Merge commit 'a706fce6781104b3aa1315be14f1fb8ccd4fcb1b' into glitch-soc/merge-upstream

This commit is contained in:
Claire 2026-04-21 19:20:05 +02:00
commit 0b3c848958
25 changed files with 505 additions and 348 deletions

26
Gemfile
View File

@ -105,19 +105,19 @@ gem 'opentelemetry-api', '~> 1.9.0'
group :opentelemetry do
gem 'opentelemetry-exporter-otlp', '~> 0.33.0', require: false
gem 'opentelemetry-instrumentation-active_job', '~> 0.10.0', require: false
gem 'opentelemetry-instrumentation-active_model_serializers', '~> 0.24.0', require: false
gem 'opentelemetry-instrumentation-concurrent_ruby', '~> 0.24.0', require: false
gem 'opentelemetry-instrumentation-excon', '~> 0.28.0', require: false
gem 'opentelemetry-instrumentation-faraday', '~> 0.32.0', require: false
gem 'opentelemetry-instrumentation-http', '~> 0.29.0', require: false
gem 'opentelemetry-instrumentation-http_client', '~> 0.28.0', require: false
gem 'opentelemetry-instrumentation-net_http', '~> 0.28.0', require: false
gem 'opentelemetry-instrumentation-pg', '~> 0.35.0', require: false
gem 'opentelemetry-instrumentation-rack', '~> 0.30.0', require: false
gem 'opentelemetry-instrumentation-rails', '~> 0.40.0', require: false
gem 'opentelemetry-instrumentation-redis', '~> 0.28.0', require: false
gem 'opentelemetry-instrumentation-sidekiq', '~> 0.28.0', require: false
gem 'opentelemetry-instrumentation-active_job', '~> 0.11.0', require: false
gem 'opentelemetry-instrumentation-active_model_serializers', '~> 0.25.0', require: false
gem 'opentelemetry-instrumentation-concurrent_ruby', '~> 0.25.0', require: false
gem 'opentelemetry-instrumentation-excon', '~> 0.29.0', require: false
gem 'opentelemetry-instrumentation-faraday', '~> 0.33.0', require: false
gem 'opentelemetry-instrumentation-http', '~> 0.30.0', require: false
gem 'opentelemetry-instrumentation-http_client', '~> 0.29.0', require: false
gem 'opentelemetry-instrumentation-net_http', '~> 0.29.0', require: false
gem 'opentelemetry-instrumentation-pg', '~> 0.36.0', require: false
gem 'opentelemetry-instrumentation-rack', '~> 0.31.0', require: false
gem 'opentelemetry-instrumentation-rails', '~> 0.41.0', require: false
gem 'opentelemetry-instrumentation-redis', '~> 0.29.0', require: false
gem 'opentelemetry-instrumentation-sidekiq', '~> 0.29.0', require: false
gem 'opentelemetry-sdk', '~> 1.4', require: false
end

View File

@ -519,61 +519,61 @@ GEM
opentelemetry-common (~> 0.20)
opentelemetry-sdk (~> 1.10)
opentelemetry-semantic_conventions
opentelemetry-helpers-sql (0.3.0)
opentelemetry-helpers-sql (0.4.0)
opentelemetry-api (~> 1.7)
opentelemetry-helpers-sql-processor (0.4.0)
opentelemetry-helpers-sql-processor (0.5.0)
opentelemetry-api (~> 1.0)
opentelemetry-common (~> 0.21)
opentelemetry-instrumentation-action_mailer (0.6.1)
opentelemetry-instrumentation-action_mailer (0.7.0)
opentelemetry-instrumentation-active_support (~> 0.10)
opentelemetry-instrumentation-action_pack (0.16.0)
opentelemetry-instrumentation-action_pack (0.17.0)
opentelemetry-instrumentation-rack (~> 0.29)
opentelemetry-instrumentation-action_view (0.11.2)
opentelemetry-instrumentation-action_view (0.12.0)
opentelemetry-instrumentation-active_support (~> 0.10)
opentelemetry-instrumentation-active_job (0.10.1)
opentelemetry-instrumentation-active_job (0.11.0)
opentelemetry-instrumentation-base (~> 0.25)
opentelemetry-instrumentation-active_model_serializers (0.24.0)
opentelemetry-instrumentation-active_model_serializers (0.25.0)
opentelemetry-instrumentation-active_support (>= 0.7.0)
opentelemetry-instrumentation-active_record (0.11.1)
opentelemetry-instrumentation-active_record (0.12.0)
opentelemetry-instrumentation-base (~> 0.25)
opentelemetry-instrumentation-active_storage (0.3.1)
opentelemetry-instrumentation-active_storage (0.4.0)
opentelemetry-instrumentation-active_support (~> 0.10)
opentelemetry-instrumentation-active_support (0.10.1)
opentelemetry-instrumentation-active_support (0.11.0)
opentelemetry-instrumentation-base (~> 0.25)
opentelemetry-instrumentation-base (0.25.0)
opentelemetry-instrumentation-base (0.26.0)
opentelemetry-api (~> 1.7)
opentelemetry-common (~> 0.21)
opentelemetry-registry (~> 0.1)
opentelemetry-instrumentation-concurrent_ruby (0.24.0)
opentelemetry-instrumentation-concurrent_ruby (0.25.0)
opentelemetry-instrumentation-base (~> 0.25)
opentelemetry-instrumentation-excon (0.28.0)
opentelemetry-instrumentation-excon (0.29.0)
opentelemetry-instrumentation-base (~> 0.25)
opentelemetry-instrumentation-faraday (0.32.0)
opentelemetry-instrumentation-faraday (0.33.0)
opentelemetry-instrumentation-base (~> 0.25)
opentelemetry-instrumentation-http (0.29.0)
opentelemetry-instrumentation-http (0.30.0)
opentelemetry-instrumentation-base (~> 0.25)
opentelemetry-instrumentation-http_client (0.28.0)
opentelemetry-instrumentation-http_client (0.29.0)
opentelemetry-instrumentation-base (~> 0.25)
opentelemetry-instrumentation-net_http (0.28.0)
opentelemetry-instrumentation-net_http (0.29.0)
opentelemetry-instrumentation-base (~> 0.25)
opentelemetry-instrumentation-pg (0.35.0)
opentelemetry-instrumentation-pg (0.36.0)
opentelemetry-helpers-sql
opentelemetry-helpers-sql-processor
opentelemetry-instrumentation-base (~> 0.25)
opentelemetry-instrumentation-rack (0.30.0)
opentelemetry-instrumentation-rack (0.31.0)
opentelemetry-instrumentation-base (~> 0.25)
opentelemetry-instrumentation-rails (0.40.0)
opentelemetry-instrumentation-action_mailer (~> 0.6)
opentelemetry-instrumentation-action_pack (~> 0.15)
opentelemetry-instrumentation-action_view (~> 0.11)
opentelemetry-instrumentation-active_job (~> 0.10)
opentelemetry-instrumentation-active_record (~> 0.11)
opentelemetry-instrumentation-active_storage (~> 0.3)
opentelemetry-instrumentation-active_support (~> 0.10)
opentelemetry-instrumentation-concurrent_ruby (~> 0.23)
opentelemetry-instrumentation-redis (0.28.0)
opentelemetry-instrumentation-rails (0.41.0)
opentelemetry-instrumentation-action_mailer (~> 0.7)
opentelemetry-instrumentation-action_pack (~> 0.17)
opentelemetry-instrumentation-action_view (~> 0.12)
opentelemetry-instrumentation-active_job (~> 0.11)
opentelemetry-instrumentation-active_record (~> 0.12)
opentelemetry-instrumentation-active_storage (~> 0.4)
opentelemetry-instrumentation-active_support (~> 0.11)
opentelemetry-instrumentation-concurrent_ruby (~> 0.25)
opentelemetry-instrumentation-redis (0.29.0)
opentelemetry-instrumentation-base (~> 0.25)
opentelemetry-instrumentation-sidekiq (0.28.1)
opentelemetry-instrumentation-sidekiq (0.29.0)
opentelemetry-instrumentation-base (~> 0.25)
opentelemetry-registry (0.5.0)
opentelemetry-api (~> 1.1)
@ -597,8 +597,8 @@ GEM
pastel (0.8.0)
tty-color (~> 0.5)
pg (1.6.3)
pghero (3.7.0)
activerecord (>= 7.1)
pghero (3.8.0)
activerecord (>= 7.2)
playwright-ruby-client (1.59.0)
base64
concurrent-ruby (>= 1.1.6)
@ -1022,19 +1022,19 @@ DEPENDENCIES
omniauth_openid_connect (~> 0.8.0)
opentelemetry-api (~> 1.9.0)
opentelemetry-exporter-otlp (~> 0.33.0)
opentelemetry-instrumentation-active_job (~> 0.10.0)
opentelemetry-instrumentation-active_model_serializers (~> 0.24.0)
opentelemetry-instrumentation-concurrent_ruby (~> 0.24.0)
opentelemetry-instrumentation-excon (~> 0.28.0)
opentelemetry-instrumentation-faraday (~> 0.32.0)
opentelemetry-instrumentation-http (~> 0.29.0)
opentelemetry-instrumentation-http_client (~> 0.28.0)
opentelemetry-instrumentation-net_http (~> 0.28.0)
opentelemetry-instrumentation-pg (~> 0.35.0)
opentelemetry-instrumentation-rack (~> 0.30.0)
opentelemetry-instrumentation-rails (~> 0.40.0)
opentelemetry-instrumentation-redis (~> 0.28.0)
opentelemetry-instrumentation-sidekiq (~> 0.28.0)
opentelemetry-instrumentation-active_job (~> 0.11.0)
opentelemetry-instrumentation-active_model_serializers (~> 0.25.0)
opentelemetry-instrumentation-concurrent_ruby (~> 0.25.0)
opentelemetry-instrumentation-excon (~> 0.29.0)
opentelemetry-instrumentation-faraday (~> 0.33.0)
opentelemetry-instrumentation-http (~> 0.30.0)
opentelemetry-instrumentation-http_client (~> 0.29.0)
opentelemetry-instrumentation-net_http (~> 0.29.0)
opentelemetry-instrumentation-pg (~> 0.36.0)
opentelemetry-instrumentation-rack (~> 0.31.0)
opentelemetry-instrumentation-rails (~> 0.41.0)
opentelemetry-instrumentation-redis (~> 0.29.0)
opentelemetry-instrumentation-sidekiq (~> 0.29.0)
opentelemetry-sdk (~> 1.4)
ox (~> 2.14)
parslet

View File

@ -0,0 +1,6 @@
# frozen_string_literal: true
module MediaPlayerHelper
PLAYER_HEIGHT = 380
PLAYER_WIDTH = 670
end

View File

@ -26,7 +26,6 @@
z-index: 9999;
box-sizing: border-box;
max-height: min(320px, 50dvh);
padding: 4px;
border-radius: 4px;
color: var(--color-text-primary);
background: var(--color-bg-primary);
@ -38,22 +37,18 @@
overscroll-behavior-y: contain;
}
.groupLabel {
padding-block: 12px 4px;
padding-inline: 12px;
.groupTitle {
padding: 8px 16px 4px;
font-size: 13px;
font-weight: bold;
text-transform: uppercase;
ul:first-child > & {
padding-top: 4px;
}
}
.menuItem {
display: flex;
align-items: center;
padding: 8px 12px;
margin-inline: 4px;
gap: 12px;
font-size: 14px;
line-height: 20px;
@ -62,6 +57,14 @@
cursor: pointer;
user-select: none;
&:first-child {
margin-top: 4px;
}
&:last-child {
margin-bottom: 4px;
}
&[data-highlighted='true'] {
background: var(--color-bg-overlay-highlight);
}

View File

@ -2,7 +2,7 @@ import { useCallback, useState } from 'react';
import type { Meta, StoryObj } from '@storybook/react-vite';
import { ComboboxField } from './combobox_field';
import { ComboboxField, ComboboxMenuItem } from './combobox_field';
interface Fruit {
id: string;
@ -60,7 +60,7 @@ const ComboboxDemo: React.FC<{ withGroups?: boolean }> = ({ withGroups }) => {
}, []);
const renderItem = useCallback(
(fruit: Fruit) => <span>{fruit.name}</span>,
(fruit: Fruit) => <ComboboxMenuItem>{fruit.name}</ComboboxMenuItem>,
[],
);
@ -93,6 +93,7 @@ const ComboboxDemo: React.FC<{ withGroups?: boolean }> = ({ withGroups }) => {
const meta = {
title: 'Components/Form Fields/ComboboxField',
component: ComboboxField,
subcomponents: { ComboboxMenuItem },
render: () => <ComboboxDemo />,
} satisfies Meta<typeof ComboboxField>;

View File

@ -1,6 +1,8 @@
import {
createContext,
forwardRef,
useCallback,
useContext,
useId,
useMemo,
useRef,
@ -109,6 +111,58 @@ interface ComboboxProps<
interface Props<Item extends ComboboxItem, GroupKey extends string>
extends ComboboxProps<Item, GroupKey>, CommonFieldWrapperProps {}
interface ComboboxItemPropsContext {
role: 'option';
'data-highlighted': boolean;
'aria-selected': boolean;
'aria-disabled': boolean;
'data-item-id': string;
onMouseEnter: React.MouseEventHandler<HTMLLIElement>;
onClick: React.MouseEventHandler<HTMLLIElement>;
}
const ComboboxItemPropsContext = createContext<ComboboxItemPropsContext | null>(
null,
);
export function useComboboxItemProps() {
const context = useContext(ComboboxItemPropsContext);
if (context === null) {
throw new Error(
'useComboboxItemProps must be used within a Combobox component',
);
}
return context;
}
export const ComboboxMenuItem: React.FC<{
className?: string;
children: React.ReactNode;
}> = ({ className, children }) => {
const props = useComboboxItemProps();
return (
<li className={classNames(className, classes.menuItem)} {...props}>
{children}
</li>
);
};
export const ComboboxMenuGroupTitle: React.FC<
React.ComponentPropsWithoutRef<'li'>
> = ({ className, children, ...otherProps }) => {
return (
<li
{...otherProps}
role='presentation'
className={classNames(className, classes.groupTitle)}
>
{children}
</li>
);
};
/**
* The combobox field allows users to select one or more items
* by searching or filtering a large or dynamic list of options.
@ -371,7 +425,7 @@ const ComboboxWithRef = <Item extends ComboboxItem, GroupKey extends string>(
const renderItems = (items: Item[]) =>
items.map((item) => {
const id = getItemId(item);
const isDisabled = getIsItemDisabled?.(item);
const isDisabled = getIsItemDisabled?.(item) ?? false;
const isHighlighted = id === highlightedItemId;
// If `getIsItemSelected` is defined, we assume 'multi-select'
// behaviour and don't set `aria-selected` based on highlight,
@ -380,23 +434,23 @@ const ComboboxWithRef = <Item extends ComboboxItem, GroupKey extends string>(
? getIsItemSelected(item)
: isHighlighted;
return (
// eslint-disable-next-line jsx-a11y/click-events-have-key-events
<li
<ComboboxItemPropsContext.Provider
key={id}
role='option'
className={classes.menuItem}
data-highlighted={isHighlighted}
aria-selected={isSelected}
aria-disabled={isDisabled}
data-item-id={id}
onMouseEnter={handleItemMouseEnter}
onClick={handleSelectItem}
value={{
role: 'option',
'data-highlighted': isHighlighted,
'aria-selected': isSelected,
'aria-disabled': isDisabled,
'data-item-id': id,
onMouseEnter: handleItemMouseEnter,
onClick: handleSelectItem,
}}
>
{renderItem(item, {
isSelected,
isDisabled: isDisabled ?? false,
isDisabled,
})}
</li>
</ComboboxItemPropsContext.Provider>
);
});
@ -498,16 +552,12 @@ const ComboboxWithRef = <Item extends ComboboxItem, GroupKey extends string>(
role='group'
aria-labelledby={hasTitle ? groupTitleId : undefined}
>
{hasTitle && (
<li
role='presentation'
className={classes.groupLabel}
>
{customGroupTitle ?? (
<span id={groupTitleId}>{groupKey}</span>
)}
</li>
)}
{hasTitle &&
(customGroupTitle ?? (
<ComboboxMenuGroupTitle id={groupTitleId}>
{groupKey}
</ComboboxMenuGroupTitle>
))}
{renderItems(groupItems)}
</ul>
);

View File

@ -4,6 +4,7 @@ import { useCallback, useId, useState } from 'react';
import { defineMessages, useIntl } from 'react-intl';
import { Combobox } from '@/mastodon/components/form_fields';
import { ComboboxMenuItem } from '@/mastodon/components/form_fields/combobox_field';
import { useSearchTags } from '@/mastodon/hooks/useSearchTags';
import type { TagSearchResult } from '@/mastodon/hooks/useSearchTags';
import { addFeaturedTags } from '@/mastodon/reducers/slices/profile_edit';
@ -77,4 +78,6 @@ export const AccountEditTagSearch: FC = () => {
);
};
const renderItem = (item: TagSearchResult) => item.label ?? `#${item.name}`;
const renderItem = (item: TagSearchResult) => (
<ComboboxMenuItem>{item.label ?? `#${item.name}`}</ComboboxMenuItem>
);

View File

@ -65,16 +65,23 @@ export const ImageUploadModal: FC<
const handleFile = useCallback((file: File) => {
try {
parseImageFile(file, (result, isAnimated) => {
if (isAnimated) {
// If the image is animated, skip cropping and go straight to alt text.
setImageBlob(file);
setStep('alt');
} else {
setImageSrc(result);
setStep('crop');
// If the image is animated, skip cropping and go straight to alt text.
if (file.type === 'image/gif') {
setImageBlob(file);
setStep('alt');
return;
}
const reader = new FileReader();
reader.onload = () => {
const dataUri = reader.result;
if (typeof dataUri !== 'string') {
throw new Error('Expected a string');
}
});
setImageSrc(dataUri);
setStep('crop');
};
reader.readAsDataURL(file);
} catch (error) {
console.warn('Error with image parsing:', error);
setStep('select');
@ -408,54 +415,6 @@ const StepAlt: FC<{
);
};
/**
* Parses an image file and determines if it's an animated GIF and returns a data URI for cropping.
* Based on https://gist.github.com/zakirt/faa4a58cec5a7505b10e3686a226f285.
*/
function parseImageFile(
file: File,
cb: (buffer: string, isAnimated: boolean) => void,
): void {
const reader = new FileReader();
reader.onload = () => {
const buffer = reader.result;
if (!(buffer instanceof ArrayBuffer)) {
throw new Error('Expected an ArrayBuffer');
}
// Convert the ArrayBuffer to a base64 data URI.
const bytes = new Uint8Array(buffer);
const base64 = btoa(String.fromCharCode(...bytes));
const dataUri = `data:${file.type};base64,${base64}`;
// If the file type is not a GIF, then it's not animated as we don't support animated WebP or PNG.
if (file.type !== 'image/gif') {
cb(dataUri, false);
}
const view = new DataView(buffer, 10); // Start from the last 4 bytes of the Logical Screen Descriptor.
let offset = 3;
// Check the first bit for the global color table flag.
const globalColorTable = view.getInt8(0);
if (globalColorTable & 0x08) {
// Grab last three bits to calculate the global color table size, and skip it.
offset += 3 * Math.pow(2, (globalColorTable & 0x7) + 1);
}
// Check Graphics Control Extension and Graphics Control Label to access animated data.
let delayTime = 0;
if (view.getUint8(offset) & 0x21 && view.getUint8(offset + 1) & 0xf9) {
// Skip to the delay time, which is stored in the next two bytes.
delayTime = view.getUint16(offset + 4);
}
// If there is a delay time, the GIF is animated.
cb(dataUri, delayTime > 0);
};
reader.readAsArrayBuffer(file);
}
async function calculateCroppedImage(
imageSrc: string,
crop: Area,

View File

@ -4,6 +4,9 @@ import { FormattedMessage, useIntl } from 'react-intl';
import { useHistory } from 'react-router-dom';
import type { Map as ImmutableMap } from 'immutable';
import { useComboboxItemProps } from '@/mastodon/components/form_fields/combobox_field';
import type { ApiMutedAccountJSON } from 'mastodon/api_types/accounts';
import type { ApiCollectionJSON } from 'mastodon/api_types/collections';
import { AccountListItem } from 'mastodon/components/account_list_item';
@ -25,6 +28,7 @@ import {
import { useAccount } from 'mastodon/hooks/useAccount';
import { useSearchAccounts } from 'mastodon/hooks/useSearchAccounts';
import { domain } from 'mastodon/initial_state';
import type { Relationship } from 'mastodon/models/relationship';
import {
addCollectionItem,
getCollectionItemIds,
@ -64,18 +68,18 @@ const AddedAccountItem: React.FC<{
const SuggestedAccountItem: React.FC<{ id: string }> = ({ id }) => {
const account = useAccount(id);
const handle = useAccountHandle(account, domain);
const comboboxItemProps = useComboboxItemProps();
if (!account) return null;
return (
<ListItemWrapper
className={classes.suggestion}
icon={<Avatar account={account} size={40} />}
>
<ListItemContent subtitle={handle}>
<DisplayName account={account} variant='simple' />
</ListItemContent>
</ListItemWrapper>
<li {...comboboxItemProps} className={classes.suggestion}>
<ListItemWrapper icon={<Avatar account={account} size={40} />}>
<ListItemContent subtitle={handle}>
<DisplayName account={account} variant='simple' />
</ListItemContent>
</ListItemWrapper>
</li>
);
};
@ -85,19 +89,37 @@ const renderAccountItem = (account: ApiMutedAccountJSON) => (
type GroupKey = 'available' | 'mustFollow' | 'disabled';
function groupSuggestions(accounts: ApiMutedAccountJSON[]) {
const { available, disabled } = Object.groupBy(accounts, (account) => {
if (getIsItemDisabled(account)) {
const canAccountBeAdded = (account: ApiMutedAccountJSON) =>
['automatic', 'manual'].includes(account.feature_approval.current_user);
function groupSuggestions(
accounts: ApiMutedAccountJSON[],
relationships: ImmutableMap<string, Relationship>,
) {
const { available, mustFollow, disabled } = Object.groupBy(
accounts,
(account): GroupKey => {
if (canAccountBeAdded(account)) {
return 'available';
}
const canAccountBeAddedByFollowers =
account.feature_approval.automatic.includes('followers') ||
account.feature_approval.manual.includes('followers');
if (
canAccountBeAddedByFollowers &&
!relationships.get(account.id)?.following
) {
return 'mustFollow';
}
return 'disabled';
}
// if (account.locked && !relationship?.following) {
// return 'mustFollow';
// }
return 'available';
});
},
);
// Returning a new object ensures a fixed property order
return { available, disabled };
return { available, mustFollow, disabled };
}
const renderGroupTitle = (groupKey: GroupKey, titleId: string) => {
@ -137,19 +159,19 @@ const renderGroupTitle = (groupKey: GroupKey, titleId: string) => {
}
return (
<ListItemWrapper className={classes.suggestionGroup}>
<ListItemContent id={titleId} subtitle={description}>
{title}
</ListItemContent>
</ListItemWrapper>
<li role='presentation'>
<ListItemWrapper className={classes.suggestionGroup}>
<ListItemContent id={titleId} subtitle={description}>
{title}
</ListItemContent>
</ListItemWrapper>
</li>
);
};
const getItemId = (account: ApiMutedAccountJSON) => account.id;
// Disable accounts who can't be added to a collection
const getIsItemDisabled = (account: ApiMutedAccountJSON) =>
!['automatic', 'manual'].includes(account.feature_approval.current_user);
!canAccountBeAdded(account);
export const CollectionAccounts: React.FC<{
collection?: ApiCollectionJSON | null;
@ -189,6 +211,10 @@ export const CollectionAccounts: React.FC<{
filterResults: (account) => !accountIds.includes(account.id),
});
const relationships = useAppSelector((state) => state.relationships);
const groupedItems = groupSuggestions(suggestedAccounts, relationships);
const handleSearchValueChange = useCallback(
(e: React.ChangeEvent<HTMLInputElement>) => {
setSearchValue(e.target.value);
@ -330,7 +356,7 @@ export const CollectionAccounts: React.FC<{
onKeyDown={handleSearchKeyDown}
disabled={hasMaxAccounts}
isLoading={isLoadingSuggestions}
items={groupSuggestions(suggestedAccounts)}
items={groupedItems}
getItemId={getItemId}
getIsItemDisabled={getIsItemDisabled}
renderItem={renderAccountItem}

View File

@ -6,6 +6,7 @@ import { useHistory } from 'react-router-dom';
import { isFulfilled } from '@reduxjs/toolkit';
import { ComboboxMenuItem } from '@/mastodon/components/form_fields/combobox_field';
import { languages } from '@/mastodon/initial_state';
import {
hasSpecialCharacters,
@ -373,7 +374,9 @@ const TopicField: React.FC = () => {
);
};
const renderTagItem = (item: TagSearchResult) => item.label ?? `#${item.name}`;
const renderTagItem = (item: TagSearchResult) => (
<ComboboxMenuItem>{item.label ?? `#${item.name}`}</ComboboxMenuItem>
);
const LanguageField: React.FC = () => {
const dispatch = useAppDispatch();

View File

@ -60,17 +60,20 @@
}
.suggestion {
padding: 4px 0;
cursor: pointer;
user-select: none;
border-bottom: 1px solid var(--color-border-primary);
[aria-disabled='true'] & {
&[data-highlighted='true'] {
background: var(--color-bg-overlay-highlight);
}
&[aria-disabled='true'] {
opacity: 0.6;
cursor: not-allowed;
}
}
.suggestionGroup {
padding: 4px 0;
// Undo default group styles:
font-weight: 400;
text-transform: none;
padding-bottom: 4px;
}

View File

@ -411,7 +411,9 @@
"collections.sensitive": "Inhaltswarnung",
"collections.share_short": "Teilen",
"collections.suggestions.can_not_add": "Kann nicht hinzugefügt werden",
"collections.suggestions.can_not_add_desc": "Diese Konten möchten möglicherweise nicht entdeckt werden oder deren Server unterstützt noch keine Sammlungen.",
"collections.suggestions.must_follow": "Zuerst Profil folgen",
"collections.suggestions.must_follow_desc": "Diese Konten überprüfen ihre Follower-Anfragen manuell. Follower können sie zu Sammlungen hinzufügen.",
"collections.topic_hint": "Ein Hashtag für diese Sammlung kann anderen dabei helfen, dein Anliegen besser einordnen zu können.",
"collections.topic_special_chars_hint": "Sonderzeichen werden beim Speichern entfernt",
"collections.unlisted_collections_description": "Die Sammlungen sind für andere nicht auf deinem Profil sichtbar. Ein direkter Zugriff ist per Link möglich.",

View File

@ -666,7 +666,7 @@
"featured_carousel.header": "{count, plural, one {Καρφιτσωμένη Ανάρτηση} other {Καρφιτσωμένες Αναρτήσεις}}",
"featured_carousel.slide": "Ανάρτηση {current, number} από {max, number}",
"featured_tags.more_items": "+{count}",
"featured_tags.suggestions": "Τον τελευταίο καιρό έχετε δημοσιεύσει για {items}. Προσθέστε αυτά ως αναδεδειγμένες ετικέτες;",
"featured_tags.suggestions": "Τον τελευταίο καιρό έχεις δημοσιεύσει για {items}. Να προστεθούν αυτά ως αναδεδειγμένες ετικέτες;",
"featured_tags.suggestions.add": "Προσθήκη",
"featured_tags.suggestions.added": "Διαχειριστείτε τις αναδεδειγμένες ετικέτες σας οποιαδήποτε στιγμή κάτω από το <link>Επεξεργασία προφίλ > Αναδεδειγμένες ετικέτες</link>.",
"featured_tags.suggestions.dismiss": "Όχι, ευχαριστώ",

View File

@ -106,6 +106,7 @@
"account.name.copy": "Copy handle",
"account.name.help.domain": "{domain} is the server that hosts the users profile and posts.",
"account.name.help.domain_self": "{domain} is your server that hosts your profile and posts.",
"account.name.help.footer": "Just like you can send emails to people using different email providers, you can interact with people on other Mastodon servers, and with anyone on other Mastodon-compatible social apps.",
"account.name.help.header": "A handle is like an email address",
"account.name.help.username": "{username} is this accounts username on their server. Someone on another server might have the same username.",
"account.name.help.username_self": "{username} is your username on this server. Someone on another server might have the same username.",
@ -350,6 +351,7 @@
"closed_registrations_modal.find_another_server": "Find another server",
"closed_registrations_modal.preamble": "Mastodon is decentralised, so no matter where you create your account, you will be able to follow and interact with anyone on this server. You can even self-host it!",
"closed_registrations_modal.title": "Signing up on Mastodon",
"collection.share_modal.share_link_label": "Share link",
"collection.share_modal.share_via_post": "Post on Mastodon",
"collection.share_modal.share_via_system": "Share to…",
"collection.share_modal.title": "Share collection",
@ -357,7 +359,10 @@
"collection.share_template_other": "Check out this cool collection: {link}",
"collection.share_template_own": "Check out my new collection: {link}",
"collections.account_count": "{count, plural, one {# account} other {# accounts}}",
"collections.accounts.empty_description": "Add up to {count} accounts",
"collections.accounts.empty_editor_title": "No one is in this collection yet",
"collections.accounts.empty_title": "This collection is empty",
"collections.block_collection_owner": "Block account",
"collections.by_account": "Delete",
"collections.collection_description": "Description",
"collections.collection_language": "Language",
@ -367,6 +372,8 @@
"collections.confirm_account_removal": "Are you sure you want to remove this account from this collection?",
"collections.content_warning": "Content warning",
"collections.continue": "Continue",
"collections.copy_link": "Copy link",
"collections.copy_link_confirmation": "Copied collection link to clipboard",
"collections.create.accounts_title": "Who will you feature in this collection?",
"collections.create.basic_details_title": "Basic details",
"collections.create.steps": "Step {step}/{total}",
@ -384,6 +391,9 @@
"collections.detail.you_are_in_this_collection": "You're featured in this collection",
"collections.edit_details": "Edit details",
"collections.error_loading_collections": "There was an error when trying to load your collections.",
"collections.hidden_accounts_description": "Youve blocked or muted {count, plural, one {this user} other {these users}}",
"collections.hidden_accounts_link": "{count, plural, one {# hidden account} other {# hidden accounts}}",
"collections.hints.accounts_counter": "{count}/{max} accounts",
"collections.last_updated_at": "Last updated: {date}",
"collections.manage_accounts": "Manage accounts",
"collections.mark_as_sensitive": "Mark as sensitive",
@ -391,14 +401,23 @@
"collections.name_length_hint": "40 characters limit",
"collections.new_collection": "New collection",
"collections.no_collections_yet": "No collections yet.",
"collections.remove_account": "Remove",
"collections.report_collection": "Report this collection",
"collections.revoke_collection_inclusion": "Remove myself from this collection",
"collections.revoke_inclusion.confirmation": "You've been removed from \"{collection}\"",
"collections.revoke_inclusion.error": "There was an error, please try again later.",
"collections.search_accounts_label": "Search for an account to add",
"collections.search_accounts_max_reached": "You have added the maximum number of accounts",
"collections.sensitive": "Sensitive",
"collections.share_short": "Share",
"collections.suggestions.can_not_add": "Cant be added",
"collections.suggestions.can_not_add_desc": "These accounts may have opted out of discovery, or they might be on a server that doesnt support collections.",
"collections.suggestions.must_follow": "Must follow first",
"collections.suggestions.must_follow_desc": "These accounts review all follow requests. Followers can add them to collections.",
"collections.topic_hint": "Add a hashtag that helps others understand the main topic of this collection.",
"collections.topic_special_chars_hint": "Special characters will be removed when saving",
"collections.unlisted_collections_description": "These dont appear on your profile to others. Anyone with the link can discover them.",
"collections.unlisted_collections_with_count": "Unlisted collections ({count})",
"collections.view_collection": "View collection",
"collections.visibility_public": "Public",
"collections.visibility_public_hint": "Discoverable in search results and other areas where recommendations appear.",
@ -891,6 +910,7 @@
"navigation_panel.expand_followed_tags": "Expand followed hashtags menu",
"navigation_panel.expand_lists": "Expand list menu",
"not_signed_in_indicator.not_signed_in": "You need to sign in to access this resource.",
"notification.added_to_collection": "{name} added you to a collection",
"notification.admin.report": "{name} reported {target}",
"notification.admin.report_account": "{name} reported {count, plural, one {one post} other {# posts}} from {target} for {category}",
"notification.admin.report_account_other": "{name} reported {count, plural, one {one post} other {# posts}} from {target}",
@ -900,6 +920,7 @@
"notification.admin.sign_up.name_and_others": "{name} and {count, plural, one {# other} other {# others}} signed up",
"notification.annual_report.message": "Your {year} #Wrapstodon awaits! Unveil your year's highlights and memorable moments on Mastodon!",
"notification.annual_report.view": "View #Wrapstodon",
"notification.collection_update": "{name} edited a collection youre in",
"notification.favourite": "{name} favourited your post",
"notification.favourite.name_and_others_with_link": "{name} and <a>{count, plural, one {# other} other {# others}}</a> favourited your post",
"notification.favourite_pm": "{name} favourited your private mention",

View File

@ -141,8 +141,8 @@
"account.unmute_notifications_short": "Lõpeta teavituste summutamine",
"account.unmute_short": "Lõpeta summutamine",
"account_edit.advanced_settings.bot_hint": "Teavita teisi, et sel kontol tehakse peamiselt automatiseeritud toiminguid ja seda ei pruugita jälgida",
"account_edit.advanced_settings.bot_label": "Automatiseeritud konto",
"account_edit.advanced_settings.title": "Täpsemad seaded",
"account_edit.advanced_settings.bot_label": "Automatiseeritud kasutajakonto",
"account_edit.advanced_settings.title": "Täpsemad seadistused",
"account_edit.bio.add_label": "Lisa elulugu",
"account_edit.bio.edit_label": "Muuda elulugu",
"account_edit.bio.placeholder": "Lisa lühike tutvustus, et aidata teistel sinust pilti luua.",
@ -158,7 +158,7 @@
"account_edit.custom_fields.tip_content": "Saad Mastodoni konto usaldusväärsust hõlpsasti suurendada, kinnitades lingid lehtedele, mis sulle kuuluvad.",
"account_edit.custom_fields.tip_title": "Soovitus: Kinnitatud linkide lisamine",
"account_edit.custom_fields.title": "Kohandatud väljad",
"account_edit.custom_fields.verified_hint": "Kuidas lisada kinnitatud link?",
"account_edit.custom_fields.verified_hint": "Kuidas lisada kinnitatud linki?",
"account_edit.display_name.add_label": "Lisa kuvatav nimi",
"account_edit.display_name.edit_label": "Muuda kuvatavat nime",
"account_edit.display_name.placeholder": "Kuvatav nimi määrab, kuidas sinu nimi on näha sinu profiilis ja ajajoontel.",
@ -170,7 +170,7 @@
"account_edit.field_actions.edit": "Muuda välja",
"account_edit.field_delete_modal.confirm": "Kas oled kindel, et soovid selle kohandatud välja kustutada? Seda toimingut ei saa tagasi võtta.",
"account_edit.field_delete_modal.delete_button": "Kustuta",
"account_edit.field_delete_modal.title": "Kustutada kohandatud väli?",
"account_edit.field_delete_modal.title": "Kas kustutame kohandatud välja?",
"account_edit.field_edit_modal.add_title": "Lisa kohandatud väli",
"account_edit.field_edit_modal.discard_confirm": "Loobu",
"account_edit.field_edit_modal.discard_message": "Sul on salvestamata muudatusi. Kas soovid tõesti neist loobuda?",
@ -211,14 +211,14 @@
"account_edit.profile_tab.button_label": "Kohanda",
"account_edit.profile_tab.hint.description": "Need seaded määravad, mida kasutajad näevad {server} ametlikes rakendustes, kuid ei pruugi kehtida teiste serverite kasutajate ja kolmandate osapoolte rakenduste puhul.",
"account_edit.profile_tab.hint.title": "Näitamine siiski erinev",
"account_edit.profile_tab.show_featured.description": "\"Esile tõstetud\" on valikuline taab, kus saad näidata teisi kontosid.",
"account_edit.profile_tab.show_featured.title": "Näita esiletõstetute taabi",
"account_edit.profile_tab.show_media.description": "\"Meedia\" on valikuline taab, mis näitab sinu piltide või videotega postitusi.",
"account_edit.profile_tab.show_media.title": "Näita meedia taabi",
"account_edit.profile_tab.show_media_replies.description": "Sisse lülitatuna näitab meedia taab mõlemat, nii sinu postitusi kui su vastuseid teiste postitustele.",
"account_edit.profile_tab.show_media_replies.title": "Kaasa meedia taabile ka vastused",
"account_edit.profile_tab.show_featured.description": "„Esiletõstetud“ on valikuline vahekaart, kus saad näidata teisi kontosid.",
"account_edit.profile_tab.show_featured.title": "Näita vahekaarti „Esiletõstetud“",
"account_edit.profile_tab.show_media.description": "„Meedium“ on valikuline vahekaart, mis näitab sinu piltide või videotega postitusi.",
"account_edit.profile_tab.show_media.title": "Näita multimeedia vahekaarti",
"account_edit.profile_tab.show_media_replies.description": "Sisselülitatuna näitab mediumi vahekaart, nii sinu postitusi kui su vastuseid teiste kasutajate postitustele.",
"account_edit.profile_tab.show_media_replies.title": "Kaasa vahekaardile „Meedium“ ka vastused",
"account_edit.profile_tab.subtitle": "Kohanda oma profiili vahekaarte ja nende sisu.",
"account_edit.profile_tab.title": "Profiili taabide seaded",
"account_edit.profile_tab.title": "Profiili vahekaartide seadistused",
"account_edit.save": "Salvesta",
"account_edit.upload_modal.back": "Tagasi",
"account_edit.upload_modal.done": "Valmis",
@ -511,10 +511,10 @@
"confirmations.follow_to_list.confirm": "Jälgi ja lisa loetellu",
"confirmations.follow_to_list.message": "Pead jälgima kasutajat {name}, et lisada teda loetellu.",
"confirmations.follow_to_list.title": "Jälgida kasutajat?",
"confirmations.hide_featured_tab.confirm": "Peida taab",
"confirmations.hide_featured_tab.confirm": "Peida vahekaart",
"confirmations.hide_featured_tab.intro": "Saad seda igal ajal muuta menüüs <i>Profiili muutmine > Profiili vahekaardi seaded</i>.",
"confirmations.hide_featured_tab.message": "See peidab vahekaardi serveri {serverName} kasutajatel ja teistel serveritel, kus kasutatakse Mastodoni uusimat versiooni. Muudel serveritel võib kuvamine erineda.",
"confirmations.hide_featured_tab.title": "Peita taab Esiletõstetud?",
"confirmations.hide_featured_tab.title": "Kas peidame vahekaardi „Esiletõstetud“?",
"confirmations.logout.confirm": "Välju",
"confirmations.logout.message": "Kas oled kindel, et soovid välja logida?",
"confirmations.logout.title": "Logida välja?",
@ -621,7 +621,7 @@
"emoji_button.travel": "Reisimine & kohad",
"empty_column.account_featured.other": "{acct} pole veel midagi esile tõstnud.",
"empty_column.account_featured_self.no_collections_button": "Loo kogumik",
"empty_column.account_featured_self.no_collections_hide_tab": "Selle asemel peida see taab",
"empty_column.account_featured_self.no_collections_hide_tab": "Selle asemel peida see vahekaart",
"empty_column.account_featured_self.pre_collections": "Jälgi kogumikke",
"empty_column.account_featured_self.pre_collections_desc": "Kogumikud (lisanduvad Mastodon V4.6) võimaldavad sul luua enda koostatud kontode nimekirju, mida teistele soovitada.",
"empty_column.account_featured_self.showcase_accounts": "Näita oma lemmikkontosid",

View File

@ -64,6 +64,7 @@
"account.media": "Multivide",
"account.mention": "Pieminēt @{name}",
"account.menu.block": "Bloķēt kontu",
"account.menu.copy": "Kopēt saiti",
"account.moved_to": "{name} norādīja, ka viņu jaunais konts tagad ir:",
"account.mute": "Apklusināt @{name}",
"account.mute_notifications_short": "Apklusināt paziņojumus",
@ -71,8 +72,10 @@
"account.muted": "Apklusināts",
"account.muting": "Apklusināts",
"account.mutual": "Jūs sekojat viens otram",
"account.name_info": "Ko tas nozīmē?",
"account.no_bio": "Apraksts nav sniegts.",
"account.node_modal.save": "Saglabāt",
"account.note.edit_button": "Labot",
"account.open_original_page": "Atvērt pirmavota lapu",
"account.posts": "Ieraksti",
"account.remove_from_followers": "Dzēst sekotāju {name}",
@ -91,6 +94,7 @@
"account.unmute": "Noņemt apklusinājumu @{name}",
"account.unmute_notifications_short": "Atcelet paziņojumu apklusināšanu",
"account.unmute_short": "Noņemt apklusinājumu",
"account_edit.bio.edit_label": "Labot biogrāfiju",
"account_edit.bio.title": "Biogrāfija",
"account_edit.bio_modal.add_title": "Pievienot biogrāfiju",
"account_edit.bio_modal.edit_title": "Labot biogrāfiju",
@ -98,8 +102,23 @@
"account_edit.column_title": "Labot profilu",
"account_edit.custom_fields.add_label": "Pievienot lauku",
"account_edit.custom_fields.edit_label": "Labot lauku",
"account_edit.field_actions.delete": "Dzēst lauku",
"account_edit.field_actions.edit": "Labot lauku",
"account_edit.field_delete_modal.delete_button": "Dzēst",
"account_edit.field_edit_modal.discard_confirm": "Atmest",
"account_edit.image_delete_modal.delete_button": "Dzēst",
"account_edit.image_delete_modal.title": "Dzēst attēlu?",
"account_edit.image_edit.add_button": "Pievienot attēlu",
"account_edit.image_edit.remove_button": "Noņemt attēlu",
"account_edit.save": "Saglabāt",
"account_edit.upload_modal.back": "Atpakaļ",
"account_edit.upload_modal.done": "Gatavs",
"account_edit.upload_modal.step_upload.button": "Pārlūkot failus",
"account_edit.upload_modal.title_add.avatar": "Pievienot profila fotoattēlu",
"account_edit.upload_modal.title_add.header": "Pievienot titullapas fotoattēlu",
"account_edit.upload_modal.title_replace.avatar": "Nomainīt profila fotoattēlu",
"account_edit.upload_modal.title_replace.header": "Nomainīt titullapas fotoattēlu",
"account_edit_tags.suggestions": "Ieteikumi:",
"account_note.placeholder": "Noklikšķini, lai pievienotu piezīmi",
"admin.dashboard.daily_retention": "Lietotāju saglabāšanas rādītājs dienā pēc reģistrēšanās",
"admin.dashboard.monthly_retention": "Lietotāju saglabāšanas rādītājs mēnesī pēc reģistrēšanās",
@ -123,6 +142,11 @@
"alt_text_modal.describe_for_people_with_visual_impairments": "Aprakstīt šo cilvēkiem ar redzes traucējumiem…",
"alt_text_modal.done": "Gatavs",
"announcement.announcement": "Paziņojums",
"annual_report.shared_page.donate": "Ziedot",
"annual_report.summary.archetype.title_public": "Lietotāja \"{name}\" arhetips",
"annual_report.summary.archetype.title_self": "Tavs arhetips",
"annual_report.summary.close": "Aizvērt",
"annual_report.summary.copy_link": "Kopēt saiti",
"annual_report.summary.most_used_app.most_used_app": "visizmantotākā lietotne",
"annual_report.summary.most_used_hashtag.most_used_hashtag": "visizmantotākais tēmturis",
"annual_report.summary.new_posts.new_posts": "jauni ieraksti",
@ -158,6 +182,19 @@
"closed_registrations_modal.find_another_server": "Atrast citu serveri",
"closed_registrations_modal.preamble": "Mastodon ir decentralizēts, tāpēc neatkarīgi no tā, kur Tu izveido savu kontu, varēsi sekot un mijiedarboties ar ikvienu šajā serverī. Tu pat vari to pašizvietot!",
"closed_registrations_modal.title": "Reģistrēšanās Mastodon",
"collections.accounts.empty_title": "Šī kolekcija ir tukša",
"collections.block_collection_owner": "Bloķēt kontu",
"collections.collection_description": "Apraksts",
"collections.collection_language": "Valoda",
"collections.collection_language_none": "Nav",
"collections.collection_name": "Nosaukums",
"collections.collection_topic": "Tēma",
"collections.continue": "Turpināt",
"collections.copy_link": "Kopēt saiti",
"collections.manage_accounts": "Pārvaldīt kontus",
"collections.remove_account": "Noņemt",
"collections.suggestions.can_not_add": "Nevar pievienot",
"collections.visibility_title": "Redzamība",
"column.about": "Par",
"column.blocks": "Liegtie lietotāji",
"column.bookmarks": "Grāmatzīmes",
@ -185,6 +222,8 @@
"column_header.show_settings": "Rādīt iestatījumus",
"column_header.unpin": "Atspraust",
"column_search.cancel": "Atcelt",
"combobox.loading": "Ielādē",
"combobox.open_results": "Atvērt rezultātus",
"community.column_settings.local_only": "Tikai vietējie",
"community.column_settings.media_only": "Tikai multivide",
"community.column_settings.remote_only": "Tikai attālinātie",
@ -218,6 +257,7 @@
"confirmations.delete.confirm": "Dzēst",
"confirmations.delete.message": "Vai tiešām izdzēst šo ierakstu?",
"confirmations.delete.title": "Izdzēst ierakstu?",
"confirmations.delete_collection.confirm": "Dzēst",
"confirmations.delete_list.confirm": "Dzēst",
"confirmations.delete_list.message": "Vai tiešām neatgriezeniski izdzēst šo sarakstu?",
"confirmations.delete_list.title": "Izdzēst sarakstu?",

View File

@ -96,7 +96,7 @@ class ReportService < BaseService
def domain_mentions(domain)
Mention
.joins(:account)
.where(Account.arel_table[:domain].lower.eq domain)
.merge(Account.with_domain(domain))
.select(1).arel.exists
end

View File

@ -14,7 +14,7 @@
detailed: true,
editable: true,
frameRate: meta.dig('original', 'frame_rate'),
height: 380,
height: MediaPlayerHelper::PLAYER_HEIGHT,
inline: true,
media: [ActiveModelSerializers::SerializableResource.new(@media_attachment, serializer: REST::MediaAttachmentSerializer)].as_json,
preview: @media_attachment.thumbnail.present? ? @media_attachment.thumbnail.url : @media_attachment.file.url(:small),
@ -25,7 +25,7 @@
- elsif @media_attachment.gifv?
= react_component :media_gallery,
autoplay: true,
height: 380,
height: MediaPlayerHelper::PLAYER_HEIGHT,
media: [ActiveModelSerializers::SerializableResource.new(@media_attachment, serializer: REST::MediaAttachmentSerializer).as_json],
standalone: true do
%video{ autoplay: 'autoplay', muted: 'muted', loop: 'loop' }
@ -38,9 +38,9 @@
duration: meta.dig(:original, :duration),
foregroundColor: meta.dig('colors', 'foreground'),
fullscreen: true,
height: 380,
height: MediaPlayerHelper::PLAYER_HEIGHT,
poster: @media_attachment.thumbnail.present? ? @media_attachment.thumbnail.url : @media_attachment.account.avatar_static_url,
src: @media_attachment.file.url(:original),
width: 670 do
width: MediaPlayerHelper::PLAYER_WIDTH do
%audio{ controls: 'controls' }
%source{ src: @media_attachment.file.url(:original) }

View File

@ -38,8 +38,8 @@
= opengraph 'twitter:player', player_medium_url(media)
= opengraph 'twitter:player:stream', full_asset_url(media.file.url(:original))
= opengraph 'twitter:player:stream:content_type', media.file_content_type
= opengraph 'twitter:player:width', '670'
= opengraph 'twitter:player:height', '380'
= opengraph 'twitter:player:width', MediaPlayerHelper::PLAYER_WIDTH
= opengraph 'twitter:player:height', MediaPlayerHelper::PLAYER_HEIGHT
- if player_card
= opengraph 'twitter:card', 'player'
- else

View File

@ -83,6 +83,10 @@ et:
access_denied: Ressursi omanik või autoriseerimisserver lükkas taotluse tagasi.
credential_flow_not_configured: Resource Owner Password Credentials vool ebaõnnestus, kuna Doorkeeper.configure.resource_owner_from_credentials ei ole seadistatud.
invalid_client: Kliendi autentimine ebaõnnestus. Põhjus kas tundmatu klient, puudulik autentimine või toetamata autentimismeetod.
invalid_code_challenge_method:
one: "„code_challenge_method“ meetod peab olema selline: %{challenge_methods}."
other: "„code_challenge_method“ meetod peab olema üks neist: %{challenge_methods}."
zero: Kuna sobilikke „code_challenge_method“ meetodi väärtusi ei leidu, siis autentimisserver ei toeta PKCE-d.
invalid_grant: Antud autoriseerimisluba on vale, aegunud, tagasi võetud, ei kattu kasutatud ümbersuunamise URLid või oli antud teisele kliendile.
invalid_redirect_uri: Antud ümbersuunamise URL ei ole õige.
invalid_request:

View File

@ -2238,7 +2238,7 @@ et:
extra_instructions_html: <strong>Soovitus:</strong> Sinu kodulehel olev link võib olla nähtamatu. Oluline osa on <code>rel="me"</code>, mis väldib kasutaja loodud sisuga lehtedel libaisikustamist. Sa saad isegi kasutada lehe HEADER osas silti <code>link</code> sildi <code>a</code> asemel, kuid HTML peab olema kättesaadav ilma JavaScripti käivitamata.
here_is_how: Siin on, kuidas
hint_html: "<strong>Oma isiku tuvastamine on Mastodonis kõigi jaoks.</strong> Toetub avatud veebistandarditele, nüüd ja igavesti tasuta. Kõik, mida vajad, on isiklik veebileht, mille järgi inimesed sind tunnevad. Kui lingid oma profiililt sellele veebilehele, kontrollime me, et see veebileht lingib tagasi sinu profiilile ning näitame profiilil visuaalset tähist."
instructions_html: Kopeeri ja kleebi allpool olev kood oma lehe HTML lähtekoodi. Seejärel lisa oma kodulehe aadress profiili "Muuda profiili" vahekaardi ühte lisavälja ning salvesta muudatused.
instructions_html: Kopeeri ja aseta allpool olev kood oma lehe HTML lähtekoodi. Seejärel lisa oma kodulehe aadress profiili „Muuda profiili“ vahekaardi ühte lisavälja ning salvesta muudatused.
verification: Kinnitamine
verified_links: Sinu kontrollitud lingid
website_verification: Veebilehe kontrollimine

View File

@ -61,6 +61,9 @@ en-GB:
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: Warn before showing media marked as sensitive
setting_display_media_hide_all: Warn before showing all media
setting_display_media_show_all: Show all media without warning, including media marked as sensitive
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

View File

@ -134,6 +134,7 @@ et:
otp: 'Kaheastmelise autentimise kood telefonirakendusest või mõni taastekood:'
webauthn: Kui see on USB-võti, sisesta see ning vajadusel aktiveeri.
settings:
email_subscriptions: Funktsionaalsuse keelamine säilitab olemasolevad tellijad, kuid peatab e-kirjade saatmise.
indexable: Su profiilileht võib ilmuda Google, Bingi ja teiste otsimootorite tulemustes.
show_application: Sa saad sõltumata sellest vaadata, milline äpp su postituse postitas.
tag:
@ -153,6 +154,7 @@ et:
jurisdiction: Nimeta riik, kus elab see, kes arveid maksab. Kui tegemist on äriühingu või muu üksusega, märgi riik, kus see on asutatud, ning vajaduse korral linn, piirkond, territoorium või osariik.
min_age: Vanus ei tohiks olla väiksem, kui sinu õigusruumis nõutav alampiir.
user:
chosen_languages: Kui see valik on märgitud, kuvatakse avalikul ajajoonel ainult valitud keeltes postitusi. See seadistus ei mõjuta sinu avalehe ajajoont ega loendeid.
date_of_birth:
one: "%{domain} saidi teenuste kasutamiseks pead olema vähemalt %{count} aastat vana. Me ei salvesta neid andmeid."
other: "%{domain} saidi teenuste kasutamiseks pead olema vähemalt %{count} aastat vana. Me ei salvesta neid andmeid."
@ -175,6 +177,7 @@ et:
labels:
account:
attribution_domains: Veebisaidid, mis võivad sind algallikana mainida
discoverable: Võimalda mind teistel avatada
fields:
name: Nimetus
value: Sisu
@ -222,6 +225,7 @@ et:
email: E-posti aadress
expires_in: Aegu pärast
fields: Veebiviited
filter_action: Filtritoimingud
header: Päis
honeypot: "%{label} (ära sisesta)"
inbox_url: Sõnumivahendusserveri sisendkausta võrguaadress
@ -353,6 +357,7 @@ et:
hint: Lisainfo
text: Reegel
settings:
email_subscriptions: Luba e-posti aadressiga liitumised
indexable: Kaasa profiilileht otsimootoritesse
show_application: Näita, millisest äpist postituse saatsid
tag:

View File

@ -27,7 +27,7 @@
"pino": "^10.0.0",
"pino-http": "^11.0.0",
"prom-client": "^15.0.0",
"uuid": "^13.0.0",
"uuid": "^14.0.0",
"ws": "^8.12.1"
},
"devDependencies": {

308
yarn.lock
View File

@ -2411,6 +2411,13 @@ __metadata:
languageName: node
linkType: hard
"@formatjs/bigdecimal@npm:0.2.1":
version: 0.2.1
resolution: "@formatjs/bigdecimal@npm:0.2.1"
checksum: 10c0/04b72caf1608afe59f20313b73b80dba474b65485076c0f9a72b8145fcb0e04580a7a0592c2f88f739f4997b51326e2b9d6142e6c5b04c0c941d0294e2aa2f20
languageName: node
linkType: hard
"@formatjs/cli@npm:^6.1.1":
version: 6.7.4
resolution: "@formatjs/cli@npm:6.7.4"
@ -2461,6 +2468,13 @@ __metadata:
languageName: node
linkType: hard
"@formatjs/fast-memoize@npm:3.1.2":
version: 3.1.2
resolution: "@formatjs/fast-memoize@npm:3.1.2"
checksum: 10c0/25af387ebb53146c8c09af34cda4ce82768f0855227ec854fb315d6dc2e7859e16724860fdea7991b3c7c5741154e3fcdd5169ef7a11ba1afb3ffd860613931c
languageName: node
linkType: hard
"@formatjs/icu-messageformat-parser@npm:3.5.3":
version: 3.5.3
resolution: "@formatjs/icu-messageformat-parser@npm:3.5.3"
@ -2471,6 +2485,15 @@ __metadata:
languageName: node
linkType: hard
"@formatjs/icu-messageformat-parser@npm:3.5.4":
version: 3.5.4
resolution: "@formatjs/icu-messageformat-parser@npm:3.5.4"
dependencies:
"@formatjs/icu-skeleton-parser": "npm:2.1.4"
checksum: 10c0/3ff5ab209b63113d6b1779a4e8de6ee2cf941f3ad3f3ede2c8e425953a25456b6a1d880d734845244615dc9887fad10b62e75dee38858c731e45812402110efb
languageName: node
linkType: hard
"@formatjs/icu-skeleton-parser@npm:2.1.3":
version: 2.1.3
resolution: "@formatjs/icu-skeleton-parser@npm:2.1.3"
@ -2480,6 +2503,13 @@ __metadata:
languageName: node
linkType: hard
"@formatjs/icu-skeleton-parser@npm:2.1.4":
version: 2.1.4
resolution: "@formatjs/icu-skeleton-parser@npm:2.1.4"
checksum: 10c0/9d6292443e4079c5718c50e32041a3bd192047449d181ae87e8cb6ef78c90f156f8b2d454008c9d0c2920c215daee5250c0eb214d13a105522a631f269e71b3c
languageName: node
linkType: hard
"@formatjs/intl-localematcher@npm:0.8.2":
version: 0.8.2
resolution: "@formatjs/intl-localematcher@npm:0.8.2"
@ -2489,26 +2519,33 @@ __metadata:
languageName: node
linkType: hard
"@formatjs/intl-pluralrules@npm:^6.0.0":
version: 6.3.1
resolution: "@formatjs/intl-pluralrules@npm:6.3.1"
"@formatjs/intl-localematcher@npm:0.8.3":
version: 0.8.3
resolution: "@formatjs/intl-localematcher@npm:0.8.3"
dependencies:
"@formatjs/bigdecimal": "npm:0.2.0"
"@formatjs/ecma402-abstract": "npm:3.2.0"
"@formatjs/intl-localematcher": "npm:0.8.2"
checksum: 10c0/8c0847d21d06276557316a01998528b79310b1c5411b0932b51dc88640a8ed6181c2221694d1d206a217f5a2be29227edfa52d1eca0873bc7c8c04b9a7dc2cc7
"@formatjs/fast-memoize": "npm:3.1.2"
checksum: 10c0/4693548ee9df74deb5f548635242ede0254507a531e04bb52d0983a653e7103bd4bfa1024e0b5b784fce1dadab57a31062bd7412b142f954c6614a7c9ee4cae7
languageName: node
linkType: hard
"@formatjs/intl@npm:4.1.5":
version: 4.1.5
resolution: "@formatjs/intl@npm:4.1.5"
"@formatjs/intl-pluralrules@npm:^6.0.0":
version: 6.3.2
resolution: "@formatjs/intl-pluralrules@npm:6.3.2"
dependencies:
"@formatjs/ecma402-abstract": "npm:3.2.0"
"@formatjs/fast-memoize": "npm:3.1.1"
"@formatjs/icu-messageformat-parser": "npm:3.5.3"
intl-messageformat: "npm:11.2.0"
checksum: 10c0/2fd7c6211b38fd6178093e7358f015dc461bc80d428372064a0c144b1a32fce4050c34fa58b77af715b8dbf77909d408b59c7e714b0c612d1b573defe70828b2
"@formatjs/bigdecimal": "npm:0.2.1"
"@formatjs/intl-localematcher": "npm:0.8.3"
checksum: 10c0/7ff9a9a48efc970d6ebcb0902dc28fcf6577fd53f07c2b775ac918858a08d934317c654f6e481a978eeea2146a0e84ab7604f991d8bbdb147b42a004f582bec8
languageName: node
linkType: hard
"@formatjs/intl@npm:4.1.6":
version: 4.1.6
resolution: "@formatjs/intl@npm:4.1.6"
dependencies:
"@formatjs/fast-memoize": "npm:3.1.2"
"@formatjs/icu-messageformat-parser": "npm:3.5.4"
intl-messageformat: "npm:11.2.1"
checksum: 10c0/d1bdd4ba373efc249090970c54bb7b5373f88d4294b9e6c889f91c8214b047715578b4fde4c917f809fddd0d52d3ec360ddc9a96def9e7c237c4024161ca29a0
languageName: node
linkType: hard
@ -2529,11 +2566,11 @@ __metadata:
languageName: node
linkType: hard
"@formatjs/ts-transformer@npm:4.4.3":
version: 4.4.3
resolution: "@formatjs/ts-transformer@npm:4.4.3"
"@formatjs/ts-transformer@npm:4.4.4":
version: 4.4.4
resolution: "@formatjs/ts-transformer@npm:4.4.4"
dependencies:
"@formatjs/icu-messageformat-parser": "npm:3.5.3"
"@formatjs/icu-messageformat-parser": "npm:3.5.4"
"@types/node": "npm:22 || 24"
json-stable-stringify: "npm:^1.3.0"
typescript: "npm:^5.6 || 6"
@ -2542,18 +2579,18 @@ __metadata:
peerDependenciesMeta:
ts-jest:
optional: true
checksum: 10c0/f5a4b32098e2c37c7ab7b40a798b6fa8e24e23516384579a698175ab214e2052e45256cc39880891de8db583c326a2e9f8581e1d4f7a0dc5d4aaa2291dec058d
checksum: 10c0/88aecd69792c34d3dbe3da3866422c3c6668102d316dd0bad848ec56ac1cd11d011e4b9253b72e0241e934a68d6b0144dda85ab0e200019c572edab4b257d93b
languageName: node
linkType: hard
"@formatjs/unplugin@npm:^1.1.5":
version: 1.1.6
resolution: "@formatjs/unplugin@npm:1.1.6"
version: 1.1.7
resolution: "@formatjs/unplugin@npm:1.1.7"
dependencies:
"@formatjs/icu-messageformat-parser": "npm:3.5.3"
"@formatjs/ts-transformer": "npm:4.4.3"
"@formatjs/icu-messageformat-parser": "npm:3.5.4"
"@formatjs/ts-transformer": "npm:4.4.4"
magic-string: "npm:^0.30.0"
oxc-parser: "npm:^0.120.0"
oxc-parser: "npm:^0.124.0"
unplugin: "npm:^3.0.0"
peerDependencies:
"@rspack/core": ">=1"
@ -2572,7 +2609,7 @@ __metadata:
optional: true
webpack:
optional: true
checksum: 10c0/9371206edfb7d0197a04fc64b6095eea759b04a135fc766a9fe49b9252a65c7fae1c487f40952e3ae6e82ca77ee0aae456c46e42ecc7753f1990bc95e673f064
checksum: 10c0/4578e27f0063095ac11dc717c42a483bd5e29e8eeba5ddafe95238f7c124a1c3f86edf933591f7efa3af950e5031bda77dd639fc10a11e11aae88ccdee61a0d2
languageName: node
linkType: hard
@ -2995,7 +3032,7 @@ __metadata:
typescript: "npm:~6.0.0"
typescript-eslint: "npm:^8.55.0"
utf-8-validate: "npm:^6.0.3"
uuid: "npm:^13.0.0"
uuid: "npm:^14.0.0"
ws: "npm:^8.12.1"
dependenciesMeta:
bufferutil:
@ -3042,7 +3079,7 @@ __metadata:
languageName: node
linkType: hard
"@napi-rs/wasm-runtime@npm:^1.1.1, @napi-rs/wasm-runtime@npm:^1.1.3":
"@napi-rs/wasm-runtime@npm:^1.1.2, @napi-rs/wasm-runtime@npm:^1.1.3":
version: 1.1.3
resolution: "@napi-rs/wasm-runtime@npm:1.1.3"
dependencies:
@ -3156,162 +3193,155 @@ __metadata:
languageName: node
linkType: hard
"@oxc-parser/binding-android-arm-eabi@npm:0.120.0":
version: 0.120.0
resolution: "@oxc-parser/binding-android-arm-eabi@npm:0.120.0"
"@oxc-parser/binding-android-arm-eabi@npm:0.124.0":
version: 0.124.0
resolution: "@oxc-parser/binding-android-arm-eabi@npm:0.124.0"
conditions: os=android & cpu=arm
languageName: node
linkType: hard
"@oxc-parser/binding-android-arm64@npm:0.120.0":
version: 0.120.0
resolution: "@oxc-parser/binding-android-arm64@npm:0.120.0"
"@oxc-parser/binding-android-arm64@npm:0.124.0":
version: 0.124.0
resolution: "@oxc-parser/binding-android-arm64@npm:0.124.0"
conditions: os=android & cpu=arm64
languageName: node
linkType: hard
"@oxc-parser/binding-darwin-arm64@npm:0.120.0":
version: 0.120.0
resolution: "@oxc-parser/binding-darwin-arm64@npm:0.120.0"
"@oxc-parser/binding-darwin-arm64@npm:0.124.0":
version: 0.124.0
resolution: "@oxc-parser/binding-darwin-arm64@npm:0.124.0"
conditions: os=darwin & cpu=arm64
languageName: node
linkType: hard
"@oxc-parser/binding-darwin-x64@npm:0.120.0":
version: 0.120.0
resolution: "@oxc-parser/binding-darwin-x64@npm:0.120.0"
"@oxc-parser/binding-darwin-x64@npm:0.124.0":
version: 0.124.0
resolution: "@oxc-parser/binding-darwin-x64@npm:0.124.0"
conditions: os=darwin & cpu=x64
languageName: node
linkType: hard
"@oxc-parser/binding-freebsd-x64@npm:0.120.0":
version: 0.120.0
resolution: "@oxc-parser/binding-freebsd-x64@npm:0.120.0"
"@oxc-parser/binding-freebsd-x64@npm:0.124.0":
version: 0.124.0
resolution: "@oxc-parser/binding-freebsd-x64@npm:0.124.0"
conditions: os=freebsd & cpu=x64
languageName: node
linkType: hard
"@oxc-parser/binding-linux-arm-gnueabihf@npm:0.120.0":
version: 0.120.0
resolution: "@oxc-parser/binding-linux-arm-gnueabihf@npm:0.120.0"
"@oxc-parser/binding-linux-arm-gnueabihf@npm:0.124.0":
version: 0.124.0
resolution: "@oxc-parser/binding-linux-arm-gnueabihf@npm:0.124.0"
conditions: os=linux & cpu=arm
languageName: node
linkType: hard
"@oxc-parser/binding-linux-arm-musleabihf@npm:0.120.0":
version: 0.120.0
resolution: "@oxc-parser/binding-linux-arm-musleabihf@npm:0.120.0"
"@oxc-parser/binding-linux-arm-musleabihf@npm:0.124.0":
version: 0.124.0
resolution: "@oxc-parser/binding-linux-arm-musleabihf@npm:0.124.0"
conditions: os=linux & cpu=arm
languageName: node
linkType: hard
"@oxc-parser/binding-linux-arm64-gnu@npm:0.120.0":
version: 0.120.0
resolution: "@oxc-parser/binding-linux-arm64-gnu@npm:0.120.0"
"@oxc-parser/binding-linux-arm64-gnu@npm:0.124.0":
version: 0.124.0
resolution: "@oxc-parser/binding-linux-arm64-gnu@npm:0.124.0"
conditions: os=linux & cpu=arm64 & libc=glibc
languageName: node
linkType: hard
"@oxc-parser/binding-linux-arm64-musl@npm:0.120.0":
version: 0.120.0
resolution: "@oxc-parser/binding-linux-arm64-musl@npm:0.120.0"
"@oxc-parser/binding-linux-arm64-musl@npm:0.124.0":
version: 0.124.0
resolution: "@oxc-parser/binding-linux-arm64-musl@npm:0.124.0"
conditions: os=linux & cpu=arm64 & libc=musl
languageName: node
linkType: hard
"@oxc-parser/binding-linux-ppc64-gnu@npm:0.120.0":
version: 0.120.0
resolution: "@oxc-parser/binding-linux-ppc64-gnu@npm:0.120.0"
"@oxc-parser/binding-linux-ppc64-gnu@npm:0.124.0":
version: 0.124.0
resolution: "@oxc-parser/binding-linux-ppc64-gnu@npm:0.124.0"
conditions: os=linux & cpu=ppc64 & libc=glibc
languageName: node
linkType: hard
"@oxc-parser/binding-linux-riscv64-gnu@npm:0.120.0":
version: 0.120.0
resolution: "@oxc-parser/binding-linux-riscv64-gnu@npm:0.120.0"
"@oxc-parser/binding-linux-riscv64-gnu@npm:0.124.0":
version: 0.124.0
resolution: "@oxc-parser/binding-linux-riscv64-gnu@npm:0.124.0"
conditions: os=linux & cpu=riscv64 & libc=glibc
languageName: node
linkType: hard
"@oxc-parser/binding-linux-riscv64-musl@npm:0.120.0":
version: 0.120.0
resolution: "@oxc-parser/binding-linux-riscv64-musl@npm:0.120.0"
"@oxc-parser/binding-linux-riscv64-musl@npm:0.124.0":
version: 0.124.0
resolution: "@oxc-parser/binding-linux-riscv64-musl@npm:0.124.0"
conditions: os=linux & cpu=riscv64 & libc=musl
languageName: node
linkType: hard
"@oxc-parser/binding-linux-s390x-gnu@npm:0.120.0":
version: 0.120.0
resolution: "@oxc-parser/binding-linux-s390x-gnu@npm:0.120.0"
"@oxc-parser/binding-linux-s390x-gnu@npm:0.124.0":
version: 0.124.0
resolution: "@oxc-parser/binding-linux-s390x-gnu@npm:0.124.0"
conditions: os=linux & cpu=s390x & libc=glibc
languageName: node
linkType: hard
"@oxc-parser/binding-linux-x64-gnu@npm:0.120.0":
version: 0.120.0
resolution: "@oxc-parser/binding-linux-x64-gnu@npm:0.120.0"
"@oxc-parser/binding-linux-x64-gnu@npm:0.124.0":
version: 0.124.0
resolution: "@oxc-parser/binding-linux-x64-gnu@npm:0.124.0"
conditions: os=linux & cpu=x64 & libc=glibc
languageName: node
linkType: hard
"@oxc-parser/binding-linux-x64-musl@npm:0.120.0":
version: 0.120.0
resolution: "@oxc-parser/binding-linux-x64-musl@npm:0.120.0"
"@oxc-parser/binding-linux-x64-musl@npm:0.124.0":
version: 0.124.0
resolution: "@oxc-parser/binding-linux-x64-musl@npm:0.124.0"
conditions: os=linux & cpu=x64 & libc=musl
languageName: node
linkType: hard
"@oxc-parser/binding-openharmony-arm64@npm:0.120.0":
version: 0.120.0
resolution: "@oxc-parser/binding-openharmony-arm64@npm:0.120.0"
"@oxc-parser/binding-openharmony-arm64@npm:0.124.0":
version: 0.124.0
resolution: "@oxc-parser/binding-openharmony-arm64@npm:0.124.0"
conditions: os=openharmony & cpu=arm64
languageName: node
linkType: hard
"@oxc-parser/binding-wasm32-wasi@npm:0.120.0":
version: 0.120.0
resolution: "@oxc-parser/binding-wasm32-wasi@npm:0.120.0"
"@oxc-parser/binding-wasm32-wasi@npm:0.124.0":
version: 0.124.0
resolution: "@oxc-parser/binding-wasm32-wasi@npm:0.124.0"
dependencies:
"@napi-rs/wasm-runtime": "npm:^1.1.1"
"@napi-rs/wasm-runtime": "npm:^1.1.2"
conditions: cpu=wasm32
languageName: node
linkType: hard
"@oxc-parser/binding-win32-arm64-msvc@npm:0.120.0":
version: 0.120.0
resolution: "@oxc-parser/binding-win32-arm64-msvc@npm:0.120.0"
"@oxc-parser/binding-win32-arm64-msvc@npm:0.124.0":
version: 0.124.0
resolution: "@oxc-parser/binding-win32-arm64-msvc@npm:0.124.0"
conditions: os=win32 & cpu=arm64
languageName: node
linkType: hard
"@oxc-parser/binding-win32-ia32-msvc@npm:0.120.0":
version: 0.120.0
resolution: "@oxc-parser/binding-win32-ia32-msvc@npm:0.120.0"
"@oxc-parser/binding-win32-ia32-msvc@npm:0.124.0":
version: 0.124.0
resolution: "@oxc-parser/binding-win32-ia32-msvc@npm:0.124.0"
conditions: os=win32 & cpu=ia32
languageName: node
linkType: hard
"@oxc-parser/binding-win32-x64-msvc@npm:0.120.0":
version: 0.120.0
resolution: "@oxc-parser/binding-win32-x64-msvc@npm:0.120.0"
"@oxc-parser/binding-win32-x64-msvc@npm:0.124.0":
version: 0.124.0
resolution: "@oxc-parser/binding-win32-x64-msvc@npm:0.124.0"
conditions: os=win32 & cpu=x64
languageName: node
linkType: hard
"@oxc-project/types@npm:=0.124.0":
"@oxc-project/types@npm:=0.124.0, @oxc-project/types@npm:^0.124.0":
version: 0.124.0
resolution: "@oxc-project/types@npm:0.124.0"
checksum: 10c0/9564ee3ce41f4b87802ffd0d62a7602d27f4503fbd39c1bedab98d54fde06e2ac254a8f85d8f679af1281a26e8fc7aa053fadbb3e09e786b38178eb38a8e2fb3
languageName: node
linkType: hard
"@oxc-project/types@npm:^0.120.0":
version: 0.120.0
resolution: "@oxc-project/types@npm:0.120.0"
checksum: 10c0/3090ca95ed1467ae790a79cf7aa49d1ea4ac390dbfccb7afb914c138034d01e72115e2e137a3cc76f409ba424e4d2b160a599fe137c88033ad68ba2df1e40b29
languageName: node
linkType: hard
"@oxfmt/binding-android-arm-eabi@npm:0.33.0":
version: 0.33.0
resolution: "@oxfmt/binding-android-arm-eabi@npm:0.33.0"
@ -8801,14 +8831,13 @@ __metadata:
languageName: node
linkType: hard
"intl-messageformat@npm:11.2.0, intl-messageformat@npm:^11.0.0":
version: 11.2.0
resolution: "intl-messageformat@npm:11.2.0"
"intl-messageformat@npm:11.2.1, intl-messageformat@npm:^11.0.0":
version: 11.2.1
resolution: "intl-messageformat@npm:11.2.1"
dependencies:
"@formatjs/ecma402-abstract": "npm:3.2.0"
"@formatjs/fast-memoize": "npm:3.1.1"
"@formatjs/icu-messageformat-parser": "npm:3.5.3"
checksum: 10c0/0f0a92324ef61c885902ff41c99754a65f0cc5cbe25d690c1771605117df4f97a786bb06dec50f12a7047e4cb2fab1f2516002df32e93be6ac02e1967e928e44
"@formatjs/fast-memoize": "npm:3.1.2"
"@formatjs/icu-messageformat-parser": "npm:3.5.4"
checksum: 10c0/c4d2e43c2e7940a8dbd75d7a3b77d722c7ac8802707f7410067097e3a923243343bd36367edb4e922b13d1a10425a2f52c544c65c9368841d481816ed04c6c2b
languageName: node
linkType: hard
@ -10674,31 +10703,31 @@ __metadata:
languageName: node
linkType: hard
"oxc-parser@npm:^0.120.0":
version: 0.120.0
resolution: "oxc-parser@npm:0.120.0"
"oxc-parser@npm:^0.124.0":
version: 0.124.0
resolution: "oxc-parser@npm:0.124.0"
dependencies:
"@oxc-parser/binding-android-arm-eabi": "npm:0.120.0"
"@oxc-parser/binding-android-arm64": "npm:0.120.0"
"@oxc-parser/binding-darwin-arm64": "npm:0.120.0"
"@oxc-parser/binding-darwin-x64": "npm:0.120.0"
"@oxc-parser/binding-freebsd-x64": "npm:0.120.0"
"@oxc-parser/binding-linux-arm-gnueabihf": "npm:0.120.0"
"@oxc-parser/binding-linux-arm-musleabihf": "npm:0.120.0"
"@oxc-parser/binding-linux-arm64-gnu": "npm:0.120.0"
"@oxc-parser/binding-linux-arm64-musl": "npm:0.120.0"
"@oxc-parser/binding-linux-ppc64-gnu": "npm:0.120.0"
"@oxc-parser/binding-linux-riscv64-gnu": "npm:0.120.0"
"@oxc-parser/binding-linux-riscv64-musl": "npm:0.120.0"
"@oxc-parser/binding-linux-s390x-gnu": "npm:0.120.0"
"@oxc-parser/binding-linux-x64-gnu": "npm:0.120.0"
"@oxc-parser/binding-linux-x64-musl": "npm:0.120.0"
"@oxc-parser/binding-openharmony-arm64": "npm:0.120.0"
"@oxc-parser/binding-wasm32-wasi": "npm:0.120.0"
"@oxc-parser/binding-win32-arm64-msvc": "npm:0.120.0"
"@oxc-parser/binding-win32-ia32-msvc": "npm:0.120.0"
"@oxc-parser/binding-win32-x64-msvc": "npm:0.120.0"
"@oxc-project/types": "npm:^0.120.0"
"@oxc-parser/binding-android-arm-eabi": "npm:0.124.0"
"@oxc-parser/binding-android-arm64": "npm:0.124.0"
"@oxc-parser/binding-darwin-arm64": "npm:0.124.0"
"@oxc-parser/binding-darwin-x64": "npm:0.124.0"
"@oxc-parser/binding-freebsd-x64": "npm:0.124.0"
"@oxc-parser/binding-linux-arm-gnueabihf": "npm:0.124.0"
"@oxc-parser/binding-linux-arm-musleabihf": "npm:0.124.0"
"@oxc-parser/binding-linux-arm64-gnu": "npm:0.124.0"
"@oxc-parser/binding-linux-arm64-musl": "npm:0.124.0"
"@oxc-parser/binding-linux-ppc64-gnu": "npm:0.124.0"
"@oxc-parser/binding-linux-riscv64-gnu": "npm:0.124.0"
"@oxc-parser/binding-linux-riscv64-musl": "npm:0.124.0"
"@oxc-parser/binding-linux-s390x-gnu": "npm:0.124.0"
"@oxc-parser/binding-linux-x64-gnu": "npm:0.124.0"
"@oxc-parser/binding-linux-x64-musl": "npm:0.124.0"
"@oxc-parser/binding-openharmony-arm64": "npm:0.124.0"
"@oxc-parser/binding-wasm32-wasi": "npm:0.124.0"
"@oxc-parser/binding-win32-arm64-msvc": "npm:0.124.0"
"@oxc-parser/binding-win32-ia32-msvc": "npm:0.124.0"
"@oxc-parser/binding-win32-x64-msvc": "npm:0.124.0"
"@oxc-project/types": "npm:^0.124.0"
dependenciesMeta:
"@oxc-parser/binding-android-arm-eabi":
optional: true
@ -10740,7 +10769,7 @@ __metadata:
optional: true
"@oxc-parser/binding-win32-x64-msvc":
optional: true
checksum: 10c0/12b717560645480f12954b2eaaabcf8043dfc7a8bc0105627ff11d7958d52a90eaf9f5cfb6af82f148d5e69ef7c57ac5a84f8834fc1edda695b2b09d6bb4e73d
checksum: 10c0/06bd6b937f0574f49b74112cf2af3fb9990e7445d40126fca2c6ceb950c7ba5e10fbb223d941341c8207376620f6ee37466779a4fbff78ed7a67e15df3459d9c
languageName: node
linkType: hard
@ -12052,17 +12081,16 @@ __metadata:
linkType: hard
"react-intl@npm:^10.0.0":
version: 10.1.1
resolution: "react-intl@npm:10.1.1"
version: 10.1.2
resolution: "react-intl@npm:10.1.2"
dependencies:
"@formatjs/ecma402-abstract": "npm:3.2.0"
"@formatjs/icu-messageformat-parser": "npm:3.5.3"
"@formatjs/intl": "npm:4.1.5"
intl-messageformat: "npm:11.2.0"
"@formatjs/icu-messageformat-parser": "npm:3.5.4"
"@formatjs/intl": "npm:4.1.6"
intl-messageformat: "npm:11.2.1"
peerDependencies:
"@types/react": 19
react: 19
checksum: 10c0/97ac04e5813d22bb0f7cbc7332c41a683b61deddd9f1e2720c72536bc74abb23713b02602bf69c1fbd99ab1d087ff1b334a1ef89b2332c867b9030187d128dd9
checksum: 10c0/785a4c0d16a5cb64888b23f6f2d8a87296bde05f1f834c34c5f7f6a73dcab6115afbbb0d4e71471fb287a9c919f32b54ed4b6284e60d21368dec1244eaf3e736
languageName: node
linkType: hard
@ -14666,12 +14694,12 @@ __metadata:
languageName: node
linkType: hard
"uuid@npm:^13.0.0":
version: 13.0.0
resolution: "uuid@npm:13.0.0"
"uuid@npm:^14.0.0":
version: 14.0.0
resolution: "uuid@npm:14.0.0"
bin:
uuid: dist-node/bin/uuid
checksum: 10c0/950e4c18d57fef6c69675344f5700a08af21e26b9eff2bf2180427564297368c538ea11ac9fb2e6528b17fc3966a9fd2c5049361b0b63c7d654f3c550c9b3d67
checksum: 10c0/a57ae7794c45005c1a9208989196c5baf79a7679c30f43c1bee9033a2c4d113a2cea216fa6fcc9663b08b0d55635df1a7c6eb7e7f3d21c3e50688c698fa39a50
languageName: node
linkType: hard