mirror of
https://github.com/mastodon/mastodon.git
synced 2025-11-27 01:50:47 +00:00
Compare commits
23 Commits
d0622ed8fb
...
1886d92c57
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1886d92c57 | ||
|
|
002632c3bb | ||
|
|
81510455d1 | ||
|
|
ee7e756e89 | ||
|
|
f87f30c1ac | ||
|
|
1757a0f0f3 | ||
|
|
cb4f1cc89c | ||
|
|
00163e89bf | ||
|
|
59e48657cf | ||
|
|
384594f462 | ||
|
|
cd9d166312 | ||
|
|
6f4f9942b9 | ||
|
|
0725afe1a9 | ||
|
|
09697045a9 | ||
|
|
3e77c3bc8c | ||
|
|
bd02cd4591 | ||
|
|
4ca458e0b4 | ||
|
|
8c772028ac | ||
|
|
861625fdca | ||
|
|
ca53195b31 | ||
|
|
a26636ff1f | ||
|
|
204143becc | ||
|
|
f0d7ea61ef |
4
Gemfile
4
Gemfile
|
|
@ -40,7 +40,7 @@ gem 'net-ldap', '~> 0.18'
|
|||
gem 'omniauth', '~> 2.0'
|
||||
gem 'omniauth-cas', '~> 3.0.0.beta.1'
|
||||
gem 'omniauth_openid_connect', '~> 0.8.0'
|
||||
gem 'omniauth-rails_csrf_protection', '~> 1.0'
|
||||
gem 'omniauth-rails_csrf_protection', '~> 2.0'
|
||||
gem 'omniauth-saml', '~> 2.0'
|
||||
|
||||
gem 'color_diff', '~> 0.1'
|
||||
|
|
@ -71,7 +71,7 @@ gem 'oj', '~> 3.14'
|
|||
gem 'ox', '~> 2.14'
|
||||
gem 'parslet'
|
||||
gem 'premailer-rails'
|
||||
gem 'public_suffix', '~> 6.0'
|
||||
gem 'public_suffix', '~> 7.0'
|
||||
gem 'pundit', '~> 2.3'
|
||||
gem 'rack-attack', '~> 6.6'
|
||||
gem 'rack-cors', require: 'rack/cors'
|
||||
|
|
|
|||
24
Gemfile.lock
24
Gemfile.lock
|
|
@ -86,8 +86,8 @@ GEM
|
|||
securerandom (>= 0.3)
|
||||
tzinfo (~> 2.0, >= 2.0.5)
|
||||
uri (>= 0.13.1)
|
||||
addressable (2.8.7)
|
||||
public_suffix (>= 2.0.2, < 7.0)
|
||||
addressable (2.8.8)
|
||||
public_suffix (>= 2.0.2, < 8.0)
|
||||
aes_key_wrap (1.1.0)
|
||||
android_key_attestation (0.3.0)
|
||||
annotaterb (4.20.0)
|
||||
|
|
@ -97,7 +97,7 @@ GEM
|
|||
attr_required (1.0.2)
|
||||
aws-eventstream (1.4.0)
|
||||
aws-partitions (1.1186.0)
|
||||
aws-sdk-core (3.239.1)
|
||||
aws-sdk-core (3.239.2)
|
||||
aws-eventstream (~> 1, >= 1.3.0)
|
||||
aws-partitions (~> 1, >= 1.992.0)
|
||||
aws-sigv4 (~> 1.9)
|
||||
|
|
@ -167,7 +167,7 @@ GEM
|
|||
cocoon (1.2.15)
|
||||
color_diff (0.1)
|
||||
concurrent-ruby (1.3.5)
|
||||
connection_pool (2.5.4)
|
||||
connection_pool (2.5.5)
|
||||
cose (1.3.1)
|
||||
cbor (~> 0.5.9)
|
||||
openssl-signature_algorithm (~> 1.0)
|
||||
|
|
@ -481,7 +481,7 @@ GEM
|
|||
addressable (~> 2.8)
|
||||
nokogiri (~> 1.12)
|
||||
omniauth (~> 2.1)
|
||||
omniauth-rails_csrf_protection (1.0.2)
|
||||
omniauth-rails_csrf_protection (2.0.0)
|
||||
actionpack (>= 4.2)
|
||||
omniauth (~> 2.0)
|
||||
omniauth-saml (2.2.4)
|
||||
|
|
@ -618,7 +618,7 @@ GEM
|
|||
psych (5.2.6)
|
||||
date
|
||||
stringio
|
||||
public_suffix (6.0.2)
|
||||
public_suffix (7.0.0)
|
||||
puma (7.1.0)
|
||||
nio4r (~> 2.0)
|
||||
pundit (2.5.2)
|
||||
|
|
@ -638,7 +638,7 @@ GEM
|
|||
faraday-follow_redirects
|
||||
json-jwt (>= 1.11.0)
|
||||
rack (>= 2.1.0)
|
||||
rack-protection (4.1.1)
|
||||
rack-protection (4.2.1)
|
||||
base64 (>= 0.1.0)
|
||||
logger (>= 1.6.0)
|
||||
rack (>= 3.0.0, < 4)
|
||||
|
|
@ -672,7 +672,7 @@ GEM
|
|||
rails-html-sanitizer (1.6.2)
|
||||
loofah (~> 2.21)
|
||||
nokogiri (>= 1.15.7, != 1.16.7, != 1.16.6, != 1.16.5, != 1.16.4, != 1.16.3, != 1.16.2, != 1.16.1, != 1.16.0.rc1, != 1.16.0)
|
||||
rails-i18n (8.0.2)
|
||||
rails-i18n (8.1.0)
|
||||
i18n (>= 0.7, < 2)
|
||||
railties (>= 8.0.0, < 9)
|
||||
railties (8.0.3)
|
||||
|
|
@ -717,10 +717,10 @@ GEM
|
|||
rotp (6.3.0)
|
||||
rouge (4.6.1)
|
||||
rpam2 (4.0.2)
|
||||
rqrcode (3.1.0)
|
||||
rqrcode (3.1.1)
|
||||
chunky_png (~> 1.0)
|
||||
rqrcode_core (~> 2.0)
|
||||
rqrcode_core (2.0.0)
|
||||
rqrcode_core (2.0.1)
|
||||
rspec (3.13.1)
|
||||
rspec-core (~> 3.13.0)
|
||||
rspec-expectations (~> 3.13.0)
|
||||
|
|
@ -1009,7 +1009,7 @@ DEPENDENCIES
|
|||
oj (~> 3.14)
|
||||
omniauth (~> 2.0)
|
||||
omniauth-cas (~> 3.0.0.beta.1)
|
||||
omniauth-rails_csrf_protection (~> 1.0)
|
||||
omniauth-rails_csrf_protection (~> 2.0)
|
||||
omniauth-saml (~> 2.0)
|
||||
omniauth_openid_connect (~> 0.8.0)
|
||||
opentelemetry-api (~> 1.7.0)
|
||||
|
|
@ -1036,7 +1036,7 @@ DEPENDENCIES
|
|||
premailer-rails
|
||||
prometheus_exporter (~> 2.2)
|
||||
propshaft
|
||||
public_suffix (~> 6.0)
|
||||
public_suffix (~> 7.0)
|
||||
puma (~> 7.0)
|
||||
pundit (~> 2.3)
|
||||
rack-attack (~> 6.6)
|
||||
|
|
|
|||
|
|
@ -51,7 +51,7 @@ export interface ApiPreviewCardJSON {
|
|||
html: string;
|
||||
width: number;
|
||||
height: number;
|
||||
image: string;
|
||||
image: string | null;
|
||||
image_description: string;
|
||||
embed_url: string;
|
||||
blurhash: string;
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@ const textAtCursorMatchesToken = (str, caretPosition, searchTokens) => {
|
|||
return [null, null];
|
||||
}
|
||||
|
||||
word = word.trim().toLowerCase();
|
||||
word = word.trim();
|
||||
|
||||
if (word.length > 0) {
|
||||
return [left + 1, word];
|
||||
|
|
@ -159,8 +159,8 @@ export default class AutosuggestInput extends ImmutablePureComponent {
|
|||
this.input.focus();
|
||||
};
|
||||
|
||||
UNSAFE_componentWillReceiveProps (nextProps) {
|
||||
if (nextProps.suggestions !== this.props.suggestions && nextProps.suggestions.size > 0 && this.state.suggestionsHidden && this.state.focused) {
|
||||
componentDidUpdate (prevProps) {
|
||||
if (prevProps.suggestions !== this.props.suggestions && this.props.suggestions.size > 0 && this.state.suggestionsHidden && this.state.focused) {
|
||||
this.setState({ suggestionsHidden: false });
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@ const textAtCursorMatchesToken = (str, caretPosition) => {
|
|||
return [null, null];
|
||||
}
|
||||
|
||||
word = word.trim().toLowerCase();
|
||||
word = word.trim();
|
||||
|
||||
if (word.length > 0) {
|
||||
return [left + 1, word];
|
||||
|
|
|
|||
|
|
@ -242,11 +242,11 @@ class MediaGallery extends PureComponent {
|
|||
window.removeEventListener('resize', this.handleResize);
|
||||
}
|
||||
|
||||
UNSAFE_componentWillReceiveProps (nextProps) {
|
||||
if (!is(nextProps.media, this.props.media) && nextProps.visible === undefined) {
|
||||
this.setState({ visible: displayMedia !== 'hide_all' && !nextProps.sensitive || displayMedia === 'show_all' });
|
||||
} else if (!is(nextProps.visible, this.props.visible) && nextProps.visible !== undefined) {
|
||||
this.setState({ visible: nextProps.visible });
|
||||
componentDidUpdate (prevProps) {
|
||||
if (!is(prevProps.media, this.props.media) && this.props.visible === undefined) {
|
||||
this.setState({ visible: displayMedia !== 'hide_all' && !this.props.sensitive || displayMedia === 'show_all' });
|
||||
} else if (!is(prevProps.visible, this.props.visible) && this.props.visible !== undefined) {
|
||||
this.setState({ visible: this.props.visible });
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -61,14 +61,6 @@ class ModalRoot extends PureComponent {
|
|||
this.history = this.props.history || createBrowserHistory();
|
||||
}
|
||||
|
||||
UNSAFE_componentWillReceiveProps (nextProps) {
|
||||
if (!!nextProps.children && !this.props.children) {
|
||||
this.activeElement = document.activeElement;
|
||||
|
||||
this.getSiblings().forEach(sibling => sibling.setAttribute('inert', true));
|
||||
}
|
||||
}
|
||||
|
||||
componentDidUpdate (prevProps) {
|
||||
if (!this.props.children && !!prevProps.children) {
|
||||
this.getSiblings().forEach(sibling => sibling.removeAttribute('inert'));
|
||||
|
|
@ -85,9 +77,15 @@ class ModalRoot extends PureComponent {
|
|||
|
||||
this._handleModalClose();
|
||||
}
|
||||
|
||||
if (this.props.children && !prevProps.children) {
|
||||
this.activeElement = document.activeElement;
|
||||
|
||||
this.getSiblings().forEach(sibling => sibling.setAttribute('inert', true));
|
||||
|
||||
this._handleModalOpen();
|
||||
}
|
||||
|
||||
if (this.props.children) {
|
||||
this._ensureHistoryBuffer();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -538,9 +538,8 @@ class Status extends ImmutablePureComponent {
|
|||
} else if (status.get('card') && !status.get('quote')) {
|
||||
media = (
|
||||
<Card
|
||||
onOpenMedia={this.handleOpenMedia}
|
||||
key={`${status.get('id')}-${status.get('edited_at')}`}
|
||||
card={status.get('card')}
|
||||
compact
|
||||
sensitive={status.get('sensitive')}
|
||||
/>
|
||||
);
|
||||
|
|
|
|||
|
|
@ -38,7 +38,7 @@ class Blocks extends ImmutablePureComponent {
|
|||
multiColumn: PropTypes.bool,
|
||||
};
|
||||
|
||||
UNSAFE_componentWillMount () {
|
||||
componentDidMount () {
|
||||
this.props.dispatch(fetchBlocks());
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -61,8 +61,14 @@ class ModifierPickerMenu extends PureComponent {
|
|||
this.props.onSelect(e.currentTarget.getAttribute('data-index') * 1);
|
||||
};
|
||||
|
||||
UNSAFE_componentWillReceiveProps(nextProps) {
|
||||
if (nextProps.active) {
|
||||
componentDidMount() {
|
||||
if (this.props.active) {
|
||||
this.attachListeners();
|
||||
}
|
||||
}
|
||||
|
||||
componentDidUpdate() {
|
||||
if (this.props.active) {
|
||||
this.attachListeners();
|
||||
} else {
|
||||
this.removeListeners();
|
||||
|
|
|
|||
|
|
@ -41,7 +41,7 @@ class Favourites extends ImmutablePureComponent {
|
|||
intl: PropTypes.object.isRequired,
|
||||
};
|
||||
|
||||
UNSAFE_componentWillMount () {
|
||||
componentDidMount () {
|
||||
if (!this.props.accountIds) {
|
||||
this.props.dispatch(fetchFavourites(this.props.params.statusId));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -45,7 +45,7 @@ class FollowRequests extends ImmutablePureComponent {
|
|||
multiColumn: PropTypes.bool,
|
||||
};
|
||||
|
||||
UNSAFE_componentWillMount () {
|
||||
componentDidMount () {
|
||||
this.props.dispatch(fetchFollowRequests());
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -73,11 +73,10 @@ class ListTimeline extends PureComponent {
|
|||
this.disconnect = dispatch(connectListStream(id));
|
||||
}
|
||||
|
||||
UNSAFE_componentWillReceiveProps (nextProps) {
|
||||
const { dispatch } = this.props;
|
||||
const { id } = nextProps.params;
|
||||
componentDidUpdate (prevProps) {
|
||||
const { dispatch, params: {id} } = this.props;
|
||||
|
||||
if (id !== this.props.params.id) {
|
||||
if (id !== prevProps.params.id) {
|
||||
if (this.disconnect) {
|
||||
this.disconnect();
|
||||
this.disconnect = null;
|
||||
|
|
|
|||
|
|
@ -40,7 +40,7 @@ class Mutes extends ImmutablePureComponent {
|
|||
multiColumn: PropTypes.bool,
|
||||
};
|
||||
|
||||
UNSAFE_componentWillMount () {
|
||||
componentDidMount () {
|
||||
this.props.dispatch(fetchMutes());
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -34,7 +34,7 @@ class PinnedStatuses extends ImmutablePureComponent {
|
|||
multiColumn: PropTypes.bool,
|
||||
};
|
||||
|
||||
UNSAFE_componentWillMount () {
|
||||
componentDidMount () {
|
||||
this.props.dispatch(fetchPinnedStatuses());
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -42,7 +42,7 @@ class Reblogs extends ImmutablePureComponent {
|
|||
intl: PropTypes.object.isRequired,
|
||||
};
|
||||
|
||||
UNSAFE_componentWillMount () {
|
||||
componentDidMount () {
|
||||
if (!this.props.accountIds) {
|
||||
this.props.dispatch(fetchReblogs(this.props.params.statusId));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,254 +0,0 @@
|
|||
import punycode from 'punycode';
|
||||
|
||||
import PropTypes from 'prop-types';
|
||||
import { PureComponent } from 'react';
|
||||
|
||||
import { FormattedMessage } from 'react-intl';
|
||||
|
||||
import classNames from 'classnames';
|
||||
|
||||
|
||||
import { is } from 'immutable';
|
||||
import ImmutablePropTypes from 'react-immutable-proptypes';
|
||||
|
||||
import DescriptionIcon from '@/material-icons/400-24px/description-fill.svg?react';
|
||||
import OpenInNewIcon from '@/material-icons/400-24px/open_in_new.svg?react';
|
||||
import PlayArrowIcon from '@/material-icons/400-24px/play_arrow-fill.svg?react';
|
||||
import { Blurhash } from 'mastodon/components/blurhash';
|
||||
import { Icon } from 'mastodon/components/icon';
|
||||
import { MoreFromAuthor } from 'mastodon/components/more_from_author';
|
||||
import { RelativeTimestamp } from 'mastodon/components/relative_timestamp';
|
||||
import { useBlurhash } from 'mastodon/initial_state';
|
||||
|
||||
const IDNA_PREFIX = 'xn--';
|
||||
|
||||
const decodeIDNA = domain => {
|
||||
return domain
|
||||
.split('.')
|
||||
.map(part => part.indexOf(IDNA_PREFIX) === 0 ? punycode.decode(part.slice(IDNA_PREFIX.length)) : part)
|
||||
.join('.');
|
||||
};
|
||||
|
||||
const getHostname = url => {
|
||||
const parser = document.createElement('a');
|
||||
parser.href = url;
|
||||
return parser.hostname;
|
||||
};
|
||||
|
||||
const domParser = new DOMParser();
|
||||
|
||||
const handleIframeUrl = (html, url, providerName) => {
|
||||
const document = domParser.parseFromString(html, 'text/html').documentElement;
|
||||
const iframe = document.querySelector('iframe');
|
||||
const startTime = new URL(url).searchParams.get('t')
|
||||
|
||||
if (iframe) {
|
||||
const iframeUrl = new URL(iframe.src)
|
||||
|
||||
iframeUrl.searchParams.set('autoplay', 1)
|
||||
iframeUrl.searchParams.set('auto_play', 1)
|
||||
|
||||
if (startTime && providerName === "YouTube") iframeUrl.searchParams.set('start', startTime)
|
||||
|
||||
iframe.src = iframeUrl.href
|
||||
|
||||
// DOM parser creates html/body elements around original HTML fragment,
|
||||
// so we need to get innerHTML out of the body and not the entire document
|
||||
return document.querySelector('body').innerHTML;
|
||||
}
|
||||
|
||||
return html;
|
||||
};
|
||||
|
||||
export default class Card extends PureComponent {
|
||||
|
||||
static propTypes = {
|
||||
card: ImmutablePropTypes.map,
|
||||
onOpenMedia: PropTypes.func.isRequired,
|
||||
sensitive: PropTypes.bool,
|
||||
};
|
||||
|
||||
state = {
|
||||
previewLoaded: false,
|
||||
embedded: false,
|
||||
revealed: !this.props.sensitive,
|
||||
};
|
||||
|
||||
UNSAFE_componentWillReceiveProps (nextProps) {
|
||||
if (!is(this.props.card, nextProps.card)) {
|
||||
this.setState({ embedded: false, previewLoaded: false });
|
||||
}
|
||||
|
||||
if (this.props.sensitive !== nextProps.sensitive) {
|
||||
this.setState({ revealed: !nextProps.sensitive });
|
||||
}
|
||||
}
|
||||
|
||||
componentDidMount () {
|
||||
window.addEventListener('resize', this.handleResize, { passive: true });
|
||||
}
|
||||
|
||||
componentWillUnmount () {
|
||||
window.removeEventListener('resize', this.handleResize);
|
||||
}
|
||||
|
||||
handleEmbedClick = () => {
|
||||
this.setState({ embedded: true });
|
||||
};
|
||||
|
||||
handleExternalLinkClick = (e) => {
|
||||
e.stopPropagation();
|
||||
};
|
||||
|
||||
setRef = c => {
|
||||
this.node = c;
|
||||
};
|
||||
|
||||
handleImageLoad = () => {
|
||||
this.setState({ previewLoaded: true });
|
||||
};
|
||||
|
||||
handleReveal = e => {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
this.setState({ revealed: true });
|
||||
};
|
||||
|
||||
renderVideo () {
|
||||
const { card } = this.props;
|
||||
const content = { __html: handleIframeUrl(card.get('html'), card.get('url'), card.get('provider_name')) };
|
||||
|
||||
return (
|
||||
<div
|
||||
ref={this.setRef}
|
||||
className='status-card__image status-card-video'
|
||||
dangerouslySetInnerHTML={content}
|
||||
style={{ aspectRatio: '16 / 9' }}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
render () {
|
||||
const { card } = this.props;
|
||||
const { embedded, revealed } = this.state;
|
||||
|
||||
if (card === null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const provider = card.get('provider_name').length === 0 ? decodeIDNA(getHostname(card.get('url'))) : card.get('provider_name');
|
||||
const interactive = card.get('type') === 'video';
|
||||
const language = card.get('language') || '';
|
||||
const largeImage = (card.get('image')?.length > 0 && card.get('width') > card.get('height')) || interactive;
|
||||
const showAuthor = !!card.getIn(['authors', 0, 'accountId']);
|
||||
|
||||
const description = (
|
||||
<div className='status-card__content' dir='auto'>
|
||||
<span className='status-card__host'>
|
||||
<span lang={language}>{provider}</span>
|
||||
{card.get('published_at') && <> · <RelativeTimestamp timestamp={card.get('published_at')} /></>}
|
||||
</span>
|
||||
|
||||
<strong className='status-card__title' title={card.get('title')} lang={language}>{card.get('title')}</strong>
|
||||
|
||||
{!showAuthor && (card.get('author_name').length > 0 ? <span className='status-card__author'><FormattedMessage id='link_preview.author' defaultMessage='By {name}' values={{ name: <strong>{card.get('author_name')}</strong> }} /></span> : <span className='status-card__description' lang={language}>{card.get('description')}</span>)}
|
||||
</div>
|
||||
);
|
||||
|
||||
const thumbnailStyle = {
|
||||
visibility: revealed ? null : 'hidden',
|
||||
};
|
||||
|
||||
if (largeImage && card.get('type') === 'video') {
|
||||
thumbnailStyle.aspectRatio = `16 / 9`;
|
||||
} else if (largeImage) {
|
||||
thumbnailStyle.aspectRatio = '1.91 / 1';
|
||||
} else {
|
||||
thumbnailStyle.aspectRatio = 1;
|
||||
}
|
||||
|
||||
let embed;
|
||||
|
||||
let canvas = (
|
||||
<Blurhash
|
||||
className={classNames('status-card__image-preview', {
|
||||
'status-card__image-preview--hidden': revealed && this.state.previewLoaded,
|
||||
})}
|
||||
hash={card.get('blurhash')}
|
||||
dummy={!useBlurhash}
|
||||
/>
|
||||
);
|
||||
|
||||
const thumbnailDescription = card.get('image_description');
|
||||
const thumbnail = <img src={card.get('image')} alt={thumbnailDescription} title={thumbnailDescription} lang={language} style={thumbnailStyle} onLoad={this.handleImageLoad} className='status-card__image-image' />;
|
||||
|
||||
let spoilerButton = (
|
||||
<button type='button' onClick={this.handleReveal} className='spoiler-button__overlay'>
|
||||
<span className='spoiler-button__overlay__label'>
|
||||
<FormattedMessage id='status.sensitive_warning' defaultMessage='Sensitive content' />
|
||||
<span className='spoiler-button__overlay__action'><FormattedMessage id='status.media.show' defaultMessage='Click to show' /></span>
|
||||
</span>
|
||||
</button>
|
||||
);
|
||||
|
||||
spoilerButton = (
|
||||
<div className={classNames('spoiler-button', { 'spoiler-button--minified': revealed })}>
|
||||
{spoilerButton}
|
||||
</div>
|
||||
);
|
||||
|
||||
if (interactive) {
|
||||
if (embedded) {
|
||||
embed = this.renderVideo();
|
||||
} else {
|
||||
embed = (
|
||||
<div className='status-card__image'>
|
||||
{canvas}
|
||||
{thumbnail}
|
||||
|
||||
{revealed ? (
|
||||
<div className='status-card__actions' onClick={this.handleEmbedClick} role='none'>
|
||||
<div>
|
||||
<button type='button' onClick={this.handleEmbedClick}><Icon id='play' icon={PlayArrowIcon} /></button>
|
||||
<a href={card.get('url')} onClick={this.handleExternalLinkClick} target='_blank' rel='noopener'><Icon id='external-link' icon={OpenInNewIcon} /></a>
|
||||
</div>
|
||||
</div>
|
||||
) : spoilerButton}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<div className={classNames('status-card', { expanded: largeImage })} ref={this.setRef} onClick={revealed ? null : this.handleReveal} role={revealed ? 'button' : null}>
|
||||
{embed}
|
||||
<a href={card.get('url')} target='_blank' rel='noopener'>{description}</a>
|
||||
</div>
|
||||
);
|
||||
} else if (card.get('image')) {
|
||||
embed = (
|
||||
<div className='status-card__image'>
|
||||
{canvas}
|
||||
{thumbnail}
|
||||
</div>
|
||||
);
|
||||
} else {
|
||||
embed = (
|
||||
<div className='status-card__image'>
|
||||
<Icon id='file-text' icon={DescriptionIcon} />
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<>
|
||||
<a href={card.get('url')} className={classNames('status-card', { expanded: largeImage, bottomless: showAuthor })} target='_blank' rel='noopener' ref={this.setRef}>
|
||||
{embed}
|
||||
{description}
|
||||
</a>
|
||||
|
||||
{showAuthor && <MoreFromAuthor accountId={card.getIn(['authors', 0, 'accountId'])} />}
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
316
app/javascript/mastodon/features/status/components/card.tsx
Normal file
316
app/javascript/mastodon/features/status/components/card.tsx
Normal file
|
|
@ -0,0 +1,316 @@
|
|||
import punycode from 'node:punycode';
|
||||
|
||||
import { useCallback, useId, useState } from 'react';
|
||||
|
||||
import { FormattedMessage } from 'react-intl';
|
||||
|
||||
import classNames from 'classnames';
|
||||
|
||||
import DescriptionIcon from '@/material-icons/400-24px/description-fill.svg?react';
|
||||
import OpenInNewIcon from '@/material-icons/400-24px/open_in_new.svg?react';
|
||||
import PlayArrowIcon from '@/material-icons/400-24px/play_arrow-fill.svg?react';
|
||||
import { Blurhash } from 'mastodon/components/blurhash';
|
||||
import { Icon } from 'mastodon/components/icon';
|
||||
import { MoreFromAuthor } from 'mastodon/components/more_from_author';
|
||||
import { RelativeTimestamp } from 'mastodon/components/relative_timestamp';
|
||||
import { useBlurhash } from 'mastodon/initial_state';
|
||||
import type { Card as CardType } from 'mastodon/models/status';
|
||||
|
||||
const IDNA_PREFIX = 'xn--';
|
||||
|
||||
const decodeIDNA = (domain: string) => {
|
||||
return domain
|
||||
.split('.')
|
||||
.map((part) =>
|
||||
part.startsWith(IDNA_PREFIX)
|
||||
? punycode.decode(part.slice(IDNA_PREFIX.length))
|
||||
: part,
|
||||
)
|
||||
.join('.');
|
||||
};
|
||||
|
||||
const getHostname = (url: string) => {
|
||||
const parser = document.createElement('a');
|
||||
parser.href = url;
|
||||
return parser.hostname;
|
||||
};
|
||||
|
||||
const domParser = new DOMParser();
|
||||
|
||||
const handleIframeUrl = (html: string, url: string, providerName: string) => {
|
||||
const document = domParser.parseFromString(html, 'text/html').documentElement;
|
||||
const iframe = document.querySelector('iframe');
|
||||
const startTime = new URL(url).searchParams.get('t');
|
||||
|
||||
if (iframe) {
|
||||
const iframeUrl = new URL(iframe.src);
|
||||
|
||||
iframeUrl.searchParams.set('autoplay', '1');
|
||||
iframeUrl.searchParams.set('auto_play', '1');
|
||||
|
||||
if (startTime && providerName === 'YouTube')
|
||||
iframeUrl.searchParams.set('start', startTime);
|
||||
|
||||
iframe.src = iframeUrl.href;
|
||||
|
||||
// DOM parser creates html/body elements around original HTML fragment,
|
||||
// so we need to get innerHTML out of the body and not the entire document
|
||||
return document.querySelector('body')?.innerHTML ?? '';
|
||||
}
|
||||
|
||||
return html;
|
||||
};
|
||||
|
||||
interface CardProps {
|
||||
card: CardType | null;
|
||||
sensitive?: boolean;
|
||||
}
|
||||
|
||||
const CardVideo: React.FC<Pick<CardProps, 'card'>> = ({ card }) => (
|
||||
<div
|
||||
className='status-card__image status-card-video'
|
||||
dangerouslySetInnerHTML={{
|
||||
__html: card
|
||||
? handleIframeUrl(
|
||||
card.get('html'),
|
||||
card.get('url'),
|
||||
card.get('provider_name'),
|
||||
)
|
||||
: '',
|
||||
}}
|
||||
style={{ aspectRatio: '16 / 9' }}
|
||||
/>
|
||||
);
|
||||
|
||||
const Card: React.FC<CardProps> = ({ card, sensitive }) => {
|
||||
const [previewLoaded, setPreviewLoaded] = useState(false);
|
||||
const [embedded, setEmbedded] = useState(false);
|
||||
const [revealed, setRevealed] = useState(!sensitive);
|
||||
|
||||
const handleEmbedClick = useCallback(() => {
|
||||
setEmbedded(true);
|
||||
}, []);
|
||||
|
||||
const handleExternalLinkClick = useCallback((e: React.MouseEvent) => {
|
||||
e.stopPropagation();
|
||||
}, []);
|
||||
|
||||
const handleImageLoad = useCallback(() => {
|
||||
setPreviewLoaded(true);
|
||||
}, []);
|
||||
|
||||
const handleReveal = useCallback((e: React.MouseEvent) => {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
setRevealed(true);
|
||||
}, []);
|
||||
|
||||
const spoilerButtonId = useId();
|
||||
|
||||
if (card === null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const provider =
|
||||
card.get('provider_name').length === 0
|
||||
? decodeIDNA(getHostname(card.get('url')))
|
||||
: card.get('provider_name');
|
||||
const interactive = card.get('type') === 'video';
|
||||
const language = card.get('language') || '';
|
||||
const hasImage = (card.get('image')?.length ?? 0) > 0;
|
||||
const largeImage =
|
||||
(hasImage && card.get('width') > card.get('height')) || interactive;
|
||||
const showAuthor = !!card.getIn(['authors', 0, 'accountId']);
|
||||
|
||||
const description = (
|
||||
<div className='status-card__content' dir='auto'>
|
||||
<span className='status-card__host'>
|
||||
<span lang={language}>{provider}</span>
|
||||
{card.get('published_at') && (
|
||||
<>
|
||||
{' '}
|
||||
· <RelativeTimestamp timestamp={card.get('published_at')} />
|
||||
</>
|
||||
)}
|
||||
</span>
|
||||
|
||||
<strong
|
||||
className='status-card__title'
|
||||
title={card.get('title')}
|
||||
lang={language}
|
||||
>
|
||||
{card.get('title')}
|
||||
</strong>
|
||||
|
||||
{!showAuthor &&
|
||||
(card.get('author_name').length > 0 ? (
|
||||
<span className='status-card__author'>
|
||||
<FormattedMessage
|
||||
id='link_preview.author'
|
||||
defaultMessage='By {name}'
|
||||
values={{ name: <strong>{card.get('author_name')}</strong> }}
|
||||
/>
|
||||
</span>
|
||||
) : (
|
||||
<span className='status-card__description' lang={language}>
|
||||
{card.get('description')}
|
||||
</span>
|
||||
))}
|
||||
</div>
|
||||
);
|
||||
|
||||
const thumbnailStyle: React.CSSProperties = {
|
||||
visibility: revealed ? undefined : 'hidden',
|
||||
aspectRatio: '1',
|
||||
};
|
||||
|
||||
if (largeImage && card.get('type') === 'video') {
|
||||
thumbnailStyle.aspectRatio = `16 / 9`;
|
||||
} else if (largeImage) {
|
||||
thumbnailStyle.aspectRatio = '1.91 / 1';
|
||||
}
|
||||
|
||||
let embed;
|
||||
|
||||
const canvas = (
|
||||
<Blurhash
|
||||
className={classNames('status-card__image-preview', {
|
||||
'status-card__image-preview--hidden': revealed && previewLoaded,
|
||||
})}
|
||||
hash={card.get('blurhash')}
|
||||
dummy={!useBlurhash}
|
||||
/>
|
||||
);
|
||||
|
||||
const thumbnailDescription = card.get('image_description');
|
||||
const thumbnail = (
|
||||
<img
|
||||
src={card.get('image') ?? undefined}
|
||||
alt={thumbnailDescription}
|
||||
title={thumbnailDescription}
|
||||
lang={language}
|
||||
style={thumbnailStyle}
|
||||
onLoad={handleImageLoad}
|
||||
className='status-card__image-image'
|
||||
/>
|
||||
);
|
||||
|
||||
const spoilerButton = (
|
||||
<div
|
||||
className={classNames('spoiler-button', {
|
||||
'spoiler-button--minified': revealed,
|
||||
})}
|
||||
id={spoilerButtonId}
|
||||
>
|
||||
<button
|
||||
type='button'
|
||||
onClick={handleReveal}
|
||||
className='spoiler-button__overlay'
|
||||
>
|
||||
<span className='spoiler-button__overlay__label'>
|
||||
<FormattedMessage
|
||||
id='status.sensitive_warning'
|
||||
defaultMessage='Sensitive content'
|
||||
/>
|
||||
<span className='spoiler-button__overlay__action'>
|
||||
<FormattedMessage
|
||||
id='status.media.show'
|
||||
defaultMessage='Click to show'
|
||||
/>
|
||||
</span>
|
||||
</span>
|
||||
</button>
|
||||
</div>
|
||||
);
|
||||
|
||||
if (interactive) {
|
||||
if (embedded) {
|
||||
embed = <CardVideo card={card} />;
|
||||
} else {
|
||||
embed = (
|
||||
<div className='status-card__image'>
|
||||
{canvas}
|
||||
{thumbnail}
|
||||
|
||||
{revealed ? (
|
||||
<div
|
||||
className='status-card__actions'
|
||||
onClick={handleEmbedClick}
|
||||
role='none'
|
||||
>
|
||||
<div>
|
||||
<button type='button' onClick={handleEmbedClick}>
|
||||
<Icon id='play' icon={PlayArrowIcon} />
|
||||
</button>
|
||||
<a
|
||||
href={card.get('url')}
|
||||
onClick={handleExternalLinkClick}
|
||||
target='_blank'
|
||||
rel='noopener'
|
||||
>
|
||||
<Icon id='external-link' icon={OpenInNewIcon} />
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
) : (
|
||||
spoilerButton
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<div className={classNames('status-card', { expanded: largeImage })}>
|
||||
{embed}
|
||||
<a
|
||||
href={card.get('url')}
|
||||
target='_blank'
|
||||
rel='noopener'
|
||||
onClick={revealed ? undefined : handleReveal}
|
||||
aria-describedby={revealed ? undefined : spoilerButtonId}
|
||||
>
|
||||
{description}
|
||||
</a>
|
||||
</div>
|
||||
);
|
||||
} else if (card.get('image')) {
|
||||
embed = (
|
||||
<div className='status-card__image'>
|
||||
{canvas}
|
||||
{thumbnail}
|
||||
</div>
|
||||
);
|
||||
} else {
|
||||
embed = (
|
||||
<div className='status-card__image'>
|
||||
<Icon id='file-text' icon={DescriptionIcon} />
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<>
|
||||
<a
|
||||
href={card.get('url')}
|
||||
className={classNames('status-card', {
|
||||
expanded: largeImage,
|
||||
bottomless: showAuthor,
|
||||
})}
|
||||
target='_blank'
|
||||
rel='noopener'
|
||||
>
|
||||
{embed}
|
||||
{description}
|
||||
</a>
|
||||
|
||||
{showAuthor && (
|
||||
<MoreFromAuthor
|
||||
accountId={card.getIn(['authors', 0, 'accountId']) as string}
|
||||
/>
|
||||
)}
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
// eslint-disable-next-line import/no-default-export
|
||||
export default Card;
|
||||
|
|
@ -262,8 +262,8 @@ export const DetailedStatus: React.FC<{
|
|||
} else if (status.get('card') && !status.get('quote')) {
|
||||
media = (
|
||||
<Card
|
||||
key={`${status.get('id')}-${status.get('edited_at')}`}
|
||||
sensitive={status.get('sensitive')}
|
||||
onOpenMedia={onOpenMedia}
|
||||
card={status.get('card')}
|
||||
/>
|
||||
);
|
||||
|
|
|
|||
|
|
@ -33,13 +33,13 @@ class Bundle extends PureComponent {
|
|||
forceRender: false,
|
||||
};
|
||||
|
||||
UNSAFE_componentWillMount() {
|
||||
componentDidMount() {
|
||||
this.load(this.props);
|
||||
}
|
||||
|
||||
UNSAFE_componentWillReceiveProps(nextProps) {
|
||||
if (nextProps.fetchComponent !== this.props.fetchComponent) {
|
||||
this.load(nextProps);
|
||||
componentDidUpdate(prevProps) {
|
||||
if (prevProps.fetchComponent !== this.props.fetchComponent) {
|
||||
this.load(this.props);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -108,7 +108,7 @@ class SwitchingColumnsArea extends PureComponent {
|
|||
forceOnboarding: PropTypes.bool,
|
||||
};
|
||||
|
||||
UNSAFE_componentWillMount () {
|
||||
componentDidMount () {
|
||||
document.body.classList.toggle('layout-single-column', this.props.singleColumn);
|
||||
document.body.classList.toggle('layout-multiple-columns', !this.props.singleColumn);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -357,6 +357,7 @@
|
|||
"empty_column.notification_requests": "All clear! There is nothing here. When you receive new notifications, they will appear here according to your settings.",
|
||||
"empty_column.notifications": "You don't have any notifications yet. When other people interact with you, you will see it here.",
|
||||
"empty_column.public": "There is nothing here! Write something publicly, or manually follow users from other servers to fill it up",
|
||||
"error.no_hashtag_feed_access": "Join or log in to view and follow this hashtag.",
|
||||
"error.unexpected_crash.explanation": "Due to a bug in our code or a browser compatibility issue, this page could not be displayed correctly.",
|
||||
"error.unexpected_crash.explanation_addons": "This page could not be displayed correctly. This error is likely caused by a browser add-on or automatic translation tools.",
|
||||
"error.unexpected_crash.next_steps": "Try refreshing the page. If that does not help, you may still be able to use Mastodon through a different browser or native app.",
|
||||
|
|
@ -767,6 +768,8 @@
|
|||
"quote_error.poll": "Quoting is not allowed with polls.",
|
||||
"quote_error.private_mentions": "Quoting is not allowed with direct mentions.",
|
||||
"quote_error.quote": "Only one quote at a time is allowed.",
|
||||
"quote_error.unauthorized": "You are not authorised to quote this post.",
|
||||
"quote_error.upload": "Quoting is not allowed with media attachments.",
|
||||
"recommended": "Recommended",
|
||||
"refresh": "Refresh",
|
||||
"regeneration_indicator.please_stand_by": "Please stand by.",
|
||||
|
|
@ -782,6 +785,9 @@
|
|||
"relative_time.minutes": "{number}m",
|
||||
"relative_time.seconds": "{number}s",
|
||||
"relative_time.today": "today",
|
||||
"remove_quote_hint.button_label": "Got it",
|
||||
"remove_quote_hint.message": "You can do so from the {icon} options menu.",
|
||||
"remove_quote_hint.title": "Want to remove your quoted post?",
|
||||
"reply_indicator.attachments": "{count, plural, one {# attachment} other {# attachments}}",
|
||||
"reply_indicator.cancel": "Cancel",
|
||||
"reply_indicator.poll": "Poll",
|
||||
|
|
@ -873,13 +879,23 @@
|
|||
"status.admin_account": "Open moderation interface for @{name}",
|
||||
"status.admin_domain": "Open moderation interface for {domain}",
|
||||
"status.admin_status": "Open this post in the moderation interface",
|
||||
"status.all_disabled": "Boosts and quotes are disabled",
|
||||
"status.block": "Block @{name}",
|
||||
"status.bookmark": "Bookmark",
|
||||
"status.cancel_reblog_private": "Unboost",
|
||||
"status.cannot_quote": "You are not allowed to quote this post",
|
||||
"status.cannot_reblog": "This post cannot be boosted",
|
||||
"status.contains_quote": "Contains quote",
|
||||
"status.context.loading": "Loading more replies",
|
||||
"status.context.loading_error": "Couldn't load new replies",
|
||||
"status.context.loading_success": "New replies loaded",
|
||||
"status.context.more_replies_found": "More replies found",
|
||||
"status.context.retry": "Retry",
|
||||
"status.context.show": "Show",
|
||||
"status.continued_thread": "Continued thread",
|
||||
"status.copy": "Copy link to status",
|
||||
"status.delete": "Delete",
|
||||
"status.delete.success": "Post deleted",
|
||||
"status.detailed_status": "Detailed conversation view",
|
||||
"status.direct": "Privately mention @{name}",
|
||||
"status.direct_indicator": "Private mention",
|
||||
|
|
@ -888,6 +904,7 @@
|
|||
"status.edited_x_times": "Edited {count, plural, one {{count} time} other {{count} times}}",
|
||||
"status.embed": "Get embed code",
|
||||
"status.favourite": "Favourite",
|
||||
"status.favourites_count": "{count, plural, one {{counter} favourite} other {{counter} favourites}}",
|
||||
"status.filter": "Filter this post",
|
||||
"status.history.created": "{name} created {date}",
|
||||
"status.history.edited": "{name} edited {date}",
|
||||
|
|
@ -901,19 +918,46 @@
|
|||
"status.mute_conversation": "Mute conversation",
|
||||
"status.open": "Expand this post",
|
||||
"status.pin": "Pin on profile",
|
||||
"status.quote": "Quote",
|
||||
"status.quote.cancel": "Cancel quote",
|
||||
"status.quote_error.blocked_account_hint.title": "This post is hidden because you've blocked @{name}.",
|
||||
"status.quote_error.blocked_domain_hint.title": "This post is hidden because you've blocked {domain}.",
|
||||
"status.quote_error.filtered": "Hidden due to one of your filters",
|
||||
"status.quote_error.limited_account_hint.action": "Show anyway",
|
||||
"status.quote_error.limited_account_hint.title": "This account has been hidden by the moderators of {domain}.",
|
||||
"status.quote_error.muted_account_hint.title": "This post is hidden because you've muted @{name}.",
|
||||
"status.quote_error.not_available": "Post unavailable",
|
||||
"status.quote_error.pending_approval": "Post pending",
|
||||
"status.quote_error.pending_approval_popout.body": "On Mastodon, you can control whether someone can quote you. This post is pending while we're getting the original author's approval.",
|
||||
"status.quote_error.revoked": "Post removed by author",
|
||||
"status.quote_followers_only": "Only followers can quote this post",
|
||||
"status.quote_manual_review": "Author will manually review",
|
||||
"status.quote_noun": "Quote",
|
||||
"status.quote_policy_change": "Change who can quote",
|
||||
"status.quote_post_author": "Quoted a post by @{name}",
|
||||
"status.quote_private": "Private posts cannot be quoted",
|
||||
"status.quotes.empty": "No one has quoted this post yet. When someone does, it will show up here.",
|
||||
"status.quotes.local_other_disclaimer": "Quotes rejected by the author will not be shown.",
|
||||
"status.quotes.remote_other_disclaimer": "Only quotes from {domain} are guaranteed to be shown here. Quotes rejected by the author will not be shown.",
|
||||
"status.quotes_count": "{count, plural, one {{counter} quote} other {{counter} quotes}}",
|
||||
"status.read_more": "Read more",
|
||||
"status.reblog": "Boost",
|
||||
"status.reblog_or_quote": "Boost or quote",
|
||||
"status.reblog_private": "Share again with your followers",
|
||||
"status.reblogged_by": "{name} boosted",
|
||||
"status.reblogs.empty": "No one has boosted this post yet. When someone does, they will show up here.",
|
||||
"status.reblogs_count": "{count, plural, one {{counter} boost} other {{counter} boosts}}",
|
||||
"status.redraft": "Delete & re-draft",
|
||||
"status.remove_bookmark": "Remove bookmark",
|
||||
"status.remove_favourite": "Remove from favourites",
|
||||
"status.remove_quote": "Remove",
|
||||
"status.replied_in_thread": "Replied in thread",
|
||||
"status.replied_to": "Replied to {name}",
|
||||
"status.reply": "Reply",
|
||||
"status.replyAll": "Reply to thread",
|
||||
"status.report": "Report @{name}",
|
||||
"status.request_quote": "Request to quote",
|
||||
"status.revoke_quote": "Remove my post from @{name}’s post",
|
||||
"status.sensitive_warning": "Sensitive content",
|
||||
"status.share": "Share",
|
||||
"status.show_less_all": "Show less for all",
|
||||
|
|
@ -951,6 +995,7 @@
|
|||
"upload_button.label": "Add images, a video or an audio file",
|
||||
"upload_error.limit": "File upload limit exceeded.",
|
||||
"upload_error.poll": "File upload not allowed with polls.",
|
||||
"upload_error.quote": "File upload not allowed with quotes.",
|
||||
"upload_form.drag_and_drop.instructions": "To pick up a media attachment, press space or enter. While dragging, use the arrow keys to move the media attachment in any given direction. Press space or enter again to drop the media attachment in its new position, or press escape to cancel.",
|
||||
"upload_form.drag_and_drop.on_drag_cancel": "Dragging was cancelled. Media attachment {item} was dropped.",
|
||||
"upload_form.drag_and_drop.on_drag_end": "Media attachment {item} was dropped.",
|
||||
|
|
@ -974,6 +1019,14 @@
|
|||
"video.unmute": "Unmute",
|
||||
"video.volume_down": "Volume down",
|
||||
"video.volume_up": "Volume up",
|
||||
"visibility_modal.button_title": "Set visibility",
|
||||
"visibility_modal.direct_quote_warning.text": "If you save the current settings, the embedded quote will be converted to a link.",
|
||||
"visibility_modal.direct_quote_warning.title": "Quotes can't be embedded in private mentions",
|
||||
"visibility_modal.header": "Visibility and interaction",
|
||||
"visibility_modal.helper.direct_quoting": "Private mentions authored on Mastodon can't be quoted by others.",
|
||||
"visibility_modal.helper.privacy_editing": "Visibility can't be changed after a post is published.",
|
||||
"visibility_modal.helper.privacy_private_self_quote": "Self-quotes of private posts cannot be made public.",
|
||||
"visibility_modal.helper.private_quoting": "Follower-only posts authored on Mastodon can't be quoted by others.",
|
||||
"visibility_modal.helper.unlisted_quoting": "When people quote you, their post will also be hidden from trending timelines.",
|
||||
"visibility_modal.instructions": "Control who can interact with this post. You can also apply settings to all future posts by navigating to <link>Preferences > Posting defaults</link>.",
|
||||
"visibility_modal.privacy_label": "Visibility",
|
||||
|
|
|
|||
|
|
@ -357,6 +357,7 @@
|
|||
"empty_column.notification_requests": "Iste lista es toto vacue! Quando tu recipe notificationes, illos apparera hic como configurate in tu parametros.",
|
||||
"empty_column.notifications": "Tu non ha ancora notificationes. Quando altere personas interage con te, tu lo videra hic.",
|
||||
"empty_column.public": "Il ha nihil hic! Scribe qualcosa public, o manualmente seque usatores de altere servitores, pro plenar lo",
|
||||
"error.no_hashtag_feed_access": "Inscribe te o aperi session pro vider e sequer iste hashtag.",
|
||||
"error.unexpected_crash.explanation": "A causa de un defecto in nostre codice o de un problema de compatibilitate del navigator, iste pagina non pote esser visualisate correctemente.",
|
||||
"error.unexpected_crash.explanation_addons": "Iste pagina non pote esser visualisate correctemente. Iste error es probabilemente causate per un additivo al navigator o per un utensile de traduction automatic.",
|
||||
"error.unexpected_crash.next_steps": "Tenta refrescar le pagina. Si isto non remedia le problema, es possibile que tu pote totevia usar Mastodon per medio de un altere navigator o application native.",
|
||||
|
|
@ -919,9 +920,12 @@
|
|||
"status.pin": "Fixar sur profilo",
|
||||
"status.quote": "Citar",
|
||||
"status.quote.cancel": "Cancellar le citation",
|
||||
"status.quote_error.blocked_account_hint.title": "Iste message es celate perque tu ha blocate @{name}.",
|
||||
"status.quote_error.blocked_domain_hint.title": "Iste message es celate perque tu ha blocate {domain}.",
|
||||
"status.quote_error.filtered": "Celate a causa de un de tu filtros",
|
||||
"status.quote_error.limited_account_hint.action": "Monstrar in omne caso",
|
||||
"status.quote_error.limited_account_hint.title": "Iste conto ha essite celate per le moderatores de {domain}.",
|
||||
"status.quote_error.muted_account_hint.title": "Iste message es celate perque tu ha silentiate @{name}.",
|
||||
"status.quote_error.not_available": "Message indisponibile",
|
||||
"status.quote_error.pending_approval": "Message pendente",
|
||||
"status.quote_error.pending_approval_popout.body": "Sur Mastodon, tu pote controlar si on pote citar te. Iste message attende ora le approbation del autor original.",
|
||||
|
|
@ -935,12 +939,14 @@
|
|||
"status.quotes.empty": "Necuno ha ancora citate iste message. Quando alcuno lo face, illo apparera hic.",
|
||||
"status.quotes.local_other_disclaimer": "Le citationes rejectate per le autor non essera monstrate.",
|
||||
"status.quotes.remote_other_disclaimer": "Solmente le citationes de {domain} se garanti de esser monstrate hic. Citationes rejectate per le autor non essera monstrate.",
|
||||
"status.quotes_count": "{count, plural, one {{counter} citation} other {{counter} citationes}}",
|
||||
"status.read_more": "Leger plus",
|
||||
"status.reblog": "Impulsar",
|
||||
"status.reblog_or_quote": "Impulsar o citar",
|
||||
"status.reblog_private": "Re-compartir con tu sequitores",
|
||||
"status.reblogged_by": "Impulsate per {name}",
|
||||
"status.reblogs.empty": "Necuno ha ancora impulsate iste message. Quando alcuno lo face, le impulsos apparera hic.",
|
||||
"status.reblogs_count": "{count, plural, one {{counter} impulso} other {{counter} impulsos}}",
|
||||
"status.redraft": "Deler e reconciper",
|
||||
"status.remove_bookmark": "Remover marcapagina",
|
||||
"status.remove_favourite": "Remover del favoritos",
|
||||
|
|
@ -1014,6 +1020,7 @@
|
|||
"video.volume_down": "Abassar le volumine",
|
||||
"video.volume_up": "Augmentar le volumine",
|
||||
"visibility_modal.button_title": "Definir visibilitate",
|
||||
"visibility_modal.direct_quote_warning.text": "Si tu salva le parametros actual, le citation incorporate se convertera in un ligamine.",
|
||||
"visibility_modal.header": "Visibilitate e interaction",
|
||||
"visibility_modal.helper.direct_quoting": "Le mentiones private scribite sur Mastodon non pote esser citate per alteres.",
|
||||
"visibility_modal.helper.privacy_editing": "Le visibilitate de un message non pote esser cambiate post su publication.",
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@
|
|||
"account.familiar_followers_two": "Seguido por {name1} e {name2}",
|
||||
"account.featured": "Em destaque",
|
||||
"account.featured.accounts": "Perfis",
|
||||
"account.featured.hashtags": "\"Hashtags\"",
|
||||
"account.featured.hashtags": "Hashtags",
|
||||
"account.featured_tags.last_status_at": "Última publicação em {date}",
|
||||
"account.featured_tags.last_status_never": "Sem publicações",
|
||||
"account.follow": "Seguir",
|
||||
|
|
@ -45,7 +45,7 @@
|
|||
"account.follow_request": "Pedir para seguir",
|
||||
"account.follow_request_cancel": "Cancelar solicitação",
|
||||
"account.follow_request_cancel_short": "Cancelar",
|
||||
"account.follow_request_short": "Solicitação",
|
||||
"account.follow_request_short": "Solicitar",
|
||||
"account.followers": "Seguidores",
|
||||
"account.followers.empty": "Nada aqui.",
|
||||
"account.followers_counter": "{count, plural, one {{counter} seguidor} other {{counter} seguidores}}",
|
||||
|
|
@ -98,7 +98,7 @@
|
|||
"admin.dashboard.retention.cohort_size": "Novos usuários",
|
||||
"admin.impact_report.instance_accounts": "Perfis de contas que isso apagaria",
|
||||
"admin.impact_report.instance_followers": "Seguidores que os nossos usuários perderiam",
|
||||
"admin.impact_report.instance_follows": "Seguidores que os seus usuários perderiam",
|
||||
"admin.impact_report.instance_follows": "Seguidores que os usuários deles perderiam",
|
||||
"admin.impact_report.title": "Resumo do impacto",
|
||||
"alert.rate_limited.message": "Tente novamente após {retry_time, time, medium}.",
|
||||
"alert.rate_limited.title": "Tentativas limitadas",
|
||||
|
|
@ -109,8 +109,8 @@
|
|||
"alt_text_modal.add_text_from_image": "Adicione texto da imagem",
|
||||
"alt_text_modal.cancel": "Cancelar",
|
||||
"alt_text_modal.change_thumbnail": "Alterar miniatura",
|
||||
"alt_text_modal.describe_for_people_with_hearing_impairments": "Descreva isso para pessoas com deficiências auditivas...",
|
||||
"alt_text_modal.describe_for_people_with_visual_impairments": "Descreva isso para pessoas com deficiências visuais…",
|
||||
"alt_text_modal.describe_for_people_with_hearing_impairments": "Descreva isso para pessoas com deficiências auditivas…",
|
||||
"alt_text_modal.describe_for_people_with_visual_impairments": "Descreva isto para pessoas com deficiências visuais…",
|
||||
"alt_text_modal.done": "Feito",
|
||||
"announcement.announcement": "Comunicados",
|
||||
"annual_report.summary.archetype.booster": "Caçador legal",
|
||||
|
|
@ -120,7 +120,7 @@
|
|||
"annual_report.summary.archetype.replier": "A borboleta social",
|
||||
"annual_report.summary.followers.followers": "seguidores",
|
||||
"annual_report.summary.followers.total": "{count} total",
|
||||
"annual_report.summary.here_it_is": "Aqui está seu {year} em revisão:",
|
||||
"annual_report.summary.here_it_is": "Aqui está seu {year} em retrospectiva:",
|
||||
"annual_report.summary.highlighted_post.by_favourites": "publicação mais favoritada",
|
||||
"annual_report.summary.highlighted_post.by_reblogs": "publicação mais impulsionada",
|
||||
"annual_report.summary.highlighted_post.by_replies": "publicação com mais respostas",
|
||||
|
|
@ -130,18 +130,18 @@
|
|||
"annual_report.summary.most_used_hashtag.none": "Nenhuma",
|
||||
"annual_report.summary.new_posts.new_posts": "novas publicações",
|
||||
"annual_report.summary.percentile.text": "<topLabel>Isso lhe coloca no topo</topLabel><percentage></percentage><bottomLabel>de usuários de {domain}.</bottomLabel>",
|
||||
"annual_report.summary.percentile.we_wont_tell_bernie": "Não contaremos à Bernie.",
|
||||
"annual_report.summary.percentile.we_wont_tell_bernie": "Não contaremos ao Bernie.",
|
||||
"annual_report.summary.thanks": "Obrigada por fazer parte do Mastodon!",
|
||||
"attachments_list.unprocessed": "(não processado)",
|
||||
"audio.hide": "Ocultar áudio",
|
||||
"block_modal.remote_users_caveat": "Pediremos ao servidor {domain} que respeite sua decisão. No entanto, a conformidade não é garantida, já que alguns servidores podem lidar com bloqueios de maneira diferente. As postagens públicas ainda podem estar visíveis para usuários não logados.",
|
||||
"block_modal.remote_users_caveat": "Pediremos ao servidor {domain} que respeite sua decisão. No entanto, a conformidade não é garantida, já que alguns servidores podem lidar com bloqueios de maneira diferente. As publicações públicas ainda podem estar visíveis para usuários não logados.",
|
||||
"block_modal.show_less": "Mostrar menos",
|
||||
"block_modal.show_more": "Mostrar mais",
|
||||
"block_modal.they_cant_mention": "Eles não podem mencionar ou seguir você.",
|
||||
"block_modal.they_cant_see_posts": "Eles não podem ver suas postagens e você não verá as deles.",
|
||||
"block_modal.they_will_know": "Eles podem ver que estão bloqueados.",
|
||||
"block_modal.they_cant_mention": "Não poderá mencionar ou seguir você.",
|
||||
"block_modal.they_cant_see_posts": "Não poderá ver suas publicações e você não verá as dele/a.",
|
||||
"block_modal.they_will_know": "Poderá ver que você bloqueou.",
|
||||
"block_modal.title": "Bloquear usuário?",
|
||||
"block_modal.you_wont_see_mentions": "Você não verá publicações que os mencionem.",
|
||||
"block_modal.you_wont_see_mentions": "Você não verá publicações que mencionem o usuário.",
|
||||
"boost_modal.combo": "Pressione {combo} para pular isso na próxima vez",
|
||||
"boost_modal.reblog": "Impulsionar a publicação?",
|
||||
"boost_modal.undo_reblog": "Retirar o impulsionamento do post?",
|
||||
|
|
@ -196,12 +196,12 @@
|
|||
"community.column_settings.local_only": "Somente local",
|
||||
"community.column_settings.media_only": "Somente mídia",
|
||||
"community.column_settings.remote_only": "Somente global",
|
||||
"compose.error.blank_post": "A postagem não pode estar em branco.",
|
||||
"compose.error.blank_post": "A publicação não pode estar em branco.",
|
||||
"compose.language.change": "Alterar idioma",
|
||||
"compose.language.search": "Pesquisar idiomas...",
|
||||
"compose.published.body": "Publicado.",
|
||||
"compose.published.open": "Abrir",
|
||||
"compose.saved.body": "Postagem salva.",
|
||||
"compose.saved.body": "Publicação salva.",
|
||||
"compose_form.direct_message_warning_learn_more": "Saiba mais",
|
||||
"compose_form.encryption_warning": "As publicações no Mastodon não são criptografadas de ponta-a-ponta. Não compartilhe nenhuma informação sensível no Mastodon.",
|
||||
"compose_form.hashtag_warning": "Esta publicação não será exibida sob nenhuma hashtag, já que não é pública. Apenas postagens públicas podem ser pesquisadas por meio de hashtags.",
|
||||
|
|
@ -217,7 +217,7 @@
|
|||
"compose_form.poll.type": "Estilo",
|
||||
"compose_form.publish": "Publicar",
|
||||
"compose_form.reply": "Responder",
|
||||
"compose_form.save_changes": "Atualização",
|
||||
"compose_form.save_changes": "Atualizar",
|
||||
"compose_form.spoiler.marked": "Com Aviso de Conteúdo",
|
||||
"compose_form.spoiler.unmarked": "Sem Aviso de Conteúdo",
|
||||
"compose_form.spoiler_placeholder": "Aviso de conteúdo (opcional)",
|
||||
|
|
@ -231,11 +231,11 @@
|
|||
"confirmations.delete_list.title": "Excluir lista?",
|
||||
"confirmations.discard_draft.confirm": "Descartar e continuar",
|
||||
"confirmations.discard_draft.edit.cancel": "Continuar editando",
|
||||
"confirmations.discard_draft.edit.message": "Continuar vai descartar quaisquer mudanças feitas ao post sendo editado.",
|
||||
"confirmations.discard_draft.edit.title": "Descartar mudanças no seu post?",
|
||||
"confirmations.discard_draft.edit.message": "Continuar vai descartar quaisquer mudanças feitas à publicação sendo editada.",
|
||||
"confirmations.discard_draft.edit.title": "Descartar mudanças na sua publicação?",
|
||||
"confirmations.discard_draft.post.cancel": "Continuar rascunho",
|
||||
"confirmations.discard_draft.post.message": "Continuar eliminará a publicação que está sendo elaborada no momento.",
|
||||
"confirmations.discard_draft.post.title": "Eliminar seu esboço de publicação?",
|
||||
"confirmations.discard_draft.post.title": "Eliminar seu rascunho de publicação?",
|
||||
"confirmations.discard_edit_media.confirm": "Descartar",
|
||||
"confirmations.discard_edit_media.message": "Há mudanças não salvas na descrição ou pré-visualização da mídia. Descartar assim mesmo?",
|
||||
"confirmations.follow_to_list.confirm": "Seguir e adicionar à lista",
|
||||
|
|
@ -246,13 +246,13 @@
|
|||
"confirmations.logout.title": "Sair da sessão?",
|
||||
"confirmations.missing_alt_text.confirm": "Adicione texto alternativo",
|
||||
"confirmations.missing_alt_text.message": "Seu post contém mídia sem texto alternativo. Adicionar descrições ajuda a tornar seu conteúdo acessível para mais pessoas.",
|
||||
"confirmations.missing_alt_text.secondary": "Postar mesmo assim",
|
||||
"confirmations.missing_alt_text.secondary": "Publicar mesmo assim",
|
||||
"confirmations.missing_alt_text.title": "Adicionar texto alternativo?",
|
||||
"confirmations.mute.confirm": "Silenciar",
|
||||
"confirmations.private_quote_notify.cancel": "Voltar à edição",
|
||||
"confirmations.private_quote_notify.confirm": "Publicar postagem",
|
||||
"confirmations.private_quote_notify.confirm": "Publicar citação",
|
||||
"confirmations.private_quote_notify.do_not_show_again": "Não me mostre esta mensagem novamente",
|
||||
"confirmations.private_quote_notify.message": "A pessoa que está citando e outras menções serão notificadas e poderão ver sua postagem, mesmo que não sigam você.",
|
||||
"confirmations.private_quote_notify.message": "A pessoa que está sendo citada e outras mencionadas serão notificadas e poderão ver sua publicação, mesmo que não sigam você.",
|
||||
"confirmations.private_quote_notify.title": "Compartilhar com seguidores e usuários mencionados?",
|
||||
"confirmations.quiet_post_quote_info.dismiss": "Não me lembrar novamente",
|
||||
"confirmations.quiet_post_quote_info.got_it": "Entendi",
|
||||
|
|
@ -265,15 +265,15 @@
|
|||
"confirmations.remove_from_followers.message": "{name} vai parar de te seguir. Tem certeza de que deseja continuar?",
|
||||
"confirmations.remove_from_followers.title": "Remover seguidor?",
|
||||
"confirmations.revoke_quote.confirm": "Remover publicação",
|
||||
"confirmations.revoke_quote.message": "Essa ação não pode ser desfeita.",
|
||||
"confirmations.revoke_quote.message": "Esta ação não pode ser desfeita.",
|
||||
"confirmations.revoke_quote.title": "Remover publicação?",
|
||||
"confirmations.unblock.confirm": "Desbloquear",
|
||||
"confirmations.unblock.title": "Desbloquear {name}?",
|
||||
"confirmations.unfollow.confirm": "Deixar de seguir",
|
||||
"confirmations.unfollow.title": "Deixar de seguir {name}?",
|
||||
"confirmations.withdraw_request.confirm": "Retirar solicitação",
|
||||
"confirmations.withdraw_request.title": "Cancelar solicitação para seguir {name}?",
|
||||
"content_warning.hide": "Ocultar post",
|
||||
"confirmations.withdraw_request.title": "Retirar solicitação para seguir {name}?",
|
||||
"content_warning.hide": "Ocultar publicação",
|
||||
"content_warning.show": "Mostrar mesmo assim",
|
||||
"content_warning.show_more": "Mostrar mais",
|
||||
"conversation.delete": "Excluir conversa",
|
||||
|
|
@ -291,7 +291,7 @@
|
|||
"disabled_account_banner.text": "Sua conta {disabledAccount} está desativada no momento.",
|
||||
"dismissable_banner.community_timeline": "Estas são as publicações públicas mais recentes das pessoas cujas contas são hospedadas por {domain}.",
|
||||
"dismissable_banner.dismiss": "Dispensar",
|
||||
"dismissable_banner.public_timeline": "Estas são as publicações mais recentes das pessoas no fediverse que as pessoas do {domain} seguem.",
|
||||
"dismissable_banner.public_timeline": "Estas são as publicações mais recentes das pessoas no fediverso que as pessoas do {domain} seguem.",
|
||||
"domain_block_modal.block": "Bloquear servidor",
|
||||
"domain_block_modal.block_account_instead": "Bloquear @{name}",
|
||||
"domain_block_modal.they_can_interact_with_old_posts": "Pessoas deste servidor podem interagir com suas publicações antigas.",
|
||||
|
|
@ -304,8 +304,8 @@
|
|||
"domain_pill.activitypub_lets_connect": "Ele permite que você se conecte e interaja com pessoas não apenas no Mastodon, mas também em diferentes aplicativos sociais.",
|
||||
"domain_pill.activitypub_like_language": "ActivityPub é como a linguagem que o Mastodon fala com outras redes sociais.",
|
||||
"domain_pill.server": "Servidor",
|
||||
"domain_pill.their_handle": "Seu identificador:",
|
||||
"domain_pill.their_server": "Sua casa digital, onde ficam todas as suas postagens.",
|
||||
"domain_pill.their_handle": "Identificador dele/a:",
|
||||
"domain_pill.their_server": "Casa digital dele/a, onde ficam todas as suas postagens.",
|
||||
"domain_pill.their_username": "Seu identificador exclusivo em seu servidor. É possível encontrar usuários com o mesmo nome de usuário em servidores diferentes.",
|
||||
"domain_pill.username": "Nome de usuário",
|
||||
"domain_pill.whats_in_a_handle": "O que há em um identificador?",
|
||||
|
|
@ -425,8 +425,8 @@
|
|||
"generic.saved": "Salvo",
|
||||
"getting_started.heading": "Primeiros passos",
|
||||
"hashtag.admin_moderation": "Abrir interface de moderação para #{name}",
|
||||
"hashtag.browse": "Buscar postagens em #{hashtag}",
|
||||
"hashtag.browse_from_account": "Procurar mensagens de @{name} em #{hashtag}",
|
||||
"hashtag.browse": "Buscar publicações em #{hashtag}",
|
||||
"hashtag.browse_from_account": "Buscar publicações de @{name} em #{hashtag}",
|
||||
"hashtag.column_header.tag_mode.all": "e {additional}",
|
||||
"hashtag.column_header.tag_mode.any": "ou {additional}",
|
||||
"hashtag.column_header.tag_mode.none": "sem {additional}",
|
||||
|
|
@ -445,11 +445,11 @@
|
|||
"hashtag.unfeature": "Não destacar no perfil",
|
||||
"hashtag.unfollow": "Parar de seguir hashtag",
|
||||
"hashtags.and_other": "…e {count, plural, one {}other {outros #}}",
|
||||
"hints.profiles.followers_may_be_missing": "Os seguidores deste perfil podem estar faltando.",
|
||||
"hints.profiles.follows_may_be_missing": "Os seguidores deste perfil podem estar faltando.",
|
||||
"hints.profiles.followers_may_be_missing": "Pode haver seguidores deste perfil faltando.",
|
||||
"hints.profiles.follows_may_be_missing": "Pode haver seguidos por este perfil faltando.",
|
||||
"hints.profiles.posts_may_be_missing": "É possível que algumas publicações deste perfil estejam faltando.",
|
||||
"hints.profiles.see_more_followers": "Ver mais seguidores no {domain}",
|
||||
"hints.profiles.see_more_follows": "Ver mais seguidores no {domain}",
|
||||
"hints.profiles.see_more_follows": "Ver mais seguidos no {domain}",
|
||||
"hints.profiles.see_more_posts": "Ver mais publicações em {domain}",
|
||||
"home.column_settings.show_quotes": "Mostrar citações",
|
||||
"home.column_settings.show_reblogs": "Mostrar boosts",
|
||||
|
|
@ -636,7 +636,7 @@
|
|||
"notification.moderation_warning.action_suspend": "Sua conta foi suspensa.",
|
||||
"notification.own_poll": "Sua enquete terminou",
|
||||
"notification.poll": "Uma enquete que você votou terminou",
|
||||
"notification.quoted_update": "{name} Editou um post seu",
|
||||
"notification.quoted_update": "{name} editou uma pulicação que você citou",
|
||||
"notification.reblog": "{name} deu boost no teu toot",
|
||||
"notification.reblog.name_and_others_with_link": "{name} e <a>{count, plural, one {# outra} other {# outras}}</a> impulsionaram a publicação",
|
||||
"notification.relationships_severance_event": "Conexões perdidas com {name}",
|
||||
|
|
@ -761,14 +761,14 @@
|
|||
"privacy.quote.limited": "{visibility} Citações limitadas",
|
||||
"privacy.unlisted.additional": "Isso se comporta exatamente como público, exceto que a publicação não aparecerá nos _feeds ao vivo_ ou nas _hashtags_, explorar, ou barra de busca, mesmo que você seja escolhido em toda a conta.",
|
||||
"privacy.unlisted.long": "Oculto para os resultados de pesquisa do Mastodon, tendências e linhas do tempo públicas",
|
||||
"privacy.unlisted.short": "Público silenciado",
|
||||
"privacy.unlisted.short": "Público silencioso",
|
||||
"privacy_policy.last_updated": "Atualizado {date}",
|
||||
"privacy_policy.title": "Política de privacidade",
|
||||
"quote_error.edit": "Citações não podem ser adicionadas durante a edição de uma publicação.",
|
||||
"quote_error.poll": "Citações não permitidas com enquetes.",
|
||||
"quote_error.private_mentions": "Citações não são permitidas com menções diretas.",
|
||||
"quote_error.quote": "Apenas uma citação por vez é permitido.",
|
||||
"quote_error.unauthorized": "Você não é autorizado a citar essa publicação.",
|
||||
"quote_error.quote": "Somente é permitida uma citação por vez.",
|
||||
"quote_error.unauthorized": "Você não tem autorização para citar essa publicação.",
|
||||
"quote_error.upload": "Citações não são permitidas com mídias anexadas.",
|
||||
"recommended": "Recomendado",
|
||||
"refresh": "Atualizar",
|
||||
|
|
@ -939,14 +939,14 @@
|
|||
"status.quotes.empty": "Ninguém citou essa publicação até agora. Quando alguém citar aparecerá aqui.",
|
||||
"status.quotes.local_other_disclaimer": "Citações rejeitadas pelo autor não serão exibidas.",
|
||||
"status.quotes.remote_other_disclaimer": "Apenas citações do {domain} têm a garantia de serem exibidas aqui. Citações rejeitadas pelo autor não serão exibidas.",
|
||||
"status.quotes_count": "{count, plural, one {{counter} mencionar} other {{counter} menções}}",
|
||||
"status.quotes_count": "{count, plural, one {{counter} citação} other {{counter} citações}}",
|
||||
"status.read_more": "Ler mais",
|
||||
"status.reblog": "Dar boost",
|
||||
"status.reblog_or_quote": "Acelerar ou citar",
|
||||
"status.reblog_or_quote": "Dar boost ou citar",
|
||||
"status.reblog_private": "Compartilhar novamente com seus seguidores",
|
||||
"status.reblogged_by": "{name} deu boost",
|
||||
"status.reblogs.empty": "Nada aqui. Quando alguém der boost, o usuário aparecerá aqui.",
|
||||
"status.reblogs_count": "{count, plural, one {{counter} impulsionar} other {{counter} impulsionados}}",
|
||||
"status.reblogs_count": "{count, plural, one {{counter} boost} other {{counter} boosts}}",
|
||||
"status.redraft": "Excluir e rascunhar",
|
||||
"status.remove_bookmark": "Remover do Salvos",
|
||||
"status.remove_favourite": "Remover dos favoritos",
|
||||
|
|
@ -1021,7 +1021,7 @@
|
|||
"video.volume_up": "Aumentar o volume",
|
||||
"visibility_modal.button_title": "Selecionar Visibilidade",
|
||||
"visibility_modal.direct_quote_warning.text": "Se salvar as configurações atuais, a cotação incorporada será convertida em um link.",
|
||||
"visibility_modal.direct_quote_warning.title": "Cotações não podem ser incorporadas em menções privadas",
|
||||
"visibility_modal.direct_quote_warning.title": "Citações não podem ser incorporadas em menções privadas",
|
||||
"visibility_modal.header": "Visibilidade e interação",
|
||||
"visibility_modal.helper.direct_quoting": "Menções privadas escritas no Mastodon.",
|
||||
"visibility_modal.helper.privacy_editing": "A visibilidade não pode ser alterada após uma publicação ser publicada.",
|
||||
|
|
|
|||
|
|
@ -157,6 +157,8 @@
|
|||
"bundle_modal_error.close": "Stäng",
|
||||
"bundle_modal_error.message": "Något gick fel när skärmen laddades.",
|
||||
"bundle_modal_error.retry": "Försök igen",
|
||||
"carousel.current": "<sr>Bild</sr>{current, number} / {max, number}",
|
||||
"carousel.slide": "Bild {current, number} av {max, number}",
|
||||
"closed_registrations.other_server_instructions": "Eftersom Mastodon är decentraliserat kan du skapa ett konto på en annan server och fortfarande interagera med denna.",
|
||||
"closed_registrations_modal.description": "Det är för närvarande inte möjligt att skapa ett konto på {domain} men kom ihåg att du inte behöver ett konto specifikt på {domain} för att använda Mastodon.",
|
||||
"closed_registrations_modal.find_another_server": "Hitta en annan server",
|
||||
|
|
@ -902,6 +904,7 @@
|
|||
"status.edited_x_times": "Redigerad {count, plural, one {{count} gång} other {{count} gånger}}",
|
||||
"status.embed": "Hämta kod för inbäddning",
|
||||
"status.favourite": "Favoritmarkera",
|
||||
"status.favourites_count": "{count, plural, one {{counter} favorit} other {{counter} favoriter}}",
|
||||
"status.filter": "Filtrera detta inlägg",
|
||||
"status.history.created": "{name} skapade {date}",
|
||||
"status.history.edited": "{name} redigerade {date}",
|
||||
|
|
@ -929,16 +932,21 @@
|
|||
"status.quote_error.revoked": "Inlägg borttaget av författaren",
|
||||
"status.quote_followers_only": "Detta inlägg kan bara citeras av följare",
|
||||
"status.quote_manual_review": "Författaren kommer att granska manuellt",
|
||||
"status.quote_noun": "Citat",
|
||||
"status.quote_policy_change": "Ändra vem som kan citera",
|
||||
"status.quote_post_author": "Citerade ett inlägg av @{name}",
|
||||
"status.quote_private": "Privata inlägg kan inte citeras",
|
||||
"status.quotes.empty": "Ingen har citerat detta inlägg än. När någon gör det kommer det att synas här.",
|
||||
"status.quotes.local_other_disclaimer": "Citat som avvisats av författaren kommer inte att visas.",
|
||||
"status.quotes.remote_other_disclaimer": "Endast citat från {domain} är garanterade att visas här. Citat som avvisats av författaren kommer inte att visas.",
|
||||
"status.quotes_count": "{count, plural, one {{counter} citat} other {{counter} citat}}",
|
||||
"status.read_more": "Läs mer",
|
||||
"status.reblog": "Boosta",
|
||||
"status.reblog_or_quote": "Boosta eller citera",
|
||||
"status.reblog_private": "Dela igen med dina följare",
|
||||
"status.reblogged_by": "{name} boostade",
|
||||
"status.reblogs.empty": "Ingen har boostat detta inlägg än. När någon gör det kommer de synas här.",
|
||||
"status.reblogs_count": "{count, plural, one {{counter} boost} other {{counter} boostar}}",
|
||||
"status.redraft": "Radera & gör om",
|
||||
"status.remove_bookmark": "Ta bort bokmärke",
|
||||
"status.remove_favourite": "Ta bort från Favoriter",
|
||||
|
|
@ -948,6 +956,7 @@
|
|||
"status.reply": "Svara",
|
||||
"status.replyAll": "Svara på tråden",
|
||||
"status.report": "Rapportera @{name}",
|
||||
"status.request_quote": "Begär att få citera",
|
||||
"status.revoke_quote": "Ta bort mitt inlägg från @{name}s inlägg",
|
||||
"status.sensitive_warning": "Känsligt innehåll",
|
||||
"status.share": "Dela",
|
||||
|
|
|
|||
|
|
@ -357,6 +357,7 @@
|
|||
"empty_column.notification_requests": "一扫而空!这里没有任何未读通知。当收到新的通知时,将根据你的设置显示在这里。",
|
||||
"empty_column.notifications": "你还没有收到过任何通知,快和其他用户互动吧。",
|
||||
"empty_column.public": "这里什么都没有!写一些公开的嘟文,或者关注其他服务器的用户后,这里就会有嘟文出现了",
|
||||
"error.no_hashtag_feed_access": "加入或登录以查看和关注此话题标签。",
|
||||
"error.unexpected_crash.explanation": "此页面无法正确显示,这可能是因为我们的代码中有错误,也可能是因为浏览器兼容问题。",
|
||||
"error.unexpected_crash.explanation_addons": "此页面无法正确显示,这个错误很可能是由浏览器附加组件或自动翻译工具造成的。",
|
||||
"error.unexpected_crash.next_steps": "刷新一下页面试试。如果没用,你可以换个浏览器或者用本地应用。",
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@
|
|||
"about.disclaimer": "Mastodon 是一個自由的開源軟體,是 Mastodon gGmbH 之註冊商標。",
|
||||
"about.domain_blocks.no_reason_available": "無法存取的原因",
|
||||
"about.domain_blocks.preamble": "Mastodon 基本上允許您瀏覽聯邦宇宙中任何伺服器的內容並與使用者互動。以下是於本伺服器上設定之例外。",
|
||||
"about.domain_blocks.silenced.explanation": "一般來說您不會看到來自這個伺服器的個人檔案與內容,除非您明確地打開或著跟隨此個人檔案。",
|
||||
"about.domain_blocks.silenced.explanation": "一般來說您不會看到來自這個伺服器的個人檔案與內容,除非您明確地檢視或著跟隨此個人檔案。",
|
||||
"about.domain_blocks.silenced.title": "已受限",
|
||||
"about.domain_blocks.suspended.explanation": "來自此伺服器的資料都不會被處理、儲存或交換,也無法和此伺服器上的使用者互動與交流。",
|
||||
"about.domain_blocks.suspended.title": "已停權",
|
||||
|
|
@ -90,7 +90,7 @@
|
|||
"account.unmute": "解除靜音 @{name}",
|
||||
"account.unmute_notifications_short": "解除靜音推播通知",
|
||||
"account.unmute_short": "解除靜音",
|
||||
"account_note.placeholder": "按此新增備註",
|
||||
"account_note.placeholder": "點擊以新增備註",
|
||||
"admin.dashboard.daily_retention": "註冊後使用者存留率(日)",
|
||||
"admin.dashboard.monthly_retention": "註冊後使用者存留率(月)",
|
||||
"admin.dashboard.retention.average": "平均",
|
||||
|
|
@ -138,10 +138,10 @@
|
|||
"block_modal.show_less": "減少顯示",
|
||||
"block_modal.show_more": "顯示更多",
|
||||
"block_modal.they_cant_mention": "他們無法提及或跟隨您。",
|
||||
"block_modal.they_cant_see_posts": "他們無法讀取您的嘟文,且您不會見到他們。",
|
||||
"block_modal.they_cant_see_posts": "他們無法讀取您的嘟文,且您不會見到他們的嘟文。",
|
||||
"block_modal.they_will_know": "他們能見到他們已被封鎖。",
|
||||
"block_modal.title": "是否封鎖該使用者?",
|
||||
"block_modal.you_wont_see_mentions": "您不會見到提及他們的嘟文。",
|
||||
"block_modal.you_wont_see_mentions": "您將不會見到提及他們的嘟文。",
|
||||
"boost_modal.combo": "您下次可以按 {combo} 跳過",
|
||||
"boost_modal.reblog": "是否要轉嘟?",
|
||||
"boost_modal.undo_reblog": "是否要取消轉嘟?",
|
||||
|
|
@ -181,7 +181,7 @@
|
|||
"column.home": "首頁",
|
||||
"column.list_members": "管理列表成員",
|
||||
"column.lists": "列表",
|
||||
"column.mutes": "已靜音的使用者",
|
||||
"column.mutes": "已靜音使用者",
|
||||
"column.notifications": "推播通知",
|
||||
"column.pins": "釘選的嘟文",
|
||||
"column.public": "聯邦時間軸",
|
||||
|
|
@ -193,9 +193,9 @@
|
|||
"column_header.show_settings": "顯示設定",
|
||||
"column_header.unpin": "取消釘選",
|
||||
"column_search.cancel": "取消",
|
||||
"community.column_settings.local_only": "只顯示本站",
|
||||
"community.column_settings.media_only": "只顯示媒體",
|
||||
"community.column_settings.remote_only": "只顯示遠端",
|
||||
"community.column_settings.local_only": "僅顯示本站",
|
||||
"community.column_settings.media_only": "僅顯示媒體",
|
||||
"community.column_settings.remote_only": "僅顯示遠端",
|
||||
"compose.error.blank_post": "嘟文無法為空白。",
|
||||
"compose.language.change": "變更語言",
|
||||
"compose.language.search": "搜尋語言...",
|
||||
|
|
@ -204,14 +204,14 @@
|
|||
"compose.saved.body": "已儲存嘟文。",
|
||||
"compose_form.direct_message_warning_learn_more": "了解更多",
|
||||
"compose_form.encryption_warning": "Mastodon 上的嘟文並未進行端到端加密。請不要透過 Mastodon 分享任何敏感資訊。",
|
||||
"compose_form.hashtag_warning": "由於這則嘟文設定為非公開,將不會列於任何主題標籤下。只有公開的嘟文才能藉由主題標籤被找到。",
|
||||
"compose_form.lock_disclaimer": "您的帳號尚未 {locked}。任何人皆能跟隨您並看到您設定成只對跟隨者顯示的嘟文。",
|
||||
"compose_form.hashtag_warning": "由於這則嘟文設定為「不公開」,它將不被列於任何主題標籤下。只有公開的嘟文才能藉由主題標籤被找到。",
|
||||
"compose_form.lock_disclaimer": "您的帳號尚未 {locked}。任何人皆能跟隨您並看到您設定成僅有跟隨者可見的嘟文。",
|
||||
"compose_form.lock_disclaimer.lock": "上鎖",
|
||||
"compose_form.placeholder": "正在想些什麼嗎?",
|
||||
"compose_form.poll.duration": "投票期限",
|
||||
"compose_form.poll.multiple": "多選",
|
||||
"compose_form.poll.option_placeholder": "選項 {number}",
|
||||
"compose_form.poll.single": "單一選擇",
|
||||
"compose_form.poll.single": "單選",
|
||||
"compose_form.poll.switch_to_multiple": "變更投票為允許多個選項",
|
||||
"compose_form.poll.switch_to_single": "變更投票為允許單一選項",
|
||||
"compose_form.poll.type": "投票方式",
|
||||
|
|
@ -231,7 +231,7 @@
|
|||
"confirmations.delete_list.title": "是否刪除該列表?",
|
||||
"confirmations.discard_draft.confirm": "捨棄並繼續",
|
||||
"confirmations.discard_draft.edit.cancel": "恢復編輯",
|
||||
"confirmations.discard_draft.edit.message": "繼續將會捨棄任何您對正在編輯的此嘟文進行之任何變更。",
|
||||
"confirmations.discard_draft.edit.message": "繼續將捨棄任何您對正在編輯的此嘟文進行之任何變更。",
|
||||
"confirmations.discard_draft.edit.title": "是否捨棄對您的嘟文之變更?",
|
||||
"confirmations.discard_draft.post.cancel": "恢復草稿",
|
||||
"confirmations.discard_draft.post.message": "繼續將捨棄您正在撰寫中之嘟文。",
|
||||
|
|
@ -259,20 +259,20 @@
|
|||
"confirmations.quiet_post_quote_info.message": "當引用不於公開時間軸顯示之嘟文時,您的嘟文將自熱門時間軸隱藏。",
|
||||
"confirmations.quiet_post_quote_info.title": "引用不於公開時間軸顯示之嘟文",
|
||||
"confirmations.redraft.confirm": "刪除並重新編輯",
|
||||
"confirmations.redraft.message": "您確定要刪除這則嘟文並重新編輯嗎?您將失去這則嘟文之轉嘟及最愛,且對此嘟文之回覆會變成獨立的嘟文。",
|
||||
"confirmations.redraft.message": "您確定要刪除這則嘟文並重新編輯嗎?您將失去此嘟文之轉嘟及最愛,且對原嘟文之回覆將變成獨立嘟文。",
|
||||
"confirmations.redraft.title": "是否刪除並重新編輯該嘟文?",
|
||||
"confirmations.remove_from_followers.confirm": "移除跟隨者",
|
||||
"confirmations.remove_from_followers.message": "{name} 將會停止跟隨您。您確定要繼續嗎?",
|
||||
"confirmations.remove_from_followers.message": "{name} 將停止跟隨您。您確定要繼續嗎?",
|
||||
"confirmations.remove_from_followers.title": "是否移除該跟隨者?",
|
||||
"confirmations.revoke_quote.confirm": "移除嘟文",
|
||||
"confirmations.revoke_quote.message": "此動作無法復原。",
|
||||
"confirmations.revoke_quote.title": "您是否確定移除嘟文?",
|
||||
"confirmations.revoke_quote.title": "是否移除該嘟文?",
|
||||
"confirmations.unblock.confirm": "解除封鎖",
|
||||
"confirmations.unblock.title": "解除封鎖 {name}?",
|
||||
"confirmations.unblock.title": "是否解除封鎖 {name}?",
|
||||
"confirmations.unfollow.confirm": "取消跟隨",
|
||||
"confirmations.unfollow.title": "取消跟隨 {name}?",
|
||||
"confirmations.unfollow.title": "是否取消跟隨 {name}?",
|
||||
"confirmations.withdraw_request.confirm": "收回跟隨請求",
|
||||
"confirmations.withdraw_request.title": "收回對 {name} 之跟隨請求?",
|
||||
"confirmations.withdraw_request.title": "是否收回對 {name} 之跟隨請求?",
|
||||
"content_warning.hide": "隱藏嘟文",
|
||||
"content_warning.show": "仍要顯示",
|
||||
"content_warning.show_more": "顯示更多",
|
||||
|
|
@ -284,7 +284,7 @@
|
|||
"copypaste.copied": "已複製",
|
||||
"copypaste.copy_to_clipboard": "複製到剪貼簿",
|
||||
"directory.federated": "來自已知聯邦宇宙",
|
||||
"directory.local": "僅來自 {domain} 網域",
|
||||
"directory.local": "僅來自 {domain}",
|
||||
"directory.new_arrivals": "新人",
|
||||
"directory.recently_active": "最近活躍",
|
||||
"disabled_account_banner.account_settings": "帳號設定",
|
||||
|
|
@ -298,9 +298,9 @@
|
|||
"domain_block_modal.they_cant_follow": "來自此伺服器之使用者將無法跟隨您。",
|
||||
"domain_block_modal.they_wont_know": "他們不會知道他們已被封鎖。",
|
||||
"domain_block_modal.title": "是否封鎖該網域?",
|
||||
"domain_block_modal.you_will_lose_num_followers": "您將會失去 {followersCount, plural, other {{followersCountDisplay} 個跟隨者}} 與 {followingCount, plural, other {{followingCountDisplay} 個您跟隨之帳號}}.",
|
||||
"domain_block_modal.you_will_lose_num_followers": "您將失去 {followersCount, plural, other {{followersCountDisplay} 個跟隨者}} 與 {followingCount, plural, other {{followingCountDisplay} 個您跟隨之帳號}}。",
|
||||
"domain_block_modal.you_will_lose_relationships": "您將失去所有的跟隨者與您自此伺服器跟隨之帳號。",
|
||||
"domain_block_modal.you_wont_see_posts": "您不會見到來自此伺服器使用者之任何嘟文或推播通知。",
|
||||
"domain_block_modal.you_wont_see_posts": "您將不會見到來自此伺服器使用者之任何嘟文或推播通知。",
|
||||
"domain_pill.activitypub_lets_connect": "它使您能於 Mastodon 及其他不同的社群應用程式與人連結及互動。",
|
||||
"domain_pill.activitypub_like_language": "ActivityPub 像是 Mastodon 與其他社群網路溝通時所用的語言。",
|
||||
"domain_pill.server": "伺服器",
|
||||
|
|
@ -567,8 +567,8 @@
|
|||
"mute_modal.they_can_mention_and_follow": "他們仍可提及或跟隨您,但您不會見到他們。",
|
||||
"mute_modal.they_wont_know": "他們不會知道他們已被靜音。",
|
||||
"mute_modal.title": "是否靜音該使用者?",
|
||||
"mute_modal.you_wont_see_mentions": "您不會見到提及他們的嘟文。",
|
||||
"mute_modal.you_wont_see_posts": "他們仍可讀取您的嘟文,但您不會見到他們的。",
|
||||
"mute_modal.you_wont_see_mentions": "您將不會見到提及他們的嘟文。",
|
||||
"mute_modal.you_wont_see_posts": "他們仍可讀取您的嘟文,但您不會見到他們的嘟文。",
|
||||
"navigation_bar.about": "關於",
|
||||
"navigation_bar.account_settings": "密碼與安全性",
|
||||
"navigation_bar.administration": "管理介面",
|
||||
|
|
@ -631,7 +631,7 @@
|
|||
"notification.moderation_warning.action_disable": "您的帳號已被停用。",
|
||||
"notification.moderation_warning.action_mark_statuses_as_sensitive": "某些您的嘟文已被標記為敏感內容。",
|
||||
"notification.moderation_warning.action_none": "您的帳號已收到管理員警告。",
|
||||
"notification.moderation_warning.action_sensitive": "即日起,您的嘟文將會被標記為敏感內容。",
|
||||
"notification.moderation_warning.action_sensitive": "即日起,您的嘟文將被標記為敏感內容。",
|
||||
"notification.moderation_warning.action_silence": "您的帳號已被限制。",
|
||||
"notification.moderation_warning.action_suspend": "您的帳號已被停權。",
|
||||
"notification.own_poll": "您的投票已結束",
|
||||
|
|
@ -649,10 +649,10 @@
|
|||
"notification_requests.accept": "接受",
|
||||
"notification_requests.accept_multiple": "{count, plural, other {接受 # 則請求...}}",
|
||||
"notification_requests.confirm_accept_multiple.button": "{count, plural, other {接受請求}}",
|
||||
"notification_requests.confirm_accept_multiple.message": "您將接受 {count, plural, other {# 則推播通知請求}}。您確定要繼續?",
|
||||
"notification_requests.confirm_accept_multiple.message": "您將接受 {count, plural, other {# 則推播通知請求}}。您確定要繼續嗎?",
|
||||
"notification_requests.confirm_accept_multiple.title": "是否接受推播通知請求?",
|
||||
"notification_requests.confirm_dismiss_multiple.button": "{count, plural, other {忽略請求}}",
|
||||
"notification_requests.confirm_dismiss_multiple.message": "您將忽略 {count, plural, other {# 則推播通知請求}}。您將不再能輕易存取{count, plural, other {這些}}推播通知。您確定要繼續?",
|
||||
"notification_requests.confirm_dismiss_multiple.message": "您將忽略 {count, plural, other {# 則推播通知請求}}。您將不再能輕易存取{count, plural, other {這些}}推播通知。您確定要繼續嗎?",
|
||||
"notification_requests.confirm_dismiss_multiple.title": "是否忽略推播通知請求?",
|
||||
"notification_requests.dismiss": "關閉",
|
||||
"notification_requests.dismiss_multiple": "{count, plural, other {忽略 # 則請求...}}",
|
||||
|
|
@ -759,7 +759,7 @@
|
|||
"privacy.quote.anyone": "{visibility},任何人皆可引用",
|
||||
"privacy.quote.disabled": "{visibility},停用引用嘟文",
|
||||
"privacy.quote.limited": "{visibility},受限的引用嘟文",
|
||||
"privacy.unlisted.additional": "此與公開嘟文完全相同,但嘟文不會出現於即時內容或主題標籤、探索、及 Mastodon 搜尋中,即使您在帳戶設定中選擇加入。",
|
||||
"privacy.unlisted.additional": "此與公開嘟文完全相同,但嘟文不會出現於即時內容或主題標籤、探索、及 Mastodon 搜尋中,即使您於帳戶設定中選擇加入。",
|
||||
"privacy.unlisted.long": "不顯示於 Mastodon 之搜尋結果、熱門趨勢、及公開時間軸上",
|
||||
"privacy.unlisted.short": "不公開",
|
||||
"privacy_policy.last_updated": "最後更新:{date}",
|
||||
|
|
@ -792,7 +792,7 @@
|
|||
"reply_indicator.cancel": "取消",
|
||||
"reply_indicator.poll": "投票",
|
||||
"report.block": "封鎖",
|
||||
"report.block_explanation": "您將不再看到他們的嘟文。他們將無法看到您的嘟文或是跟隨您。他們會發現他們已被封鎖。",
|
||||
"report.block_explanation": "您將不再看到他們的嘟文。他們將無法檢視您的嘟文或是跟隨您。他們會發現他們已被封鎖。",
|
||||
"report.categories.legal": "合法性",
|
||||
"report.categories.other": "其他",
|
||||
"report.categories.spam": "垃圾訊息",
|
||||
|
|
@ -806,7 +806,7 @@
|
|||
"report.forward": "轉寄到 {target}",
|
||||
"report.forward_hint": "這個帳號屬於其他伺服器。要向該伺服器發送匿名的檢舉訊息嗎?",
|
||||
"report.mute": "靜音",
|
||||
"report.mute_explanation": "您將不再看到他們的嘟文。他們仍能可以跟隨您以及察看您的嘟文,並且不會知道他們已被靜音。",
|
||||
"report.mute_explanation": "您將不再看到他們的嘟文。他們仍能可以跟隨您以及檢視您的嘟文,並且不會知道他們已被靜音。",
|
||||
"report.next": "繼續",
|
||||
"report.placeholder": "其他備註",
|
||||
"report.reasons.dislike": "我不喜歡",
|
||||
|
|
@ -996,7 +996,7 @@
|
|||
"upload_error.limit": "已達到檔案上傳限制。",
|
||||
"upload_error.poll": "不允許於投票時上傳檔案。",
|
||||
"upload_error.quote": "引用嘟文無法上傳檔案。",
|
||||
"upload_form.drag_and_drop.instructions": "請按空白鍵或 Enter 鍵取多媒體附加檔案。使用方向鍵移動多媒體附加檔案。按下空白鍵或 Enter 鍵於新位置放置多媒體附加檔案,或按下 ESC 鍵取消。",
|
||||
"upload_form.drag_and_drop.instructions": "請按空白鍵或 Enter 鍵選取多媒體附加檔案。使用方向鍵移動多媒體附加檔案。按下空白鍵或 Enter 鍵於新位置放置多媒體附加檔案,或按下 ESC 鍵取消。",
|
||||
"upload_form.drag_and_drop.on_drag_cancel": "移動已取消。多媒體附加檔案 {item} 已被放置。",
|
||||
"upload_form.drag_and_drop.on_drag_end": "多媒體附加檔案 {item} 已被放置。",
|
||||
"upload_form.drag_and_drop.on_drag_over": "多媒體附加檔案 {item} 已被移動。",
|
||||
|
|
|
|||
|
|
@ -7699,6 +7699,8 @@ a.status-card {
|
|||
position: relative;
|
||||
background: $base-shadow-color;
|
||||
max-width: 100%;
|
||||
max-height: max(400px, 60vh);
|
||||
margin-inline: auto;
|
||||
border-radius: 8px;
|
||||
box-sizing: border-box;
|
||||
color: $white;
|
||||
|
|
|
|||
|
|
@ -122,7 +122,11 @@ $content-width: 840px;
|
|||
align-items: center;
|
||||
gap: 6px;
|
||||
padding: 15px;
|
||||
color: var(--color-text-secondary);
|
||||
color: color-mix(
|
||||
in oklab,
|
||||
var(--color-text-primary),
|
||||
var(--color-text-secondary)
|
||||
);
|
||||
text-decoration: none;
|
||||
transition: all 200ms linear;
|
||||
transition-property: color, background-color;
|
||||
|
|
|
|||
|
|
@ -4494,7 +4494,7 @@ a.status-card {
|
|||
z-index: 1;
|
||||
background: radial-gradient(
|
||||
ellipse,
|
||||
rgb(from var(--color-bg-brand-softer-base) r g b / 23%) 0%,
|
||||
rgb(from var(--color-bg-brand-base) r g b / 23%) 0%,
|
||||
transparent 60%
|
||||
);
|
||||
}
|
||||
|
|
@ -7492,6 +7492,8 @@ a.status-card {
|
|||
color: var(--color-text-on-media);
|
||||
background: var(--color-bg-media);
|
||||
max-width: 100%;
|
||||
max-height: max(400px, 60vh);
|
||||
margin-inline: auto;
|
||||
border-radius: 8px;
|
||||
box-sizing: border-box;
|
||||
display: flex;
|
||||
|
|
|
|||
|
|
@ -79,7 +79,7 @@
|
|||
|
||||
// Utility
|
||||
--color-bg-ambient: var(--color-bg-primary);
|
||||
--color-bg-elevated: var(--color-grey-800);
|
||||
--color-bg-elevated: var(--color-bg-primary);
|
||||
--color-bg-inverted: var(--color-grey-50);
|
||||
--color-bg-media-base: var(--color-black);
|
||||
--color-bg-media-strength: 65%;
|
||||
|
|
@ -87,7 +87,7 @@
|
|||
var(--color-bg-media-base),
|
||||
var(--color-bg-media-strength)
|
||||
)};
|
||||
--color-bg-overlay: var(--color-bg-primary);
|
||||
--color-bg-overlay: var(--color-black);
|
||||
--color-bg-disabled: var(--color-grey-700);
|
||||
|
||||
// Brand
|
||||
|
|
|
|||
|
|
@ -112,10 +112,12 @@ class AttachmentBatch
|
|||
keys.each_slice(LIMIT) do |keys_slice|
|
||||
logger.debug { "Deleting #{keys_slice.size} objects" }
|
||||
|
||||
bucket.delete_objects(delete: {
|
||||
objects: keys_slice.map { |key| { key: key } },
|
||||
quiet: true,
|
||||
})
|
||||
with_overridden_timeout(bucket.client, 120) do
|
||||
bucket.delete_objects(delete: {
|
||||
objects: keys_slice.map { |key| { key: key } },
|
||||
quiet: true,
|
||||
})
|
||||
end
|
||||
rescue => e
|
||||
retries += 1
|
||||
|
||||
|
|
@ -134,6 +136,20 @@ class AttachmentBatch
|
|||
@bucket ||= records.first.public_send(@attachment_names.first).s3_bucket
|
||||
end
|
||||
|
||||
# Currently, the aws-sdk-s3 gem does not offer a way to cleanly override the timeout
|
||||
# per-request. So we change the client's config instead. As this client will likely
|
||||
# be re-used for other jobs, restore its original configuration in an `ensure` block.
|
||||
def with_overridden_timeout(s3_client, longer_read_timeout)
|
||||
original_timeout = s3_client.config.http_read_timeout
|
||||
s3_client.config.http_read_timeout = [original_timeout, longer_read_timeout].max
|
||||
|
||||
begin
|
||||
yield
|
||||
ensure
|
||||
s3_client.config.http_read_timeout = original_timeout
|
||||
end
|
||||
end
|
||||
|
||||
def nullified_attributes
|
||||
@attachment_names.flat_map { |attachment_name| NULLABLE_ATTRIBUTES.map { |attribute| "#{attachment_name}_#{attribute}" } & klass.column_names }.index_with(nil)
|
||||
end
|
||||
|
|
|
|||
|
|
@ -27,6 +27,9 @@ class Collection < ApplicationRecord
|
|||
|
||||
validates :name, presence: true
|
||||
validates :description, presence: true
|
||||
validates :local, inclusion: [true, false]
|
||||
validates :sensitive, inclusion: [true, false]
|
||||
validates :discoverable, inclusion: [true, false]
|
||||
validates :uri, presence: true, if: :remote?
|
||||
validates :original_number_of_items,
|
||||
presence: true,
|
||||
|
|
|
|||
|
|
@ -38,9 +38,7 @@ class SessionActivation < ApplicationRecord
|
|||
end
|
||||
|
||||
def activate(**)
|
||||
activation = create!(**)
|
||||
purge_old
|
||||
activation
|
||||
create!(**).tap { purge_old }
|
||||
end
|
||||
|
||||
def deactivate(id)
|
||||
|
|
|
|||
|
|
@ -32,6 +32,12 @@ en-GB:
|
|||
attributes:
|
||||
url:
|
||||
invalid: is not a valid URL
|
||||
collection:
|
||||
attributes:
|
||||
collection_items:
|
||||
too_many: are too many, no more than %{count} are allowed
|
||||
tag:
|
||||
unusable: may not be used
|
||||
doorkeeper/application:
|
||||
attributes:
|
||||
website:
|
||||
|
|
|
|||
|
|
@ -32,6 +32,12 @@ fi:
|
|||
attributes:
|
||||
url:
|
||||
invalid: ei ole kelvollinen verkko-osoite
|
||||
collection:
|
||||
attributes:
|
||||
collection_items:
|
||||
too_many: on liian monta, enintään %{count} sallitaan
|
||||
tag:
|
||||
unusable: ei ole käytettävissä
|
||||
doorkeeper/application:
|
||||
attributes:
|
||||
website:
|
||||
|
|
|
|||
|
|
@ -32,6 +32,12 @@ it:
|
|||
attributes:
|
||||
url:
|
||||
invalid: non è un URL valido
|
||||
collection:
|
||||
attributes:
|
||||
collection_items:
|
||||
too_many: sono troppi, non sono consentiti più di %{count}
|
||||
tag:
|
||||
unusable: non può essere utilizzato
|
||||
doorkeeper/application:
|
||||
attributes:
|
||||
website:
|
||||
|
|
|
|||
|
|
@ -32,6 +32,12 @@ zh-CN:
|
|||
attributes:
|
||||
url:
|
||||
invalid: 网址无效
|
||||
collection:
|
||||
attributes:
|
||||
collection_items:
|
||||
too_many: 数量过多,不能多于 %{count} 个
|
||||
tag:
|
||||
unusable: 不可使用
|
||||
doorkeeper/application:
|
||||
attributes:
|
||||
website:
|
||||
|
|
|
|||
|
|
@ -66,7 +66,7 @@ da:
|
|||
disabled: Frosset
|
||||
display_name: Visningsnavn
|
||||
domain: Domæne
|
||||
edit: Redigere
|
||||
edit: Rediger
|
||||
email: E-mail
|
||||
email_status: E-mailstatus
|
||||
enable: Optø
|
||||
|
|
@ -1593,13 +1593,13 @@ da:
|
|||
invalid: Denne invitation er ikke gyldig
|
||||
invited_by: 'Du blev inviteret af:'
|
||||
max_uses:
|
||||
one: 1 benyttelse
|
||||
other: "%{count} benyttelser"
|
||||
one: 1 anvendelse
|
||||
other: "%{count} anvendelser"
|
||||
max_uses_prompt: Ubegrænset
|
||||
prompt: Generér og del links med andre for at give dem adgang til denne server
|
||||
table:
|
||||
expires_at: Udløber
|
||||
uses: Benyttelser
|
||||
uses: Anvendelser
|
||||
title: Invitér personer
|
||||
link_preview:
|
||||
author_html: Af %{name}
|
||||
|
|
@ -2122,7 +2122,7 @@ da:
|
|||
feature_audience_title: Opbyg et publikum i tillid
|
||||
feature_control: Man ved selv bedst, hvad man ønsker at se på sit hjemmefeed. Ingen algoritmer eller annoncer til at spilde tiden. Følg alle på tværs af enhver Mastodon-server fra en enkelt konto og modtag deres indlæg i kronologisk rækkefølge, og gør dette hjørne af internet lidt mere personligt.
|
||||
feature_control_title: Hold styr på egen tidslinje
|
||||
feature_creativity: Mastodon understøtter indlæg med lyd, video og billede, tilgængelighedsbeskrivelser, meningsmålinger, indhold advarsler, animerede avatarer, tilpassede emojis, miniaturebeskæringskontrol og mere, for at gøre det lettere at udtrykke sig online. Uanset om man udgiver sin kunst, musik eller podcast, så står Mastodon til rådighed.
|
||||
feature_creativity: Mastodon understøtter lyd-, video- og billedindlæg, tilgængelighedsbeskrivelser, afstemninger, indholdsadvarsler, animerede avatarer, brugerdefinerede emojis, kontrol over beskæring af miniaturebilleder og meget mere, så du lettere kan udtrykke dig online. Uanset om du udgiver din kunst, din musik eller din podcast, er Mastodon der for dig.
|
||||
feature_creativity_title: Uovertruffen kreativitet
|
||||
feature_moderation: Mastodon lægger beslutningstagning tilbage i brugerens hænder. Hver server opretter deres egne regler og reguleringer, som håndhæves lokalt og ikke ovenfra som virksomhedernes sociale medier, hvilket gør det til den mest fleksible mht. at reagere på behovene hos forskellige persongrupper. Deltag på en server med de regler, man er enige med, eller driv en egen server.
|
||||
feature_moderation_title: Moderering af måden, tingene bør være på
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@ en-GB:
|
|||
send_paranoid_instructions: If your email address exists in our database, you will receive an email with instructions for how to confirm your email address in a few minutes. Please check your spam folder if you didn't receive this email.
|
||||
failure:
|
||||
already_authenticated: You are already logged in.
|
||||
closed_registrations: Your registration attempt has been blocked due to a network policy. If you believe this is an error, contact %{email}.
|
||||
inactive: Your account is not activated yet.
|
||||
invalid: Invalid %{authentication_keys} or password.
|
||||
last_attempt: You have one more attempt before your account is locked.
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@ sv:
|
|||
send_paranoid_instructions: Om din e-postadress finns i vår databas får du ett mail med instruktioner för hur du bekräftar din e-postadress inom några minuter. Kontrollera din spammapp om du inte fick det e-postmeddelandet.
|
||||
failure:
|
||||
already_authenticated: Du har redan loggat in.
|
||||
closed_registrations: Ditt registreringsförsök har blivit blockerat på grund av en nätverkspolicy. Om du anser att detta är ett fel, kontakta %{email}.
|
||||
inactive: Ditt konto är ännu inte aktiverat.
|
||||
invalid: Ogiltig %{authentication_keys} eller lösenord.
|
||||
last_attempt: Du har ytterligare ett försök innan ditt konto är låst.
|
||||
|
|
|
|||
|
|
@ -190,6 +190,7 @@ en-GB:
|
|||
create_relay: Create Relay
|
||||
create_unavailable_domain: Create Unavailable Domain
|
||||
create_user_role: Create Role
|
||||
create_username_block: Create Username Rule
|
||||
demote_user: Demote User
|
||||
destroy_announcement: Delete Announcement
|
||||
destroy_canonical_email_block: Delete Email Block
|
||||
|
|
@ -203,6 +204,7 @@ en-GB:
|
|||
destroy_status: Delete Post
|
||||
destroy_unavailable_domain: Delete Unavailable Domain
|
||||
destroy_user_role: Destroy Role
|
||||
destroy_username_block: Delete Username Rule
|
||||
disable_2fa_user: Disable 2FA
|
||||
disable_custom_emoji: Disable Custom Emoji
|
||||
disable_relay: Disable Relay
|
||||
|
|
@ -237,6 +239,7 @@ en-GB:
|
|||
update_report: Update Report
|
||||
update_status: Update Post
|
||||
update_user_role: Update Role
|
||||
update_username_block: Update Username Rule
|
||||
actions:
|
||||
approve_appeal_html: "%{name} approved moderation decision appeal from %{target}"
|
||||
approve_user_html: "%{name} approved sign-up from %{target}"
|
||||
|
|
@ -255,6 +258,7 @@ en-GB:
|
|||
create_relay_html: "%{name} created a relay %{target}"
|
||||
create_unavailable_domain_html: "%{name} stopped delivery to domain %{target}"
|
||||
create_user_role_html: "%{name} created %{target} role"
|
||||
create_username_block_html: "%{name} added rule for usernames containing %{target}"
|
||||
demote_user_html: "%{name} demoted user %{target}"
|
||||
destroy_announcement_html: "%{name} deleted announcement %{target}"
|
||||
destroy_canonical_email_block_html: "%{name} unblocked email with the hash %{target}"
|
||||
|
|
@ -268,6 +272,7 @@ en-GB:
|
|||
destroy_status_html: "%{name} removed post by %{target}"
|
||||
destroy_unavailable_domain_html: "%{name} stopped delivery to domain %{target}"
|
||||
destroy_user_role_html: "%{name} deleted %{target} role"
|
||||
destroy_username_block_html: "%{name} removed rule for usernames containing %{target}"
|
||||
disable_2fa_user_html: "%{name} disabled two factor requirement for user %{target}"
|
||||
disable_custom_emoji_html: "%{name} disabled emoji %{target}"
|
||||
disable_relay_html: "%{name} disabled the relay %{target}"
|
||||
|
|
@ -302,6 +307,7 @@ en-GB:
|
|||
update_report_html: "%{name} updated report %{target}"
|
||||
update_status_html: "%{name} updated post by %{target}"
|
||||
update_user_role_html: "%{name} changed %{target} role"
|
||||
update_username_block_html: "%{name} updated rule for usernames containing %{target}"
|
||||
deleted_account: deleted account
|
||||
empty: No logs found.
|
||||
filter_by_action: Filter by action
|
||||
|
|
@ -790,6 +796,8 @@ en-GB:
|
|||
view_dashboard_description: Allows users to access the dashboard and various metrics
|
||||
view_devops: DevOps
|
||||
view_devops_description: Allows users to access Sidekiq and pgHero dashboards
|
||||
view_feeds: View live and topic feeds
|
||||
view_feeds_description: Allows users to access the live and topic feeds regardless of server settings
|
||||
title: Roles
|
||||
rules:
|
||||
add_new: Add rule
|
||||
|
|
@ -831,6 +839,7 @@ en-GB:
|
|||
title: Opt users out of search engine indexing by default
|
||||
discovery:
|
||||
follow_recommendations: Follow recommendations
|
||||
preamble: Surfacing interesting content is instrumental in onboarding new users who may not know anyone on Mastodon. Control how various discovery features work on your server.
|
||||
privacy: Privacy
|
||||
profile_directory: Profile directory
|
||||
public_timelines: Public timelines
|
||||
|
|
@ -841,6 +850,16 @@ en-GB:
|
|||
all: To everyone
|
||||
disabled: To no one
|
||||
users: To logged-in local users
|
||||
feed_access:
|
||||
modes:
|
||||
authenticated: Authenticated users only
|
||||
disabled: Require specific user role
|
||||
public: Everyone
|
||||
landing_page:
|
||||
values:
|
||||
about: About
|
||||
local_feed: Local feed
|
||||
trends: Trends
|
||||
registrations:
|
||||
moderation_recommandation: Please make sure you have an adequate and reactive moderation team before you open registrations to everyone!
|
||||
preamble: Control who can create an account on your server.
|
||||
|
|
@ -894,6 +913,7 @@ en-GB:
|
|||
no_status_selected: No posts were changed as none were selected
|
||||
open: Open post
|
||||
original_status: Original post
|
||||
quotes: Quotes
|
||||
reblogs: Reblogs
|
||||
replied_to_html: Replied to %{acct_link}
|
||||
status_changed: Post changed
|
||||
|
|
@ -901,6 +921,7 @@ en-GB:
|
|||
title: Account posts - @%{name}
|
||||
trending: Trending
|
||||
view_publicly: View publicly
|
||||
view_quoted_post: View quoted post
|
||||
visibility: Visibility
|
||||
with_media: With media
|
||||
strikes:
|
||||
|
|
@ -1084,6 +1105,25 @@ en-GB:
|
|||
other: Used by %{count} people over the last week
|
||||
title: Recommendations & Trends
|
||||
trending: Trending
|
||||
username_blocks:
|
||||
add_new: Add new
|
||||
block_registrations: Block registrations
|
||||
comparison:
|
||||
contains: Contains
|
||||
equals: Equals
|
||||
contains_html: Contains %{string}
|
||||
created_msg: Successfully created username rule
|
||||
delete: Delete
|
||||
edit:
|
||||
title: Edit username rule
|
||||
matches_exactly_html: Equals %{string}
|
||||
new:
|
||||
create: Create rule
|
||||
title: Create new username rule
|
||||
no_username_block_selected: No username rules were changed, as none were selected
|
||||
not_permitted: Not permitted
|
||||
title: Username rules
|
||||
updated_msg: Successfully updated username rule
|
||||
warning_presets:
|
||||
add_new: Add new
|
||||
delete: Delete
|
||||
|
|
@ -1156,7 +1196,10 @@ en-GB:
|
|||
hint_html: If you want to move from another account to this one, here you can create an alias, which is required before you can proceed with moving followers from the old account to this one. This action by itself is <strong>harmless and reversible</strong>. <strong>The account migration is initiated from the old account</strong>.
|
||||
remove: Unlink alias
|
||||
appearance:
|
||||
advanced_settings: Advanced settings
|
||||
animations_and_accessibility: Animations and accessibility
|
||||
boosting_preferences: Boosting preferences
|
||||
boosting_preferences_info_html: "<strong>Tip:</strong> Regardless of settings, <kbd>Shift</kbd> + <kbd>Click</kbd> on the %{icon} Boost icon will immediately boost."
|
||||
discovery: Discovery
|
||||
localization:
|
||||
body: Mastodon is translated by volunteers.
|
||||
|
|
@ -1558,6 +1601,13 @@ en-GB:
|
|||
expires_at: Expires
|
||||
uses: Uses
|
||||
title: Invite people
|
||||
link_preview:
|
||||
author_html: By %{name}
|
||||
potentially_sensitive_content:
|
||||
action: Click to show
|
||||
confirm_visit: Are you sure you wish to open this link?
|
||||
hide_button: Hide
|
||||
label: Potentially sensitive content
|
||||
lists:
|
||||
errors:
|
||||
limit: You have reached the maximum number of lists
|
||||
|
|
@ -1622,6 +1672,7 @@ en-GB:
|
|||
disabled_account: Your current account will not be fully usable afterwards. However, you will have access to data export as well as re-activation.
|
||||
followers: This action will move all followers from the current account to the new account
|
||||
only_redirect_html: Alternatively, you can <a href="%{path}">only put up a redirect on your profile</a>.
|
||||
other_data: No other data will be moved automatically (including your posts and the list of accounts you follow)
|
||||
redirect: Your current account's profile will be updated with a redirect notice and be excluded from searches
|
||||
moderation:
|
||||
title: Moderation
|
||||
|
|
@ -1657,6 +1708,10 @@ en-GB:
|
|||
title: New mention
|
||||
poll:
|
||||
subject: A poll by %{name} has ended
|
||||
quote:
|
||||
body: 'Your post was quoted by %{name}:'
|
||||
subject: "%{name} quoted your post"
|
||||
title: New quote
|
||||
reblog:
|
||||
body: 'Your post was boosted by %{name}:'
|
||||
subject: "%{name} boosted your post"
|
||||
|
|
@ -1705,6 +1760,9 @@ en-GB:
|
|||
self_vote: You cannot vote in your own polls
|
||||
too_few_options: must have more than one item
|
||||
too_many_options: can't contain more than %{max} items
|
||||
vote: Vote
|
||||
posting_defaults:
|
||||
explanation: These settings will be used as defaults when you create new posts, but you can edit them per post within the composer.
|
||||
preferences:
|
||||
other: Other
|
||||
posting_defaults: Posting defaults
|
||||
|
|
@ -1860,6 +1918,9 @@ en-GB:
|
|||
other: "%{count} videos"
|
||||
boosted_from_html: Boosted from %{acct_link}
|
||||
content_warning: 'Content warning: %{warning}'
|
||||
content_warnings:
|
||||
hide: Hide post
|
||||
show: Show more
|
||||
default_language: Same as interface language
|
||||
disallowed_hashtags:
|
||||
one: 'contained a disallowed hashtag: %{tags}'
|
||||
|
|
@ -1867,15 +1928,31 @@ en-GB:
|
|||
edited_at_html: Edited %{date}
|
||||
errors:
|
||||
in_reply_not_found: The post you are trying to reply to does not appear to exist.
|
||||
quoted_status_not_found: The post you are trying to quote does not appear to exist.
|
||||
quoted_user_not_mentioned: Cannot quote a non-mentioned user in a Private Mention post.
|
||||
over_character_limit: character limit of %{max} exceeded
|
||||
pin_errors:
|
||||
direct: Posts that are only visible to mentioned users cannot be pinned
|
||||
limit: You have already pinned the maximum number of posts
|
||||
ownership: Someone else's post cannot be pinned
|
||||
reblog: A boost cannot be pinned
|
||||
quote_error:
|
||||
not_available: Post unavailable
|
||||
pending_approval: Post pending
|
||||
revoked: Post removed by author
|
||||
quote_policies:
|
||||
followers: Followers only
|
||||
nobody: Just me
|
||||
public: Anyone
|
||||
quote_post_author: Quoted a post by %{acct}
|
||||
title: '%{name}: "%{quote}"'
|
||||
visibilities:
|
||||
direct: Private mention
|
||||
private: Followers only
|
||||
public: Public
|
||||
public_long: Anyone on and off Mastodon
|
||||
unlisted: Quiet public
|
||||
unlisted_long: Hidden from Mastodon search results, trending, and public timelines
|
||||
statuses_cleanup:
|
||||
enabled: Automatically delete old posts
|
||||
enabled_hint: Automatically deletes your posts once they reach a specified age threshold, unless they match one of the exceptions below
|
||||
|
|
|
|||
|
|
@ -227,7 +227,7 @@ da:
|
|||
inbox_url: URL til videreformidlingsindbakken
|
||||
irreversible: Fjern istedet for skjul
|
||||
locale: Grænsefladesprog
|
||||
max_uses: Maks. antal afbenyttelser
|
||||
max_uses: Maks. antal anvendelser
|
||||
new_password: Ny adgangskode
|
||||
note: Biografi
|
||||
otp_attempt: Tofaktorkode
|
||||
|
|
|
|||
|
|
@ -54,13 +54,18 @@ en-GB:
|
|||
password: Use at least 8 characters
|
||||
phrase: Will be matched regardless of casing in text or content warning of a post
|
||||
scopes: Which APIs the application will be allowed to access. If you select a top-level scope, you don't need to select individual ones.
|
||||
setting_advanced_layout: Display Mastodon as a multi-column layout, allowing you to view the timeline, notifications, and a third column of your choosing. Not recommended for smaller screens.
|
||||
setting_aggregate_reblogs: Do not show new boosts for posts that have been recently boosted (only affects newly-received boosts)
|
||||
setting_always_send_emails: Normally e-mail notifications won't be sent when you are actively using Mastodon
|
||||
setting_boost_modal: When enabled, boosting will first open a confirmation dialogue in which you can change the visibility of your boost.
|
||||
setting_default_quote_policy_private: Followers-only posts authored on Mastodon can't be quoted by others.
|
||||
setting_default_quote_policy_unlisted: When people quote you, their post will also be hidden from trending timelines.
|
||||
setting_default_sensitive: Sensitive media is hidden by default and can be revealed with a click
|
||||
setting_display_media_default: Hide media marked as sensitive
|
||||
setting_display_media_hide_all: Always hide media
|
||||
setting_display_media_show_all: Always show media
|
||||
setting_emoji_style: How to display emojis. "Auto" will try using native emoji, but falls back to Twemoji for legacy browsers.
|
||||
setting_quick_boosting_html: When enabled, clicking on the %{boost_icon} Boost icon will immediately boost instead of opening the boost/quote dropdown menu. Relocates the quoting action to the %{options_icon} (Options) menu.
|
||||
setting_system_scrollbars_ui: Applies only to desktop browsers based on Safari and Chrome
|
||||
setting_use_blurhash: Gradients are based on the colors of the hidden visuals but obfuscate any details
|
||||
setting_use_pending_items: Hide timeline updates behind a click instead of automatically scrolling the feed
|
||||
|
|
@ -74,6 +79,7 @@ en-GB:
|
|||
featured_tag:
|
||||
name: 'Here are some of the hashtags you used the most recently:'
|
||||
filters:
|
||||
action: Choose which action to perform when a post matches the filter
|
||||
actions:
|
||||
blur: Hide media behind a warning, without hiding the text itself
|
||||
hide: Completely hide the filtered content, behaving as if it did not exist
|
||||
|
|
@ -82,10 +88,12 @@ en-GB:
|
|||
activity_api_enabled: Counts of locally published posts, active users, and new registrations in weekly buckets
|
||||
app_icon: WEBP, PNG, GIF or JPG. Overrides the default app icon on mobile devices with a custom icon.
|
||||
backups_retention_period: Users have the ability to generate archives of their posts to download later. When set to a positive value, these archives will be automatically deleted from your storage after the specified number of days.
|
||||
bootstrap_timeline_accounts: These accounts will be pinned to the top of new users' follow recommendations. Provide a comma-separated list of accounts.
|
||||
closed_registrations_message: Displayed when sign-ups are closed
|
||||
content_cache_retention_period: All posts from other servers (including boosts and replies) will be deleted after the specified number of days, without regard to any local user interaction with those posts. This includes posts where a local user has marked it as bookmarks or favorites. Private mentions between users from different instances will also be lost and impossible to restore. Use of this setting is intended for special purpose instances and breaks many user expectations when implemented for general purpose use.
|
||||
custom_css: You can apply custom styles on the web version of Mastodon.
|
||||
favicon: WEBP, PNG, GIF or JPG. Overrides the default Mastodon favicon with a custom icon.
|
||||
landing_page: Selects what page new visitors see when they first arrive on your server. If you select "Trends", then Trends needs to be enabled in the Discovery Settings. If you select "Local feed", then "Access to live feeds featuring local posts" needs to be set to "Everyone" in the Discovery Settings.
|
||||
mascot: Overrides the illustration in the advanced web interface.
|
||||
media_cache_retention_period: Media files from posts made by remote users are cached on your server. When set to a positive value, media will be deleted after the specified number of days. If the media data is requested after it is deleted, it will be re-downloaded, if the source content is still available. Due to restrictions on how often link preview cards poll third-party sites, it is recommended to set this value to at least 14 days, or link preview cards will not be updated on demand before that time.
|
||||
min_age: Users will be asked to confirm their date of birth during sign-up
|
||||
|
|
@ -145,6 +153,9 @@ en-GB:
|
|||
min_age: Should not be below the minimum age required by the laws of your jurisdiction.
|
||||
user:
|
||||
chosen_languages: When checked, only posts in selected languages will be displayed in public timelines
|
||||
date_of_birth:
|
||||
one: We have to make sure you're at least %{count} to use %{domain}. We won't store this.
|
||||
other: We have to make sure you're at least %{count} to use %{domain}. We won't store this.
|
||||
role: The role controls which permissions the user has.
|
||||
user_role:
|
||||
color: Color to be used for the role throughout the UI, as RGB in hex format
|
||||
|
|
@ -152,6 +163,10 @@ en-GB:
|
|||
name: Public name of the role, if role is set to be displayed as a badge
|
||||
permissions_as_keys: Users with this role will have access to...
|
||||
position: Higher role decides conflict resolution in certain situations. Certain actions can only be performed on roles with a lower priority
|
||||
username_block:
|
||||
allow_with_approval: Instead of preventing sign-up outright, matching sign-ups will require your approval
|
||||
comparison: Please be mindful of the Scunthorpe Problem when blocking partial matches
|
||||
username: Will be matched regardless of casing and common homoglyphs like "4" for "a" or "3" for "e"
|
||||
webhook:
|
||||
events: Select events to send
|
||||
template: Compose your own JSON payload using variable interpolation. Leave blank for default JSON.
|
||||
|
|
@ -222,9 +237,12 @@ en-GB:
|
|||
setting_aggregate_reblogs: Group boosts in timelines
|
||||
setting_always_send_emails: Always send e-mail notifications
|
||||
setting_auto_play_gif: Auto-play animated GIFs
|
||||
setting_boost_modal: Control boosting visibility
|
||||
setting_default_language: Posting language
|
||||
setting_default_privacy: Posting visibility
|
||||
setting_default_quote_policy: Who can quote
|
||||
setting_default_sensitive: Always mark media as sensitive
|
||||
setting_delete_modal: Warn me before deleting a post
|
||||
setting_disable_hover_cards: Disable profile preview on hover
|
||||
setting_disable_swiping: Disable swiping motions
|
||||
setting_display_media: Media display
|
||||
|
|
@ -234,6 +252,8 @@ en-GB:
|
|||
setting_emoji_style: Emoji style
|
||||
setting_expand_spoilers: Always expand posts marked with content warnings
|
||||
setting_hide_network: Hide your social graph
|
||||
setting_missing_alt_text_modal: Warn me before posting media without alt text
|
||||
setting_quick_boosting: Enable quick boosting
|
||||
setting_reduce_motion: Reduce motion in animations
|
||||
setting_system_font_ui: Use system's default font
|
||||
setting_system_scrollbars_ui: Use system's default scrollbar
|
||||
|
|
@ -267,12 +287,17 @@ en-GB:
|
|||
content_cache_retention_period: Remote content retention period
|
||||
custom_css: Custom CSS
|
||||
favicon: Favicon
|
||||
landing_page: Landing page for new visitors
|
||||
local_live_feed_access: Access to live feeds featuring local posts
|
||||
local_topic_feed_access: Access to hashtag and link feeds featuring local posts
|
||||
mascot: Custom mascot (legacy)
|
||||
media_cache_retention_period: Media cache retention period
|
||||
min_age: Minimum age requirement
|
||||
peers_api_enabled: Publish list of discovered servers in the API
|
||||
profile_directory: Enable profile directory
|
||||
registrations_mode: Who can sign-up
|
||||
remote_live_feed_access: Access to live feeds featuring remote posts
|
||||
remote_topic_feed_access: Access to hashtag and link feeds featuring remote posts
|
||||
require_invite_text: Require a reason to join
|
||||
show_domain_blocks: Show domain blocks
|
||||
show_domain_blocks_rationale: Show why domains were blocked
|
||||
|
|
@ -311,6 +336,7 @@ en-GB:
|
|||
follow_request: Someone requested to follow you
|
||||
mention: Someone mentioned you
|
||||
pending_account: New account needs review
|
||||
quote: Someone quoted you
|
||||
reblog: Someone boosted your post
|
||||
report: New report is submitted
|
||||
software_updates:
|
||||
|
|
@ -346,7 +372,9 @@ en-GB:
|
|||
jurisdiction: Legal jurisdiction
|
||||
min_age: Minimum age
|
||||
user:
|
||||
date_of_birth_1i: Year
|
||||
date_of_birth_2i: Month
|
||||
date_of_birth_3i: Day
|
||||
role: Role
|
||||
time_zone: Time Zone
|
||||
user_role:
|
||||
|
|
@ -355,6 +383,10 @@ en-GB:
|
|||
name: Name
|
||||
permissions_as_keys: Permissions
|
||||
position: Priority
|
||||
username_block:
|
||||
allow_with_approval: Allow registrations with approval
|
||||
comparison: Method of comparison
|
||||
username: Word to match
|
||||
webhook:
|
||||
events: Enabled events
|
||||
template: Payload template
|
||||
|
|
|
|||
|
|
@ -57,7 +57,7 @@ pt-BR:
|
|||
setting_advanced_layout: Exiba o Mastodon em um layout de várias colunas, permitindo que você visualize a linha do tempo, as notificações e uma terceira coluna de sua escolha. Não recomendado para telas menores.
|
||||
setting_aggregate_reblogs: Não mostrar novos impulsos para publicações que já foram impulsionadas recentemente (afeta somente os impulsos mais recentes)
|
||||
setting_always_send_emails: Normalmente, as notificações por e-mail não serão enviadas enquanto você estiver usando ativamente o Mastodon
|
||||
setting_boost_modal: Quando ativada, a função de impulsionar primeiro abrirá uma caixa de diálogo de confirmação na qual você poderá alterar a visibilidade do seu impulsionamento.
|
||||
setting_boost_modal: Quando ativada, a função de impulsionar primeiro abrirá uma caixa de diálogo de confirmação onde você poderá alterar a visibilidade do seu impulsionamento.
|
||||
setting_default_quote_policy_private: Publicações exclusivas de seguidores criadas no Mastodon não podem ser citadas por outras pessoas.
|
||||
setting_default_quote_policy_unlisted: Quando as pessoas citarem você, suas publicações também ficarão ocultas da linha do tempo.
|
||||
setting_default_sensitive: Mídia sensível está oculta por padrão e pode ser revelada com um clique
|
||||
|
|
|
|||
|
|
@ -57,6 +57,7 @@ sv:
|
|||
setting_advanced_layout: Visa Mastodon med en layout med flera kolumner, så att du kan se tidslinjen, aviseringar, och en tredje kolumn som du väljer själv. Rekommenderas inte för mindre skärmar.
|
||||
setting_aggregate_reblogs: Visa inte nya boostar för inlägg som nyligen blivit boostade (påverkar endast nymottagna boostar)
|
||||
setting_always_send_emails: E-postnotiser kommer vanligtvis inte skickas när du aktivt använder Mastodon
|
||||
setting_boost_modal: När den är aktiverad kommer boostningen först att öppna en dialogruta där du kan ändra synligheten på din boost.
|
||||
setting_default_sensitive: Känslig media döljs som standard och kan visas med ett klick
|
||||
setting_display_media_default: Dölj media markerad som känslig
|
||||
setting_display_media_hide_all: Dölj alltid all media
|
||||
|
|
|
|||
|
|
@ -796,6 +796,8 @@ sv:
|
|||
view_dashboard_description: Ger användare tillgång till instrumentpanelen och olika mätvärden
|
||||
view_devops: DevOps
|
||||
view_devops_description: Ger användare tillgång till instrumentpanelerna Sidekiq och pgHero
|
||||
view_feeds: Visa live- och ämnesflöden
|
||||
view_feeds_description: Ger användare tillgång till live-och ämnesflöden oavsett serverinställningar
|
||||
title: Roller
|
||||
rules:
|
||||
add_new: Lägg till regel
|
||||
|
|
@ -837,6 +839,7 @@ sv:
|
|||
title: Undantag användare från sökmotorindexering som standard
|
||||
discovery:
|
||||
follow_recommendations: Följrekommendationer
|
||||
preamble: Att visa intressant innehåll är avgörande för nya användare som kanske inte känner någon på Mastodon. Styr hur olika upptäcktsfunktioner fungerar på din Server.
|
||||
privacy: Integritet
|
||||
profile_directory: Profilkatalog
|
||||
public_timelines: Offentliga tidslinjer
|
||||
|
|
@ -847,6 +850,16 @@ sv:
|
|||
all: Till alla
|
||||
disabled: För ingen
|
||||
users: För inloggade lokala användare
|
||||
feed_access:
|
||||
modes:
|
||||
authenticated: Endast autentiserade användare
|
||||
disabled: Kräv specifik användarroll
|
||||
public: Alla
|
||||
landing_page:
|
||||
values:
|
||||
about: Om
|
||||
local_feed: Lokalt flöde
|
||||
trends: Trender
|
||||
registrations:
|
||||
moderation_recommandation: Se till att du har ett tillräckligt och reaktivt modereringsteam innan du öppnar registreringar till alla!
|
||||
preamble: Kontrollera vem som kan skapa ett konto på din server.
|
||||
|
|
@ -900,6 +913,7 @@ sv:
|
|||
no_status_selected: Inga inlägg ändrades eftersom inga valdes
|
||||
open: Öppna inlägg
|
||||
original_status: Ursprungligt inlägg
|
||||
quotes: Citat
|
||||
reblogs: Ombloggningar
|
||||
replied_to_html: Svarade på %{acct_link}
|
||||
status_changed: Inlägg ändrat
|
||||
|
|
@ -907,6 +921,7 @@ sv:
|
|||
title: Kontoinlägg - @%{name}
|
||||
trending: Trendande
|
||||
view_publicly: Visa offentligt
|
||||
view_quoted_post: Visa citerat inlägg
|
||||
visibility: Synlighet
|
||||
with_media: Med media
|
||||
strikes:
|
||||
|
|
@ -1181,7 +1196,10 @@ sv:
|
|||
hint_html: Om du vill flytta från ett annat konto till detta kan du skapa ett alias här, detta krävs innan du kan fortsätta med att flytta följare från det gamla kontot till detta. Denna åtgärd är <strong>ofarlig och kan ångras</strong>. <strong>Kontomigreringen initieras från det gamla kontot.</strong>.
|
||||
remove: Avlänka alias
|
||||
appearance:
|
||||
advanced_settings: Avancerade inställningar
|
||||
animations_and_accessibility: Animationer och tillgänglighet
|
||||
boosting_preferences: Boostinställningar
|
||||
boosting_preferences_info_html: "<strong>Tips:</strong> Oavsett inställningar kommer <kbd>Skifttangenten</kbd> + <kbd>Klick</kbd> på %{icon} boostikonen att boosta omedelbart."
|
||||
discovery: Upptäck
|
||||
localization:
|
||||
body: Mastodon översätts av volontärer.
|
||||
|
|
@ -1583,6 +1601,13 @@ sv:
|
|||
expires_at: Utgår
|
||||
uses: Användningar
|
||||
title: Bjud in andra
|
||||
link_preview:
|
||||
author_html: Av %{name}
|
||||
potentially_sensitive_content:
|
||||
action: Klicka för att visa
|
||||
confirm_visit: Är du säker på att du vill öppna den här länken?
|
||||
hide_button: Dölj
|
||||
label: Potentiellt känsligt innehåll
|
||||
lists:
|
||||
errors:
|
||||
limit: Du har nått det maximala antalet listor
|
||||
|
|
@ -1647,6 +1672,7 @@ sv:
|
|||
disabled_account: Ditt nuvarande konto kommer inte att kunna användas fullt ut efteråt. Du kommer dock att ha tillgång till dataexport samt återaktivering.
|
||||
followers: Den här åtgärden kommer att flytta alla följare från det nuvarande kontot till det nya kontot
|
||||
only_redirect_html: Alternativt kan du <a href="%{path}">bara sätta upp en omdirigering på din profil</a>.
|
||||
other_data: Inga andra data kommer att flyttas automatiskt (inklusive dina inlägg och listan över konton du följer)
|
||||
redirect: Ditt nuvarande kontos profil kommer att uppdateras med ett meddelande om omdirigering och uteslutas från sökningar
|
||||
moderation:
|
||||
title: Moderera
|
||||
|
|
@ -1735,6 +1761,8 @@ sv:
|
|||
too_few_options: måste ha mer än ett objekt
|
||||
too_many_options: kan inte innehålla mer än %{max} objekt
|
||||
vote: Rösta
|
||||
posting_defaults:
|
||||
explanation: Dessa inställningar kommer att användas som standard när du skapar nya inlägg, men du kan redigera dem per inlägg i kompositören.
|
||||
preferences:
|
||||
other: Annat
|
||||
posting_defaults: Standardinställningar för inlägg
|
||||
|
|
@ -1890,6 +1918,9 @@ sv:
|
|||
other: "%{count} videor"
|
||||
boosted_from_html: Boostad från %{acct_link}
|
||||
content_warning: 'Innehållsvarning: %{warning}'
|
||||
content_warnings:
|
||||
hide: Dölj inlägg
|
||||
show: Visa mer
|
||||
default_language: Samma som användargränssnittet
|
||||
disallowed_hashtags:
|
||||
one: 'innehöll en otillåten hashtag: %{tags}'
|
||||
|
|
@ -1898,15 +1929,30 @@ sv:
|
|||
errors:
|
||||
in_reply_not_found: Inlägget du försöker svara på verkar inte existera.
|
||||
quoted_status_not_found: Inlägget du försöker svara på verkar inte existera.
|
||||
quoted_user_not_mentioned: Kan inte citera en icke-omnämnt användare i ett privat omnämnandeinlägg.
|
||||
over_character_limit: teckengräns på %{max} har överskridits
|
||||
pin_errors:
|
||||
direct: Inlägg som endast är synliga för nämnda användare kan inte fästas
|
||||
limit: Du har redan fäst det maximala antalet inlägg
|
||||
ownership: Någon annans inlägg kan inte fästas
|
||||
reblog: En boost kan inte fästas
|
||||
quote_error:
|
||||
not_available: Inlägg ej tillgängligt
|
||||
pending_approval: Väntande inlägg
|
||||
revoked: Inlägg borttaget av författaren
|
||||
quote_policies:
|
||||
followers: Endast följare
|
||||
nobody: Bara jag
|
||||
public: Alla
|
||||
quote_post_author: Citerade ett inlägg av %{acct}
|
||||
title: '%{name}: "%{quote}"'
|
||||
visibilities:
|
||||
direct: Privat omnämnande
|
||||
private: Endast följare
|
||||
public: Offentlig
|
||||
public_long: Alla på och utanför Mastodon
|
||||
unlisted: Offentlig (begränsad)
|
||||
unlisted_long: Dold från Mastodon-sökresultat, trendar och offentliga tidslinjer
|
||||
statuses_cleanup:
|
||||
enabled: Ta automatiskt bort gamla inlägg
|
||||
enabled_hint: Raderar dina inlägg automatiskt när de når en specifik ålder, såvida de inte matchar något av undantagen nedan
|
||||
|
|
|
|||
|
|
@ -62,6 +62,8 @@ module Mastodon::CLI
|
|||
AND NOT EXISTS (SELECT 1 FROM mentions WHERE statuses.id = mentions.status_id AND mentions.account_id IN (SELECT accounts.id FROM accounts WHERE domain IS NULL))
|
||||
AND NOT EXISTS (SELECT 1 FROM favourites WHERE statuses.id = favourites.status_id AND favourites.account_id IN (SELECT accounts.id FROM accounts WHERE domain IS NULL))
|
||||
AND NOT EXISTS (SELECT 1 FROM bookmarks WHERE statuses.id = bookmarks.status_id AND bookmarks.account_id IN (SELECT accounts.id FROM accounts WHERE domain IS NULL))
|
||||
AND NOT EXISTS (SELECT 1 FROM quotes JOIN statuses statuses1 ON quotes.status_id = statuses1.id WHERE quotes.quoted_status_id = statuses.id AND (statuses1.uri IS NULL OR statuses1.local))
|
||||
AND NOT EXISTS (SELECT 1 FROM quotes JOIN statuses statuses1 ON quotes.quoted_status_id = statuses1.id WHERE quotes.status_id = statuses.id AND (statuses1.uri IS NULL OR statuses1.local))
|
||||
#{clean_followed_sql}
|
||||
SQL
|
||||
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"name": "@mastodon/mastodon",
|
||||
"license": "AGPL-3.0-or-later",
|
||||
"packageManager": "yarn@4.10.3",
|
||||
"packageManager": "yarn@4.12.0",
|
||||
"engines": {
|
||||
"node": ">=20"
|
||||
},
|
||||
|
|
|
|||
|
|
@ -10,6 +10,12 @@ RSpec.describe Collection do
|
|||
|
||||
it { is_expected.to validate_presence_of(:description) }
|
||||
|
||||
it { is_expected.to_not allow_value(nil).for(:local) }
|
||||
|
||||
it { is_expected.to_not allow_value(nil).for(:sensitive) }
|
||||
|
||||
it { is_expected.to_not allow_value(nil).for(:discoverable) }
|
||||
|
||||
context 'when collection is remote' do
|
||||
subject { Fabricate.build :collection, local: false }
|
||||
|
||||
|
|
|
|||
|
|
@ -39,20 +39,24 @@ RSpec.describe SessionActivation do
|
|||
end
|
||||
|
||||
describe '.activate' do
|
||||
let(:options) { { user: Fabricate(:user), session_id: '1' } }
|
||||
let(:user) { Fabricate :user }
|
||||
let!(:session_activation) { Fabricate :session_activation, user: }
|
||||
|
||||
it 'calls create! and purge_old' do
|
||||
allow(described_class).to receive(:create!).with(**options)
|
||||
allow(described_class).to receive(:purge_old)
|
||||
|
||||
described_class.activate(**options)
|
||||
|
||||
expect(described_class).to have_received(:create!).with(**options)
|
||||
expect(described_class).to have_received(:purge_old)
|
||||
around do |example|
|
||||
original = Rails.configuration.x.max_session_activations
|
||||
Rails.configuration.x.max_session_activations = 1
|
||||
example.run
|
||||
Rails.configuration.x.max_session_activations = original
|
||||
end
|
||||
|
||||
it 'returns an instance of SessionActivation' do
|
||||
expect(described_class.activate(**options)).to be_a described_class
|
||||
it 'creates a new activation and purges older ones' do
|
||||
result = described_class.activate(user: user, session_id: '123')
|
||||
|
||||
expect(result)
|
||||
.to be_a(described_class)
|
||||
.and have_attributes(session_id: '123', user:)
|
||||
expect { session_activation.reload }
|
||||
.to raise_error(ActiveRecord::RecordNotFound)
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"name": "@mastodon/streaming",
|
||||
"license": "AGPL-3.0-or-later",
|
||||
"packageManager": "yarn@4.10.3",
|
||||
"packageManager": "yarn@4.12.0",
|
||||
"engines": {
|
||||
"node": ">=20"
|
||||
},
|
||||
|
|
|
|||
518
yarn.lock
518
yarn.lock
|
|
@ -334,7 +334,7 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.24.4, @babel/parser@npm:^7.25.4, @babel/parser@npm:^7.27.2, @babel/parser@npm:^7.28.5":
|
||||
"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.24.4, @babel/parser@npm:^7.27.2, @babel/parser@npm:^7.28.5":
|
||||
version: 7.28.5
|
||||
resolution: "@babel/parser@npm:7.28.5"
|
||||
dependencies:
|
||||
|
|
@ -1209,7 +1209,7 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@babel/types@npm:^7.0.0, @babel/types@npm:^7.18.9, @babel/types@npm:^7.20.7, @babel/types@npm:^7.21.3, @babel/types@npm:^7.25.4, @babel/types@npm:^7.26.10, @babel/types@npm:^7.27.1, @babel/types@npm:^7.27.3, @babel/types@npm:^7.28.4, @babel/types@npm:^7.28.5, @babel/types@npm:^7.4.4":
|
||||
"@babel/types@npm:^7.0.0, @babel/types@npm:^7.18.9, @babel/types@npm:^7.20.7, @babel/types@npm:^7.21.3, @babel/types@npm:^7.26.10, @babel/types@npm:^7.27.1, @babel/types@npm:^7.27.3, @babel/types@npm:^7.28.4, @babel/types@npm:^7.28.5, @babel/types@npm:^7.4.4":
|
||||
version: 7.28.5
|
||||
resolution: "@babel/types@npm:7.28.5"
|
||||
dependencies:
|
||||
|
|
@ -1226,32 +1226,25 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@cacheable/memoize@npm:^2.0.1":
|
||||
version: 2.0.1
|
||||
resolution: "@cacheable/memoize@npm:2.0.1"
|
||||
"@cacheable/memory@npm:^2.0.5":
|
||||
version: 2.0.5
|
||||
resolution: "@cacheable/memory@npm:2.0.5"
|
||||
dependencies:
|
||||
"@cacheable/utils": "npm:^2.0.1"
|
||||
checksum: 10c0/40ab683429132654b95edc1229c175c45045c239d647bffa75165ae572cd8da0ee9852dfb7c6baca4e8ecc0e3005c2555222ae02add8206d4a227106b1c5fc8d
|
||||
"@cacheable/utils": "npm:^2.3.0"
|
||||
"@keyv/bigmap": "npm:^1.1.0"
|
||||
hookified: "npm:^1.12.2"
|
||||
keyv: "npm:^5.5.4"
|
||||
checksum: 10c0/bef5b26de58c4ca20d7cce457d053766b5fb13de48bf444e0ecf56481a16e6556a194dafc28f41906ae4e6cd053ef3d57686c770b8e7a2d381648505bd673839
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@cacheable/memory@npm:^2.0.1":
|
||||
version: 2.0.1
|
||||
resolution: "@cacheable/memory@npm:2.0.1"
|
||||
"@cacheable/utils@npm:^2.3.0":
|
||||
version: 2.3.1
|
||||
resolution: "@cacheable/utils@npm:2.3.1"
|
||||
dependencies:
|
||||
"@cacheable/memoize": "npm:^2.0.1"
|
||||
"@cacheable/utils": "npm:^2.0.1"
|
||||
"@keyv/bigmap": "npm:^1.0.0"
|
||||
hookified: "npm:^1.12.0"
|
||||
keyv: "npm:^5.5.1"
|
||||
checksum: 10c0/dde1caf7fe66febe8dc9d32ac4eaee48b6b1e690881adfaf3c41188a00892a20514cd7847e33a64bad09c4c5d6e1377eb8e373b02b4b9fb5fa27e6a67297c625
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@cacheable/utils@npm:^2.0.1":
|
||||
version: 2.0.1
|
||||
resolution: "@cacheable/utils@npm:2.0.1"
|
||||
checksum: 10c0/63806cca7f60add1f7bd4acee279c723760322316661a9fc6deab9ba7c03569e6cbe744d88159d4e72c1f6d296bba53b53c396d01d52294d45c9fed04c416ca4
|
||||
hashery: "npm:^1.2.0"
|
||||
keyv: "npm:^5.5.4"
|
||||
checksum: 10c0/04802bc11293ff569204e5f143cd11314856e3453de3e5757068cfd9df5c974a80aa9974c8400d88b22de3af70a7d8511d2d7fe927356365f41b765693a4c4bb
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
|
|
@ -2682,12 +2675,15 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@keyv/bigmap@npm:^1.0.0":
|
||||
version: 1.0.2
|
||||
resolution: "@keyv/bigmap@npm:1.0.2"
|
||||
"@keyv/bigmap@npm:^1.1.0":
|
||||
version: 1.3.0
|
||||
resolution: "@keyv/bigmap@npm:1.3.0"
|
||||
dependencies:
|
||||
hookified: "npm:^1.12.1"
|
||||
checksum: 10c0/1fe415265241b015c19891dc6c1909b41a5a033e57339b40f85af27355d2f52b52df01795a3f7ba37d3ec2b67e147c05914965775254ff8dbd1701adab45208a
|
||||
hashery: "npm:^1.2.0"
|
||||
hookified: "npm:^1.13.0"
|
||||
peerDependencies:
|
||||
keyv: ^5.5.4
|
||||
checksum: 10c0/68fe63451097067d8359dc25b7e5b832fe9d99493ca32602686026c8d14c9ca7ecaf19312df9420c7f54df8de1b26e7305f9189fa364a82f39730710eb895f9e
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
|
|
@ -4499,140 +4495,139 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@typescript-eslint/eslint-plugin@npm:8.46.3":
|
||||
version: 8.46.3
|
||||
resolution: "@typescript-eslint/eslint-plugin@npm:8.46.3"
|
||||
"@typescript-eslint/eslint-plugin@npm:8.48.0":
|
||||
version: 8.48.0
|
||||
resolution: "@typescript-eslint/eslint-plugin@npm:8.48.0"
|
||||
dependencies:
|
||||
"@eslint-community/regexpp": "npm:^4.10.0"
|
||||
"@typescript-eslint/scope-manager": "npm:8.46.3"
|
||||
"@typescript-eslint/type-utils": "npm:8.46.3"
|
||||
"@typescript-eslint/utils": "npm:8.46.3"
|
||||
"@typescript-eslint/visitor-keys": "npm:8.46.3"
|
||||
"@typescript-eslint/scope-manager": "npm:8.48.0"
|
||||
"@typescript-eslint/type-utils": "npm:8.48.0"
|
||||
"@typescript-eslint/utils": "npm:8.48.0"
|
||||
"@typescript-eslint/visitor-keys": "npm:8.48.0"
|
||||
graphemer: "npm:^1.4.0"
|
||||
ignore: "npm:^7.0.0"
|
||||
natural-compare: "npm:^1.4.0"
|
||||
ts-api-utils: "npm:^2.1.0"
|
||||
peerDependencies:
|
||||
"@typescript-eslint/parser": ^8.46.3
|
||||
"@typescript-eslint/parser": ^8.48.0
|
||||
eslint: ^8.57.0 || ^9.0.0
|
||||
typescript: ">=4.8.4 <6.0.0"
|
||||
checksum: 10c0/9c8a5efd9779418d2096634a072a9e2b108e146d0fc541572db56ff28ff37469f03dd404fdb3b0c3161be4cc4857ce14259f30eba1a93d4771de5d1562624e45
|
||||
checksum: 10c0/5f4f9ac3ace3f615bac428859026b70fb7fa236666cfe8856fed3add7e4ba73c7113264c2df7a9d68247b679dfcc21b0414488bda7b9b3de1c209b1807ed7842
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@typescript-eslint/parser@npm:8.46.3":
|
||||
version: 8.46.3
|
||||
resolution: "@typescript-eslint/parser@npm:8.46.3"
|
||||
"@typescript-eslint/parser@npm:8.48.0":
|
||||
version: 8.48.0
|
||||
resolution: "@typescript-eslint/parser@npm:8.48.0"
|
||||
dependencies:
|
||||
"@typescript-eslint/scope-manager": "npm:8.46.3"
|
||||
"@typescript-eslint/types": "npm:8.46.3"
|
||||
"@typescript-eslint/typescript-estree": "npm:8.46.3"
|
||||
"@typescript-eslint/visitor-keys": "npm:8.46.3"
|
||||
"@typescript-eslint/scope-manager": "npm:8.48.0"
|
||||
"@typescript-eslint/types": "npm:8.48.0"
|
||||
"@typescript-eslint/typescript-estree": "npm:8.48.0"
|
||||
"@typescript-eslint/visitor-keys": "npm:8.48.0"
|
||||
debug: "npm:^4.3.4"
|
||||
peerDependencies:
|
||||
eslint: ^8.57.0 || ^9.0.0
|
||||
typescript: ">=4.8.4 <6.0.0"
|
||||
checksum: 10c0/8a8b47abbbc8bbc68f423df23189afefd296305d50a31c6bec9bdde563adc9ddf99b89a6b8466965fda4aee9118263bae36422dd1c25d7595dd82f8897b5df61
|
||||
checksum: 10c0/180753e1dc55cd5174a236b738d3b0dd6dd6c131797cd417b3b3b8fac344168f3d21bd49eae6c0a075be29ed69b7bc74d97cadd917f1f4d4c113c29e76c1f9cd
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@typescript-eslint/project-service@npm:8.46.3":
|
||||
version: 8.46.3
|
||||
resolution: "@typescript-eslint/project-service@npm:8.46.3"
|
||||
"@typescript-eslint/project-service@npm:8.48.0":
|
||||
version: 8.48.0
|
||||
resolution: "@typescript-eslint/project-service@npm:8.48.0"
|
||||
dependencies:
|
||||
"@typescript-eslint/tsconfig-utils": "npm:^8.46.3"
|
||||
"@typescript-eslint/types": "npm:^8.46.3"
|
||||
"@typescript-eslint/tsconfig-utils": "npm:^8.48.0"
|
||||
"@typescript-eslint/types": "npm:^8.48.0"
|
||||
debug: "npm:^4.3.4"
|
||||
peerDependencies:
|
||||
typescript: ">=4.8.4 <6.0.0"
|
||||
checksum: 10c0/24ef305bbb550a8e27a7d6377663c1f2773b39b7a9f12c8b95c66c0d15f8150787b036bbff9ae4c2a0a18ab68c62435b0e03889df294bef00b3ae8846cd20659
|
||||
checksum: 10c0/6e1d08312fe55a91ba37eb19131af91ad7834bafd15d1cddb83a1e35e5134382e10dc0b14531036ba1c075ce4cba627123625ed6f2e209fb3355f3dda25da0a1
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@typescript-eslint/scope-manager@npm:8.46.3":
|
||||
version: 8.46.3
|
||||
resolution: "@typescript-eslint/scope-manager@npm:8.46.3"
|
||||
"@typescript-eslint/scope-manager@npm:8.48.0":
|
||||
version: 8.48.0
|
||||
resolution: "@typescript-eslint/scope-manager@npm:8.48.0"
|
||||
dependencies:
|
||||
"@typescript-eslint/types": "npm:8.46.3"
|
||||
"@typescript-eslint/visitor-keys": "npm:8.46.3"
|
||||
checksum: 10c0/de8c116477e2a05a895ecd848a8289974a76cab884e07683c8085b3a2ce53895871d9bcd9de94723d6b2a437a6c526c77afcc75d6030cc4f1dccb9b47f4fc069
|
||||
"@typescript-eslint/types": "npm:8.48.0"
|
||||
"@typescript-eslint/visitor-keys": "npm:8.48.0"
|
||||
checksum: 10c0/0766e365901a8af9d9e41fa70464254aacf8b4d167734d88b6cdaa0235e86bfdffc57a3e39a20e105929b8df499d252090f64f81f86770f74626ca809afe54b6
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@typescript-eslint/tsconfig-utils@npm:8.46.3, @typescript-eslint/tsconfig-utils@npm:^8.46.3":
|
||||
version: 8.46.3
|
||||
resolution: "@typescript-eslint/tsconfig-utils@npm:8.46.3"
|
||||
"@typescript-eslint/tsconfig-utils@npm:8.48.0, @typescript-eslint/tsconfig-utils@npm:^8.48.0":
|
||||
version: 8.48.0
|
||||
resolution: "@typescript-eslint/tsconfig-utils@npm:8.48.0"
|
||||
peerDependencies:
|
||||
typescript: ">=4.8.4 <6.0.0"
|
||||
checksum: 10c0/a9686141204a96591ee51814a79fa676a8da845638eabb2363f9d82902660fd48ea47f7ec15a618129e45021ad154e1d193127248915752546d60d475d6a566e
|
||||
checksum: 10c0/52e9ce8ffbaf32f3c6f4b8fa8af6e3901c430411e137a0baf650fcefdd8edf3dcc4569eba726a28424471d4d1d96b815aa4cf7b63aa7b67380efd6a8dd354222
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@typescript-eslint/type-utils@npm:8.46.3":
|
||||
version: 8.46.3
|
||||
resolution: "@typescript-eslint/type-utils@npm:8.46.3"
|
||||
"@typescript-eslint/type-utils@npm:8.48.0":
|
||||
version: 8.48.0
|
||||
resolution: "@typescript-eslint/type-utils@npm:8.48.0"
|
||||
dependencies:
|
||||
"@typescript-eslint/types": "npm:8.46.3"
|
||||
"@typescript-eslint/typescript-estree": "npm:8.46.3"
|
||||
"@typescript-eslint/utils": "npm:8.46.3"
|
||||
"@typescript-eslint/types": "npm:8.48.0"
|
||||
"@typescript-eslint/typescript-estree": "npm:8.48.0"
|
||||
"@typescript-eslint/utils": "npm:8.48.0"
|
||||
debug: "npm:^4.3.4"
|
||||
ts-api-utils: "npm:^2.1.0"
|
||||
peerDependencies:
|
||||
eslint: ^8.57.0 || ^9.0.0
|
||||
typescript: ">=4.8.4 <6.0.0"
|
||||
checksum: 10c0/06e20dff5a22feb6581703e8d35159ad6694d9e1df8fbb75869fcd89893826ca533b7b30b795a16d532e9d8ea6720462b1361d1e7a11d431a4cd11b3f47a22b5
|
||||
checksum: 10c0/72ab5c7d183b844e4870bfa5dfeb68e2e7ce5f3e1b33c06d5a8e70f0d0a012c9152ad15071d41ba3788266109804a9f4cdb85d664b11df8948bc930e29e0c244
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@typescript-eslint/types@npm:8.46.3, @typescript-eslint/types@npm:^8.46.0, @typescript-eslint/types@npm:^8.46.3":
|
||||
version: 8.46.3
|
||||
resolution: "@typescript-eslint/types@npm:8.46.3"
|
||||
checksum: 10c0/6a6ccefbd086e6c38172fe14d04ba27c1c34755af7c25e752547c42d978b91bf6b97da56a5e63d098fbd679b4a5076c4dd4be6c947fd39b4c5feea5fed6deeb6
|
||||
"@typescript-eslint/types@npm:8.48.0, @typescript-eslint/types@npm:^8.46.0, @typescript-eslint/types@npm:^8.48.0":
|
||||
version: 8.48.0
|
||||
resolution: "@typescript-eslint/types@npm:8.48.0"
|
||||
checksum: 10c0/865a8f4ae4a50aa8976f3d7e0f874f1a1c80227ec53ded68644d41011c729a489bb59f70683b29237ab945716ea0258e1d47387163379eab3edaaf5e5cc3b757
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@typescript-eslint/typescript-estree@npm:8.46.3":
|
||||
version: 8.46.3
|
||||
resolution: "@typescript-eslint/typescript-estree@npm:8.46.3"
|
||||
"@typescript-eslint/typescript-estree@npm:8.48.0":
|
||||
version: 8.48.0
|
||||
resolution: "@typescript-eslint/typescript-estree@npm:8.48.0"
|
||||
dependencies:
|
||||
"@typescript-eslint/project-service": "npm:8.46.3"
|
||||
"@typescript-eslint/tsconfig-utils": "npm:8.46.3"
|
||||
"@typescript-eslint/types": "npm:8.46.3"
|
||||
"@typescript-eslint/visitor-keys": "npm:8.46.3"
|
||||
"@typescript-eslint/project-service": "npm:8.48.0"
|
||||
"@typescript-eslint/tsconfig-utils": "npm:8.48.0"
|
||||
"@typescript-eslint/types": "npm:8.48.0"
|
||||
"@typescript-eslint/visitor-keys": "npm:8.48.0"
|
||||
debug: "npm:^4.3.4"
|
||||
fast-glob: "npm:^3.3.2"
|
||||
is-glob: "npm:^4.0.3"
|
||||
minimatch: "npm:^9.0.4"
|
||||
semver: "npm:^7.6.0"
|
||||
tinyglobby: "npm:^0.2.15"
|
||||
ts-api-utils: "npm:^2.1.0"
|
||||
peerDependencies:
|
||||
typescript: ">=4.8.4 <6.0.0"
|
||||
checksum: 10c0/3a2bb879a3b42eda478015beee42729efdc78c0cfc70fa009442706626813114f8f9a1e918638ab957df385681ab073cf2076c508973ff9a72e2425e4e521b4f
|
||||
checksum: 10c0/f17dd35f7b82654fae9fe83c2eb650572464dbce0170d55b3ef94b99e9aae010f2cbadd436089c8e59eef97d41719ace3a2deb4ac3cdfac26d43b36f34df5590
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@typescript-eslint/utils@npm:8.46.3, @typescript-eslint/utils@npm:^8.27.0, @typescript-eslint/utils@npm:^8.8.1":
|
||||
version: 8.46.3
|
||||
resolution: "@typescript-eslint/utils@npm:8.46.3"
|
||||
"@typescript-eslint/utils@npm:8.48.0, @typescript-eslint/utils@npm:^8.27.0, @typescript-eslint/utils@npm:^8.8.1":
|
||||
version: 8.48.0
|
||||
resolution: "@typescript-eslint/utils@npm:8.48.0"
|
||||
dependencies:
|
||||
"@eslint-community/eslint-utils": "npm:^4.7.0"
|
||||
"@typescript-eslint/scope-manager": "npm:8.46.3"
|
||||
"@typescript-eslint/types": "npm:8.46.3"
|
||||
"@typescript-eslint/typescript-estree": "npm:8.46.3"
|
||||
"@typescript-eslint/scope-manager": "npm:8.48.0"
|
||||
"@typescript-eslint/types": "npm:8.48.0"
|
||||
"@typescript-eslint/typescript-estree": "npm:8.48.0"
|
||||
peerDependencies:
|
||||
eslint: ^8.57.0 || ^9.0.0
|
||||
typescript: ">=4.8.4 <6.0.0"
|
||||
checksum: 10c0/cf85b166f75c2fd248004fb59643315347489d9ab589738cda1b4c36c25e7947c197a1c21e46cb25959be7d0f310b352c4436f8d3e0a91d64e4fafb3ef4b4e3d
|
||||
checksum: 10c0/56334312d1dc114a5c8b05dac4da191c40a416a5705fa76797ebdc9f6a96d35727fd0993cf8776f5c4411837e5fc2151bfa61d3eecc98b24f5a821a63a4d56f3
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@typescript-eslint/visitor-keys@npm:8.46.3":
|
||||
version: 8.46.3
|
||||
resolution: "@typescript-eslint/visitor-keys@npm:8.46.3"
|
||||
"@typescript-eslint/visitor-keys@npm:8.48.0":
|
||||
version: 8.48.0
|
||||
resolution: "@typescript-eslint/visitor-keys@npm:8.48.0"
|
||||
dependencies:
|
||||
"@typescript-eslint/types": "npm:8.46.3"
|
||||
"@typescript-eslint/types": "npm:8.48.0"
|
||||
eslint-visitor-keys: "npm:^4.2.1"
|
||||
checksum: 10c0/c5f96840e0c31541e1a2390712a6cb290eff59fc97a3ffa7ecab353d3bb3cf0d8c6f62d68db271bf194aa8c4582be735b6121fcc5b30449e01799642be77de6e
|
||||
checksum: 10c0/20ae9ec255a786de40cdba281b63f634a642dcc34d2a79c5ffc160109f7f6227c28ae2c64be32cbc53dc68dc398c3da715bfcce90422b5024f15f7124a3c1704
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
|
|
@ -4829,62 +4824,62 @@ __metadata:
|
|||
linkType: hard
|
||||
|
||||
"@vitest/browser-playwright@npm:^4.0.5":
|
||||
version: 4.0.7
|
||||
resolution: "@vitest/browser-playwright@npm:4.0.7"
|
||||
version: 4.0.13
|
||||
resolution: "@vitest/browser-playwright@npm:4.0.13"
|
||||
dependencies:
|
||||
"@vitest/browser": "npm:4.0.7"
|
||||
"@vitest/mocker": "npm:4.0.7"
|
||||
"@vitest/browser": "npm:4.0.13"
|
||||
"@vitest/mocker": "npm:4.0.13"
|
||||
tinyrainbow: "npm:^3.0.3"
|
||||
peerDependencies:
|
||||
playwright: "*"
|
||||
vitest: 4.0.7
|
||||
vitest: 4.0.13
|
||||
peerDependenciesMeta:
|
||||
playwright:
|
||||
optional: false
|
||||
checksum: 10c0/85969557a441c141b14bc13e3b2f1b70f7e7aa3eb8a63489b4b3af253b3fcd8019293cb56e1dea50f338eca9bc845e21ec85f1c88ab6bc3ee494fbdacac153a3
|
||||
checksum: 10c0/5a387eb02534736a25cfff442e66e8c41ef97f0db744ffe8360e484af61d66db793cb44ba8681471b8c21ba509db1775f1ba688bc7f50325eee76918773848cb
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@vitest/browser@npm:4.0.7, @vitest/browser@npm:^4.0.5":
|
||||
version: 4.0.7
|
||||
resolution: "@vitest/browser@npm:4.0.7"
|
||||
"@vitest/browser@npm:4.0.13, @vitest/browser@npm:^4.0.5":
|
||||
version: 4.0.13
|
||||
resolution: "@vitest/browser@npm:4.0.13"
|
||||
dependencies:
|
||||
"@vitest/mocker": "npm:4.0.7"
|
||||
"@vitest/utils": "npm:4.0.7"
|
||||
magic-string: "npm:^0.30.19"
|
||||
"@vitest/mocker": "npm:4.0.13"
|
||||
"@vitest/utils": "npm:4.0.13"
|
||||
magic-string: "npm:^0.30.21"
|
||||
pixelmatch: "npm:7.1.0"
|
||||
pngjs: "npm:^7.0.0"
|
||||
sirv: "npm:^3.0.2"
|
||||
tinyrainbow: "npm:^3.0.3"
|
||||
ws: "npm:^8.18.3"
|
||||
peerDependencies:
|
||||
vitest: 4.0.7
|
||||
checksum: 10c0/22b6d666f7ae6220dea8d55afd787b435f4dc19656d22c7892f7caafd3c26b62fc87a091384c6044aa49b84c187581f6cad44fd8a65f1583abef5197a162b5c6
|
||||
vitest: 4.0.13
|
||||
checksum: 10c0/22c9297888a7288717cad706ca08159b3af05337a2f9b8da98fe74e683d534c8d816e40fece96f218d223a54c06762c5aa2a5db23ce8565c174ab9a70aade7f0
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@vitest/coverage-v8@npm:^4.0.5":
|
||||
version: 4.0.7
|
||||
resolution: "@vitest/coverage-v8@npm:4.0.7"
|
||||
version: 4.0.13
|
||||
resolution: "@vitest/coverage-v8@npm:4.0.13"
|
||||
dependencies:
|
||||
"@bcoe/v8-coverage": "npm:^1.0.2"
|
||||
"@vitest/utils": "npm:4.0.7"
|
||||
ast-v8-to-istanbul: "npm:^0.3.5"
|
||||
"@vitest/utils": "npm:4.0.13"
|
||||
ast-v8-to-istanbul: "npm:^0.3.8"
|
||||
debug: "npm:^4.4.3"
|
||||
istanbul-lib-coverage: "npm:^3.2.2"
|
||||
istanbul-lib-report: "npm:^3.0.1"
|
||||
istanbul-lib-source-maps: "npm:^5.0.6"
|
||||
istanbul-reports: "npm:^3.2.0"
|
||||
magicast: "npm:^0.3.5"
|
||||
std-env: "npm:^3.9.0"
|
||||
magicast: "npm:^0.5.1"
|
||||
std-env: "npm:^3.10.0"
|
||||
tinyrainbow: "npm:^3.0.3"
|
||||
peerDependencies:
|
||||
"@vitest/browser": 4.0.7
|
||||
vitest: 4.0.7
|
||||
"@vitest/browser": 4.0.13
|
||||
vitest: 4.0.13
|
||||
peerDependenciesMeta:
|
||||
"@vitest/browser":
|
||||
optional: true
|
||||
checksum: 10c0/4a34c6de4d1e8173856af078c053e5a6d4a3ad0085fd613fddbe5067b7083d6d11858788a994a3bd427630ddd56cc5eb948b59b425b2c7ba7dd73094d2f1844f
|
||||
checksum: 10c0/dd462b13605fca62d20cb5a4f9d7cfda2bfa5e77aedc16ad5a633d8dabb24f68e96382ac4d16c2fdcddb45e7c4717e558f5ac51a70c64857f5e89d12d8700823
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
|
|
@ -4901,17 +4896,17 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@vitest/expect@npm:4.0.7":
|
||||
version: 4.0.7
|
||||
resolution: "@vitest/expect@npm:4.0.7"
|
||||
"@vitest/expect@npm:4.0.13":
|
||||
version: 4.0.13
|
||||
resolution: "@vitest/expect@npm:4.0.13"
|
||||
dependencies:
|
||||
"@standard-schema/spec": "npm:^1.0.0"
|
||||
"@types/chai": "npm:^5.2.2"
|
||||
"@vitest/spy": "npm:4.0.7"
|
||||
"@vitest/utils": "npm:4.0.7"
|
||||
chai: "npm:^6.0.1"
|
||||
"@vitest/spy": "npm:4.0.13"
|
||||
"@vitest/utils": "npm:4.0.13"
|
||||
chai: "npm:^6.2.1"
|
||||
tinyrainbow: "npm:^3.0.3"
|
||||
checksum: 10c0/366d7be563149b6143a6f275ae37b77ac7b13d96cd5b0992bfece5c801c1ed1cb7f4a1a1921e9fa5c47f8ad4e73bdfb9f3f362acc42be34cedcb907020c313a2
|
||||
checksum: 10c0/1cd7dc02cb650d024826f2e20260d23c2b9ab6733341045ffb59be7af73402eecd2422198d7e4eac609710730b6d11f0faf22af0c074d65445ab88d9da7f6556
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
|
|
@ -4934,13 +4929,13 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@vitest/mocker@npm:4.0.7":
|
||||
version: 4.0.7
|
||||
resolution: "@vitest/mocker@npm:4.0.7"
|
||||
"@vitest/mocker@npm:4.0.13":
|
||||
version: 4.0.13
|
||||
resolution: "@vitest/mocker@npm:4.0.13"
|
||||
dependencies:
|
||||
"@vitest/spy": "npm:4.0.7"
|
||||
"@vitest/spy": "npm:4.0.13"
|
||||
estree-walker: "npm:^3.0.3"
|
||||
magic-string: "npm:^0.30.19"
|
||||
magic-string: "npm:^0.30.21"
|
||||
peerDependencies:
|
||||
msw: ^2.4.9
|
||||
vite: ^6.0.0 || ^7.0.0-0
|
||||
|
|
@ -4949,7 +4944,7 @@ __metadata:
|
|||
optional: true
|
||||
vite:
|
||||
optional: true
|
||||
checksum: 10c0/a500d2eca0e8b43f63358bd102e1203f3e478c0896ebe41dcdac0ab048e991736dc053bd4129dcf62ba94d4d3d2e43793175cd7deb6552cf54a2a9c8a5bab77b
|
||||
checksum: 10c0/667ec4fbb77a28ede1b055b9d962beed92c2dd2d83b7bab1ed22239578a7b399180a978e26ef136301c0bc7c57c75ca178cda55ec94081856437e3b4be4a3e19
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
|
|
@ -4962,33 +4957,33 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@vitest/pretty-format@npm:4.0.7":
|
||||
version: 4.0.7
|
||||
resolution: "@vitest/pretty-format@npm:4.0.7"
|
||||
"@vitest/pretty-format@npm:4.0.13":
|
||||
version: 4.0.13
|
||||
resolution: "@vitest/pretty-format@npm:4.0.13"
|
||||
dependencies:
|
||||
tinyrainbow: "npm:^3.0.3"
|
||||
checksum: 10c0/4084355dbc7b1b9ee4b777adbbc44833dfd4c4a4bb2de8cb5ef28f490bf1c699eb31820157692dc87504b26e6b7bd931d0f316472895bfbc608327a671646032
|
||||
checksum: 10c0/c32ebd3457fd4b92fa89800b0ddaa2ca7de84df75be3c64f87ace006f3a3ec546a6ffd4c06f88e3161e80f9e10c83dfee61150e682eaa5a1871240d98c7ef0eb
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@vitest/runner@npm:4.0.7":
|
||||
version: 4.0.7
|
||||
resolution: "@vitest/runner@npm:4.0.7"
|
||||
"@vitest/runner@npm:4.0.13":
|
||||
version: 4.0.13
|
||||
resolution: "@vitest/runner@npm:4.0.13"
|
||||
dependencies:
|
||||
"@vitest/utils": "npm:4.0.7"
|
||||
"@vitest/utils": "npm:4.0.13"
|
||||
pathe: "npm:^2.0.3"
|
||||
checksum: 10c0/717d7ce765eba1493051b309f82755a4b1d8594de6cd9d036864c9464dadc604c703388d96e070fe843b0216d2a7b66e59d18ad3db8055990114b3506bc172bf
|
||||
checksum: 10c0/e9f95b8a413f875123e5c32322dd92bd523d6e3ba25b054f0e865f42e01f82666b847535fe5ea2ff3238faa2df16cefc7e5845d3d5ccfecb3a96ab924d31e760
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@vitest/snapshot@npm:4.0.7":
|
||||
version: 4.0.7
|
||||
resolution: "@vitest/snapshot@npm:4.0.7"
|
||||
"@vitest/snapshot@npm:4.0.13":
|
||||
version: 4.0.13
|
||||
resolution: "@vitest/snapshot@npm:4.0.13"
|
||||
dependencies:
|
||||
"@vitest/pretty-format": "npm:4.0.7"
|
||||
magic-string: "npm:^0.30.19"
|
||||
"@vitest/pretty-format": "npm:4.0.13"
|
||||
magic-string: "npm:^0.30.21"
|
||||
pathe: "npm:^2.0.3"
|
||||
checksum: 10c0/0382303038ebc58d419047fd329f848336e06b292839ea6ec05063092ce32464eb6a21c00e6487541e42b8155fa0c10b8cc2f6445ff85256b7d73feeb4a8afef
|
||||
checksum: 10c0/ad3fbe9ff30bc294811556f958e0014cb03888ea06ac7c05ab41e20c582fe8e27d8f4176aaf8a8e230fc6377124af30f5622173fb459b70a30ff9dd622664be2
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
|
|
@ -5001,18 +4996,18 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@vitest/spy@npm:4.0.7":
|
||||
version: 4.0.7
|
||||
resolution: "@vitest/spy@npm:4.0.7"
|
||||
checksum: 10c0/88c8fdffa54cdfb9f4157316d1fb3308ad1630791881866878c7cbf837ad8e6e6aa79041c82635b2598ed551cf93409d34a434c87b779a30a66f55221de636fa
|
||||
"@vitest/spy@npm:4.0.13":
|
||||
version: 4.0.13
|
||||
resolution: "@vitest/spy@npm:4.0.13"
|
||||
checksum: 10c0/64dc4c496eb9aacd3137beedccdb3265c895f8cd2626b3f76d7324ad944be5b1567ede2652eee407991796879270a63abdec4453c73185e637a1d7ff9cd1a009
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@vitest/ui@npm:^4.0.5":
|
||||
version: 4.0.7
|
||||
resolution: "@vitest/ui@npm:4.0.7"
|
||||
version: 4.0.13
|
||||
resolution: "@vitest/ui@npm:4.0.13"
|
||||
dependencies:
|
||||
"@vitest/utils": "npm:4.0.7"
|
||||
"@vitest/utils": "npm:4.0.13"
|
||||
fflate: "npm:^0.8.2"
|
||||
flatted: "npm:^3.3.3"
|
||||
pathe: "npm:^2.0.3"
|
||||
|
|
@ -5020,8 +5015,8 @@ __metadata:
|
|||
tinyglobby: "npm:^0.2.15"
|
||||
tinyrainbow: "npm:^3.0.3"
|
||||
peerDependencies:
|
||||
vitest: 4.0.7
|
||||
checksum: 10c0/e7173da36e9549a8b04ee4015a64882075aa9f49a59cb135616d22c6d881244c938cf41f6ef149d7e1f42ff414dc72f2bb23f5334b4285801adf83280b23a279
|
||||
vitest: 4.0.13
|
||||
checksum: 10c0/7656762bc6a9c99850639d0809ada53ad4b842e4d9a8c7b82987b60bcf1675c98c077516a3777fce9580255538d0d050c92cb1e6f6296af6365f2387d7a972b9
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
|
|
@ -5036,13 +5031,13 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@vitest/utils@npm:4.0.7":
|
||||
version: 4.0.7
|
||||
resolution: "@vitest/utils@npm:4.0.7"
|
||||
"@vitest/utils@npm:4.0.13":
|
||||
version: 4.0.13
|
||||
resolution: "@vitest/utils@npm:4.0.13"
|
||||
dependencies:
|
||||
"@vitest/pretty-format": "npm:4.0.7"
|
||||
"@vitest/pretty-format": "npm:4.0.13"
|
||||
tinyrainbow: "npm:^3.0.3"
|
||||
checksum: 10c0/a2305c5117a30f1685f362767a0e0cc47265f3602469641f6eb01b4b708e2b1c35c33ccf480314348b21978d70a78311cce3f5bdd09de6456d528c5469093217
|
||||
checksum: 10c0/1b64872e82a652f11bfd813c0140eaae9b6e4ece39fc0e460ab2b3111b925892f1128f3b27f3a280471cfc404bb9c9289c59f8ca5387950ab35d024d154e9ec1
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
|
|
@ -5341,7 +5336,7 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"ast-v8-to-istanbul@npm:^0.3.5":
|
||||
"ast-v8-to-istanbul@npm:^0.3.8":
|
||||
version: 0.3.8
|
||||
resolution: "ast-v8-to-istanbul@npm:0.3.8"
|
||||
dependencies:
|
||||
|
|
@ -5691,16 +5686,16 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"cacheable@npm:^2.0.1":
|
||||
version: 2.0.1
|
||||
resolution: "cacheable@npm:2.0.1"
|
||||
"cacheable@npm:^2.2.0":
|
||||
version: 2.2.0
|
||||
resolution: "cacheable@npm:2.2.0"
|
||||
dependencies:
|
||||
"@cacheable/memoize": "npm:^2.0.1"
|
||||
"@cacheable/memory": "npm:^2.0.1"
|
||||
"@cacheable/utils": "npm:^2.0.1"
|
||||
hookified: "npm:^1.12.0"
|
||||
keyv: "npm:^5.5.1"
|
||||
checksum: 10c0/c4c16af5997850531a02b0efa150d3a06fff9560eca15a16e4042038a63487e967f00f5f1b63310523877b2ac4038e732faf0e707a5ff5d10cb861c01ed67ca8
|
||||
"@cacheable/memory": "npm:^2.0.5"
|
||||
"@cacheable/utils": "npm:^2.3.0"
|
||||
hookified: "npm:^1.13.0"
|
||||
keyv: "npm:^5.5.4"
|
||||
qified: "npm:^0.5.2"
|
||||
checksum: 10c0/39b09e68b0a3da6c53dba1ed10dd13b63bf03f1fcb93ee941dd324d758e2d84466f1acb0c760fa78b23377be15ee58dc9acfb1fde85a89d2483d195b2f75e249
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
|
|
@ -5770,10 +5765,10 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"chai@npm:^6.0.1":
|
||||
version: 6.2.0
|
||||
resolution: "chai@npm:6.2.0"
|
||||
checksum: 10c0/a4b7d7f5907187e09f1847afa838d6d1608adc7d822031b7900813c4ed5d9702911ac2468bf290676f22fddb3d727b1be90b57c1d0a69b902534ee29cdc6ff8a
|
||||
"chai@npm:^6.2.1":
|
||||
version: 6.2.1
|
||||
resolution: "chai@npm:6.2.1"
|
||||
checksum: 10c0/0c2d84392d7c6d44ca5d14d94204f1760e22af68b83d1f4278b5c4d301dabfc0242da70954dd86b1eda01e438f42950de6cf9d569df2103678538e4014abe50b
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
|
|
@ -5950,7 +5945,7 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"commander@npm:^14.0.1":
|
||||
"commander@npm:^14.0.2":
|
||||
version: 14.0.2
|
||||
resolution: "commander@npm:14.0.2"
|
||||
checksum: 10c0/245abd1349dbad5414cb6517b7b5c584895c02c4f7836ff5395f301192b8566f9796c82d7bd6c92d07eba8775fe4df86602fca5d86d8d10bcc2aded1e21c2aeb
|
||||
|
|
@ -7074,8 +7069,8 @@ __metadata:
|
|||
linkType: hard
|
||||
|
||||
"eslint-plugin-jsdoc@npm:^61.1.11":
|
||||
version: 61.1.12
|
||||
resolution: "eslint-plugin-jsdoc@npm:61.1.12"
|
||||
version: 61.4.1
|
||||
resolution: "eslint-plugin-jsdoc@npm:61.4.1"
|
||||
dependencies:
|
||||
"@es-joy/jsdoccomment": "npm:~0.76.0"
|
||||
"@es-joy/resolve.exports": "npm:1.2.0"
|
||||
|
|
@ -7093,7 +7088,7 @@ __metadata:
|
|||
to-valid-identifier: "npm:^1.0.0"
|
||||
peerDependencies:
|
||||
eslint: ^7.0.0 || ^8.0.0 || ^9.0.0
|
||||
checksum: 10c0/a0d291796029f8c3711ece955afde3cbac2b366735ad99f22723e4d53e54b9dcb6224a7a23369d9bf95a25c01e64b7cf6e7807218b73a18fd33bfe6eabf0bbdd
|
||||
checksum: 10c0/564f89bad71dcdbf6a45c27d16113333a5251f97a60bcc0e7346ea1b19dc1258991e1f585c89a2978e279288be2e180dde58c57f63cd49ac3db6604a5d4c581c
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
|
|
@ -7177,14 +7172,14 @@ __metadata:
|
|||
linkType: hard
|
||||
|
||||
"eslint-plugin-storybook@npm:^10.0.2":
|
||||
version: 10.0.4
|
||||
resolution: "eslint-plugin-storybook@npm:10.0.4"
|
||||
version: 10.1.0
|
||||
resolution: "eslint-plugin-storybook@npm:10.1.0"
|
||||
dependencies:
|
||||
"@typescript-eslint/utils": "npm:^8.8.1"
|
||||
peerDependencies:
|
||||
eslint: ">=8"
|
||||
storybook: ^10.0.4
|
||||
checksum: 10c0/a2d486a6e45d1ce731333c439b51fc44b4a9292e8c0bca914534dab11cd37a3c25c62e8cbb1bb3b35e5e8b87d6ff2c7d8256c4f89a34c444138c4c738c52e1fc
|
||||
storybook: ^10.1.0
|
||||
checksum: 10c0/25fdfc21cde3f07c6d0a84690a434cb981808e6fdbd811b7c96b73b7aedaae7bbf1e9a20f009ed109803c408aa45de73d93049acc0e0e363a271a94f7074cf7b
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
|
|
@ -7401,9 +7396,9 @@ __metadata:
|
|||
linkType: hard
|
||||
|
||||
"fake-indexeddb@npm:^6.0.1":
|
||||
version: 6.2.4
|
||||
resolution: "fake-indexeddb@npm:6.2.4"
|
||||
checksum: 10c0/53b7e9e8f7e413c1a45a4f80f6deda00ef02676cc3a4457e73abff06720ec6b4f4f63fd65c1ef6b03298a1e7e4684d4bf65137a8b9ac166dcfade4b2acf229b4
|
||||
version: 6.2.5
|
||||
resolution: "fake-indexeddb@npm:6.2.5"
|
||||
checksum: 10c0/6c5e2fe84a61daa06d7ad63699d1041fe61847f15f92db12415634b3db94f363a64be9e08a3c3c4434af9c3c0132086b85c4d5dc5e8e06edae1e7daf70ce1f3c
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
|
|
@ -7421,7 +7416,7 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"fast-glob@npm:^3.2.9, fast-glob@npm:^3.3.2, fast-glob@npm:^3.3.3":
|
||||
"fast-glob@npm:^3.2.9, fast-glob@npm:^3.3.3":
|
||||
version: 3.3.3
|
||||
resolution: "fast-glob@npm:3.3.3"
|
||||
dependencies:
|
||||
|
|
@ -7497,12 +7492,12 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"file-entry-cache@npm:^10.1.4":
|
||||
version: 10.1.4
|
||||
resolution: "file-entry-cache@npm:10.1.4"
|
||||
"file-entry-cache@npm:^11.1.0":
|
||||
version: 11.1.1
|
||||
resolution: "file-entry-cache@npm:11.1.1"
|
||||
dependencies:
|
||||
flat-cache: "npm:^6.1.13"
|
||||
checksum: 10c0/78a7d6b257c620374a8fc5280f14acffc7bd5cb5d39a5bd3509c640f17209f5194eff6e3b476d19db7cfbe9f97abe85ec8d33260f7ed94225efb2a95a68841a6
|
||||
flat-cache: "npm:^6.1.19"
|
||||
checksum: 10c0/aa639f5dd578f63984a941f34b112180a4bd9d091d03970752437958158932957fc576861b9fbcf4d6eceaeb0779ad5359befdc321cc1bac59aa6f56f6b1d205
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
|
|
@ -7574,14 +7569,14 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"flat-cache@npm:^6.1.13":
|
||||
version: 6.1.14
|
||||
resolution: "flat-cache@npm:6.1.14"
|
||||
"flat-cache@npm:^6.1.19":
|
||||
version: 6.1.19
|
||||
resolution: "flat-cache@npm:6.1.19"
|
||||
dependencies:
|
||||
cacheable: "npm:^2.0.1"
|
||||
cacheable: "npm:^2.2.0"
|
||||
flatted: "npm:^3.3.3"
|
||||
hookified: "npm:^1.12.0"
|
||||
checksum: 10c0/e17eda47414b4742bc557650788f18255068621afb66b23dfc6a47b3ef3e6c366ede7329e71406bf331ef6f4a3b243040803eb175560b4ceb204779066ba6e92
|
||||
hookified: "npm:^1.13.0"
|
||||
checksum: 10c0/80c2d3c6ff2b7327920dacf2ab57e70ba4e865120209e41295689f029fcec17a6b49892ded7ce758d968d2b097fa2f9ab4e52923d971f3cdc90af9faba4680fd
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
|
|
@ -8028,6 +8023,15 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"hashery@npm:^1.2.0":
|
||||
version: 1.2.0
|
||||
resolution: "hashery@npm:1.2.0"
|
||||
dependencies:
|
||||
hookified: "npm:^1.13.0"
|
||||
checksum: 10c0/57905ae4bcb12faedf222b1f39cc05424ae2a2bba1f613b9c582a4e5012b8361c14a25a5a0c16da7eca70ee8338ad2924d6b9566667014c927a36d4b90ad5b72
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"hasown@npm:^2.0.2":
|
||||
version: 2.0.2
|
||||
resolution: "hasown@npm:2.0.2"
|
||||
|
|
@ -8090,10 +8094,10 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"hookified@npm:^1.12.0, hookified@npm:^1.12.1":
|
||||
version: 1.12.1
|
||||
resolution: "hookified@npm:1.12.1"
|
||||
checksum: 10c0/fe8d74ee49d1f79677dcdff7606eeb731f7a7dc59f61ec2141a11e3bb94ff6532f870649b900fa9f68568f410c504a338d8732e4d1abe61b426e645c37862e50
|
||||
"hookified@npm:^1.12.2, hookified@npm:^1.13.0":
|
||||
version: 1.13.0
|
||||
resolution: "hookified@npm:1.13.0"
|
||||
checksum: 10c0/26718a60385ab95f20173323c175a23b06efcc1fac613c51714c9c38038c7395ed52d3bea660840c8362d92dc38022ae4469c2a531728f6116f4df53f70505e7
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
|
|
@ -9057,12 +9061,12 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"keyv@npm:^5.5.1":
|
||||
version: 5.5.2
|
||||
resolution: "keyv@npm:5.5.2"
|
||||
"keyv@npm:^5.5.4":
|
||||
version: 5.5.4
|
||||
resolution: "keyv@npm:5.5.4"
|
||||
dependencies:
|
||||
"@keyv/serialize": "npm:^1.1.1"
|
||||
checksum: 10c0/b0a224210e8bbc4a5913535aa7cc8552809dc81ad67311cc78a2ccfe5485b82b23b8e28ea3a1202e8352c18dd2a0b12b49cda5bb933958d2dcf88042db54c9d0
|
||||
checksum: 10c0/8dad7f61022c6348c4c691a19468b7c238198252edbd3cc08277d95253c137af7ce5ffd763b6ffded4a75cbe03dc3134f1adcd3dd26c5767c2c9c254e3b39001
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
|
|
@ -9186,10 +9190,10 @@ __metadata:
|
|||
linkType: hard
|
||||
|
||||
"lint-staged@npm:^16.2.6":
|
||||
version: 16.2.6
|
||||
resolution: "lint-staged@npm:16.2.6"
|
||||
version: 16.2.7
|
||||
resolution: "lint-staged@npm:16.2.7"
|
||||
dependencies:
|
||||
commander: "npm:^14.0.1"
|
||||
commander: "npm:^14.0.2"
|
||||
listr2: "npm:^9.0.5"
|
||||
micromatch: "npm:^4.0.8"
|
||||
nano-spawn: "npm:^2.0.0"
|
||||
|
|
@ -9198,7 +9202,7 @@ __metadata:
|
|||
yaml: "npm:^2.8.1"
|
||||
bin:
|
||||
lint-staged: bin/lint-staged.js
|
||||
checksum: 10c0/6bae38082a0fcb3f699b144d1a4b85394f259f17a1f8a58b22122b9f1c6bb5e8340d6ee4bff12e52dbc4267377d6dde9e5c206157f381f1924a2640717f769c1
|
||||
checksum: 10c0/9a677c21a8112d823ae5bc565ba2c9e7b803786f2a021c46827a55fe44ed59def96edb24fc99c06a2545cdbbf366022ad82addcb3bf60c712f3b98ef92069717
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
|
|
@ -9362,7 +9366,7 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"magic-string@npm:^0.30.0, magic-string@npm:^0.30.17, magic-string@npm:^0.30.19, magic-string@npm:~0.30.11":
|
||||
"magic-string@npm:^0.30.0, magic-string@npm:^0.30.17, magic-string@npm:^0.30.21, magic-string@npm:~0.30.11":
|
||||
version: 0.30.21
|
||||
resolution: "magic-string@npm:0.30.21"
|
||||
dependencies:
|
||||
|
|
@ -9371,14 +9375,14 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"magicast@npm:^0.3.5":
|
||||
version: 0.3.5
|
||||
resolution: "magicast@npm:0.3.5"
|
||||
"magicast@npm:^0.5.1":
|
||||
version: 0.5.1
|
||||
resolution: "magicast@npm:0.5.1"
|
||||
dependencies:
|
||||
"@babel/parser": "npm:^7.25.4"
|
||||
"@babel/types": "npm:^7.25.4"
|
||||
source-map-js: "npm:^1.2.0"
|
||||
checksum: 10c0/a6cacc0a848af84f03e3f5bda7b0de75e4d0aa9ddce5517fd23ed0f31b5ddd51b2d0ff0b7e09b51f7de0f4053c7a1107117edda6b0732dca3e9e39e6c5a68c64
|
||||
"@babel/parser": "npm:^7.28.5"
|
||||
"@babel/types": "npm:^7.28.5"
|
||||
source-map-js: "npm:^1.2.1"
|
||||
checksum: 10c0/a00bbf3688b9b3e83c10b3bfe3f106cc2ccbf20c4f2dc1c9020a10556dfe0a6a6605a445ee8e86a6e2b484ec519a657b5e405532684f72678c62e4c0d32f962c
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
|
|
@ -11140,6 +11144,15 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"qified@npm:^0.5.2":
|
||||
version: 0.5.2
|
||||
resolution: "qified@npm:0.5.2"
|
||||
dependencies:
|
||||
hookified: "npm:^1.13.0"
|
||||
checksum: 10c0/4234ba1c0d3b14f31752a39f6788b2490cebad57abd1ce0cee0e04d2fe04a234463785d47559d364affe4d1578aad06fa2fd67b87044688708bf56d4a18ce44a
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"qs@npm:^6.14.0":
|
||||
version: 6.14.0
|
||||
resolution: "qs@npm:6.14.0"
|
||||
|
|
@ -12090,8 +12103,8 @@ __metadata:
|
|||
linkType: hard
|
||||
|
||||
"sass@npm:^1.62.1, sass@npm:^1.70.0":
|
||||
version: 1.93.3
|
||||
resolution: "sass@npm:1.93.3"
|
||||
version: 1.94.2
|
||||
resolution: "sass@npm:1.94.2"
|
||||
dependencies:
|
||||
"@parcel/watcher": "npm:^2.4.1"
|
||||
chokidar: "npm:^4.0.0"
|
||||
|
|
@ -12102,7 +12115,7 @@ __metadata:
|
|||
optional: true
|
||||
bin:
|
||||
sass: sass.js
|
||||
checksum: 10c0/b9facc64de10c9d1514272c1dcbb48ca99d5f591a1cd43fd27d641275d9d95948f1299107ab5b309e2abb552667cca84a38a1a3df5116eb72eba4144bf850b6a
|
||||
checksum: 10c0/49a656dfab58299165ef94e71483a333972daee68c49fa542858d4912accdfb1707338226a165b1a2dfcdb2509fcda5a5b4f3780d14e49b6d38d93c8043475d3
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
|
|
@ -12459,7 +12472,7 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"source-map-js@npm:>=0.6.2 <2.0.0, source-map-js@npm:^1.0.1, source-map-js@npm:^1.0.2, source-map-js@npm:^1.2.0, source-map-js@npm:^1.2.1":
|
||||
"source-map-js@npm:>=0.6.2 <2.0.0, source-map-js@npm:^1.0.1, source-map-js@npm:^1.0.2, source-map-js@npm:^1.2.1":
|
||||
version: 1.2.1
|
||||
resolution: "source-map-js@npm:1.2.1"
|
||||
checksum: 10c0/7bda1fc4c197e3c6ff17de1b8b2c20e60af81b63a52cb32ec5a5d67a20a7d42651e2cb34ebe93833c5a2a084377e17455854fee3e21e7925c64a51b6a52b0faf
|
||||
|
|
@ -12632,10 +12645,10 @@ __metadata:
|
|||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"std-env@npm:^3.9.0":
|
||||
version: 3.9.0
|
||||
resolution: "std-env@npm:3.9.0"
|
||||
checksum: 10c0/4a6f9218aef3f41046c3c7ecf1f98df00b30a07f4f35c6d47b28329bc2531eef820828951c7d7b39a1c5eb19ad8a46e3ddfc7deb28f0a2f3ceebee11bab7ba50
|
||||
"std-env@npm:^3.10.0":
|
||||
version: 3.10.0
|
||||
resolution: "std-env@npm:3.10.0"
|
||||
checksum: 10c0/1814927a45004d36dde6707eaf17552a546769bc79a6421be2c16ce77d238158dfe5de30910b78ec30d95135cc1c59ea73ee22d2ca170f8b9753f84da34c427f
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
|
|
@ -12980,8 +12993,8 @@ __metadata:
|
|||
linkType: hard
|
||||
|
||||
"stylelint@npm:^16.19.1":
|
||||
version: 16.25.0
|
||||
resolution: "stylelint@npm:16.25.0"
|
||||
version: 16.26.0
|
||||
resolution: "stylelint@npm:16.26.0"
|
||||
dependencies:
|
||||
"@csstools/css-parser-algorithms": "npm:^3.0.5"
|
||||
"@csstools/css-tokenizer": "npm:^3.0.4"
|
||||
|
|
@ -12996,7 +13009,7 @@ __metadata:
|
|||
debug: "npm:^4.4.3"
|
||||
fast-glob: "npm:^3.3.3"
|
||||
fastest-levenshtein: "npm:^1.0.16"
|
||||
file-entry-cache: "npm:^10.1.4"
|
||||
file-entry-cache: "npm:^11.1.0"
|
||||
global-modules: "npm:^2.0.0"
|
||||
globby: "npm:^11.1.0"
|
||||
globjoin: "npm:^0.1.4"
|
||||
|
|
@ -13023,7 +13036,7 @@ __metadata:
|
|||
write-file-atomic: "npm:^5.0.1"
|
||||
bin:
|
||||
stylelint: bin/stylelint.mjs
|
||||
checksum: 10c0/80fa44ff5197419647306d9b2cf3804c10255ac30a96bb3390f2a3f1debee80e2e1cde81bb4e87d9179ababc9cc0ad6c362661835ee1d32a509b7fe44a8d3dd6
|
||||
checksum: 10c0/6f501ff051aee4fc7713635c98bf6837f889b22fe86152cfed20365ffeee0acf9d751f94ff265433b532b2a1ab7a228fc1fda3f507859acb57a689268939553d
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
|
|
@ -13544,17 +13557,17 @@ __metadata:
|
|||
linkType: hard
|
||||
|
||||
"typescript-eslint@npm:^8.28.0, typescript-eslint@npm:^8.45.0":
|
||||
version: 8.46.3
|
||||
resolution: "typescript-eslint@npm:8.46.3"
|
||||
version: 8.48.0
|
||||
resolution: "typescript-eslint@npm:8.48.0"
|
||||
dependencies:
|
||||
"@typescript-eslint/eslint-plugin": "npm:8.46.3"
|
||||
"@typescript-eslint/parser": "npm:8.46.3"
|
||||
"@typescript-eslint/typescript-estree": "npm:8.46.3"
|
||||
"@typescript-eslint/utils": "npm:8.46.3"
|
||||
"@typescript-eslint/eslint-plugin": "npm:8.48.0"
|
||||
"@typescript-eslint/parser": "npm:8.48.0"
|
||||
"@typescript-eslint/typescript-estree": "npm:8.48.0"
|
||||
"@typescript-eslint/utils": "npm:8.48.0"
|
||||
peerDependencies:
|
||||
eslint: ^8.57.0 || ^9.0.0
|
||||
typescript: ">=4.8.4 <6.0.0"
|
||||
checksum: 10c0/c6d9398b16429b614c96405caae018b7ea74df55abf5ba9248ca9d02327704d6e1c3bdd2e2f52cfb25c9e5465ad93d73e19ee7fc3afbb837a6aeeecdf02c979b
|
||||
checksum: 10c0/bd1a8691148c2424a92458e1f67f0b78b4ee8698a561ec53412874fb1333cf475d604c71a5832ce5140dbda76420dfd299d3cd39dd18ca7101476f86d3cd67af
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
|
|
@ -14043,23 +14056,23 @@ __metadata:
|
|||
linkType: hard
|
||||
|
||||
"vitest@npm:^4.0.5":
|
||||
version: 4.0.7
|
||||
resolution: "vitest@npm:4.0.7"
|
||||
version: 4.0.13
|
||||
resolution: "vitest@npm:4.0.13"
|
||||
dependencies:
|
||||
"@vitest/expect": "npm:4.0.7"
|
||||
"@vitest/mocker": "npm:4.0.7"
|
||||
"@vitest/pretty-format": "npm:4.0.7"
|
||||
"@vitest/runner": "npm:4.0.7"
|
||||
"@vitest/snapshot": "npm:4.0.7"
|
||||
"@vitest/spy": "npm:4.0.7"
|
||||
"@vitest/utils": "npm:4.0.7"
|
||||
"@vitest/expect": "npm:4.0.13"
|
||||
"@vitest/mocker": "npm:4.0.13"
|
||||
"@vitest/pretty-format": "npm:4.0.13"
|
||||
"@vitest/runner": "npm:4.0.13"
|
||||
"@vitest/snapshot": "npm:4.0.13"
|
||||
"@vitest/spy": "npm:4.0.13"
|
||||
"@vitest/utils": "npm:4.0.13"
|
||||
debug: "npm:^4.4.3"
|
||||
es-module-lexer: "npm:^1.7.0"
|
||||
expect-type: "npm:^1.2.2"
|
||||
magic-string: "npm:^0.30.19"
|
||||
magic-string: "npm:^0.30.21"
|
||||
pathe: "npm:^2.0.3"
|
||||
picomatch: "npm:^4.0.3"
|
||||
std-env: "npm:^3.9.0"
|
||||
std-env: "npm:^3.10.0"
|
||||
tinybench: "npm:^2.9.0"
|
||||
tinyexec: "npm:^0.3.2"
|
||||
tinyglobby: "npm:^0.2.15"
|
||||
|
|
@ -14068,17 +14081,20 @@ __metadata:
|
|||
why-is-node-running: "npm:^2.3.0"
|
||||
peerDependencies:
|
||||
"@edge-runtime/vm": "*"
|
||||
"@opentelemetry/api": ^1.9.0
|
||||
"@types/debug": ^4.1.12
|
||||
"@types/node": ^20.0.0 || ^22.0.0 || >=24.0.0
|
||||
"@vitest/browser-playwright": 4.0.7
|
||||
"@vitest/browser-preview": 4.0.7
|
||||
"@vitest/browser-webdriverio": 4.0.7
|
||||
"@vitest/ui": 4.0.7
|
||||
"@vitest/browser-playwright": 4.0.13
|
||||
"@vitest/browser-preview": 4.0.13
|
||||
"@vitest/browser-webdriverio": 4.0.13
|
||||
"@vitest/ui": 4.0.13
|
||||
happy-dom: "*"
|
||||
jsdom: "*"
|
||||
peerDependenciesMeta:
|
||||
"@edge-runtime/vm":
|
||||
optional: true
|
||||
"@opentelemetry/api":
|
||||
optional: true
|
||||
"@types/debug":
|
||||
optional: true
|
||||
"@types/node":
|
||||
|
|
@ -14097,7 +14113,7 @@ __metadata:
|
|||
optional: true
|
||||
bin:
|
||||
vitest: vitest.mjs
|
||||
checksum: 10c0/d5312e11e9ffbaf239fa5cb5d43e81a43adbdb085bf113c237eff3531805a347e6587ad1dd368a5e9639ff23f8f48650e689fb49c3cf9375d922ef2767a6416a
|
||||
checksum: 10c0/8582ab1848d5d7dbbac0b3a5eae2625f44d0db887f73da2ee8f588fb13c66fe8ea26dac05c26ebb43673b735bc246764f52969f7c7e25455dfb7c6274659ae2c
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user