diff --git a/.storybook/main.ts b/.storybook/main.ts index 2f70c80dbf..c8f60c17a2 100644 --- a/.storybook/main.ts +++ b/.storybook/main.ts @@ -3,7 +3,18 @@ import { resolve } from 'node:path'; import type { StorybookConfig } from '@storybook/react-vite'; const config: StorybookConfig = { - stories: ['../app/javascript/**/*.stories.@(js|jsx|mjs|ts|tsx)'], + stories: [ + { + directory: '../app/javascript/mastodon', + files: '**/*.stories.@(js|jsx|mjs|ts|tsx)', + titlePrefix: 'Vanilla', + }, + { + directory: '../app/javascript/flavours/glitch', + files: '**/*.stories.@(js|jsx|mjs|ts|tsx)', + titlePrefix: 'Glitch', + }, + ], addons: [ '@storybook/addon-docs', '@storybook/addon-a11y', diff --git a/.storybook/vitest.setup.ts b/.storybook/vitest.setup.ts deleted file mode 100644 index a08badd02f..0000000000 --- a/.storybook/vitest.setup.ts +++ /dev/null @@ -1,8 +0,0 @@ -import * as a11yAddonAnnotations from '@storybook/addon-a11y/preview'; -import { setProjectAnnotations } from '@storybook/react-vite'; - -import * as projectAnnotations from './preview'; - -// This is an important step to apply the right configuration when testing your stories. -// More info at: https://storybook.js.org/docs/api/portable-stories/portable-stories-vitest#setprojectannotations -setProjectAnnotations([a11yAddonAnnotations, projectAnnotations]); diff --git a/FEDERATION.md b/FEDERATION.md index 7593d6d953..22bbb03a0c 100644 --- a/FEDERATION.md +++ b/FEDERATION.md @@ -68,6 +68,6 @@ The following table summarizes those limits. | Account `attributionDomains` | 256 | List will be truncated | | Account aliases (actor `alsoKnownAs`) | 256 | List will be truncated | | Custom emoji shortcode (`Emoji` `name`) | 2048 | Emoji will be rejected | -| Media and avatar/header descriptions (`name`/`summary`) | 1500 | Description will be truncated | +| Media and avatar/header descriptions (`name`/`summary`) | 10000 | Description will be truncated | | Collection name (`FeaturedCollection` `name`) | 256 | Name will be truncated | | Collection description (`FeaturedCollection` `summary`) | 2048 | Description will be truncated | diff --git a/Gemfile.lock b/Gemfile.lock index e655342dc4..fc2beaa711 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -12,29 +12,29 @@ GEM specs: action_text-trix (2.1.17) railties - actioncable (8.1.2) - actionpack (= 8.1.2) - activesupport (= 8.1.2) + actioncable (8.1.2.1) + actionpack (= 8.1.2.1) + activesupport (= 8.1.2.1) nio4r (~> 2.0) websocket-driver (>= 0.6.1) zeitwerk (~> 2.6) - actionmailbox (8.1.2) - actionpack (= 8.1.2) - activejob (= 8.1.2) - activerecord (= 8.1.2) - activestorage (= 8.1.2) - activesupport (= 8.1.2) + actionmailbox (8.1.2.1) + actionpack (= 8.1.2.1) + activejob (= 8.1.2.1) + activerecord (= 8.1.2.1) + activestorage (= 8.1.2.1) + activesupport (= 8.1.2.1) mail (>= 2.8.0) - actionmailer (8.1.2) - actionpack (= 8.1.2) - actionview (= 8.1.2) - activejob (= 8.1.2) - activesupport (= 8.1.2) + actionmailer (8.1.2.1) + actionpack (= 8.1.2.1) + actionview (= 8.1.2.1) + activejob (= 8.1.2.1) + activesupport (= 8.1.2.1) mail (>= 2.8.0) rails-dom-testing (~> 2.2) - actionpack (8.1.2) - actionview (= 8.1.2) - activesupport (= 8.1.2) + actionpack (8.1.2.1) + actionview (= 8.1.2.1) + activesupport (= 8.1.2.1) nokogiri (>= 1.8.5) rack (>= 2.2.4) rack-session (>= 1.0.1) @@ -42,16 +42,16 @@ GEM rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) useragent (~> 0.16) - actiontext (8.1.2) + actiontext (8.1.2.1) action_text-trix (~> 2.1.15) - actionpack (= 8.1.2) - activerecord (= 8.1.2) - activestorage (= 8.1.2) - activesupport (= 8.1.2) + actionpack (= 8.1.2.1) + activerecord (= 8.1.2.1) + activestorage (= 8.1.2.1) + activesupport (= 8.1.2.1) globalid (>= 0.6.0) nokogiri (>= 1.8.5) - actionview (8.1.2) - activesupport (= 8.1.2) + actionview (8.1.2.1) + activesupport (= 8.1.2.1) builder (~> 3.1) erubi (~> 1.11) rails-dom-testing (~> 2.2) @@ -61,22 +61,22 @@ GEM activemodel (>= 4.1) case_transform (>= 0.2) jsonapi-renderer (>= 0.1.1.beta1, < 0.3) - activejob (8.1.2) - activesupport (= 8.1.2) + activejob (8.1.2.1) + activesupport (= 8.1.2.1) globalid (>= 0.3.6) - activemodel (8.1.2) - activesupport (= 8.1.2) - activerecord (8.1.2) - activemodel (= 8.1.2) - activesupport (= 8.1.2) + activemodel (8.1.2.1) + activesupport (= 8.1.2.1) + activerecord (8.1.2.1) + activemodel (= 8.1.2.1) + activesupport (= 8.1.2.1) timeout (>= 0.4.0) - activestorage (8.1.2) - actionpack (= 8.1.2) - activejob (= 8.1.2) - activerecord (= 8.1.2) - activesupport (= 8.1.2) + activestorage (8.1.2.1) + actionpack (= 8.1.2.1) + activejob (= 8.1.2.1) + activerecord (= 8.1.2.1) + activesupport (= 8.1.2.1) marcel (~> 1.0) - activesupport (8.1.2) + activesupport (8.1.2.1) base64 bigdecimal concurrent-ruby (~> 1.0, >= 1.3.1) @@ -251,12 +251,14 @@ GEM ffi-compiler (1.3.2) ffi (>= 1.15.5) rake - flatware (2.3.4) + flatware (2.4.0) + benchmark drb + logger thor (< 2.0) - flatware-rspec (2.3.4) - flatware (= 2.3.4) - rspec (>= 3.6) + flatware-rspec (2.4.0) + flatware (= 2.4.0) + rspec (>= 3.8) fog-core (2.6.0) builder excon (~> 1.0) @@ -470,7 +472,7 @@ GEM net-smtp (0.5.1) net-protocol nio4r (2.7.5) - nokogiri (1.19.1) + nokogiri (1.19.2) mini_portile2 (~> 2.8.2) racc (~> 1.4) omniauth (2.1.4) @@ -655,20 +657,20 @@ GEM rack (>= 1.3) rackup (2.3.1) rack (>= 3) - rails (8.1.2) - actioncable (= 8.1.2) - actionmailbox (= 8.1.2) - actionmailer (= 8.1.2) - actionpack (= 8.1.2) - actiontext (= 8.1.2) - actionview (= 8.1.2) - activejob (= 8.1.2) - activemodel (= 8.1.2) - activerecord (= 8.1.2) - activestorage (= 8.1.2) - activesupport (= 8.1.2) + rails (8.1.2.1) + actioncable (= 8.1.2.1) + actionmailbox (= 8.1.2.1) + actionmailer (= 8.1.2.1) + actionpack (= 8.1.2.1) + actiontext (= 8.1.2.1) + actionview (= 8.1.2.1) + activejob (= 8.1.2.1) + activemodel (= 8.1.2.1) + activerecord (= 8.1.2.1) + activestorage (= 8.1.2.1) + activesupport (= 8.1.2.1) bundler (>= 1.15.0) - railties (= 8.1.2) + railties (= 8.1.2.1) rails-dom-testing (2.3.0) activesupport (>= 5.0.0) minitest @@ -679,9 +681,9 @@ GEM rails-i18n (8.1.0) i18n (>= 0.7, < 2) railties (>= 8.0.0, < 9) - railties (8.1.2) - actionpack (= 8.1.2) - activesupport (= 8.1.2) + railties (8.1.2.1) + actionpack (= 8.1.2.1) + activesupport (= 8.1.2.1) irb (~> 1.13) rackup (>= 1.0.0) rake (>= 12.2) diff --git a/app/controllers/admin/statuses_controller.rb b/app/controllers/admin/statuses_controller.rb index 7e75d841b5..21c4e5529e 100644 --- a/app/controllers/admin/statuses_controller.rb +++ b/app/controllers/admin/statuses_controller.rb @@ -62,7 +62,11 @@ module Admin end def set_statuses - @statuses = Admin::StatusFilter.new(@account, filter_params).results.preload(:application, :preloadable_poll, :media_attachments, active_mentions: :account, reblog: [:account, :application, :preloadable_poll, :media_attachments, active_mentions: :account]).page(params[:page]).per(PER_PAGE) + @statuses = Admin::StatusFilter.new(@account, filter_params).results.preload(*preload_columns, reblog: [:account, *preload_columns]).page(params[:page]).per(PER_PAGE) + end + + def preload_columns + [:application, :preloadable_poll, :media_attachments, active_mentions: :account] end def filter_params diff --git a/app/helpers/context_helper.rb b/app/helpers/context_helper.rb index fae76edf25..aedadafe08 100644 --- a/app/helpers/context_helper.rb +++ b/app/helpers/context_helper.rb @@ -26,6 +26,12 @@ module ContextHelper voters_count: { 'toot' => 'http://joinmastodon.org/ns#', 'votersCount' => 'toot:votersCount' }, suspended: { 'toot' => 'http://joinmastodon.org/ns#', 'suspended' => 'toot:suspended' }, attribution_domains: { 'toot' => 'http://joinmastodon.org/ns#', 'attributionDomains' => { '@id' => 'toot:attributionDomains', '@type' => '@id' } }, + profile_settings: { + 'toot' => 'http://joinmastodon.org/ns#', + 'showFeatured' => 'toot:showFeatured', + 'showMedia' => 'toot:showMedia', + 'showRepliesInMedia' => 'toot:showRepliesInMedia', + }, quote_requests: { 'QuoteRequest' => 'https://w3id.org/fep/044f#QuoteRequest' }, quotes: { 'quote' => 'https://w3id.org/fep/044f#quote', diff --git a/app/javascript/flavours/glitch/components/callout/index.tsx b/app/javascript/flavours/glitch/components/callout/index.tsx index a9232ec3a7..fe088e2a83 100644 --- a/app/javascript/flavours/glitch/components/callout/index.tsx +++ b/app/javascript/flavours/glitch/components/callout/index.tsx @@ -1,4 +1,4 @@ -import type { FC, ReactNode } from 'react'; +import type { FC, ReactElement, ReactNode } from 'react'; import { useIntl } from 'react-intl'; @@ -19,7 +19,7 @@ import classes from './styles.module.css'; export interface CalloutProps { variant?: | 'default' - // | 'subtle' + | 'subtle' | 'feature' | 'inverted' | 'success' @@ -31,9 +31,9 @@ export interface CalloutProps { /** Set to false to hide the icon. */ icon?: IconProp | boolean; onPrimary?: () => void; - primaryLabel?: string; + primaryLabel?: string | ReactElement; onSecondary?: () => void; - secondaryLabel?: string; + secondaryLabel?: string | ReactElement; onClose?: () => void; id?: string; extraContent?: ReactNode; @@ -41,7 +41,7 @@ export interface CalloutProps { const variantClasses = { default: classes.variantDefault as string, - // subtle: classes.variantSubtle as string, + subtle: classes.variantSubtle as string, feature: classes.variantFeature as string, inverted: classes.variantInverted as string, success: classes.variantSuccess as string, diff --git a/app/javascript/flavours/glitch/components/callout/styles.module.css b/app/javascript/flavours/glitch/components/callout/styles.module.css index 7f33c96eae..14003ccf5d 100644 --- a/app/javascript/flavours/glitch/components/callout/styles.module.css +++ b/app/javascript/flavours/glitch/components/callout/styles.module.css @@ -32,6 +32,10 @@ .body { flex-grow: 1; + a { + color: inherit; + } + h3 { font-weight: 500; margin-bottom: 5px; @@ -51,6 +55,7 @@ color: inherit; font-weight: 500; padding: 0; + text-wrap: nowrap; text-decoration: underline; transition: color 0.1s ease-in-out; @@ -80,14 +85,14 @@ } } -/* .variantSubtle { +.variantSubtle { border: 1px solid var(--color-bg-brand-softer); background-color: var(--color-bg-primary); .icon { background-color: var(--color-bg-brand-softer); } -} */ +} .variantFeature { background-color: var(--color-bg-brand-base); diff --git a/app/javascript/flavours/glitch/features/account_edit/components/tag_search.tsx b/app/javascript/flavours/glitch/features/account_edit/components/tag_search.tsx index 0752c3fa5d..7708012f94 100644 --- a/app/javascript/flavours/glitch/features/account_edit/components/tag_search.tsx +++ b/app/javascript/flavours/glitch/features/account_edit/components/tag_search.tsx @@ -6,7 +6,7 @@ import { defineMessages, useIntl } from 'react-intl'; import { Combobox } from '@/flavours/glitch/components/form_fields'; import { useSearchTags } from '@/flavours/glitch/hooks/useSearchTags'; import type { TagSearchResult } from '@/flavours/glitch/hooks/useSearchTags'; -import { addFeaturedTag } from '@/flavours/glitch/reducers/slices/profile_edit'; +import { addFeaturedTags } from '@/flavours/glitch/reducers/slices/profile_edit'; import { useAppDispatch } from '@/flavours/glitch/store'; import SearchIcon from '@/material-icons/400-24px/search.svg?react'; @@ -47,7 +47,7 @@ export const AccountEditTagSearch: FC = () => { (item: TagSearchResult) => { resetSearch(); setQuery(''); - void dispatch(addFeaturedTag({ name: item.name })); + void dispatch(addFeaturedTags({ names: [item.name] })); }, [dispatch, resetSearch], ); diff --git a/app/javascript/flavours/glitch/features/account_edit/featured_tags.tsx b/app/javascript/flavours/glitch/features/account_edit/featured_tags.tsx index 2eaaca3cf2..701f68ca72 100644 --- a/app/javascript/flavours/glitch/features/account_edit/featured_tags.tsx +++ b/app/javascript/flavours/glitch/features/account_edit/featured_tags.tsx @@ -9,7 +9,7 @@ import { useAccount } from '@/flavours/glitch/hooks/useAccount'; import { useCurrentAccountId } from '@/flavours/glitch/hooks/useAccountId'; import type { TagData } from '@/flavours/glitch/reducers/slices/profile_edit'; import { - addFeaturedTag, + addFeaturedTags, deleteFeaturedTag, fetchProfile, fetchSuggestedTags, @@ -128,7 +128,7 @@ const SuggestedTag: FC<{ name: string; disabled?: boolean }> = ({ }) => { const dispatch = useAppDispatch(); const handleAddTag = useCallback(() => { - void dispatch(addFeaturedTag({ name })); + void dispatch(addFeaturedTags({ names: [name] })); }, [dispatch, name]); return ; }; diff --git a/app/javascript/flavours/glitch/features/account_timeline/v2/index.tsx b/app/javascript/flavours/glitch/features/account_timeline/v2/index.tsx index 3bf8ee67f6..295cb1427d 100644 --- a/app/javascript/flavours/glitch/features/account_timeline/v2/index.tsx +++ b/app/javascript/flavours/glitch/features/account_timeline/v2/index.tsx @@ -18,7 +18,10 @@ import { LoadingIndicator } from '@/flavours/glitch/components/loading_indicator import { RemoteHint } from '@/flavours/glitch/components/remote_hint'; import StatusList from '@/flavours/glitch/components/status_list'; import BundleColumnError from '@/flavours/glitch/features/ui/components/bundle_column_error'; -import { useAccountId } from '@/flavours/glitch/hooks/useAccountId'; +import { + useAccountId, + useCurrentAccountId, +} from '@/flavours/glitch/hooks/useAccountId'; import { useAccountVisibility } from '@/flavours/glitch/hooks/useAccountVisibility'; import { selectTimelineByKey } from '@/flavours/glitch/selectors/timelines'; import { useAppDispatch, useAppSelector } from '@/flavours/glitch/store'; @@ -34,6 +37,7 @@ import { usePinnedStatusIds, } from './pinned_statuses'; import classes from './styles.module.scss'; +import { TagSuggestions } from './tags_suggestions'; const emptyList = ImmutableList(); @@ -135,6 +139,7 @@ const Prepend: FC<{ accountId: string; forceEmpty: boolean; }> = ({ forceEmpty, accountId }) => { + const me = useCurrentAccountId(); if (forceEmpty) { return ; } @@ -144,6 +149,7 @@ const Prepend: FC<{ + {me === accountId && } ); }; diff --git a/app/javascript/flavours/glitch/features/account_timeline/v2/styles.module.scss b/app/javascript/flavours/glitch/features/account_timeline/v2/styles.module.scss index b39892beec..1df19feb1d 100644 --- a/app/javascript/flavours/glitch/features/account_timeline/v2/styles.module.scss +++ b/app/javascript/flavours/glitch/features/account_timeline/v2/styles.module.scss @@ -49,8 +49,12 @@ } } -.tagsWrapper { +.tagsWrapper, +.tagSuggestions { margin: 0 24px 8px; +} + +.tagsWrapper { display: flex; flex-wrap: nowrap; justify-content: flex-start; diff --git a/app/javascript/flavours/glitch/features/account_timeline/v2/tags_suggestions.tsx b/app/javascript/flavours/glitch/features/account_timeline/v2/tags_suggestions.tsx new file mode 100644 index 0000000000..138ccc4cf2 --- /dev/null +++ b/app/javascript/flavours/glitch/features/account_timeline/v2/tags_suggestions.tsx @@ -0,0 +1,128 @@ +import type { FC } from 'react'; +import { useEffect, useCallback, useState } from 'react'; + +import { FormattedMessage, FormattedList } from 'react-intl'; + +import { Link } from 'react-router-dom'; + +import { fetchFeaturedTags } from '@/flavours/glitch/actions/featured_tags'; +import { Callout } from '@/flavours/glitch/components/callout'; +import { useCurrentAccountId } from '@/flavours/glitch/hooks/useAccountId'; +import { useDismissible } from '@/flavours/glitch/hooks/useDismissible'; +import { + fetchProfile, + fetchSuggestedTags, + addFeaturedTags, +} from '@/flavours/glitch/reducers/slices/profile_edit'; +import { useAppSelector, useAppDispatch } from '@/flavours/glitch/store'; + +import classes from './styles.module.scss'; + +const MAX_SUGGESTED_TAGS = 3; + +export const TagSuggestions: FC = () => { + const { dismiss, wasDismissed } = useDismissible( + 'profile/featured_tag_suggestions', + ); + + const suggestedTags = useAppSelector((state) => + state.profileEdit.tagSuggestions?.slice(0, MAX_SUGGESTED_TAGS), + ); + const existingTagCount = useAppSelector( + (state) => state.profileEdit.profile?.featuredTags.length, + ); + const dispatch = useAppDispatch(); + + const isLoading = !suggestedTags || existingTagCount === undefined; + + useEffect(() => { + if (isLoading) { + void dispatch(fetchProfile()); + void dispatch(fetchSuggestedTags()); + } + }, [dispatch, isLoading]); + + const me = useCurrentAccountId(); + const [showSuccessNotice, setSuccessNotice] = useState(false); + + const handleAdd = useCallback(() => { + if (!suggestedTags?.length || !me) { + return; + } + + const addTags = async () => { + await dispatch( + addFeaturedTags({ names: suggestedTags.map((tag) => tag.name) }), + ); + await dispatch(fetchFeaturedTags({ accountId: me })); + setSuccessNotice(true); + dismiss(); + }; + void addTags(); + }, [dismiss, dispatch, me, suggestedTags]); + + const handleDismissSuccessNotice = useCallback(() => { + setSuccessNotice(false); + }, []); + + if (showSuccessNotice) { + return ( + + {chunks}, + }} + /> + + ); + } + + if ( + isLoading || + !suggestedTags.length || + existingTagCount > 0 || + wasDismissed + ) { + return null; + } + + return ( + + } + onSecondary={dismiss} + secondaryLabel={ + + } + > + `#${name}`)} + /> + ), + }} + /> + + ); +}; diff --git a/app/javascript/flavours/glitch/features/emoji/worker.ts b/app/javascript/flavours/glitch/features/emoji/worker.ts index 5602577dbe..ce8eea09ab 100644 --- a/app/javascript/flavours/glitch/features/emoji/worker.ts +++ b/app/javascript/flavours/glitch/features/emoji/worker.ts @@ -1,9 +1,4 @@ import { EMOJI_DB_NAME_SHORTCODES, EMOJI_TYPE_CUSTOM } from './constants'; -import { - importCustomEmojiData, - importEmojiData, - importLegacyShortcodes, -} from './loader'; addEventListener('message', handleMessage); self.postMessage('ready'); // After the worker is ready, notify the main thread @@ -16,6 +11,8 @@ function handleMessage(event: MessageEvent<{ locale: string }>) { } async function loadData(locale: string) { + const { importCustomEmojiData, importEmojiData, importLegacyShortcodes } = + await import('./loader'); let importCount: number | undefined; if (locale === EMOJI_TYPE_CUSTOM) { importCount = (await importCustomEmojiData())?.length; diff --git a/app/javascript/flavours/glitch/reducers/slices/profile_edit.ts b/app/javascript/flavours/glitch/reducers/slices/profile_edit.ts index c42951c605..aa7f67fd50 100644 --- a/app/javascript/flavours/glitch/reducers/slices/profile_edit.ts +++ b/app/javascript/flavours/glitch/reducers/slices/profile_edit.ts @@ -104,24 +104,24 @@ const profileEditSlice = createSlice({ state.isPending = false; }); - builder.addCase(addFeaturedTag.pending, (state) => { + builder.addCase(addFeaturedTags.pending, (state) => { state.isPending = true; }); - builder.addCase(addFeaturedTag.rejected, (state) => { + builder.addCase(addFeaturedTags.rejected, (state) => { state.isPending = false; }); - builder.addCase(addFeaturedTag.fulfilled, (state, action) => { + builder.addCase(addFeaturedTags.fulfilled, (state, action) => { if (!state.profile) { return; } state.profile.featuredTags = [ ...state.profile.featuredTags, - transformTag(action.payload), + ...action.payload.map(transformTag), ].toSorted((a, b) => a.name.localeCompare(b.name)); if (state.tagSuggestions) { state.tagSuggestions = state.tagSuggestions.filter( - (tag) => tag.name !== action.meta.arg.name, + (tag) => !action.meta.arg.names.includes(tag.name), ); } state.isPending = false; @@ -350,20 +350,11 @@ export const fetchSuggestedTags = createDataLoadingThunk( { useLoadingBar: false }, ); -export const addFeaturedTag = createDataLoadingThunk( +export const addFeaturedTags = createDataLoadingThunk( `${profileEditSlice.name}/addFeaturedTag`, - ({ name }: { name: string }) => apiPostFeaturedTag(name), - { - condition(arg, { getState }) { - const state = getState(); - return ( - !!state.profileEdit.profile && - !state.profileEdit.profile.featuredTags.some( - (tag) => tag.name === arg.name, - ) - ); - }, - }, + ({ names }: { names: string[] }) => + Promise.all(names.map((n) => apiPostFeaturedTag(n))), + { useLoadingBar: false }, ); export const deleteFeaturedTag = createDataLoadingThunk( diff --git a/app/javascript/mastodon/components/callout/index.tsx b/app/javascript/mastodon/components/callout/index.tsx index a9232ec3a7..fe088e2a83 100644 --- a/app/javascript/mastodon/components/callout/index.tsx +++ b/app/javascript/mastodon/components/callout/index.tsx @@ -1,4 +1,4 @@ -import type { FC, ReactNode } from 'react'; +import type { FC, ReactElement, ReactNode } from 'react'; import { useIntl } from 'react-intl'; @@ -19,7 +19,7 @@ import classes from './styles.module.css'; export interface CalloutProps { variant?: | 'default' - // | 'subtle' + | 'subtle' | 'feature' | 'inverted' | 'success' @@ -31,9 +31,9 @@ export interface CalloutProps { /** Set to false to hide the icon. */ icon?: IconProp | boolean; onPrimary?: () => void; - primaryLabel?: string; + primaryLabel?: string | ReactElement; onSecondary?: () => void; - secondaryLabel?: string; + secondaryLabel?: string | ReactElement; onClose?: () => void; id?: string; extraContent?: ReactNode; @@ -41,7 +41,7 @@ export interface CalloutProps { const variantClasses = { default: classes.variantDefault as string, - // subtle: classes.variantSubtle as string, + subtle: classes.variantSubtle as string, feature: classes.variantFeature as string, inverted: classes.variantInverted as string, success: classes.variantSuccess as string, diff --git a/app/javascript/mastodon/components/callout/styles.module.css b/app/javascript/mastodon/components/callout/styles.module.css index 7f33c96eae..14003ccf5d 100644 --- a/app/javascript/mastodon/components/callout/styles.module.css +++ b/app/javascript/mastodon/components/callout/styles.module.css @@ -32,6 +32,10 @@ .body { flex-grow: 1; + a { + color: inherit; + } + h3 { font-weight: 500; margin-bottom: 5px; @@ -51,6 +55,7 @@ color: inherit; font-weight: 500; padding: 0; + text-wrap: nowrap; text-decoration: underline; transition: color 0.1s ease-in-out; @@ -80,14 +85,14 @@ } } -/* .variantSubtle { +.variantSubtle { border: 1px solid var(--color-bg-brand-softer); background-color: var(--color-bg-primary); .icon { background-color: var(--color-bg-brand-softer); } -} */ +} .variantFeature { background-color: var(--color-bg-brand-base); diff --git a/app/javascript/mastodon/features/account_edit/components/tag_search.tsx b/app/javascript/mastodon/features/account_edit/components/tag_search.tsx index 9c67f4e4dd..3b423c0735 100644 --- a/app/javascript/mastodon/features/account_edit/components/tag_search.tsx +++ b/app/javascript/mastodon/features/account_edit/components/tag_search.tsx @@ -6,7 +6,7 @@ import { defineMessages, useIntl } from 'react-intl'; import { Combobox } from '@/mastodon/components/form_fields'; import { useSearchTags } from '@/mastodon/hooks/useSearchTags'; import type { TagSearchResult } from '@/mastodon/hooks/useSearchTags'; -import { addFeaturedTag } from '@/mastodon/reducers/slices/profile_edit'; +import { addFeaturedTags } from '@/mastodon/reducers/slices/profile_edit'; import { useAppDispatch } from '@/mastodon/store'; import SearchIcon from '@/material-icons/400-24px/search.svg?react'; @@ -47,7 +47,7 @@ export const AccountEditTagSearch: FC = () => { (item: TagSearchResult) => { resetSearch(); setQuery(''); - void dispatch(addFeaturedTag({ name: item.name })); + void dispatch(addFeaturedTags({ names: [item.name] })); }, [dispatch, resetSearch], ); diff --git a/app/javascript/mastodon/features/account_edit/featured_tags.tsx b/app/javascript/mastodon/features/account_edit/featured_tags.tsx index dbcdad6d62..929fd554d5 100644 --- a/app/javascript/mastodon/features/account_edit/featured_tags.tsx +++ b/app/javascript/mastodon/features/account_edit/featured_tags.tsx @@ -9,7 +9,7 @@ import { useAccount } from '@/mastodon/hooks/useAccount'; import { useCurrentAccountId } from '@/mastodon/hooks/useAccountId'; import type { TagData } from '@/mastodon/reducers/slices/profile_edit'; import { - addFeaturedTag, + addFeaturedTags, deleteFeaturedTag, fetchProfile, fetchSuggestedTags, @@ -128,7 +128,7 @@ const SuggestedTag: FC<{ name: string; disabled?: boolean }> = ({ }) => { const dispatch = useAppDispatch(); const handleAddTag = useCallback(() => { - void dispatch(addFeaturedTag({ name })); + void dispatch(addFeaturedTags({ names: [name] })); }, [dispatch, name]); return ; }; diff --git a/app/javascript/mastodon/features/account_timeline/v2/index.tsx b/app/javascript/mastodon/features/account_timeline/v2/index.tsx index c88d2a12d9..693813bdbe 100644 --- a/app/javascript/mastodon/features/account_timeline/v2/index.tsx +++ b/app/javascript/mastodon/features/account_timeline/v2/index.tsx @@ -18,7 +18,10 @@ import { LoadingIndicator } from '@/mastodon/components/loading_indicator'; import { RemoteHint } from '@/mastodon/components/remote_hint'; import StatusList from '@/mastodon/components/status_list'; import BundleColumnError from '@/mastodon/features/ui/components/bundle_column_error'; -import { useAccountId } from '@/mastodon/hooks/useAccountId'; +import { + useAccountId, + useCurrentAccountId, +} from '@/mastodon/hooks/useAccountId'; import { useAccountVisibility } from '@/mastodon/hooks/useAccountVisibility'; import { selectTimelineByKey } from '@/mastodon/selectors/timelines'; import { useAppDispatch, useAppSelector } from '@/mastodon/store'; @@ -34,6 +37,7 @@ import { usePinnedStatusIds, } from './pinned_statuses'; import classes from './styles.module.scss'; +import { TagSuggestions } from './tags_suggestions'; const emptyList = ImmutableList(); @@ -135,6 +139,7 @@ const Prepend: FC<{ accountId: string; forceEmpty: boolean; }> = ({ forceEmpty, accountId }) => { + const me = useCurrentAccountId(); if (forceEmpty) { return ; } @@ -144,6 +149,7 @@ const Prepend: FC<{ + {me === accountId && } ); }; diff --git a/app/javascript/mastodon/features/account_timeline/v2/styles.module.scss b/app/javascript/mastodon/features/account_timeline/v2/styles.module.scss index b39892beec..1df19feb1d 100644 --- a/app/javascript/mastodon/features/account_timeline/v2/styles.module.scss +++ b/app/javascript/mastodon/features/account_timeline/v2/styles.module.scss @@ -49,8 +49,12 @@ } } -.tagsWrapper { +.tagsWrapper, +.tagSuggestions { margin: 0 24px 8px; +} + +.tagsWrapper { display: flex; flex-wrap: nowrap; justify-content: flex-start; diff --git a/app/javascript/mastodon/features/account_timeline/v2/tags_suggestions.tsx b/app/javascript/mastodon/features/account_timeline/v2/tags_suggestions.tsx new file mode 100644 index 0000000000..93ac491f6c --- /dev/null +++ b/app/javascript/mastodon/features/account_timeline/v2/tags_suggestions.tsx @@ -0,0 +1,128 @@ +import type { FC } from 'react'; +import { useEffect, useCallback, useState } from 'react'; + +import { FormattedMessage, FormattedList } from 'react-intl'; + +import { Link } from 'react-router-dom'; + +import { fetchFeaturedTags } from '@/mastodon/actions/featured_tags'; +import { Callout } from '@/mastodon/components/callout'; +import { useCurrentAccountId } from '@/mastodon/hooks/useAccountId'; +import { useDismissible } from '@/mastodon/hooks/useDismissible'; +import { + fetchProfile, + fetchSuggestedTags, + addFeaturedTags, +} from '@/mastodon/reducers/slices/profile_edit'; +import { useAppSelector, useAppDispatch } from '@/mastodon/store'; + +import classes from './styles.module.scss'; + +const MAX_SUGGESTED_TAGS = 3; + +export const TagSuggestions: FC = () => { + const { dismiss, wasDismissed } = useDismissible( + 'profile/featured_tag_suggestions', + ); + + const suggestedTags = useAppSelector((state) => + state.profileEdit.tagSuggestions?.slice(0, MAX_SUGGESTED_TAGS), + ); + const existingTagCount = useAppSelector( + (state) => state.profileEdit.profile?.featuredTags.length, + ); + const dispatch = useAppDispatch(); + + const isLoading = !suggestedTags || existingTagCount === undefined; + + useEffect(() => { + if (isLoading) { + void dispatch(fetchProfile()); + void dispatch(fetchSuggestedTags()); + } + }, [dispatch, isLoading]); + + const me = useCurrentAccountId(); + const [showSuccessNotice, setSuccessNotice] = useState(false); + + const handleAdd = useCallback(() => { + if (!suggestedTags?.length || !me) { + return; + } + + const addTags = async () => { + await dispatch( + addFeaturedTags({ names: suggestedTags.map((tag) => tag.name) }), + ); + await dispatch(fetchFeaturedTags({ accountId: me })); + setSuccessNotice(true); + dismiss(); + }; + void addTags(); + }, [dismiss, dispatch, me, suggestedTags]); + + const handleDismissSuccessNotice = useCallback(() => { + setSuccessNotice(false); + }, []); + + if (showSuccessNotice) { + return ( + + {chunks}, + }} + /> + + ); + } + + if ( + isLoading || + !suggestedTags.length || + existingTagCount > 0 || + wasDismissed + ) { + return null; + } + + return ( + + } + onSecondary={dismiss} + secondaryLabel={ + + } + > + `#${name}`)} + /> + ), + }} + /> + + ); +}; diff --git a/app/javascript/mastodon/features/emoji/worker.ts b/app/javascript/mastodon/features/emoji/worker.ts index 5602577dbe..ce8eea09ab 100644 --- a/app/javascript/mastodon/features/emoji/worker.ts +++ b/app/javascript/mastodon/features/emoji/worker.ts @@ -1,9 +1,4 @@ import { EMOJI_DB_NAME_SHORTCODES, EMOJI_TYPE_CUSTOM } from './constants'; -import { - importCustomEmojiData, - importEmojiData, - importLegacyShortcodes, -} from './loader'; addEventListener('message', handleMessage); self.postMessage('ready'); // After the worker is ready, notify the main thread @@ -16,6 +11,8 @@ function handleMessage(event: MessageEvent<{ locale: string }>) { } async function loadData(locale: string) { + const { importCustomEmojiData, importEmojiData, importLegacyShortcodes } = + await import('./loader'); let importCount: number | undefined; if (locale === EMOJI_TYPE_CUSTOM) { importCount = (await importCustomEmojiData())?.length; diff --git a/app/javascript/mastodon/locales/be.json b/app/javascript/mastodon/locales/be.json index ac7bd45464..aa510b681f 100644 --- a/app/javascript/mastodon/locales/be.json +++ b/app/javascript/mastodon/locales/be.json @@ -349,6 +349,8 @@ "collections.accounts.empty_description": "Дадайце да {count} уліковых запісаў, на якія Вы падпісаныя", "collections.accounts.empty_title": "Гэтая калекцыя пустая", "collections.collection_description": "Апісанне", + "collections.collection_language": "Мова", + "collections.collection_language_none": "Няма", "collections.collection_name": "Назва", "collections.collection_topic": "Тэма", "collections.confirm_account_removal": "Упэўненыя, што хочаце прыбраць гэты ўліковы запіс з гэтай калекцыі?", @@ -626,6 +628,10 @@ "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.add": "Дадаць", + "featured_tags.suggestions.added": "Кіруйце сваімі рэкамендаванымі хэштэгамі ў любы час праз Рэдагаваць профіль > Рэкамендаваныя хэштэгі.", + "featured_tags.suggestions.dismiss": "Не, дзякуй", "filter_modal.added.context_mismatch_explanation": "Гэтая катэгорыя фільтра не прымяняецца да кантэксту, у якім Вы адкрылі гэты допіс. Калі Вы хочаце, каб паведамленне таксама было адфільтраванае ў гэтым кантэксце, Вам трэба будзе адрэдагаваць фільтр.", "filter_modal.added.context_mismatch_title": "Неадпаведны кантэкст!", "filter_modal.added.expired_explanation": "Тэрмін дзеяння гэтай катэгорыі фільтраў скончыўся, вам трэба будзе змяніць дату заканчэння тэрміну дзеяння, каб яна прымянялася", diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json index 1d6cfb1a52..8eb992fd4e 100644 --- a/app/javascript/mastodon/locales/da.json +++ b/app/javascript/mastodon/locales/da.json @@ -349,6 +349,8 @@ "collections.accounts.empty_description": "Tilføj op til {count} konti, du følger", "collections.accounts.empty_title": "Denne samling er tom", "collections.collection_description": "Beskrivelse", + "collections.collection_language": "Sprog", + "collections.collection_language_none": "Intet", "collections.collection_name": "Navn", "collections.collection_topic": "Emne", "collections.confirm_account_removal": "Er du sikker på, at du vil fjerne denne konto fra denne samling?", @@ -626,6 +628,10 @@ "featured_carousel.header": "{count, plural, one {fastgjort indlæg} other {fastgjorte indlæg}}", "featured_carousel.slide": "Indlæg {current, number} af {max, number}", "featured_tags.more_items": "+{count}", + "featured_tags.suggestions": "Du har for nylig lagt indlæg op om {items}. Skal disse tilføjes som fremhævede hashtags?", + "featured_tags.suggestions.add": "Tilføj", + "featured_tags.suggestions.added": "Du kan til enhver tid administrere dine fremhævede hashtags under Rediger profil > Fremhævede hashtags.", + "featured_tags.suggestions.dismiss": "Nej tak", "filter_modal.added.context_mismatch_explanation": "Denne filterkategori omfatter ikke konteksten, hvorunder dette indlæg er tilgået. Redigér filteret, hvis indlægget også ønskes filtreret i denne kontekst.", "filter_modal.added.context_mismatch_title": "Kontekstmisforhold!", "filter_modal.added.expired_explanation": "Denne filterkategori er udløbet. Ændr dens udløbsdato, for at anvende den.", diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json index 49bbe30b87..a0f9b9f06b 100644 --- a/app/javascript/mastodon/locales/de.json +++ b/app/javascript/mastodon/locales/de.json @@ -349,6 +349,8 @@ "collections.accounts.empty_description": "Füge bis zu {count} Konten, denen du folgst, hinzu", "collections.accounts.empty_title": "Diese Sammlung ist leer", "collections.collection_description": "Beschreibung", + "collections.collection_language": "Sprache", + "collections.collection_language_none": "Nicht festgelegt", "collections.collection_name": "Titel", "collections.collection_topic": "Thema", "collections.confirm_account_removal": "Möchtest du dieses Konto wirklich aus der Sammlung entfernen?", @@ -626,6 +628,10 @@ "featured_carousel.header": "{count, plural, one {Angehefteter Beitrag} other {Angeheftete Beiträge}}", "featured_carousel.slide": "Beitrag {current, number} von {max, number}", "featured_tags.more_items": "+{count}", + "featured_tags.suggestions": "In deinen letzten Beiträgen hast du {items} verwendet. Möchtest du sie zu deinen vorgestellten Hashtags hinzufügen?", + "featured_tags.suggestions.add": "Hinzufügen", + "featured_tags.suggestions.added": "Du kannst deine vorgestellten Hashtags jederzeit in den Einstellungen Profil bearbeiten > Vorgestellte Hashtags anpassen.", + "featured_tags.suggestions.dismiss": "Nein danke", "filter_modal.added.context_mismatch_explanation": "Diese Filterkategorie gilt nicht für den Kontext, in welchem du auf diesen Beitrag zugegriffen hast. Wenn der Beitrag auch in diesem Kontext gefiltert werden soll, musst du den Filter bearbeiten.", "filter_modal.added.context_mismatch_title": "Kontext stimmt nicht überein!", "filter_modal.added.expired_explanation": "Diese Filterkategorie ist abgelaufen. Du musst das Ablaufdatum für diese Kategorie ändern.", diff --git a/app/javascript/mastodon/locales/el.json b/app/javascript/mastodon/locales/el.json index 41da6332ef..16b51552fd 100644 --- a/app/javascript/mastodon/locales/el.json +++ b/app/javascript/mastodon/locales/el.json @@ -349,6 +349,8 @@ "collections.accounts.empty_description": "Προσθέστε μέχρι και {count} λογαριασμούς που ακολουθείτε", "collections.accounts.empty_title": "Αυτή η συλλογή είναι κενή", "collections.collection_description": "Περιγραφή", + "collections.collection_language": "Γλώσσα", + "collections.collection_language_none": "Καμία", "collections.collection_name": "Όνομα", "collections.collection_topic": "Θέμα", "collections.confirm_account_removal": "Σίγουρα θέλετε να αφαιρέσετε αυτόν τον λογαριασμό από αυτή τη συλλογή;", @@ -626,6 +628,10 @@ "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.add": "Προσθήκη", + "featured_tags.suggestions.added": "Διαχειριστείτε τις αναδεδειγμένες ετικέτες σας οποιαδήποτε στιγμή κάτω από το Επεξεργασία προφίλ > Αναδεδειγμένες ετικέτες.", + "featured_tags.suggestions.dismiss": "Όχι, ευχαριστώ", "filter_modal.added.context_mismatch_explanation": "Αυτή η κατηγορία φίλτρων δεν ισχύει για το περιεχόμενο εντός του οποίου προσπελάσατε αυτή την ανάρτηση. Αν θέλετε να φιλτραριστεί η ανάρτηση και εντός αυτού του πλαισίου, θα πρέπει να τροποποιήσετε το φίλτρο.", "filter_modal.added.context_mismatch_title": "Ασυμφωνία περιεχομένου!", "filter_modal.added.expired_explanation": "Αυτή η κατηγορία φίλτρων έχει λήξει, πρέπει να αλλάξετε την ημερομηνία λήξης για να ισχύσει.", diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index e3feb120a2..c33e48dcdd 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -628,6 +628,10 @@ "featured_carousel.header": "{count, plural, one {Pinned Post} other {Pinned Posts}}", "featured_carousel.slide": "Post {current, number} of {max, number}", "featured_tags.more_items": "+{count}", + "featured_tags.suggestions": "Lately you’ve posted about {items}. Add these as featured hashtags?", + "featured_tags.suggestions.add": "Add", + "featured_tags.suggestions.added": "Manage your featured hashtags at any time under Edit Profile > Featured hashtags.", + "featured_tags.suggestions.dismiss": "No thanks", "filter_modal.added.context_mismatch_explanation": "This filter category does not apply to the context in which you have accessed this post. If you want the post to be filtered in this context too, you will have to edit the filter.", "filter_modal.added.context_mismatch_title": "Context mismatch!", "filter_modal.added.expired_explanation": "This filter category has expired, you will need to change the expiration date for it to apply.", diff --git a/app/javascript/mastodon/locales/es-AR.json b/app/javascript/mastodon/locales/es-AR.json index 5a9de67ffe..67106dc618 100644 --- a/app/javascript/mastodon/locales/es-AR.json +++ b/app/javascript/mastodon/locales/es-AR.json @@ -349,6 +349,8 @@ "collections.accounts.empty_description": "Agregá hasta {count} cuentas que seguís", "collections.accounts.empty_title": "Esta colección está vacía", "collections.collection_description": "Descripción", + "collections.collection_language": "Idioma", + "collections.collection_language_none": "Ninguno", "collections.collection_name": "Nombre", "collections.collection_topic": "Tema", "collections.confirm_account_removal": "¿De verdad querés eliminar esta cuenta de esta colección?", @@ -626,6 +628,10 @@ "featured_carousel.header": "{count, plural, one {Mensaje fijado} other {Mensajes fijados}}", "featured_carousel.slide": "Mensaje {current, number} de {max, number}", "featured_tags.more_items": "+{count}", + "featured_tags.suggestions": "Recientemente, publicaste sobre {items}. ¿Querés agregarlas como etiquetas destacadas?", + "featured_tags.suggestions.add": "Agregar", + "featured_tags.suggestions.added": "Administrá tus etiquetas destacadas cuando quieras en Editar perfil > Etiquetas destacadas.", + "featured_tags.suggestions.dismiss": "No, gracias", "filter_modal.added.context_mismatch_explanation": "Esta categoría de filtro no se aplica al contexto en el que accediste a este mensaje. Si querés que el mensaje sea filtrado también en este contexto, vas a tener que editar el filtro.", "filter_modal.added.context_mismatch_title": "¡El contexto no coincide!", "filter_modal.added.expired_explanation": "Esta categoría de filtro caducó; vas a necesitar cambiar la fecha de caducidad para que se aplique.", diff --git a/app/javascript/mastodon/locales/es-MX.json b/app/javascript/mastodon/locales/es-MX.json index fe5cde92cf..6057084391 100644 --- a/app/javascript/mastodon/locales/es-MX.json +++ b/app/javascript/mastodon/locales/es-MX.json @@ -349,6 +349,8 @@ "collections.accounts.empty_description": "Añade hasta {count} cuentas que sigues", "collections.accounts.empty_title": "Esta colección está vacía", "collections.collection_description": "Descripción", + "collections.collection_language": "Idioma", + "collections.collection_language_none": "Ninguno", "collections.collection_name": "Nombre", "collections.collection_topic": "Tema", "collections.confirm_account_removal": "¿Estás seguro/a de que quieres eliminar esta cuenta de esta colección?", @@ -466,7 +468,7 @@ "confirmation_modal.cancel": "Cancelar", "confirmations.block.confirm": "Bloquear", "confirmations.delete.confirm": "Eliminar", - "confirmations.delete.message": "¿Estás seguro de que quieres borrar esta publicación?", + "confirmations.delete.message": "¿Estás seguro de que quieres eliminar esta publicación?", "confirmations.delete.title": "¿Deseas eliminar la publicación?", "confirmations.delete_collection.confirm": "Eliminar", "confirmations.delete_collection.message": "Esta acción no se puede deshacer.", @@ -506,9 +508,9 @@ "confirmations.quiet_post_quote_info.got_it": "Entendido", "confirmations.quiet_post_quote_info.message": "Al citar una publicación pública discreta, tu publicación se ocultará de las cronologías de tendencias.", "confirmations.quiet_post_quote_info.title": "Citar publicaciones públicas discretas", - "confirmations.redraft.confirm": "Borrar y volver a borrador", - "confirmations.redraft.message": "¿Estás seguro de que quieres borrar esta publicación y editarla? Los favoritos e impulsos se perderán, y las respuestas a la publicación original quedarán separadas.", - "confirmations.redraft.title": "¿Deseas borrar y volver a redactar la publicación?", + "confirmations.redraft.confirm": "Eliminar y volver a redactar", + "confirmations.redraft.message": "¿Estás seguro de que quieres eliminar esta publicación y volver a redactarla? Se perderán tanto los «Me gusta» como los impulsos, y las respuestas a la publicación original quedarán sin referencia.", + "confirmations.redraft.title": "¿Deseas eliminar y volver a redactar la publicación?", "confirmations.remove_from_followers.confirm": "Eliminar seguidor", "confirmations.remove_from_followers.message": "{name} dejará de seguirte. ¿Estás seguro de que quieres continuar?", "confirmations.remove_from_followers.title": "¿Eliminar seguidor?", @@ -527,7 +529,7 @@ "content_warning.hide": "Ocultar publicación", "content_warning.show": "Mostrar de todos modos", "content_warning.show_more": "Mostrar más", - "conversation.delete": "Borrar conversación", + "conversation.delete": "Eliminar conversación", "conversation.mark_as_read": "Marcar como leído", "conversation.open": "Ver conversación", "conversation.with": "Con {names}", @@ -570,7 +572,7 @@ "embed.instructions": "Añade esta publicación a tu sitio web con el siguiente código.", "embed.preview": "Así es como se verá:", "emoji_button.activity": "Actividad", - "emoji_button.clear": "Borrar", + "emoji_button.clear": "Eliminar", "emoji_button.custom": "Personalizado", "emoji_button.flags": "Marcas", "emoji_button.food": "Comida y bebida", @@ -626,6 +628,10 @@ "featured_carousel.header": "{count, plural,one {Publicación fijada}other {Publicaciones fijadas}}", "featured_carousel.slide": "Publicación {current, number} de {max, number}", "featured_tags.more_items": "+{count}", + "featured_tags.suggestions": "Últimamente has publicado sobre {items}. ¿Deseas añadirlo como etiqueta destacada?", + "featured_tags.suggestions.add": "Añadir", + "featured_tags.suggestions.added": "Controla tus etiquetas destacadas en cualquier momento en Editar perfil > Etiquetas destacadas.", + "featured_tags.suggestions.dismiss": "No, gracias", "filter_modal.added.context_mismatch_explanation": "Esta categoría de filtro no se aplica al contexto en el que has accedido a esta publicación. Si deseas que la publicación también se filtre en este contexto, tendrás que editar el filtro.", "filter_modal.added.context_mismatch_title": "¡El contexto no coincide!", "filter_modal.added.expired_explanation": "Esta categoría de filtro ha caducado; deberás cambiar la fecha de caducidad para que se aplique.", @@ -798,7 +804,7 @@ "lists.create": "Crear", "lists.create_a_list_to_organize": "Crea una nueva lista para organizar tu página de inicio", "lists.create_list": "Crear lista", - "lists.delete": "Borrar lista", + "lists.delete": "Eliminar lista", "lists.done": "Hecho", "lists.edit": "Editar lista", "lists.exclusive": "Ocultar miembros en Inicio", @@ -928,7 +934,7 @@ "notification_requests.title": "Notificaciones filtradas", "notification_requests.view": "Ver notificaciones", "notifications.clear": "Limpiar notificaciones", - "notifications.clear_confirmation": "¿Seguro de querer borrar permanentemente todas tus notificaciones?", + "notifications.clear_confirmation": "¿Estás seguro de que quieres eliminar definitivamente todas tus notificaciones?", "notifications.clear_title": "¿Limpiar notificaciones?", "notifications.column_settings.admin.report": "Nuevas denuncias:", "notifications.column_settings.admin.sign_up": "Registros nuevos:", @@ -1162,7 +1168,7 @@ "status.context.show": "Mostrar", "status.continued_thread": "Hilo continuado", "status.copy": "Copiar enlace al estado", - "status.delete": "Borrar", + "status.delete": "Eliminar", "status.delete.success": "Publicación eliminada", "status.detailed_status": "Vista de conversación detallada", "status.direct": "Mención privada @{name}", @@ -1215,7 +1221,7 @@ "status.reblogged_by": "Impulsado por {name}", "status.reblogs.empty": "Nadie impulsó esta publicación todavía. Cuando alguien lo haga, aparecerá aquí.", "status.reblogs_count": "{count, plural,one {{counter} impulso} other {{counter} impulsos}}", - "status.redraft": "Borrar y volver a borrador", + "status.redraft": "Eliminar y volver a redactar", "status.remove_bookmark": "Eliminar marcador", "status.remove_favourite": "Eliminar de favoritos", "status.remove_quote": "Eliminar", diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json index e4f7519540..c04df9cfd1 100644 --- a/app/javascript/mastodon/locales/es.json +++ b/app/javascript/mastodon/locales/es.json @@ -626,6 +626,10 @@ "featured_carousel.header": "{count, plural,one {Publicación fijada} other {Publicaciones fijadas}}", "featured_carousel.slide": "Publicación {current, number} de {max, number}", "featured_tags.more_items": "+{count}", + "featured_tags.suggestions": "Últimamente has publicado sobre {items}. ¿Quieres añadirlo como etiqueta destacada?", + "featured_tags.suggestions.add": "Añadir", + "featured_tags.suggestions.added": "Controla tus etiquetas destacadas cuando quieras en Editar perfil > Etiquetas destacadas.", + "featured_tags.suggestions.dismiss": "No, gracias", "filter_modal.added.context_mismatch_explanation": "Esta categoría de filtro no se aplica al contexto en el que ha accedido a esta publlicación. Si quieres que la publicación sea filtrada también en este contexto, tendrás que editar el filtro.", "filter_modal.added.context_mismatch_title": "¡El contexto no coincide!", "filter_modal.added.expired_explanation": "Esta categoría de filtro ha caducado, tendrás que cambiar la fecha de caducidad para que se aplique.", diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json index 60afb8591f..ffec8d59e8 100644 --- a/app/javascript/mastodon/locales/fi.json +++ b/app/javascript/mastodon/locales/fi.json @@ -349,6 +349,8 @@ "collections.accounts.empty_description": "Lisää enintään {count} seuraamaasi tiliä", "collections.accounts.empty_title": "Tämä kokoelma on tyhjä", "collections.collection_description": "Kuvaus", + "collections.collection_language": "Kieli", + "collections.collection_language_none": "Ei mikään", "collections.collection_name": "Nimi", "collections.collection_topic": "Aihe", "collections.confirm_account_removal": "Haluatko varmasti poistaa tämän tilin tästä kokoelmasta?", @@ -626,6 +628,10 @@ "featured_carousel.header": "{count, plural, one {Kiinnitetty julkaisu} other {Kiinnitetyt julkaisut}}", "featured_carousel.slide": "Julkaisu {current, number} / {max, number}", "featured_tags.more_items": "+{count}", + "featured_tags.suggestions": "Olet viime aikoina julkaissut aiheista {items}. Lisätäänkö nämä esiteltäviksi aihetunnisteiksi?", + "featured_tags.suggestions.add": "Lisää", + "featured_tags.suggestions.added": "Hallitse esiteltäviä aihetunnisteitasi milloin tahansa kohdasta Muokkaa profiilia > Esiteltävät aihetunnisteet.", + "featured_tags.suggestions.dismiss": "Ei kiitos", "filter_modal.added.context_mismatch_explanation": "Tämä suodatinluokka ei koske asiayhteyttä, jossa olet tarkastellut tätä julkaisua. Jos haluat julkaisun suodatettavan myös tässä asiayhteydessä, muokkaa suodatinta.", "filter_modal.added.context_mismatch_title": "Asiayhteys ei täsmää!", "filter_modal.added.expired_explanation": "Tämä suodatinluokka on vanhentunut, joten sinun on muutettava viimeistä voimassaolopäivää, jotta suodatusta käytettäisiin.", diff --git a/app/javascript/mastodon/locales/fr-CA.json b/app/javascript/mastodon/locales/fr-CA.json index 5073f5f40d..23ab79e596 100644 --- a/app/javascript/mastodon/locales/fr-CA.json +++ b/app/javascript/mastodon/locales/fr-CA.json @@ -349,6 +349,8 @@ "collections.accounts.empty_description": "Ajouter jusqu'à {count} comptes que vous suivez", "collections.accounts.empty_title": "Cette collection est vide", "collections.collection_description": "Description", + "collections.collection_language": "Langue", + "collections.collection_language_none": "Aucune", "collections.collection_name": "Nom", "collections.collection_topic": "Sujet", "collections.confirm_account_removal": "Voulez-vous vraiment supprimer ce compte de la collection ?", @@ -626,6 +628,10 @@ "featured_carousel.header": "{count, plural, one {Pinned Post} other {Pinned Posts}}", "featured_carousel.slide": "Message {current, number} de {max, number}", "featured_tags.more_items": "+{count}", + "featured_tags.suggestions": "Récemment, vous avez posté à propos de {items}. Voulez-vous mettre ces hashtags en avant ?", + "featured_tags.suggestions.add": "Ajouter", + "featured_tags.suggestions.added": "Gérer vos hashtags mis en avant à tout moment depuis Modifier le profil > Hashtags mis en avant.", + "featured_tags.suggestions.dismiss": "Non merci", "filter_modal.added.context_mismatch_explanation": "Cette catégorie de filtre ne s'applique pas au contexte dans lequel vous avez accédé à cette publication. Si vous voulez que la publication soit filtrée dans ce contexte également, vous devrez modifier le filtre.", "filter_modal.added.context_mismatch_title": "Incompatibilité du contexte!", "filter_modal.added.expired_explanation": "Cette catégorie de filtre a expiré, vous devrez modifier la date d'expiration pour qu'elle soit appliquée.", diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json index 8bd9c72c05..9f0c6e78bc 100644 --- a/app/javascript/mastodon/locales/fr.json +++ b/app/javascript/mastodon/locales/fr.json @@ -349,6 +349,8 @@ "collections.accounts.empty_description": "Ajouter jusqu'à {count} comptes que vous suivez", "collections.accounts.empty_title": "Cette collection est vide", "collections.collection_description": "Description", + "collections.collection_language": "Langue", + "collections.collection_language_none": "Aucune", "collections.collection_name": "Nom", "collections.collection_topic": "Sujet", "collections.confirm_account_removal": "Voulez-vous vraiment supprimer ce compte de la collection ?", @@ -626,6 +628,10 @@ "featured_carousel.header": "{count, plural, one {Pinned Post} other {Pinned Posts}}", "featured_carousel.slide": "Message {current, number} de {max, number}", "featured_tags.more_items": "+{count}", + "featured_tags.suggestions": "Récemment, vous avez posté à propos de {items}. Voulez-vous mettre ces hashtags en avant ?", + "featured_tags.suggestions.add": "Ajouter", + "featured_tags.suggestions.added": "Gérer vos hashtags mis en avant à tout moment depuis Modifier le profil > Hashtags mis en avant.", + "featured_tags.suggestions.dismiss": "Non merci", "filter_modal.added.context_mismatch_explanation": "Cette catégorie de filtre ne s'applique pas au contexte dans lequel vous avez accédé à ce message. Si vous voulez que le message soit filtré dans ce contexte également, vous devrez modifier le filtre.", "filter_modal.added.context_mismatch_title": "Incompatibilité du contexte !", "filter_modal.added.expired_explanation": "Cette catégorie de filtre a expiré, vous devrez modifier la date d'expiration pour qu'elle soit appliquée.", diff --git a/app/javascript/mastodon/locales/ga.json b/app/javascript/mastodon/locales/ga.json index 32f8e17412..0ce04407a7 100644 --- a/app/javascript/mastodon/locales/ga.json +++ b/app/javascript/mastodon/locales/ga.json @@ -349,6 +349,8 @@ "collections.accounts.empty_description": "Cuir suas le {count} cuntas leis a leanann tú", "collections.accounts.empty_title": "Tá an bailiúchán seo folamh", "collections.collection_description": "Cur síos", + "collections.collection_language": "Teanga", + "collections.collection_language_none": "Dada", "collections.collection_name": "Ainm", "collections.collection_topic": "Topaic", "collections.confirm_account_removal": "An bhfuil tú cinnte gur mian leat an cuntas seo a bhaint den bhailiúchán seo?", @@ -626,6 +628,10 @@ "featured_carousel.header": "{count, plural, one {Postáil phinnáilte} two {Poist Phionáilte} few {Poist Phionáilte} many {Poist Phionáilte} other {Poist Phionáilte}}", "featured_carousel.slide": "Post {current, number} of {max, number}", "featured_tags.more_items": "+{count}", + "featured_tags.suggestions": "Le déanaí, tá postáil déanta agat faoi {items}. An gcuirfeá iad seo leis mar hashtags le feiceáil?", + "featured_tags.suggestions.add": "Cuir leis", + "featured_tags.suggestions.added": "Bainistigh do hashtags le feiceáil ag am ar bith faoi Cuir Próifíl in Eagar > Hashtags le feiceáil.", + "featured_tags.suggestions.dismiss": "Ní raibh maith agat", "filter_modal.added.context_mismatch_explanation": "Ní bhaineann an chatagóir scagaire seo leis an gcomhthéacs ina bhfuair tú rochtain ar an bpostáil seo. Más mian leat an postáil a scagadh sa chomhthéacs seo freisin, beidh ort an scagaire a chur in eagar.", "filter_modal.added.context_mismatch_title": "Neamhréir comhthéacs!", "filter_modal.added.expired_explanation": "Tá an chatagóir scagaire seo imithe in éag, beidh ort an dáta éaga a athrú chun é a chur i bhfeidhm.", diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json index 4b80a23a86..af372edd2b 100644 --- a/app/javascript/mastodon/locales/gl.json +++ b/app/javascript/mastodon/locales/gl.json @@ -349,6 +349,8 @@ "collections.accounts.empty_description": "Engade ata {count} contas que segues", "collections.accounts.empty_title": "A colección está baleira", "collections.collection_description": "Descrición", + "collections.collection_language": "Idioma", + "collections.collection_language_none": "Ningún", "collections.collection_name": "Nome", "collections.collection_topic": "Temática", "collections.confirm_account_removal": "Tes certeza de querer retirar esta conta desta colección?", @@ -626,6 +628,10 @@ "featured_carousel.header": "{count, plural, one {Publicación fixada} other {Publicacións fixadas}}", "featured_carousel.slide": "Publicación {current, number} de {max, number}", "featured_tags.more_items": "+{count}", + "featured_tags.suggestions": "Ultimamente publicaches sobre {items}. Engadimos isto como cancelos destacados?", + "featured_tags.suggestions.add": "Engadir", + "featured_tags.suggestions.added": "Xestiona os teus cancelos destacados cando queiras en Editar perfil > Cancelos destacados.", + "featured_tags.suggestions.dismiss": "Non, grazas", "filter_modal.added.context_mismatch_explanation": "Esta categoría de filtro non se aplica ao contexto no que accedeches a esta publicación. Se queres que a publicación se filtre nese contexto tamén, terás que editar o filtro.", "filter_modal.added.context_mismatch_title": "Non concorda o contexto!", "filter_modal.added.expired_explanation": "Esta categoría de filtro caducou, terás que cambiar a data de caducidade para que se aplique.", diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json index 8adbb078d3..4034ce3e30 100644 --- a/app/javascript/mastodon/locales/he.json +++ b/app/javascript/mastodon/locales/he.json @@ -349,6 +349,8 @@ "collections.accounts.empty_description": "להוסיף עד ל־{count} חשבונות שאתם עוקבים אחריהם", "collections.accounts.empty_title": "האוסף הזה ריק", "collections.collection_description": "תיאור", + "collections.collection_language": "שפה", + "collections.collection_language_none": "לא מצוין", "collections.collection_name": "כינוי", "collections.collection_topic": "נושא", "collections.confirm_account_removal": "בוודאות להסיר חשבון זה מהאוסף?", @@ -626,6 +628,10 @@ "featured_carousel.header": "{count, plural, one {הודעה אחת נעוצה} two {הודעותיים נעוצות} many {הודעות נעוצות} other {הודעות נעוצות}}", "featured_carousel.slide": "הודעה {current, number} מתוך {max, number}", "featured_tags.more_items": "+{count}", + "featured_tags.suggestions": "לאחרונה פרסמת על {items}. להוסיף את הנושאים לתגיות הנבחרות?", + "featured_tags.suggestions.add": "הוספה", + "featured_tags.suggestions.added": "ניהול התגיות הנבחרות בכל עת תחת עריכת פרופיל > תגיות נבחרות.", + "featured_tags.suggestions.dismiss": "לא תודה", "filter_modal.added.context_mismatch_explanation": "קטגוריית הסנן הזאת לא חלה על ההקשר שממנו הגעת אל ההודעה הזו. אם תרצה/י שההודעה תסונן גם בהקשר זה, תצטרך/י לערוך את הסנן.", "filter_modal.added.context_mismatch_title": "אין התאמה להקשר!", "filter_modal.added.expired_explanation": "פג תוקפה של קטגוריית הסינון הזו, יש צורך לשנות את תאריך התפוגה כדי שהסינון יוחל.", diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json index b9ff2185bd..a97a7240c1 100644 --- a/app/javascript/mastodon/locales/hu.json +++ b/app/javascript/mastodon/locales/hu.json @@ -348,6 +348,8 @@ "collections.accounts.empty_description": "Adj hozzá legfeljebb {count} követett fiókot", "collections.accounts.empty_title": "Ez a gyűjtemény üres", "collections.collection_description": "Leírás", + "collections.collection_language": "Nyelv", + "collections.collection_language_none": "Egyik sem", "collections.collection_name": "Név", "collections.collection_topic": "Téma", "collections.confirm_account_removal": "Biztos, hogy eltávolítod ezt a fiókot ebből a gyűjteményből?", diff --git a/app/javascript/mastodon/locales/is.json b/app/javascript/mastodon/locales/is.json index 442b8d60eb..6606bef9b3 100644 --- a/app/javascript/mastodon/locales/is.json +++ b/app/javascript/mastodon/locales/is.json @@ -349,6 +349,8 @@ "collections.accounts.empty_description": "Bættu við allt að {count} aðgöngum sem þú fylgist með", "collections.accounts.empty_title": "Þetta safn er tómt", "collections.collection_description": "Lýsing", + "collections.collection_language": "Tungumál", + "collections.collection_language_none": "Ekkert", "collections.collection_name": "Nafn", "collections.collection_topic": "Umfjöllunarefni", "collections.confirm_account_removal": "Ertu viss um að þú viljir fjarlægja þennan aðgang úr þessu safni?", @@ -626,6 +628,10 @@ "featured_carousel.header": "{count, plural, one {Fest færsla} other {Festar færslur}}", "featured_carousel.slide": "Færsla {current, number} af {max, number}", "featured_tags.more_items": "+{count}", + "featured_tags.suggestions": "Að undanförnu hefurðu skrifað um {items}. Ætti að bæta þessu við sem myllumerkjum með aukið vægi?", + "featured_tags.suggestions.add": "Bæta við", + "featured_tags.suggestions.added": "Sýslaðu með þau myllumerki þín sem eru með með aukið vægi með því að fara í Breyta notandasniði > Myllumerki með aukið vægi.", + "featured_tags.suggestions.dismiss": "Nei takk", "filter_modal.added.context_mismatch_explanation": "Þessi síuflokkur á ekki við í því samhengi sem aðgangur þinn að þessari færslu felur í sér. Ef þú vilt að færslan sé einnig síuð í þessu samhengi, þá þarftu að breyta síunni.", "filter_modal.added.context_mismatch_title": "Misræmi í samhengi!", "filter_modal.added.expired_explanation": "Þessi síuflokkur er útrunninn, þú þarft að breyta gidistímanum svo hann geti átt við.", diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json index 36fc7c4241..10c44a7b49 100644 --- a/app/javascript/mastodon/locales/it.json +++ b/app/javascript/mastodon/locales/it.json @@ -349,6 +349,8 @@ "collections.accounts.empty_description": "Aggiungi fino a {count} account che segui", "collections.accounts.empty_title": "Questa collezione è vuota", "collections.collection_description": "Descrizione", + "collections.collection_language": "Lingua", + "collections.collection_language_none": "Nessuna", "collections.collection_name": "Nome", "collections.collection_topic": "Argomento", "collections.confirm_account_removal": "Si è sicuri di voler rimuovere questo account da questa collezione?", @@ -626,6 +628,10 @@ "featured_carousel.header": "{count, plural, one {Post appuntato} other {Post appuntati}}", "featured_carousel.slide": "Post {current, number} di {max, number}", "featured_tags.more_items": "+{count}", + "featured_tags.suggestions": "Ultimamente hai pubblicato contenuti relativi a {items}. Vuoi aggiungerli come hashtag in evidenza?", + "featured_tags.suggestions.add": "Aggiungi", + "featured_tags.suggestions.added": "Gestisci i tuoi hashtag in evidenza in qualsiasi momento in Modifica profilo > Hashtag in evidenza.", + "featured_tags.suggestions.dismiss": "No, grazie", "filter_modal.added.context_mismatch_explanation": "La categoria di questo filtro non si applica al contesto in cui hai acceduto a questo post. Se desideri che il post sia filtrato anche in questo contesto, dovrai modificare il filtro.", "filter_modal.added.context_mismatch_title": "Contesto non corrispondente!", "filter_modal.added.expired_explanation": "La categoria di questo filtro è scaduta, dovrvai modificarne la data di scadenza per applicarlo.", diff --git a/app/javascript/mastodon/locales/nan-TW.json b/app/javascript/mastodon/locales/nan-TW.json index a463da983d..f26df41d4f 100644 --- a/app/javascript/mastodon/locales/nan-TW.json +++ b/app/javascript/mastodon/locales/nan-TW.json @@ -162,7 +162,7 @@ "account_edit.featured_hashtags.item": "hashtag", "account_edit.featured_hashtags.placeholder": "幫tsān別lâng認捌,kap緊緊接近使用lí收藏ê主題。", "account_edit.featured_hashtags.title": "特色ê hashtag", - "account_edit.field_delete_modal.confirm": "Lí敢確定behthâi掉tsit ê自訂ê框á?Tsit ê動作bē當改倒轉。", + "account_edit.field_delete_modal.confirm": "Lí敢確定beh thâi掉tsit ê自訂ê框á?Tsit ê動作bē當改倒轉。", "account_edit.field_delete_modal.delete_button": "Thâi掉", "account_edit.field_delete_modal.title": "敢beh thâi掉自訂ê框á?", "account_edit.field_edit_modal.add_title": "加自訂ê框á", @@ -183,6 +183,15 @@ "account_edit.field_reorder_modal.drag_start": "有揀框á「{item}」。", "account_edit.field_reorder_modal.handle_label": "Giú框á「{item}」", "account_edit.field_reorder_modal.title": "重整理框á", + "account_edit.image_alt_modal.add_title": "加添說明文字", + "account_edit.image_alt_modal.details_content": "著愛:
  • 照圖描述家kī
  • 用第三人稱(比如用「阿明」,毋是「我」)
  • 束結,幾个詞就夠ah
毋通:
  • 用「……ê相片」結束,這對讀螢幕程式是加講ê
例:
  • 「阿明穿青ê siá-tsuh,koh掛眼鏡」
", + "account_edit.image_alt_modal.details_title": "撇步:個人資料ê相片 ê 說明文字", + "account_edit.image_alt_modal.edit_title": "編說明文字", + "account_edit.image_alt_modal.text_hint": "ALT說明文字通幫tsān讀螢幕程式ê用者知影lí ê內容。", + "account_edit.image_alt_modal.text_label": "替代文字", + "account_edit.image_delete_modal.confirm": "Lí敢確定beh thâi掉tsit幅圖?Tsit ê動作bē當改倒轉。", + "account_edit.image_delete_modal.delete_button": "Thâi掉", + "account_edit.image_delete_modal.title": "Kám beh thâi掉影像?", "account_edit.image_edit.add_button": "加圖片", "account_edit.image_edit.alt_add_button": "加添說明文字", "account_edit.image_edit.alt_edit_button": "編說明文字", @@ -202,6 +211,16 @@ "account_edit.profile_tab.subtitle": "自訂lí ê個人資料ê分頁kap顯示ê內容。", "account_edit.profile_tab.title": "個人資料分頁設定", "account_edit.save": "儲存", + "account_edit.upload_modal.back": "轉去", + "account_edit.upload_modal.done": "做好ah", + "account_edit.upload_modal.next": "後一步", + "account_edit.upload_modal.step_crop.zoom": "伸kiu", + "account_edit.upload_modal.step_upload.button": "瀏覽檔案", + "account_edit.upload_modal.step_upload.dragging": "Giú kàu tsia傳上去", + "account_edit.upload_modal.step_upload.header": "揀圖片", + "account_edit.upload_modal.step_upload.hint": "WEBP、PNG、GIF á是 JPG 格式,上大 {limit}MB。{br}圖會伸kiu kàu {width}x{height} px。", + "account_edit.upload_modal.title_add": "加個人資料ê相", + "account_edit.upload_modal.title_replace": "替換個人資料ê相", "account_edit.verified_modal.details": "用驗證連kàu個人網站ê連結來加添lí ê Mastodon個人檔案ê通信ê程度。下kha是運作ê方法:", "account_edit.verified_modal.invisible_link.details": "加連結kàu lí ê網頁頭(header)。上重要ê部份是 rel=\"me\",伊防止通過用者生成ê網站內容來做假包。Lí甚至佇網頁ê header毋免用 {tag},反轉用link標簽,但是HTML定著佇無執行JavaScript ê時陣,就ē當接近使用。", "account_edit.verified_modal.invisible_link.summary": "Án-tsuánn khàm掉tsit ê連結?", @@ -330,6 +349,8 @@ "collections.accounts.empty_description": "加lí跟tuè ê口座,上tsē {count} ê", "collections.accounts.empty_title": "收藏內底無半項", "collections.collection_description": "說明", + "collections.collection_language": "語言", + "collections.collection_language_none": "無", "collections.collection_name": "名", "collections.collection_topic": "主題", "collections.confirm_account_removal": "Lí確定beh對收藏suá掉tsit ê口座?", @@ -488,7 +509,7 @@ "confirmations.quiet_post_quote_info.message": "Nā是引用無tī公共時間線內底êPO文,lí êPO文bē當tī趨勢ê時間線顯示。", "confirmations.quiet_post_quote_info.title": "引用無tī公開ê時間線內底顯示ê PO文", "confirmations.redraft.confirm": "Thâi掉了後重寫", - "confirmations.redraft.message": "Lí kám確定behthâi掉tsit篇PO文了後koh重寫?收藏kap轉PO ē無去,而且原底ê PO文ê回應ē變孤立。", + "confirmations.redraft.message": "Lí kám確定beh thâi掉tsit篇PO文了後koh重寫?收藏kap轉PO ē無去,而且原底ê PO文ê回應ē變孤立。", "confirmations.redraft.title": "Kám beh thâi掉koh重寫PO文?", "confirmations.remove_from_followers.confirm": "Suá掉跟tuè lí ê", "confirmations.remove_from_followers.message": "{name} ē停止跟tuè lí。Lí kám確定beh繼續?", diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json index c998f6ac8c..3be1d09814 100644 --- a/app/javascript/mastodon/locales/nl.json +++ b/app/javascript/mastodon/locales/nl.json @@ -153,7 +153,7 @@ "account_edit.custom_fields.name": "veld", "account_edit.custom_fields.placeholder": "Voeg je voornaamwoorden, externe links of iets anders toe dat je wilt delen.", "account_edit.custom_fields.reorder_button": "Velden opnieuw ordenen", - "account_edit.custom_fields.tip_content": "Je kunt gemakkelijk geloofwaardigheid toevoegen aan je Mastodon account door links te controleren naar websites die je bezit.", + "account_edit.custom_fields.tip_content": "Je kunt gemakkelijk je Mastodon-account geloofwaardig maken door links naar websites die van jou zijn te laten verifiëren.", "account_edit.custom_fields.tip_title": "Tip: Geverifieerde links toevoegen", "account_edit.custom_fields.title": "Extra velden", "account_edit.custom_fields.verified_hint": "Hoe voeg ik een geverifieerde link toe?", @@ -179,15 +179,15 @@ "account_edit.field_reorder_modal.drag_end": "Veld \"{item}\" werd geschrapt.", "account_edit.field_reorder_modal.drag_instructions": "Druk op spatie of enter om de aangepaste velden te herschikken. Gebruik de pijltjestoetsen om het veld omhoog of omlaag te verplaatsen. Druk opnieuw op spatie of enter om het veld op diens nieuwe positie te laten vallen, of druk op escape om te annuleren.", "account_edit.field_reorder_modal.drag_move": "Veld \"{item}\" is verplaatst.", - "account_edit.field_reorder_modal.drag_over": "Veld \"{item}\" is over \"{over} \" verplaatst.", + "account_edit.field_reorder_modal.drag_over": "Veld \"{item}\" is over \"{over}\" geplaatst.", "account_edit.field_reorder_modal.drag_start": "Opgepakt veld \"{item}\".", "account_edit.field_reorder_modal.handle_label": "Veld \"{item}\" slepen", "account_edit.field_reorder_modal.title": "Velden herschikken", "account_edit.image_alt_modal.add_title": "Alt-tekst toevoegen", - "account_edit.image_alt_modal.details_content": "DOEN:
  • Beschrijf jezelf zoals afgebeeld
  • Gebruik taal van een derde persoon (bijv. “Alex” in plaats van “ik”)
  • Wees beknopt - een paar woorden is vaak genoeg
NIET DOEN:
  • Begin met “Foto van” - dit is overbodig voor schermlezers
VOORBEELD:
  • “Alex draagt een groen shirt en een bril”
", + "account_edit.image_alt_modal.details_content": "DOEN:
  • Beschrijf jezelf zoals afgebeeld
  • Schrijf in de derde persoon (bijv. “Alex” in plaats van “ik”)
  • Wees beknopt - een paar woorden is vaak genoeg
NIET DOEN:
  • Begin met “Foto van” - dit is overbodig voor schermlezers
VOORBEELD:
  • “Alex draagt een groen shirt en een bril”
", "account_edit.image_alt_modal.details_title": "Tips: Alt-tekst voor profielfoto's", "account_edit.image_alt_modal.edit_title": "Alt-tekst bewerken", - "account_edit.image_alt_modal.text_hint": "Alt-text helpt gebruikers van schermlezer jouw inhoud te begrijpen.", + "account_edit.image_alt_modal.text_hint": "Alt-text helpt gebruikers van schermlezers jouw inhoud te begrijpen.", "account_edit.image_alt_modal.text_label": "Alt-tekst", "account_edit.image_delete_modal.confirm": "Weet je zeker dat je deze afbeelding wilt verwijderen? Deze actie kan niet ongedaan worden gemaakt.", "account_edit.image_delete_modal.delete_button": "Verwijderen", @@ -221,10 +221,10 @@ "account_edit.upload_modal.step_upload.hint": "WEBP-, PNG-, GIF- of JPG-formaat, tot max. {limit}MB.{br}Afbeelding wordt geschaald naar {width}x{height}px.", "account_edit.upload_modal.title_add": "Profielfoto toevoegen", "account_edit.upload_modal.title_replace": "Profielfoto vervangen", - "account_edit.verified_modal.details": "Voeg geloofwaardigheid toe aan je Mastodonprofiel door links naar persoonlijke websites te verifiëren. Zo werkt het:", - "account_edit.verified_modal.invisible_link.details": "Voeg de link toe aan uw header. Het belangrijke onderdeel is rel=\"me\" om te voorkomen dat websites impersoneren met door de gebruiker gegenereerde inhoud. Je kunt zelfs een linktag gebruiken in de kop van de pagina in plaats van {tag}, maar de HTML moet toegankelijk zijn zonder JavaScript uit te voeren.", + "account_edit.verified_modal.details": "Maak je Mastodonprofiel geloofwaardig door links naar persoonlijke websites te verifiëren. Zo werkt het:", + "account_edit.verified_modal.invisible_link.details": "Voeg de link aan de HTML van je website toe. Het belangrijkste onderdeel is rel=\"me\", waarmee wordt voorkomen dat websites met user-generated content geïmpersoneerd kunnen worden. Je kunt zelfs een -tag gebruiken binnen de -tag van je website in plaats van {tag}, maar de HTML moet zonder JavaScript toegankelijk zijn.", "account_edit.verified_modal.invisible_link.summary": "Hoe maak ik de link onzichtbaar?", - "account_edit.verified_modal.step1.header": "Kopieer de onderstaande HTML-code en plak deze in de koptekst van je website", + "account_edit.verified_modal.step1.header": "Kopieer de onderstaande HTML-code en plak deze binnen de -tag van je website", "account_edit.verified_modal.step2.details": "Als je je website al als een aangepast veld hebt toegevoegd, moet je deze verwijderen en opnieuw toevoegen om de verificatie te activeren.", "account_edit.verified_modal.step2.header": "Voeg je website toe als een aangepast veld", "account_edit.verified_modal.title": "Hoe voeg je een geverifieerde link toe", @@ -349,6 +349,8 @@ "collections.accounts.empty_description": "Tot {count} accounts die je volgt toevoegen", "collections.accounts.empty_title": "Deze verzameling is leeg", "collections.collection_description": "Omschrijving", + "collections.collection_language": "Taal", + "collections.collection_language_none": "Geen", "collections.collection_name": "Naam", "collections.collection_topic": "Onderwerp", "collections.confirm_account_removal": "Weet je zeker dat je dit account uit deze verzameling wilt verwijderen?", diff --git a/app/javascript/mastodon/locales/sq.json b/app/javascript/mastodon/locales/sq.json index ca7d378c1d..076830d3f3 100644 --- a/app/javascript/mastodon/locales/sq.json +++ b/app/javascript/mastodon/locales/sq.json @@ -344,6 +344,8 @@ "collections.account_count": "{count, plural, one {# llogari} other {# llogari}}", "collections.accounts.empty_title": "Ky koleksion është i zbrazët", "collections.collection_description": "Përshkrim", + "collections.collection_language": "Gjuhë", + "collections.collection_language_none": "Asnjë", "collections.collection_name": "Emër", "collections.collection_topic": "Temë", "collections.confirm_account_removal": "Jeni i sigurt se doni të hiqet kjo llogari nga ky koleksion?", diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json index 4c781e24a5..17613601e9 100644 --- a/app/javascript/mastodon/locales/sv.json +++ b/app/javascript/mastodon/locales/sv.json @@ -277,6 +277,8 @@ "closed_registrations_modal.preamble": "Mastodon är decentraliserat så oavsett var du skapar ditt konto kommer du att kunna följa och interagera med någon på denna server. Du kan också köra din egen server!", "closed_registrations_modal.title": "Registrera sig på Mastodon", "collections.accounts.empty_description": "Lägg till upp till {count} konton som du följer", + "collections.collection_language": "Språk", + "collections.collection_language_none": "Inga", "collections.create_a_collection_hint": "Skapa en samling för att rekommendera eller dela dina favoritkonton med andra.", "collections.create_collection": "Skapa samling", "collections.delete_collection": "Radera samling", @@ -501,6 +503,10 @@ "featured_carousel.current": "Inlägg {current, number} / {max, number}", "featured_carousel.header": "{count, plural,one {Fäst inlägg} other {Fästa inlägg}}", "featured_carousel.slide": "Inlägg {current, number} av {max, number}", + "featured_tags.suggestions": "På senare tid har du skrivit om {items}. Lägg till dessa som utvalda hashtaggar?", + "featured_tags.suggestions.add": "Lägg till", + "featured_tags.suggestions.added": "Hantera dina utvalda hashtaggar när som helst under Redigera profil > Utvalda hashtaggar.", + "featured_tags.suggestions.dismiss": "Nej tack", "filter_modal.added.context_mismatch_explanation": "Denna filterkategori gäller inte för det sammanhang där du har tillgång till det här inlägget. Om du vill att inlägget ska filtreras även i detta sammanhang måste du redigera filtret.", "filter_modal.added.context_mismatch_title": "Misspassning av sammanhang!", "filter_modal.added.expired_explanation": "Denna filterkategori har utgått, du måste ändra utgångsdatum för att den ska kunna tillämpas.", diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json index 81140ef57d..9f93fbf24b 100644 --- a/app/javascript/mastodon/locales/tr.json +++ b/app/javascript/mastodon/locales/tr.json @@ -349,6 +349,8 @@ "collections.accounts.empty_description": "Takip ettiğiniz hesapların sayısını {count} kadar artırın", "collections.accounts.empty_title": "Bu koleksiyon boş", "collections.collection_description": "Açıklama", + "collections.collection_language": "Dil", + "collections.collection_language_none": "Hiçbiri", "collections.collection_name": "Ad", "collections.collection_topic": "Konu", "collections.confirm_account_removal": "Bu hesabı bu koleksiyondan çıkarmak istediğinizden emin misiniz?", @@ -626,6 +628,10 @@ "featured_carousel.header": "{count, plural, one {{counter} Sabitlenmiş Gönderi} other {{counter} Sabitlenmiş Gönderi}}", "featured_carousel.slide": "Gönderi {current, number} / {max, number}", "featured_tags.more_items": "+{count}", + "featured_tags.suggestions": "Son zamanlarda {items} hakkında gönderileriniz var. Bunlar öne çıkan etiketler olarak eklensin mi?", + "featured_tags.suggestions.add": "Ekle", + "featured_tags.suggestions.added": "Öne çıkan etiketlerinizi istediğiniz zaman Profil Düzenle > Öne çıkan etiketler bölümünden yönetebilirsiniz.", + "featured_tags.suggestions.dismiss": "Hayır teşekkürler", "filter_modal.added.context_mismatch_explanation": "Bu süzgeç kategorisi, bu gönderide eriştiğin bağlama uymuyor. Eğer gönderinin bu bağlamda da filtrelenmesini istiyorsanız, süzgeci düzenlemeniz gerekiyor.", "filter_modal.added.context_mismatch_title": "Bağlam uyumsuzluğu!", "filter_modal.added.expired_explanation": "Bu süzgeç kategorisinin süresi dolmuş, süzgeci uygulamak için bitiş tarihini değiştirmeniz gerekiyor.", diff --git a/app/javascript/mastodon/locales/vi.json b/app/javascript/mastodon/locales/vi.json index 186da4c87f..bbaae71d13 100644 --- a/app/javascript/mastodon/locales/vi.json +++ b/app/javascript/mastodon/locales/vi.json @@ -349,6 +349,8 @@ "collections.accounts.empty_description": "Thêm tối đa {count} tài khoản mà bạn theo dõi", "collections.accounts.empty_title": "Gói khởi đầu này trống", "collections.collection_description": "Mô tả", + "collections.collection_language": "Ngôn ngữ", + "collections.collection_language_none": "Không", "collections.collection_name": "Tên", "collections.collection_topic": "Chủ đề", "collections.confirm_account_removal": "Bạn có chắc muốn gỡ tài khoản này khỏi gói khởi đầu?", @@ -626,6 +628,10 @@ "featured_carousel.header": "{count, plural, other {Tút đã ghim}}", "featured_carousel.slide": "Tút {current, number} trong {max, number}", "featured_tags.more_items": "+{count}", + "featured_tags.suggestions": "Gần đây bạn đã đăng về {items}. Thêm cái này vào hashtag thường dùng?", + "featured_tags.suggestions.add": "Thêm", + "featured_tags.suggestions.added": "Quản lý hashtag bạn thường dùng vào bất cứ lúc nào tại Sửa hồ sơ > Hashtag thường dùng.", + "featured_tags.suggestions.dismiss": "Không, cảm ơn", "filter_modal.added.context_mismatch_explanation": "Danh mục bộ lọc này không áp dụng cho ngữ cảnh mà bạn đã truy cập tút này. Nếu bạn muốn tút cũng được lọc trong ngữ cảnh này, bạn sẽ phải chỉnh sửa bộ lọc.", "filter_modal.added.context_mismatch_title": "Bối cảnh không phù hợp!", "filter_modal.added.expired_explanation": "Danh mục bộ lọc này đã hết hạn, bạn sẽ cần thay đổi ngày hết hạn để áp dụng.", diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json index c4c162124b..c49c882c29 100644 --- a/app/javascript/mastodon/locales/zh-CN.json +++ b/app/javascript/mastodon/locales/zh-CN.json @@ -349,6 +349,8 @@ "collections.accounts.empty_description": "添加你关注的账号,最多 {count} 个", "collections.accounts.empty_title": "收藏列表为空", "collections.collection_description": "说明", + "collections.collection_language": "语言", + "collections.collection_language_none": "无", "collections.collection_name": "名称", "collections.collection_topic": "话题", "collections.confirm_account_removal": "你确定要将从收藏列表中移除此账号吗?", @@ -626,6 +628,10 @@ "featured_carousel.header": "{count, plural, other {# 条置顶嘟文}}", "featured_carousel.slide": "第 {current, number} 条嘟文,共 {max, number} 条", "featured_tags.more_items": "+{count}", + "featured_tags.suggestions": "你最近发布了有关{items}的内容。要将这些添加为精选的话题标签吗?", + "featured_tags.suggestions.add": "添加", + "featured_tags.suggestions.added": "你可以在修改个人资料 > 精选的话题标签下随时管理你精选的话题标签。", + "featured_tags.suggestions.dismiss": "不了,谢谢", "filter_modal.added.context_mismatch_explanation": "这条过滤规则不适用于你当前访问此嘟文的场景。要在此场景下过滤嘟文,你必须编辑此过滤规则。", "filter_modal.added.context_mismatch_title": "场景不匹配!", "filter_modal.added.expired_explanation": "此过滤规则类别已过期,你需要修改到期日期才能应用。", diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json index eb1dd18fe8..06fabfced7 100644 --- a/app/javascript/mastodon/locales/zh-TW.json +++ b/app/javascript/mastodon/locales/zh-TW.json @@ -349,6 +349,8 @@ "collections.accounts.empty_description": "加入最多 {count} 個您跟隨之帳號", "collections.accounts.empty_title": "此收藏名單是空的", "collections.collection_description": "說明", + "collections.collection_language": "語言", + "collections.collection_language_none": "無", "collections.collection_name": "名稱", "collections.collection_topic": "主題", "collections.confirm_account_removal": "您是否確定要自此收藏名單中移除此帳號?", @@ -626,6 +628,10 @@ "featured_carousel.header": "{count, plural, other {# 則釘選嘟文}}", "featured_carousel.slide": "{max, number} 則嘟文中之第 {current, number} 則", "featured_tags.more_items": "+{count}", + "featured_tags.suggestions": "最近您曾發有關 {items} 之嘟文。是否新增其為推薦主題標籤?", + "featured_tags.suggestions.add": "新增", + "featured_tags.suggestions.added": "於 編輯個人檔案 > 推薦主題標籤 隨時管理您的推薦主題標籤。", + "featured_tags.suggestions.dismiss": "不需要,謝謝", "filter_modal.added.context_mismatch_explanation": "此過濾器類別不是用您所存取嘟文的情境。若您想要此嘟文被於此情境被過濾,您必須編輯過濾器。", "filter_modal.added.context_mismatch_title": "不符合情境!", "filter_modal.added.expired_explanation": "此過濾器類別已失效,您需要更新過期日期以套用。", diff --git a/app/javascript/mastodon/reducers/slices/profile_edit.ts b/app/javascript/mastodon/reducers/slices/profile_edit.ts index 9148a55f5f..2437352fbd 100644 --- a/app/javascript/mastodon/reducers/slices/profile_edit.ts +++ b/app/javascript/mastodon/reducers/slices/profile_edit.ts @@ -104,24 +104,24 @@ const profileEditSlice = createSlice({ state.isPending = false; }); - builder.addCase(addFeaturedTag.pending, (state) => { + builder.addCase(addFeaturedTags.pending, (state) => { state.isPending = true; }); - builder.addCase(addFeaturedTag.rejected, (state) => { + builder.addCase(addFeaturedTags.rejected, (state) => { state.isPending = false; }); - builder.addCase(addFeaturedTag.fulfilled, (state, action) => { + builder.addCase(addFeaturedTags.fulfilled, (state, action) => { if (!state.profile) { return; } state.profile.featuredTags = [ ...state.profile.featuredTags, - transformTag(action.payload), + ...action.payload.map(transformTag), ].toSorted((a, b) => a.name.localeCompare(b.name)); if (state.tagSuggestions) { state.tagSuggestions = state.tagSuggestions.filter( - (tag) => tag.name !== action.meta.arg.name, + (tag) => !action.meta.arg.names.includes(tag.name), ); } state.isPending = false; @@ -350,20 +350,11 @@ export const fetchSuggestedTags = createDataLoadingThunk( { useLoadingBar: false }, ); -export const addFeaturedTag = createDataLoadingThunk( +export const addFeaturedTags = createDataLoadingThunk( `${profileEditSlice.name}/addFeaturedTag`, - ({ name }: { name: string }) => apiPostFeaturedTag(name), - { - condition(arg, { getState }) { - const state = getState(); - return ( - !!state.profileEdit.profile && - !state.profileEdit.profile.featuredTags.some( - (tag) => tag.name === arg.name, - ) - ); - }, - }, + ({ names }: { names: string[] }) => + Promise.all(names.map((n) => apiPostFeaturedTag(n))), + { useLoadingBar: false }, ); export const deleteFeaturedTag = createDataLoadingThunk( diff --git a/app/javascript/testing/api.ts b/app/javascript/testing/api.ts index 096d2ce30e..ad980a8da9 100644 --- a/app/javascript/testing/api.ts +++ b/app/javascript/testing/api.ts @@ -51,13 +51,17 @@ export const mockHandlers = { '/packs-dev/emoji/:locale.json', async ({ params }) => { const locale = toSupportedLocale(params.locale); + const key = `../../../../../node_modules/emojibase-data/${locale}/compact.json`; + const emojiModules = import.meta.glob( + '../../../../../node_modules/emojibase-data/**/compact.json', + { import: 'default' }, + ); + const path = emojiModules[key]; + if (!path) { + throw new Error(`Unsupported locale: ${locale}`); + } action('fetching emoji data')(locale); - const { default: data } = (await import( - /* @vite-ignore */ - `emojibase-data/${locale}/compact.json` - )) as { - default: CompactEmoji[]; - }; + const data = await path(); return HttpResponse.json([data]); }, diff --git a/app/lib/activitypub/activity/create.rb b/app/lib/activitypub/activity/create.rb index 054e712fa8..1a180eea0f 100644 --- a/app/lib/activitypub/activity/create.rb +++ b/app/lib/activitypub/activity/create.rb @@ -42,6 +42,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity def process_status @tags = [] @mentions = [] + @tagged_objects = [] @unresolved_mentions = [] @silenced_account_ids = [] @params = {} @@ -56,6 +57,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity ApplicationRecord.transaction do @status = Status.create!(@params.merge(quote: @quote)) attach_tags(@status) + attach_tagged_objects(@status) attach_mentions(@status) attach_counts(@status) end @@ -181,6 +183,13 @@ class ActivityPub::Activity::Create < ActivityPub::Activity end end + def attach_tagged_objects(status) + @tagged_objects.each do |tagged_object| + tagged_object.status = status + tagged_object.save + end + end + def attach_mentions(status) @mentions.each do |mention| mention.status = status @@ -210,6 +219,8 @@ class ActivityPub::Activity::Create < ActivityPub::Activity process_mention tag elsif equals_or_includes?(tag['type'], 'Emoji') process_emoji tag + elsif equals_or_includes?(tag['type'], 'FeaturedCollection') + process_tagged_collection tag end end end @@ -266,6 +277,15 @@ class ActivityPub::Activity::Create < ActivityPub::Activity end end + def process_tagged_collection(tag) + return if tag['id'].blank? + + # TODO: We probably want to resolve unknown objects and push them to an `@unresolved_tagged_objects` on failure + collection = ActivityPub::TagManager.instance.uri_to_resource(tag['id'], Collection) + + @tagged_objects << TaggedObject.new(uri: ActivityPub::TagManager.instance.uri_for(collection), object: collection, ap_type: 'FeaturedCollection') if collection.present? + end + def process_attachments return [] if @object['attachment'].nil? diff --git a/app/lib/activitypub/activity/update.rb b/app/lib/activitypub/activity/update.rb index e22bea2c64..b40e8f381b 100644 --- a/app/lib/activitypub/activity/update.rb +++ b/app/lib/activitypub/activity/update.rb @@ -13,6 +13,8 @@ class ActivityPub::Activity::Update < ActivityPub::Activity update_account elsif supported_object_type? || converted_object_type? update_status + elsif equals_or_includes_any?(@object['type'], ['FeaturedCollection']) && Mastodon::Feature.collections_federation_enabled? + update_collection end end @@ -41,6 +43,12 @@ class ActivityPub::Activity::Update < ActivityPub::Activity ActivityPub::ProcessStatusUpdateService.new.call(@status, @json, @object, request_id: @options[:request_id]) end + def update_collection + return reject_payload! if non_matching_uri_hosts?(@account.uri, object_uri) + + ActivityPub::ProcessFeaturedCollectionService.new.call(@account, @object) + end + def object_too_old? @object['published'].present? && @object['published'].to_datetime < OBJECT_AGE_THRESHOLD.ago rescue Date::Error diff --git a/app/lib/activitypub/parser/media_attachment_parser.rb b/app/lib/activitypub/parser/media_attachment_parser.rb index 1f4f43cb15..2212c24c45 100644 --- a/app/lib/activitypub/parser/media_attachment_parser.rb +++ b/app/lib/activitypub/parser/media_attachment_parser.rb @@ -30,7 +30,7 @@ class ActivityPub::Parser::MediaAttachmentParser def description str = @json['summary'].presence || @json['name'].presence - str = str.strip[0...MediaAttachment::MAX_DESCRIPTION_LENGTH] if str.present? + str = str.strip[0...MediaAttachment::MAX_DESCRIPTION_HARD_LENGTH_LIMIT] if str.present? str end diff --git a/app/lib/activitypub/tag_manager.rb b/app/lib/activitypub/tag_manager.rb index be9003082d..9036811217 100644 --- a/app/lib/activitypub/tag_manager.rb +++ b/app/lib/activitypub/tag_manager.rb @@ -262,6 +262,14 @@ class ActivityPub::TagManager uri_to_resource(uri, Account) end + def uri_to_local_collection(uri) + path_params = Rails.application.routes.recognize_path(uri) + return unless path_params[:controller] == 'collections' + + # TODO: check account, but this requires handling potentially two different schemes + Collection.find_by(id: path_params[:id]) + end + def uri_to_local_conversation(uri) path_params = Rails.application.routes.recognize_path(uri) return unless path_params[:controller] == 'activitypub/contexts' @@ -279,6 +287,8 @@ class ActivityPub::TagManager uris_to_local_accounts([uri]).first when 'Conversation' uri_to_local_conversation(uri) + when 'Collection' + uri_to_local_collection(uri) else StatusFinder.new(uri).status end diff --git a/app/models/concerns/account/avatar.rb b/app/models/concerns/account/avatar.rb index 945ba3592c..1b561fc770 100644 --- a/app/models/concerns/account/avatar.rb +++ b/app/models/concerns/account/avatar.rb @@ -25,7 +25,7 @@ module Account::Avatar validates_attachment_size :avatar, less_than: AVATAR_LIMIT remotable_attachment :avatar, AVATAR_LIMIT, suppress_errors: false - validates :avatar_description, length: { maximum: MediaAttachment::MAX_DESCRIPTION_LENGTH } + validates :avatar_description, length: { maximum: MediaAttachment::MAX_DESCRIPTION_LENGTH }, if: -> { local? && will_save_change_to_avatar_description? } end def avatar_original_url diff --git a/app/models/concerns/account/header.rb b/app/models/concerns/account/header.rb index 1b70715a9e..75d3c04542 100644 --- a/app/models/concerns/account/header.rb +++ b/app/models/concerns/account/header.rb @@ -26,7 +26,7 @@ module Account::Header validates_attachment_size :header, less_than: HEADER_LIMIT remotable_attachment :header, HEADER_LIMIT, suppress_errors: false - validates :header_description, length: { maximum: MediaAttachment::MAX_DESCRIPTION_LENGTH } + validates :header_description, length: { maximum: MediaAttachment::MAX_DESCRIPTION_LENGTH }, if: -> { local? && will_save_change_to_header_description? } end def header_original_url diff --git a/app/models/concerns/account/interactions.rb b/app/models/concerns/account/interactions.rb index 7020491f42..308bd4c9a7 100644 --- a/app/models/concerns/account/interactions.rb +++ b/app/models/concerns/account/interactions.rb @@ -231,7 +231,7 @@ module Account::Interactions Rails.cache.fetch("followers_hash:#{id}:#{url_prefix}/") do digest = "\x00" * 32 - followers.where(Account.arel_table[:uri].matches("#{Account.sanitize_sql_like(url_prefix)}/%", false, true)).or(followers.where(uri: url_prefix)).pluck_each(:uri) do |uri| + followers.matches_uri_prefix(url_prefix).pluck_each(:uri) do |uri| Xorcist.xor!(digest, Digest::SHA256.digest(uri)) end digest.unpack1('H*') diff --git a/app/models/media_attachment.rb b/app/models/media_attachment.rb index 7fdeda15aa..bf4b23558d 100644 --- a/app/models/media_attachment.rb +++ b/app/models/media_attachment.rb @@ -39,6 +39,7 @@ class MediaAttachment < ApplicationRecord enum :processing, { queued: 0, in_progress: 1, complete: 2, failed: 3 }, prefix: true MAX_DESCRIPTION_LENGTH = 1_500 + MAX_DESCRIPTION_HARD_LENGTH_LIMIT = 10_000 IMAGE_LIMIT = (ENV['MAX_IMAGE_SIZE'] || 16.megabytes).to_i VIDEO_LIMIT = (ENV['MAX_VIDEO_SIZE'] || 99.megabytes).to_i diff --git a/app/models/status.rb b/app/models/status.rb index f0fe27c2e6..57ff46c87a 100644 --- a/app/models/status.rb +++ b/app/models/status.rb @@ -47,6 +47,20 @@ class Status < ApplicationRecord include Status::Visibility include Status::InteractionPolicyConcern + CACHEABLE_ASSOCIATIONS = [ + :application, + :conversation, + :media_attachments, + :preloadable_poll, + :status_stat, + :tags, + account: [:account_stat, user: :role], + active_mentions: :account, + tagged_objects: :object, + preview_cards_status: { preview_card: { author_account: [:account_stat, user: :role] } }, + quote: { status: { account: [:account_stat, user: :role] } }, + ].freeze + MEDIA_ATTACHMENTS_LIMIT = 4 rate_limit by: :account, family: :statuses @@ -82,6 +96,7 @@ class Status < ApplicationRecord has_many :mentions, dependent: :destroy, inverse_of: :status has_many :mentioned_accounts, through: :mentions, source: :account, class_name: 'Account' has_many :media_attachments, dependent: :nullify + has_many :tagged_objects, dependent: :destroy has_many :quotes, foreign_key: 'quoted_status_id', inverse_of: :quoted_status, dependent: :nullify # The `dependent` option is enabled by the initial `mentions` association declaration @@ -169,29 +184,11 @@ class Status < ApplicationRecord # the `dependent: destroy` callbacks remove relevant records before_destroy :unlink_from_conversations!, prepend: true - cache_associated :application, - :media_attachments, - :conversation, - :status_stat, - :tags, - :preloadable_poll, - quote: { status: { account: [:account_stat, user: :role] } }, - preview_cards_status: { preview_card: { author_account: [:account_stat, user: :role] } }, - account: [:account_stat, user: :role], - active_mentions: :account, - reblog: [ - :application, - :media_attachments, - :conversation, - :status_stat, - :tags, - :preloadable_poll, - quote: { status: { account: [:account_stat, user: :role] } }, - preview_cards_status: { preview_card: { author_account: [:account_stat, user: :role] } }, - account: [:account_stat, user: :role], - active_mentions: :account, - ], - thread: :account + cache_associated( + *CACHEABLE_ASSOCIATIONS, + reblog: [*CACHEABLE_ASSOCIATIONS], + thread: :account + ) delegate :domain, :indexable?, to: :account, prefix: true diff --git a/app/models/tagged_object.rb b/app/models/tagged_object.rb new file mode 100644 index 0000000000..7f4b83f431 --- /dev/null +++ b/app/models/tagged_object.rb @@ -0,0 +1,19 @@ +# frozen_string_literal: true + +# == Schema Information +# +# Table name: tagged_objects +# +# id :bigint(8) not null, primary key +# ap_type :string not null +# object_type :string +# uri :string +# created_at :datetime not null +# updated_at :datetime not null +# object_id :bigint(8) +# status_id :bigint(8) not null +# +class TaggedObject < ApplicationRecord + belongs_to :status, inverse_of: :tagged_objects + belongs_to :object, polymorphic: true, optional: true +end diff --git a/app/serializers/activitypub/actor_serializer.rb b/app/serializers/activitypub/actor_serializer.rb index ff1a70104b..9b78412887 100644 --- a/app/serializers/activitypub/actor_serializer.rb +++ b/app/serializers/activitypub/actor_serializer.rb @@ -8,7 +8,7 @@ class ActivityPub::ActorSerializer < ActivityPub::Serializer context_extensions :manually_approves_followers, :featured, :also_known_as, :moved_to, :property_value, :discoverable, :suspended, - :memorial, :indexable, :attribution_domains + :memorial, :indexable, :attribution_domains, :profile_settings context_extensions :interaction_policies if Mastodon::Feature.collections_enabled? @@ -16,7 +16,10 @@ class ActivityPub::ActorSerializer < ActivityPub::Serializer :inbox, :outbox, :featured, :featured_tags, :preferred_username, :name, :summary, :url, :manually_approves_followers, - :discoverable, :indexable, :published, :memorial + :discoverable, :indexable, :published, :memorial, + :show_featured, :show_media + + attribute :show_media_replies, key: :show_replies_in_media attribute :interaction_policy, if: -> { Mastodon::Feature.collections_enabled? } attribute :featured_collections, if: -> { Mastodon::Feature.collections_enabled? } diff --git a/app/serializers/activitypub/note_serializer.rb b/app/serializers/activitypub/note_serializer.rb index 76467392ec..82dc2e9d1d 100644 --- a/app/serializers/activitypub/note_serializer.rb +++ b/app/serializers/activitypub/note_serializer.rb @@ -151,7 +151,7 @@ class ActivityPub::NoteSerializer < ActivityPub::Serializer end def virtual_tags - object.active_mentions.to_a.sort_by(&:id) + object.tags + object.emojis + object.active_mentions.to_a.sort_by(&:id) + object.tags + object.emojis + object.tagged_objects.map(&:object) end def atom_uri @@ -361,8 +361,9 @@ class ActivityPub::NoteSerializer < ActivityPub::Serializer end end - class CustomEmojiSerializer < ActivityPub::EmojiSerializer - end + class CustomEmojiSerializer < ActivityPub::EmojiSerializer; end + + class CollectionSerializer < ActivityPub::FeaturedCollectionSerializer; end class OptionSerializer < ActivityPub::Serializer class RepliesSerializer < ActivityPub::Serializer diff --git a/app/serializers/rest/collection_serializer.rb b/app/serializers/rest/collection_serializer.rb index ac7c8ad026..c3f2b55a84 100644 --- a/app/serializers/rest/collection_serializer.rb +++ b/app/serializers/rest/collection_serializer.rb @@ -5,7 +5,7 @@ class REST::CollectionSerializer < ActiveModel::Serializer :local, :sensitive, :discoverable, :item_count, :created_at, :updated_at - belongs_to :tag, serializer: REST::StatusSerializer::TagSerializer + belongs_to :tag, serializer: REST::ShallowTagSerializer has_many :items, serializer: REST::CollectionItemSerializer diff --git a/app/serializers/rest/shallow_tag_serializer.rb b/app/serializers/rest/shallow_tag_serializer.rb new file mode 100644 index 0000000000..cdf2a3e1f9 --- /dev/null +++ b/app/serializers/rest/shallow_tag_serializer.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +class REST::ShallowTagSerializer < ActiveModel::Serializer + include RoutingHelper + + attributes :name, :url + + def url + tag_url(object) + end +end diff --git a/app/serializers/rest/status_serializer.rb b/app/serializers/rest/status_serializer.rb index 505c7f8f23..14e1227d80 100644 --- a/app/serializers/rest/status_serializer.rb +++ b/app/serializers/rest/status_serializer.rb @@ -30,6 +30,7 @@ class REST::StatusSerializer < ActiveModel::Serializer has_many :ordered_mentions, key: :mentions has_many :tags has_many :emojis, serializer: REST::CustomEmojiSerializer + has_many :tagged_collections, serializer: REST::CollectionSerializer # Due to a ActiveModel::Serializer quirk, if you change any of the following, have a look at # updating `app/serializers/rest/shallow_status_serializer.rb` as well @@ -170,6 +171,10 @@ class REST::StatusSerializer < ActiveModel::Serializer object.active_mentions.to_a.sort_by(&:id) end + def tagged_collections + object.tagged_objects.filter_map { |tagged_object| tagged_object.object if tagged_object.ap_type == 'FeaturedCollection' } + end + def quote_approval { automatic: object.proper.quote_policy_as_keys(:automatic), @@ -212,13 +217,5 @@ class REST::StatusSerializer < ActiveModel::Serializer end end - class TagSerializer < ActiveModel::Serializer - include RoutingHelper - - attributes :name, :url - - def url - tag_url(object) - end - end + class TagSerializer < REST::ShallowTagSerializer; end end diff --git a/app/services/activitypub/process_account_service.rb b/app/services/activitypub/process_account_service.rb index dd0eeadaa0..ad59f0b46b 100644 --- a/app/services/activitypub/process_account_service.rb +++ b/app/services/activitypub/process_account_service.rb @@ -135,6 +135,9 @@ class ActivityPub::ProcessAccountService < BaseService @account.discoverable = @json['discoverable'] || false @account.indexable = @json['indexable'] || false @account.memorial = @json['memorial'] || false + @account.show_featured = @json['showFeatured'] if @json.key?('showFeatured') + @account.show_media = @json['showMedia'] if @json.key?('showMedia') + @account.show_media_replies = @json['showRepliesInMedia'] if @json.key?('showRepliesInMedia') @account.attribution_domains = as_array(@json['attributionDomains'] || []).take(Account::ATTRIBUTION_DOMAINS_HARD_LIMIT).map { |item| value_or_id(item) } end @@ -238,7 +241,7 @@ class ActivityPub::ProcessAccountService < BaseService url = first_of_value(value['url']) url = url['href'] if url.is_a?(Hash) description = value['summary'].presence || value['name'].presence - description = description.strip[0...MediaAttachment::MAX_DESCRIPTION_LENGTH] if description.present? + description = description.strip[0...MediaAttachment::MAX_DESCRIPTION_HARD_LENGTH_LIMIT] if description.present? else url = value end diff --git a/app/services/activitypub/process_featured_collection_service.rb b/app/services/activitypub/process_featured_collection_service.rb index 91c15bdce2..2ef555e6bc 100644 --- a/app/services/activitypub/process_featured_collection_service.rb +++ b/app/services/activitypub/process_featured_collection_service.rb @@ -14,21 +14,22 @@ class ActivityPub::ProcessFeaturedCollectionService return if non_matching_uri_hosts?(@account.uri, @json['id']) with_redis_lock("collection:#{@json['id']}") do - return if @account.collections.exists?(uri: @json['id']) + Collection.transaction do + @collection = @account.collections.find_or_initialize_by(uri: @json['id']) - @collection = @account.collections.create!( - local: false, - uri: @json['id'], - name: (@json['name'] || '')[0, Collection::NAME_LENGTH_HARD_LIMIT], - description_html: truncated_summary, - language:, - sensitive: @json['sensitive'], - discoverable: @json['discoverable'], - original_number_of_items: @json['totalItems'] || 0, - tag_name: @json.dig('topic', 'name') - ) + @collection.update!( + local: false, + name: (@json['name'] || '')[0, Collection::NAME_LENGTH_HARD_LIMIT], + description_html: truncated_summary, + language:, + sensitive: @json['sensitive'], + discoverable: @json['discoverable'], + original_number_of_items: @json['totalItems'] || 0, + tag_name: @json.dig('topic', 'name') + ) - process_items! if @json['totalItems'].positive? + process_items! + end @collection end @@ -46,8 +47,13 @@ class ActivityPub::ProcessFeaturedCollectionService end def process_items! - @json['orderedItems'].take(ITEMS_LIMIT).each do |item_json| - ActivityPub::ProcessFeaturedItemWorker.perform_async(@collection.id, item_json, @request_id) + uris = [] + items = @json['orderedItems'] || [] + items.take(ITEMS_LIMIT).each_with_index do |item_json, index| + uris << value_or_id(item_json) + ActivityPub::ProcessFeaturedItemWorker.perform_async(@collection.id, item_json, index, @request_id) end + uris.compact! + @collection.collection_items.where.not(uri: uris).delete_all end end diff --git a/app/services/activitypub/process_featured_item_service.rb b/app/services/activitypub/process_featured_item_service.rb index c0d2bfd206..961de802c9 100644 --- a/app/services/activitypub/process_featured_item_service.rb +++ b/app/services/activitypub/process_featured_item_service.rb @@ -5,29 +5,24 @@ class ActivityPub::ProcessFeaturedItemService include Lockable include Redisable - def call(collection, uri_or_object, request_id: nil) + def call(collection, uri_or_object, position: nil, request_id: nil) + @collection = collection @request_id = request_id - item_json = uri_or_object.is_a?(String) ? fetch_resource(uri_or_object, true) : uri_or_object - return if non_matching_uri_hosts?(collection.uri, item_json['id']) + @item_json = uri_or_object.is_a?(String) ? fetch_resource(uri_or_object, true) : uri_or_object + return if non_matching_uri_hosts?(@collection.uri, @item_json['id']) - with_redis_lock("collection_item:#{item_json['id']}") do - return if collection.collection_items.exists?(uri: item_json['id']) + with_redis_lock("collection_item:#{@item_json['id']}") do + @collection_item = existing_item || pre_approved_item || new_item - local_account = ActivityPub::TagManager.instance.uris_to_local_accounts([item_json['featuredObject']]).first + @collection_item.update!( + uri: @item_json['id'], + object_uri: value_or_id(@item_json['featuredObject']), + position: + ) - if local_account.present? - # This is a local account that has authorized this item already - @collection_item = collection.collection_items.accepted_partial(local_account).first - @collection_item&.update!(uri: item_json['id']) - else - @collection_item = collection.collection_items.create!( - uri: item_json['id'], - object_uri: item_json['featuredObject'] - ) - @approval_uri = item_json['featureAuthorization'] + @approval_uri = @item_json['featureAuthorization'] - verify_authorization! - end + verify_authorization! unless @collection_item&.account&.local? @collection_item end @@ -35,6 +30,20 @@ class ActivityPub::ProcessFeaturedItemService private + def existing_item + @collection.collection_items.find_by(uri: @item_json['id']) + end + + def pre_approved_item + # This is a local account that has authorized this item already + local_account = ActivityPub::TagManager.instance.uris_to_local_accounts([@item_json['featuredObject']]).first + @collection.collection_items.accepted_partial(local_account).first if local_account.present? + end + + def new_item + @collection.collection_items.new + end + def verify_authorization! ActivityPub::VerifyFeaturedItemService.new.call(@collection_item, @approval_uri, request_id: @request_id) rescue Mastodon::RecursionLimitExceededError, Mastodon::UnexpectedResponseError, *Mastodon::HTTP_CONNECTION_ERRORS diff --git a/app/services/activitypub/process_status_update_service.rb b/app/services/activitypub/process_status_update_service.rb index ce47003441..2875686177 100644 --- a/app/services/activitypub/process_status_update_service.rb +++ b/app/services/activitypub/process_status_update_service.rb @@ -182,9 +182,10 @@ class ActivityPub::ProcessStatusUpdateService < BaseService end def update_metadata! - @raw_tags = [] + @raw_tags = [] @raw_mentions = [] - @raw_emojis = [] + @raw_tagged_objects = [] + @raw_emojis = [] as_array(@json['tag']).each do |tag| if equals_or_includes?(tag['type'], 'Hashtag') @@ -193,10 +194,13 @@ class ActivityPub::ProcessStatusUpdateService < BaseService @raw_mentions << tag['href'] if tag['href'].present? elsif equals_or_includes?(tag['type'], 'Emoji') @raw_emojis << tag + elsif equals_or_includes?(tag['type'], 'FeaturedCollection') + @raw_tagged_objects << tag if tag['id'] end end update_tags! + update_tagged_objects! update_mentions! update_emojis! update_quote! @@ -229,6 +233,24 @@ class ActivityPub::ProcessStatusUpdateService < BaseService end end + def update_tagged_objects! + current_tagged_objects = @raw_tagged_objects.filter_map do |tagged_object| + url = tagged_object['id'] + + # TODO: We probably want to resolve unknown objects at authoring time + ActivityPub::TagManager.instance.uri_to_resource(url, Collection) + end + + # Any previously-unresolved URI would be resolved here + @status.tagged_objects.upsert_all( + current_tagged_objects.uniq.map { |object| { object_type: object.class.name, object_id: object.id, uri: ActivityPub::TagManager.instance.uri_for(object), ap_type: 'FeaturedCollection' } }, + unique_by: %w(status_id uri) + ) + + # Remove unused links + @status.tagged_objects.where.not(uri: current_tagged_objects.map { |object| ActivityPub::TagManager.instance.uri_for(object) }).delete_all + end + def update_mentions! unresolved_mentions = [] diff --git a/app/services/post_status_service.rb b/app/services/post_status_service.rb index 0b6158b87b..2018544b28 100644 --- a/app/services/post_status_service.rb +++ b/app/services/post_status_service.rb @@ -93,9 +93,10 @@ class PostStatusService < BaseService def process_status! @status = @account.statuses.new(status_attributes) - process_mentions_service.call(@status, save_records: false) + process_mentions_service.call(@status) safeguard_mentions!(@status) safeguard_private_mention_quote!(@status) + attach_tagged_objects!(@status) attach_quote!(@status) antispam = Antispam.new(@status) @@ -127,6 +128,10 @@ class PostStatusService < BaseService status.quote.accept! if @quoted_status.local? && StatusPolicy.new(@status.account, @quoted_status).quote? end + def attach_tagged_objects!(status) + ProcessLinksService.new.call(status) + end + def safeguard_mentions!(status) return if @options[:allowed_mentions].nil? diff --git a/app/services/process_links_service.rb b/app/services/process_links_service.rb new file mode 100644 index 0000000000..e7dfb64c8e --- /dev/null +++ b/app/services/process_links_service.rb @@ -0,0 +1,53 @@ +# frozen_string_literal: true + +class ProcessLinksService < BaseService + include Payloadable + + # Scan status for links to ActivityPub objects and attach them to statuses + # @param [Status] status + def call(status) + return unless status.local? + + @status = status + @previous_objects = @status.tagged_objects.includes(:object).to_a + @current_objects = [] + + Status.transaction do + scan_text! + assign_tagged_objects! + end + end + + private + + def scan_text! + urls = @status.text.scan(FetchLinkCardService::URL_PATTERN).map { |array| Addressable::URI.parse(array[1]).normalize } + + urls.each do |url| + # We only support `FeaturedCollection` at this time + + # TODO: We probably want to resolve unknown objects at authoring time + object = ActivityPub::TagManager.instance.uri_to_resource(url.to_s, Collection) + next if object.nil? + + tagged_object = @previous_objects.find { |x| x.object == object || x.uri == url } + tagged_object ||= @current_objects.find { |x| x.object == object || x.uri == url } + tagged_object ||= @status.tagged_objects.new(object: object, ap_type: 'FeaturedCollection', uri: ActivityPub::TagManager.instance.uri_for(object)) + + @current_objects << tagged_object + end + end + + def assign_tagged_objects! + return unless @status.persisted? + + @current_objects.each do |object| + object.save if object.new_record? + end + + # If previous objects are no longer contained in the text, remove them to lighten the database + removed_objects = @previous_objects - @current_objects + + TaggedObject.where(id: removed_objects.map(&:id)).delete_all unless removed_objects.empty? + end +end diff --git a/app/services/process_mentions_service.rb b/app/services/process_mentions_service.rb index c2c33689ea..5ea38b7533 100644 --- a/app/services/process_mentions_service.rb +++ b/app/services/process_mentions_service.rb @@ -6,10 +6,8 @@ class ProcessMentionsService < BaseService # Scan status for mentions and fetch remote mentioned users, # and create local mention pointers # @param [Status] status - # @param [Boolean] save_records Whether to save records in database - def call(status, save_records: true) + def call(status) @status = status - @save_records = save_records return unless @status.local? @@ -64,7 +62,7 @@ class ProcessMentionsService < BaseService "@#{mentioned_account.acct}" end - @status.save! if @save_records + @status.save! if @status.persisted? end def assign_mentions! @@ -79,8 +77,10 @@ class ProcessMentionsService < BaseService dropped_mentions.each(&:destroy) end + return unless @status.persisted? + @current_mentions.each do |mention| - mention.save if (mention.new_record? || mention.silent_changed?) && @save_records + mention.save if mention.new_record? || mention.silent_changed? end # If previous mentions are no longer contained in the text, convert them diff --git a/app/services/update_status_service.rb b/app/services/update_status_service.rb index 1ebabf5fbe..0a4627bb25 100644 --- a/app/services/update_status_service.rb +++ b/app/services/update_status_service.rb @@ -136,6 +136,7 @@ class UpdateStatusService < BaseService def update_metadata! ProcessHashtagsService.new.call(@status) ProcessMentionsService.new.call(@status) + ProcessLinksService.new.call(@status) end def broadcast_updates! diff --git a/app/workers/activitypub/process_featured_item_worker.rb b/app/workers/activitypub/process_featured_item_worker.rb index f50ff50b40..b29c7d7aee 100644 --- a/app/workers/activitypub/process_featured_item_worker.rb +++ b/app/workers/activitypub/process_featured_item_worker.rb @@ -6,10 +6,10 @@ class ActivityPub::ProcessFeaturedItemWorker sidekiq_options queue: 'pull', retry: 3 - def perform(collection_id, id_or_json, request_id = nil) + def perform(collection_id, id_or_json, position = nil, request_id = nil) collection = Collection.find(collection_id) - ActivityPub::ProcessFeaturedItemService.new.call(collection, id_or_json, request_id:) + ActivityPub::ProcessFeaturedItemService.new.call(collection, id_or_json, position:, request_id:) rescue ActiveRecord::RecordNotFound true end diff --git a/app/workers/poll_expiration_notify_worker.rb b/app/workers/poll_expiration_notify_worker.rb index fe7647024e..3706ecd427 100644 --- a/app/workers/poll_expiration_notify_worker.rb +++ b/app/workers/poll_expiration_notify_worker.rb @@ -9,6 +9,7 @@ class PollExpirationNotifyWorker @poll = Poll.find(poll_id) return if missing_expiration? + requeue! && return if not_due_yet? notify_remote_voters_and_owner! if @poll.local? diff --git a/config/locales/es-MX.yml b/config/locales/es-MX.yml index 22e8afa757..44677285a7 100644 --- a/config/locales/es-MX.yml +++ b/config/locales/es-MX.yml @@ -361,7 +361,7 @@ es-MX: copy_failed_msg: No se pudo realizar una copia local de ese emoji create_new_category: Crear una nueva categoría created_msg: "¡Emoji creado con éxito!" - delete: Borrar + delete: Eliminar destroyed_msg: "¡Emojo destruido con éxito!" disable: Deshabilitar disabled: Desactivado @@ -473,7 +473,7 @@ es-MX: one: "%{count} intentos durante la última semana" other: "%{count} intentos de registro en la última semana" created_msg: Dominio de correo bloqueado con éxito - delete: Borrar + delete: Eliminar dns: types: mx: Registro MX @@ -610,7 +610,7 @@ es-MX: private_comment: Comentario privado public_comment: Comentario público purge: Purgar - purge_description_html: Si crees que este dominio está desconectado, puedes borrar todos los registros de cuentas y los datos asociados de este dominio de tu almacenamiento. Esto puede llevar un tiempo. + purge_description_html: Si crees que este dominio ya no está activo, puedes eliminar de tu almacenamiento todos los registros de la cuenta y los datos asociados a este dominio. Esto puede tardar un rato. title: Instancias conocidas total_blocked_by_us: Bloqueado por nosotros total_followed_by_them: Seguidos por ellos @@ -646,7 +646,7 @@ es-MX: title: Relaciones de %{acct} relays: add_new: Añadir nuevo relé - delete: Borrar + delete: Eliminar description_html: Un relés de federación es un servidor intermedio que intercambia grandes volúmenes de publicaciones públicas entre servidores que se suscriben y publican en él. Puede ayudar a servidores pequeños y medianos a descubrir contenido del fediverso, que de otra manera requeriría que los usuarios locales siguiesen manualmente a personas de servidores remotos. disable: Deshabilitar disabled: Deshabilitado @@ -776,7 +776,7 @@ es-MX: privileges: administrator: Administrador administrator_description: Los usuarios con este permiso saltarán todos los permisos - delete_user_data: Borrar Datos de Usuario + delete_user_data: Eliminar datos de usuario delete_user_data_description: Permite a los usuarios eliminar los datos de otros usuarios sin demora invite_bypass_approval: Invitar a usuarios sin revisión invite_bypass_approval_description: Permite que las personas invitadas al servidor por estos usuarios no tengan que pasar por el proceso de aprobación de la moderación @@ -1148,7 +1148,7 @@ es-MX: updated_msg: Regla de nombre de usuario actualizada correctamente warning_presets: add_new: Añadir nuevo - delete: Borrar + delete: Eliminar edit_preset: Editar aviso predeterminado empty: Aún no has definido ningún preajuste de advertencia. title: Preajustes de advertencia @@ -1260,7 +1260,7 @@ es-MX: registration_complete: "¡Tu registro en %{domain} ha sido completado!" welcome_title: "¡Bienvenido, %{name}!" wrong_email_hint: Si esa dirección de correo electrónico no es correcta, puedes cambiarla en la configuración de la cuenta. - delete_account: Borrar cuenta + delete_account: Eliminar cuenta delete_account_html: Si deseas eliminar tu cuenta, puedes proceder aquí. Se te pedirá una confirmación. description: prefix_invited_by_user: "¡@%{name} te invita a unirte a este servidor de Mastodon!" @@ -1457,10 +1457,10 @@ es-MX: mutes: Tienes en silencio storage: Almacenamiento featured_tags: - add_new: Añadir nuevo + add_new: Añadir nueva errors: limit: Ya has alcanzado la cantidad máxima de etiquetas - hint_html: "¿Qué son las etiquetas destacadas? Se muestran de forma prominente en tu perfil público y permiten a los usuarios navegar por tus publicaciones públicas específicamente bajo esas etiquetas. Son una gran herramienta para hacer un seguimiento de trabajos creativos o proyectos a largo plazo." + hint_html: "Destaca tus etiquetas más importantes en tu perfil. Una herramienta fantástica para llevar un registro de tus trabajos creativos y proyectos a largo plazo; las etiquetas destacadas aparecen en un lugar visible de tu perfil y te permiten acceder rápidamente a tus propias publicaciones." filters: contexts: account: Perfiles @@ -1479,7 +1479,7 @@ es-MX: invalid_context: Se suminstró un contexto inválido o vacío index: contexts: Filtros en %{contexts} - delete: Borrar + delete: Eliminar empty: No tienes filtros. expires_in: Caduca en %{distance} expires_on: Expira el %{date} @@ -1913,7 +1913,7 @@ es-MX: appearance: Apariencia authorized_apps: Aplicaciones autorizadas back: Volver al inicio - delete: Borrar cuenta + delete: Eliminar cuenta development: Desarrollo edit_profile: Editar perfil export: Exportar @@ -1991,7 +1991,7 @@ es-MX: unlisted: Pública, pero silenciosa unlisted_long: Ocultado de los resultados de búsqueda, tendencias y cronologías públicas de Mastodon statuses_cleanup: - enabled: Borrar automáticamente publicaciones antiguas + enabled: Eliminar automáticamente las publicaciones antiguas enabled_hint: Elimina automáticamente tus publicaciones una vez que alcancen un umbral de tiempo especificado, a menos que coincidan con alguna de las excepciones detalladas debajo exceptions: Excepciones explanation: La eliminación automática se realiza con baja prioridad. Puede haber un retraso entre el momento en que se alcanza el límite de antigüedad y el momento en que se elimina. diff --git a/config/locales/fi.yml b/config/locales/fi.yml index 49e6a46582..850e68c218 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -778,6 +778,7 @@ fi: administrator_description: Käyttäjät, joilla on tämä käyttöoikeus, ohittavat jokaisen käyttöoikeuden delete_user_data: Poistaa käyttäjän tiedot delete_user_data_description: Sallii käyttäjien poistaa muiden käyttäjien tiedot viipymättä + invite_bypass_approval: Kutsu käyttäjiä arvioimatta invite_users: Kutsua käyttäjiä invite_users_description: Sallii käyttäjien kutsua uusia käyttäjiä palvelimelle manage_announcements: Hallita tiedotteita diff --git a/config/locales/fr-CA.yml b/config/locales/fr-CA.yml index a1277b08ae..14e7e5a3d8 100644 --- a/config/locales/fr-CA.yml +++ b/config/locales/fr-CA.yml @@ -781,6 +781,8 @@ fr-CA: administrator_description: Les utilisateur⋅rice⋅s ayant cette autorisation pourront contourner toutes les autorisations delete_user_data: Supprimer les données de l'utilisateur⋅rice delete_user_data_description: Permet aux utilisateur⋅rice⋅s de supprimer sans délai les données des autres utilisateur⋅rice⋅s + invite_bypass_approval: Inviter des utilisateurs sans vérifications + invite_bypass_approval_description: Permet aux personnes invitées sur le serveur par ces utilisateur·rice·s de s'inscrire sans être soumises à l'approbation de la modération invite_users: Inviter des utilisateur⋅rice⋅s invite_users_description: Permet aux utilisateur⋅rice⋅s d'inviter de nouvelles personnes sur le serveur manage_announcements: Gérer les annonces diff --git a/config/locales/fr.yml b/config/locales/fr.yml index f65368ce14..3407c4515b 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -781,6 +781,8 @@ fr: administrator_description: Les utilisateur⋅rice⋅s ayant cette autorisation pourront contourner toutes les autorisations delete_user_data: Supprimer les données de l'utilisateur⋅rice delete_user_data_description: Permet aux utilisateur⋅rice⋅s de supprimer sans délai les données des autres utilisateur⋅rice⋅s + invite_bypass_approval: Inviter des utilisateurs sans vérifications + invite_bypass_approval_description: Permet aux personnes invitées sur le serveur par ces utilisateur·rice·s de s'inscrire sans être soumises à l'approbation de la modération invite_users: Inviter des utilisateur⋅rice⋅s invite_users_description: Permet aux utilisateur⋅rice⋅s d'inviter de nouvelles personnes sur le serveur manage_announcements: Gérer les annonces diff --git a/config/locales/nan-TW.yml b/config/locales/nan-TW.yml index e4fd51a2a8..dc471a9c2c 100644 --- a/config/locales/nan-TW.yml +++ b/config/locales/nan-TW.yml @@ -762,6 +762,8 @@ nan-TW: administrator_description: 有tsit ê權限ê用者ē忽略所有ê權限。 delete_user_data: Thâi掉用者ê資料 delete_user_data_description: 允准用者liâm-mi thâi掉其他用者ê資料 + invite_bypass_approval: 邀請iáu bē審查ê用者 + invite_bypass_approval_description: 允准予tsiah ê用者邀請kàu tsit臺服侍器ê lâng làng過管理審查許可 invite_users: 邀請用者 invite_users_description: 允准用者邀請新lâng來tsit ê服侍器 manage_announcements: 管理公告 @@ -1238,7 +1240,7 @@ nan-TW: welcome_title: 歡迎 %{name}! wrong_email_hint: Nā是電子phue ê地址無正確,lí ē當tī口座設定kā改。 delete_account: Thâi掉口座 - delete_account_html: Nā lí behthâi掉lí ê口座,lí ē當ji̍h tsia繼續。Lí著確認動作。 + delete_account_html: Nā lí beh thâi掉lí ê口座,lí ē當ji̍h tsia繼續。Lí著確認動作。 description: prefix_invited_by_user: "@%{name} 邀請lí加入tsit ê Mastodon 服侍器!" prefix_sign_up: Tsit-má註冊Mastodon ê口座! @@ -1258,6 +1260,7 @@ nan-TW: progress: confirm: 確認電子phue details: Lí ê詳細 + list: 註冊流程 review: Lán ê審查 rules: 接受規則 providers: @@ -1273,6 +1276,7 @@ nan-TW: invited_by: Lí通用有tuì hia收著ê邀請加入 %{domain}: preamble: Tsiah-ê hōo %{domain} ê管理員設定kap實施。 preamble_invited: 佇lí繼續進前,請思考 %{domain} ê管理員設立ê基本規則。 + read_more: 讀詳細 title: Tsi̍t-kuá基本規定。 title_invited: Lí受邀請ah。 security: 安全 @@ -1953,6 +1957,36 @@ nan-TW: keep_direct: 保留私人ê短phue keep_direct_hint: Bē thâi掉任何lí ê私人ê提起 keep_media: 保留有媒體附件ê PO文 + keep_media_hint: Bē thâi掉lí ê任何有媒體附件ê PO文 + keep_pinned: 保留所釘ê PO文 + keep_pinned_hint: Bē thâi掉任何lí所釘ê PO文 + keep_polls: 保留投票 + keep_polls_hint: Bē thâi掉任何lí ê投票 + keep_self_bookmark: 保留lí加冊籤ê PO文 + keep_self_bookmark_hint: Bē thâi掉lí家kī有加冊籤ê PO文 + keep_self_fav: 保留lí收藏ê PO文 + keep_self_fav_hint: Bē thâi掉lí家kī有收藏ê PO文 + min_age: + '1209600': 2 禮拜 + '15778476': 6 個月 + '2629746': 1 個月 + '31556952': 1 年 + '5259492': 2 個月 + '604800': 1 禮拜 + '63113904': 2 年 + '7889238': 3 個月 + min_age_label: 保持PO文ê期間 + min_favs: 保留超過下kha ê收藏數ê PO文 + min_favs_hint: 若是lí ê PO文有kàu tsit ê收藏數,就bē受thâi掉。留空白表示毋管收藏數,PO文lóng thâi掉 + min_reblogs: 保留超過下kha ê轉送數ê PO文 + min_reblogs_hint: 若是lí ê PO文有kàu tsit ê轉送數,就bē受thâi掉。留空白表示毋管轉送數,PO文lóng thâi掉 + stream_entries: + sensitive_content: 敏感ê內容 + strikes: + errors: + too_late: Lí bē赴申訴tsit ê處份ah + tags: + does_not_match_previous_name: kap進前ê名無kâng terms_of_service: title: 服務規定 themes: diff --git a/config/locales/nl.yml b/config/locales/nl.yml index 24b59990fb..69ff56febd 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -778,6 +778,8 @@ nl: administrator_description: Deze gebruikers hebben volledige rechten en kun dus overal bij delete_user_data: Gebruikersgegevens verwijderen delete_user_data_description: Staat gebruikers toe om de gegevens van andere gebruikers zonder vertraging te verwijderen + invite_bypass_approval: Gebruikers uitnodigen zonder beoordeling + invite_bypass_approval_description: Staat het toe dat mensen die door deze gebruikers voor deze server zijn uitgenodigd, niet door moderatoren beoordeeld hoeven te worden invite_users: Gebruikers uitnodigen invite_users_description: Staat gebruikers toe om nieuwe mensen voor de server uit te nodigen manage_announcements: Aankondigingen beheren @@ -1279,7 +1281,7 @@ nl: progress: confirm: E-mailadres bevestigen details: Jouw gegevens - list: Voortgang aanmelding + list: Voortgang registratie review: Onze beoordeling rules: Regels accepteren providers: @@ -1295,6 +1297,7 @@ nl: invited_by: 'Je kunt je registreren op %{domain} dankzij de uitnodiging die je hebt ontvangen van:' preamble: Deze zijn vastgesteld en worden gehandhaafd door de moderatoren van %{domain}. preamble_invited: Voordat je verder gaat, moet je eerst kennisnemen van de basisregels die door de moderatoren van %{domain} zijn vastgesteld. + read_more: Meer lezen title: Enkele basisregels. title_invited: Je bent uitgenodigd. security: Beveiliging diff --git a/config/locales/simple_form.es-MX.yml b/config/locales/simple_form.es-MX.yml index 362949480c..c110d76ee6 100644 --- a/config/locales/simple_form.es-MX.yml +++ b/config/locales/simple_form.es-MX.yml @@ -77,7 +77,7 @@ es-MX: domain: Este puede ser el nombre de dominio que se muestra en la dirección de correo o el registro MX que utiliza. Se comprobarán al registrarse. with_dns_records: Se hará un intento de resolver los registros DNS del dominio dado y los resultados serán también puestos en lista negra featured_tag: - name: 'Aquí están algunas de las etiquetas que más has usado recientemente:' + name: 'Estas son algunas de las etiquetas que más has utilizado recientemente:' filters: action: Elige qué acción realizar cuando una publicación coincida con el filtro actions: diff --git a/config/locales/tr.yml b/config/locales/tr.yml index cc3c5a730b..d58aab2664 100644 --- a/config/locales/tr.yml +++ b/config/locales/tr.yml @@ -778,6 +778,8 @@ tr: administrator_description: Bu izne sahip kullanıcılar tüm diğer izinleri atlıyorlar delete_user_data: Kullanıcı Verilerini Silme delete_user_data_description: Kullanıcıların, diğer kullanıcıların verisini gecikme olmaksızın silmesine izin verir + invite_bypass_approval: Kullanıcıları incelemeden davet et + invite_bypass_approval_description: Bu kullanıcılar tarafından sunucuya davet edilen kişilerin moderasyon onayını atlamasına izin verir invite_users: Kullanıcıları Davet Etme invite_users_description: Kullanıcıların yeni kişileri sunucuya davet etmesine izin verir manage_announcements: Duyuruları Yönetme diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index cc6a6c15c0..c161b99681 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -762,6 +762,8 @@ zh-CN: administrator_description: 拥有此权限的用户将绕过所有权限限制。 delete_user_data: 删除用户数据 delete_user_data_description: 允许用户立即删除其他用户的数据 + invite_bypass_approval: 邀请未经审核的用户 + invite_bypass_approval_description: 允许被这些用户邀请到此服务器的人们绕过管理审核批准 invite_users: 邀请用户 invite_users_description: 允许用户邀请新人加入站点 manage_announcements: 管理公告 diff --git a/config/routes.rb b/config/routes.rb index 57ca5923c6..062fe1a2f4 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,6 +1,5 @@ # frozen_string_literal: true -require 'sidekiq_unique_jobs/web' if ENV['ENABLE_SIDEKIQ_UNIQUE_JOBS_UI'] == true require 'sidekiq-scheduler/web' class RedirectWithVary < ActionDispatch::Routing::PathRedirect diff --git a/config/vite/plugin-glitch-themes.ts b/config/vite/plugin-glitch-themes.ts index 97dba7d430..428b76f0e3 100644 --- a/config/vite/plugin-glitch-themes.ts +++ b/config/vite/plugin-glitch-themes.ts @@ -19,7 +19,7 @@ export function GlitchThemes(): Plugin { return { name: 'glitch-themes', async config(userConfig) { - const existingInputs = userConfig.build?.rollupOptions?.input; + const existingInputs = userConfig.build?.rolldownOptions?.input; if (typeof existingInputs === 'string') { entrypoints[path.basename(existingInputs)] = existingInputs; @@ -79,7 +79,7 @@ export function GlitchThemes(): Plugin { return { build: { - rollupOptions: { + rolldownOptions: { input: entrypoints, }, }, diff --git a/config/vite/plugin-mastodon-themes.ts b/config/vite/plugin-mastodon-themes.ts index a8d75b25f9..9789d9078a 100644 --- a/config/vite/plugin-mastodon-themes.ts +++ b/config/vite/plugin-mastodon-themes.ts @@ -24,7 +24,7 @@ export function MastodonThemes(): Plugin { let entrypoints: Record = {}; - const existingInputs = userConfig.build?.rollupOptions?.input; + const existingInputs = userConfig.build?.rolldownOptions?.input; if (typeof existingInputs === 'string') { entrypoints[path.basename(existingInputs)] = existingInputs; @@ -46,7 +46,7 @@ export function MastodonThemes(): Plugin { return { build: { - rollupOptions: { + rolldownOptions: { input: entrypoints, }, }, diff --git a/db/migrate/20260319142348_create_tagged_objects.rb b/db/migrate/20260319142348_create_tagged_objects.rb new file mode 100644 index 0000000000..ae0ebc49f8 --- /dev/null +++ b/db/migrate/20260319142348_create_tagged_objects.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true + +class CreateTaggedObjects < ActiveRecord::Migration[8.1] + def change + create_table :tagged_objects do |t| + t.references :status, null: false, foreign_key: { on_delete: :cascade }, index: false + t.references :object, polymorphic: true, null: true + t.string :ap_type, null: false + t.string :uri + + t.timestamps + end + + add_index :tagged_objects, [:status_id, :object_type, :object_id], unique: true, where: 'object_type IS NOT NULL AND object_id IS NOT NULL' + add_index :tagged_objects, [:status_id, :uri], unique: true, where: 'uri IS NOT NULL' + end +end diff --git a/db/schema.rb b/db/schema.rb index a8e4a189c5..2ac78171aa 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[8.1].define(version: 2026_03_18_144837) do +ActiveRecord::Schema[8.1].define(version: 2026_03_19_142348) do # These are extensions that must be enabled in order to support this database enable_extension "pg_catalog.plpgsql" @@ -1245,6 +1245,19 @@ ActiveRecord::Schema[8.1].define(version: 2026_03_18_144837) do t.index ["tag_id", "language"], name: "index_tag_trends_on_tag_id_and_language", unique: true end + create_table "tagged_objects", force: :cascade do |t| + t.string "ap_type", null: false + t.datetime "created_at", null: false + t.bigint "object_id" + t.string "object_type" + t.bigint "status_id", null: false + t.datetime "updated_at", null: false + t.string "uri" + t.index ["object_type", "object_id"], name: "index_tagged_objects_on_object" + t.index ["status_id", "object_type", "object_id"], name: "idx_on_status_id_object_type_object_id_d6ebe374bd", unique: true, where: "((object_type IS NOT NULL) AND (object_id IS NOT NULL))" + t.index ["status_id", "uri"], name: "index_tagged_objects_on_status_id_and_uri", unique: true, where: "(uri IS NOT NULL)" + end + create_table "tags", force: :cascade do |t| t.datetime "created_at", precision: nil, null: false t.string "display_name" @@ -1550,6 +1563,7 @@ ActiveRecord::Schema[8.1].define(version: 2026_03_18_144837) do add_foreign_key "tag_follows", "accounts", on_delete: :cascade add_foreign_key "tag_follows", "tags", on_delete: :cascade add_foreign_key "tag_trends", "tags", on_delete: :cascade + add_foreign_key "tagged_objects", "statuses", on_delete: :cascade add_foreign_key "tombstones", "accounts", on_delete: :cascade add_foreign_key "user_invite_requests", "users", on_delete: :cascade add_foreign_key "users", "accounts", name: "fk_50500f500d", on_delete: :cascade diff --git a/lib/mastodon/cli/accounts.rb b/lib/mastodon/cli/accounts.rb index 25e966bd8e..e4c1aac128 100644 --- a/lib/mastodon/cli/accounts.rb +++ b/lib/mastodon/cli/accounts.rb @@ -17,7 +17,6 @@ module Mastodon::CLI LONG_DESC def rotate(username = nil) if options[:all] - processed = 0 delay = 0 scope = Account.local.without_suspended progress = create_progress_bar(scope.count) @@ -26,14 +25,13 @@ module Mastodon::CLI accounts.each do |account| rotate_keys_for_account(account, delay) progress.increment - processed += 1 end delay += 5.minutes end progress.finish - say("OK, rotated keys for #{processed} accounts", :green) + say("OK, rotated keys for #{progress.progress} accounts", :green) elsif username.present? rotate_keys_for_account(Account.find_local(username)) say('OK', :green) @@ -442,7 +440,6 @@ module Mastodon::CLI total += account.following.reorder(nil).count if options[:follows] total += account.followers.reorder(nil).count if options[:followers] progress = create_progress_bar(total) - processed = 0 if options[:follows] account.following.reorder(nil).find_each do |target_account| @@ -451,7 +448,6 @@ module Mastodon::CLI progress.log pastel.red("Error processing #{target_account.id}: #{e}") ensure progress.increment - processed += 1 end BootstrapTimelineWorker.perform_async(account.id) @@ -464,12 +460,11 @@ module Mastodon::CLI progress.log pastel.red("Error processing #{target_account.id}: #{e}") ensure progress.increment - processed += 1 end end progress.finish - say("Processed #{processed} relationships", :green, true) + say("Processed #{progress.progress} relationships", :green, true) end option :number, type: :numeric, aliases: [:n] diff --git a/package.json b/package.json index e021021807..304e10b778 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@mastodon/mastodon", "license": "AGPL-3.0-or-later", - "packageManager": "yarn@4.12.0", + "packageManager": "yarn@4.13.0", "engines": { "node": ">=20" }, @@ -51,8 +51,9 @@ "@optimize-lodash/rollup-plugin": "^6.0.0", "@react-spring/web": "^9.7.5", "@reduxjs/toolkit": "^2.0.1", + "@rolldown/plugin-babel": "^0.2.2", "@use-gesture/react": "^10.3.1", - "@vitejs/plugin-legacy": "^7.2.1", + "@vitejs/plugin-legacy": "^8.0.0", "@vitejs/plugin-react": "^5.0.0", "arrow-key-navigation": "^1.2.0", "async-mutex": "^0.5.0", @@ -110,8 +111,8 @@ "redux-immutable": "^4.0.0", "regenerator-runtime": "^0.14.0", "requestidlecallback": "^0.3.0", - "rollup-plugin-gzip": "^4.1.1", - "rollup-plugin-visualizer": "^6.0.3", + "rollup-plugin-gzip": "^4.2.0", + "rollup-plugin-visualizer": "^7.0.1", "sass": "^1.62.1", "scroll-behavior": "^0.11.0", "stacktrace-js": "^2.0.2", @@ -121,11 +122,10 @@ "tiny-queue": "^0.2.1", "twitter-text": "3.1.0", "use-debounce": "^10.0.0", - "vite": "^7.1.1", + "vite": "^8.0.0", "vite-plugin-manifest-sri": "^0.2.0", - "vite-plugin-pwa": "^1.0.2", - "vite-plugin-svgr": "^4.3.0", - "vite-tsconfig-paths": "^6.0.0", + "vite-plugin-pwa": "^1.2.0", + "vite-plugin-svgr": "^4.5.0", "wicg-inert": "^3.1.2", "workbox-expiration": "^7.3.0", "workbox-routing": "^7.3.0", @@ -135,10 +135,10 @@ "devDependencies": { "@eslint/js": "^9.39.2", "@formatjs/cli": "^6.1.1", - "@storybook/addon-a11y": "^10.0.6", - "@storybook/addon-docs": "^10.0.6", - "@storybook/addon-vitest": "^10.0.6", - "@storybook/react-vite": "^10.0.6", + "@storybook/addon-a11y": "^10.3.0", + "@storybook/addon-docs": "^10.3.0", + "@storybook/addon-vitest": "^10.3.0", + "@storybook/react-vite": "^10.3.0", "@testing-library/dom": "^10.4.1", "@testing-library/react": "^16.3.0", "@types/debug": "^4", @@ -163,10 +163,10 @@ "@types/react-toggle": "^4.0.3", "@types/redux-immutable": "^4.0.3", "@types/requestidlecallback": "^0.3.5", - "@vitest/browser": "^4.0.5", - "@vitest/browser-playwright": "^4.0.5", - "@vitest/coverage-v8": "^4.0.5", - "@vitest/ui": "^4.0.5", + "@vitest/browser": "^4.1.0", + "@vitest/browser-playwright": "^4.1.0", + "@vitest/coverage-v8": "^4.1.0", + "@vitest/ui": "^4.1.0", "chromatic": "^13.3.3", "eslint": "^9.39.2", "eslint-import-resolver-typescript": "^4.2.5", @@ -187,13 +187,13 @@ "oxfmt": "^0.33.0", "playwright": "^1.57.0", "react-test-renderer": "^18.2.0", - "storybook": "^10.0.5", + "storybook": "^10.3.0", "stylelint": "^17.0.0", "stylelint-config-standard-scss": "^17.0.0", "typescript": "~5.9.0", "typescript-eslint": "^8.55.0", "typescript-plugin-css-modules": "^5.2.0", - "vitest": "^4.0.5" + "vitest": "^4.1.0" }, "resolutions": { "@types/react": "^18.2.7", diff --git a/spec/fabricators/tagged_object_fabricator.rb b/spec/fabricators/tagged_object_fabricator.rb new file mode 100644 index 0000000000..5c0b6b94b9 --- /dev/null +++ b/spec/fabricators/tagged_object_fabricator.rb @@ -0,0 +1,8 @@ +# frozen_string_literal: true + +Fabricator(:tagged_object) do + status + object nil + ap_type 'FeaturedCollection' + uri { Faker::Internet.device_token } +end diff --git a/spec/lib/activitypub/activity/create_spec.rb b/spec/lib/activitypub/activity/create_spec.rb index 3c5839e92d..3e8b1dd762 100644 --- a/spec/lib/activitypub/activity/create_spec.rb +++ b/spec/lib/activitypub/activity/create_spec.rb @@ -731,6 +731,30 @@ RSpec.describe ActivityPub::Activity::Create do end end + context 'with tagged Featured Collections' do + let(:featured_collection) { Fabricate(:collection) } + + let(:object_json) do + build_object( + tag: [ + { + type: 'FeaturedCollection', + id: ActivityPub::TagManager.instance.uri_for(featured_collection), + }, + ] + ) + end + + it 'creates the status with appropriate tagged objects' do + expect { subject.perform } + .to change(sender.statuses, :count).by(1) + + status = sender.statuses.first + + expect(status.tagged_objects.map(&:object)).to contain_exactly(featured_collection) + end + end + context 'with hashtags' do let(:object_json) do build_object( diff --git a/spec/lib/activitypub/activity/update_spec.rb b/spec/lib/activitypub/activity/update_spec.rb index d905f68d8f..ba69c4afc2 100644 --- a/spec/lib/activitypub/activity/update_spec.rb +++ b/spec/lib/activitypub/activity/update_spec.rb @@ -256,5 +256,45 @@ RSpec.describe ActivityPub::Activity::Update do end end end + + context 'with a `FeaturedCollection` object', feature: :collections_federation do + let(:collection) { Fabricate(:remote_collection, account: sender, name: 'old name', discoverable: false) } + let(:featured_collection_json) do + { + '@context' => 'https://www.w3.org/ns/activitystreams', + 'id' => collection.uri, + 'type' => 'FeaturedCollection', + 'attributedTo' => sender.uri, + 'name' => 'Cool people', + 'summary' => 'People you should follow.', + 'totalItems' => 0, + 'sensitive' => false, + 'discoverable' => true, + 'published' => '2026-03-09T15:19:25Z', + 'updated' => Time.zone.now.iso8601, + } + end + let(:json) do + { + '@context' => 'https://www.w3.org/ns/activitystreams', + 'type' => 'Update', + 'actor' => sender.uri, + 'object' => featured_collection_json, + } + end + let(:stubbed_service) do + instance_double(ActivityPub::ProcessFeaturedCollectionService, call: true) + end + + before do + allow(ActivityPub::ProcessFeaturedCollectionService).to receive(:new).and_return(stubbed_service) + end + + it 'updates the collection' do + subject.perform + + expect(stubbed_service).to have_received(:call).with(sender, featured_collection_json) + end + end end end diff --git a/spec/lib/activitypub/tag_manager_spec.rb b/spec/lib/activitypub/tag_manager_spec.rb index a15529057c..0da55dd70b 100644 --- a/spec/lib/activitypub/tag_manager_spec.rb +++ b/spec/lib/activitypub/tag_manager_spec.rb @@ -671,5 +671,15 @@ RSpec.describe ActivityPub::TagManager do status = Fabricate(:status, uri: 'https://example.com/123') expect(subject.uri_to_resource('https://example.com/123#456', Status)).to eq status end + + it 'returns the local featured collection' do + collection = Fabricate(:collection) + expect(subject.uri_to_resource(subject.uri_for(collection), Collection)).to eq collection + end + + it 'returns the remote featured collection' do + collection = Fabricate(:remote_collection) + expect(subject.uri_to_resource(subject.uri_for(collection), Collection)).to eq collection + end end end diff --git a/spec/serializers/activitypub/note_serializer_spec.rb b/spec/serializers/activitypub/note_serializer_spec.rb index 4970de709d..dc71a19c6e 100644 --- a/spec/serializers/activitypub/note_serializer_spec.rb +++ b/spec/serializers/activitypub/note_serializer_spec.rb @@ -43,6 +43,26 @@ RSpec.describe ActivityPub::NoteSerializer do .and(not_include(reply_by_account_visibility_direct.uri)) # Replies with direct visibility end + context 'with tagged featured collections' do + let(:collection) { Fabricate(:collection) } + + before do + parent.tagged_objects.create!(object: collection, ap_type: 'FeaturedCollection', uri: ActivityPub::TagManager.instance.uri_for(collection)) + end + + it 'has the expected shape' do + expect(subject).to include({ + 'type' => 'Note', + 'tag' => include( + a_hash_including({ + 'type' => 'FeaturedCollection', + 'id' => ActivityPub::TagManager.instance.uri_for(collection), + }) + ), + }) + end + end + context 'with a quote' do let(:quoted_status) { Fabricate(:status) } let!(:quote) { Fabricate(:quote, status: parent, quoted_status: quoted_status, state: :accepted) } diff --git a/spec/serializers/rest/status_serializer_spec.rb b/spec/serializers/rest/status_serializer_spec.rb index 510328c7fb..0ad4841791 100644 --- a/spec/serializers/rest/status_serializer_spec.rb +++ b/spec/serializers/rest/status_serializer_spec.rb @@ -92,5 +92,22 @@ RSpec.describe REST::StatusSerializer do ) end end + + context 'with a tagged collection' do + let(:collection) { Fabricate(:collection) } + + before do + status.tagged_objects.create!(object: collection, ap_type: 'FeaturedCollection', uri: ActivityPub::TagManager.instance.uri_for(collection)) + end + + it 'contains the tagged collection' do + expect(subject) + .to include( + 'tagged_collections' => [a_hash_including( + 'id' => collection.id.to_s + )] + ) + end + end end end diff --git a/spec/services/activitypub/process_account_service_spec.rb b/spec/services/activitypub/process_account_service_spec.rb index 832f4e9729..949cc45618 100644 --- a/spec/services/activitypub/process_account_service_spec.rb +++ b/spec/services/activitypub/process_account_service_spec.rb @@ -114,6 +114,30 @@ RSpec.describe ActivityPub::ProcessAccountService do end end + context 'with profile settings' do + let(:payload) do + { + id: 'https://foo.test', + type: 'Actor', + inbox: 'https://foo.test/inbox', + showMedia: true, + showRepliesInMedia: false, + showFeatured: false, + }.with_indifferent_access + end + + it 'sets the profile settings as expected' do + account = subject.call('alice', 'example.com', payload) + + expect(account) + .to have_attributes( + show_media: true, + show_media_replies: false, + show_featured: false + ) + end + end + context 'with inlined feature collection' do let(:payload) do { diff --git a/spec/services/activitypub/process_featured_collection_service_spec.rb b/spec/services/activitypub/process_featured_collection_service_spec.rb index 3a0fdd82f1..c68120bf0d 100644 --- a/spec/services/activitypub/process_featured_collection_service_spec.rb +++ b/spec/services/activitypub/process_featured_collection_service_spec.rb @@ -73,4 +73,36 @@ RSpec.describe ActivityPub::ProcessFeaturedCollectionService do expect(new_collection.description_html).to eq '

A list of remote actors you should follow.

' end end + + context 'when the collection already exists' do + let(:collection) { Fabricate(:remote_collection, account:, uri: base_json['id'], name: 'placeholder') } + + before do + Fabricate(:collection_item, collection:, uri: 'https://example.com/featured_items/1') + Fabricate(:collection_item, collection:, uri: 'https://example.com/featured_items/3') + end + + it 'updates the existing collection, removes the item that no longer exists and queues a jobs to fetch the other items' do + expect { subject.call(account, featured_collection_json) } + .to change(collection.collection_items, :count).by(-1) + + expect(collection.reload.name).to eq 'Good people from other servers' + expect(ActivityPub::ProcessFeaturedItemWorker).to have_enqueued_sidekiq_job.exactly(2).times + end + + context 'when the updated collection no longer contains any items' do + let(:featured_collection_json) do + base_json.merge({ + 'summary' => summary, + 'totalItems' => 0, + 'orderedItems' => nil, + }) + end + + it 'removes all items' do + expect { subject.call(account, featured_collection_json) } + .to change(collection.collection_items, :count).by(-2) + end + end + end end diff --git a/spec/services/activitypub/process_featured_item_service_spec.rb b/spec/services/activitypub/process_featured_item_service_spec.rb index 55bf89df91..6a91f6dba8 100644 --- a/spec/services/activitypub/process_featured_item_service_spec.rb +++ b/spec/services/activitypub/process_featured_item_service_spec.rb @@ -8,6 +8,7 @@ RSpec.describe ActivityPub::ProcessFeaturedItemService do subject { described_class.new } let(:collection) { Fabricate(:remote_collection, uri: 'https://other.example.com/collection/1') } + let(:position) { 3 } let(:featured_object_uri) { 'https://example.com/actor/1' } let(:feature_authorization_uri) { 'https://example.com/auth/1' } let(:featured_item_json) do @@ -34,7 +35,7 @@ RSpec.describe ActivityPub::ProcessFeaturedItemService do it 'does not create a collection item and returns `nil`' do expect do - expect(subject.call(collection, object)).to be_nil + expect(subject.call(collection, object, position:)).to be_nil end.to_not change(CollectionItem, :count) end end @@ -45,14 +46,29 @@ RSpec.describe ActivityPub::ProcessFeaturedItemService do it_behaves_like 'non-matching URIs' - it 'creates and verifies the item' do - expect { subject.call(collection, object) }.to change(collection.collection_items, :count).by(1) + context 'when item does not yet exist' do + it 'creates and verifies the item' do + expect { subject.call(collection, object, position:) }.to change(collection.collection_items, :count).by(1) - expect(stubbed_service).to have_received(:call) + expect(stubbed_service).to have_received(:call) - new_item = collection.collection_items.last - expect(new_item.object_uri).to eq 'https://example.com/actor/1' - expect(new_item.approval_uri).to be_nil + new_item = collection.collection_items.last + expect(new_item.object_uri).to eq 'https://example.com/actor/1' + expect(new_item.approval_uri).to be_nil + expect(new_item.position).to eq 3 + end + end + + context 'when item exists at a different position' do + let!(:collection_item) do + Fabricate(:collection_item, collection:, uri: featured_item_json['id'], position: 2) + end + + it 'updates the position' do + expect { subject.call(collection, object, position:) }.to_not change(collection.collection_items, :count) + + expect(collection_item.reload.position).to eq 3 + end end context 'when an item exists for a local featured account' do @@ -63,7 +79,7 @@ RSpec.describe ActivityPub::ProcessFeaturedItemService do let(:feature_authorization_uri) { ap_account_feature_authorization_url(collection_item.account_id, collection_item) } it 'updates the URI of the existing record' do - expect { subject.call(collection, object) }.to_not change(collection.collection_items, :count) + expect { subject.call(collection, object, position:) }.to_not change(collection.collection_items, :count) expect(collection_item.reload.uri).to eq 'https://other.example.com/featured_item/1' end end @@ -87,7 +103,7 @@ RSpec.describe ActivityPub::ProcessFeaturedItemService do it_behaves_like 'non-matching URIs' it 'fetches the collection item' do - expect { subject.call(collection, object) }.to change(collection.collection_items, :count).by(1) + expect { subject.call(collection, object, position:) }.to change(collection.collection_items, :count).by(1) expect(featured_item_request).to have_been_requested diff --git a/spec/services/activitypub/process_status_update_service_spec.rb b/spec/services/activitypub/process_status_update_service_spec.rb index bcff6f1c41..dd24c3d8be 100644 --- a/spec/services/activitypub/process_status_update_service_spec.rb +++ b/spec/services/activitypub/process_status_update_service_spec.rb @@ -20,6 +20,7 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService do { type: 'Mention', href: ActivityPub::TagManager.instance.uri_for(alice) }, { type: 'Mention', href: ActivityPub::TagManager.instance.uri_for(alice) }, { type: 'Mention', href: bogus_mention }, + { type: 'FeaturedCollection', id: ActivityPub::TagManager.instance.uri_for(featured_collection) }, ], } end @@ -27,6 +28,7 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService do let(:alice) { Fabricate(:account) } let(:bob) { Fabricate(:account) } + let(:featured_collection) { Fabricate(:collection) } let(:mentions) { [] } let(:tags) { [] } @@ -276,6 +278,16 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService do end end + context 'when originally without tagged objects' do + before do + subject.call(status, json, json) + end + + it 'updates tags' do + expect(status.tagged_objects.reload.map(&:object)).to contain_exactly(featured_collection) + end + end + context 'when originally without tags' do before do subject.call(status, json, json) diff --git a/spec/services/post_status_service_spec.rb b/spec/services/post_status_service_spec.rb index d226d77167..66ef93f807 100644 --- a/spec/services/post_status_service_spec.rb +++ b/spec/services/post_status_service_spec.rb @@ -175,7 +175,7 @@ RSpec.describe PostStatusService do status = subject.call(account, text: 'test status update') expect(ProcessMentionsService).to have_received(:new) - expect(mention_service).to have_received(:call).with(status, save_records: false) + expect(mention_service).to have_received(:call).with(status) end it 'safeguards mentions' do @@ -209,6 +209,16 @@ RSpec.describe PostStatusService do expect(hashtags_service).to have_received(:call).with(status) end + it 'processes tagged objects' do + account = Fabricate(:account) + collection = Fabricate(:collection) + + status = subject.call(account, text: "test #{ActivityPub::TagManager.instance.uri_for(collection)} #{ActivityPub::TagManager.instance.uri_for(collection)}") + + expect(status.tagged_objects.map(&:object)) + .to contain_exactly(collection) + end + it 'gets distributed' do allow(DistributionWorker).to receive(:perform_async) allow(ActivityPub::DistributionWorker).to receive(:perform_async) diff --git a/spec/services/process_links_service_spec.rb b/spec/services/process_links_service_spec.rb new file mode 100644 index 0000000000..367eaa0177 --- /dev/null +++ b/spec/services/process_links_service_spec.rb @@ -0,0 +1,28 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe ProcessLinksService do + subject { described_class.new } + + let(:account) { Fabricate(:account, username: 'alice') } + + context 'when status mentions known collections' do + let!(:collection) { Fabricate(:collection) } + let(:status) { Fabricate(:status, account: account, text: "Hello check out this collection! #{ActivityPub::TagManager.instance.uri_for(collection)}", visibility: :public) } + + it 'creates a tagged object' do + expect { subject.call(status) } + .to change { status.tagged_objects.count }.by(1) + end + end + + context 'when status has a generic link' do + let(:status) { Fabricate(:status, account: account, text: 'Hello check out my personal web page: https://example.com/test', visibility: :public) } + + it 'skips the link and does not create a tagged object' do + expect { expect { subject.call(status) }.to_not raise_error } + .to not_change { status.tagged_objects.count }.from(0) + end + end +end diff --git a/spec/services/process_mentions_service_spec.rb b/spec/services/process_mentions_service_spec.rb index 61faf3d04a..a91e5420d2 100644 --- a/spec/services/process_mentions_service_spec.rb +++ b/spec/services/process_mentions_service_spec.rb @@ -54,10 +54,10 @@ RSpec.describe ProcessMentionsService do context 'when mentioning a user several times when not saving records' do let!(:remote_user) { Fabricate(:account, username: 'remote_user', protocol: :activitypub, domain: 'example.com', inbox_url: 'http://example.com/inbox') } - let(:status) { Fabricate(:status, account: account, text: "Hello @#{remote_user.acct} @#{remote_user.acct} @#{remote_user.acct}", visibility: :public) } + let(:status) { Fabricate.build(:status, account: account, text: "Hello @#{remote_user.acct} @#{remote_user.acct} @#{remote_user.acct}", visibility: :public) } it 'creates exactly one mention' do - subject.call(status, save_records: false) + subject.call(status) expect(status.mentions.size).to eq 1 end diff --git a/spec/services/update_status_service_spec.rb b/spec/services/update_status_service_spec.rb index 463605dd22..bbbf8bc420 100644 --- a/spec/services/update_status_service_spec.rb +++ b/spec/services/update_status_service_spec.rb @@ -161,6 +161,19 @@ RSpec.describe UpdateStatusService do end end + context 'when tagged objects in text change' do + let!(:old_collection) { Fabricate(:collection) } + let!(:new_collection) { Fabricate(:collection) } + + let!(:account) { Fabricate(:account) } + let!(:status) { PostStatusService.new.call(account, text: "Check out #{ActivityPub::TagManager.instance.uri_for(old_collection)}") } + + it 'changes tagged objects' do + expect { subject.call(status, status.account_id, text: "Check out #{ActivityPub::TagManager.instance.uri_for(new_collection)} #{ActivityPub::TagManager.instance.uri_for(new_collection)}") } + .to change { status.reload.tagged_objects.map(&:object) }.from([old_collection]).to([new_collection]) + end + end + context 'when hashtags in text change' do let!(:account) { Fabricate(:account) } let!(:status) { PostStatusService.new.call(account, text: 'Hello #foo') } diff --git a/spec/workers/activitypub/process_featured_item_worker_spec.rb b/spec/workers/activitypub/process_featured_item_worker_spec.rb index 02a9edfc47..531b85407f 100644 --- a/spec/workers/activitypub/process_featured_item_worker_spec.rb +++ b/spec/workers/activitypub/process_featured_item_worker_spec.rb @@ -19,7 +19,7 @@ RSpec.describe ActivityPub::ProcessFeaturedItemWorker do it 'calls the service to process the item' do subject.perform(collection.id, object) - expect(stubbed_service).to have_received(:call).with(collection, object, request_id: nil) + expect(stubbed_service).to have_received(:call).with(collection, object, position: nil, request_id: nil) end end end diff --git a/streaming/package.json b/streaming/package.json index 8d9d81f782..3989917b08 100644 --- a/streaming/package.json +++ b/streaming/package.json @@ -1,7 +1,7 @@ { "name": "@mastodon/streaming", "license": "AGPL-3.0-or-later", - "packageManager": "yarn@4.12.0", + "packageManager": "yarn@4.13.0", "engines": { "node": ">=20" }, diff --git a/vite.config.mts b/vite.config.mts index e5c869ff7a..aae1ce89b8 100644 --- a/vite.config.mts +++ b/vite.config.mts @@ -2,6 +2,7 @@ import { readdir } from 'node:fs/promises'; import path from 'node:path'; import { optimizeLodashImports } from '@optimize-lodash/rollup-plugin'; +import babel from '@rolldown/plugin-babel'; import legacy from '@vitejs/plugin-legacy'; import react from '@vitejs/plugin-react'; import postcssPresetEnv from 'postcss-preset-env'; @@ -16,7 +17,6 @@ import { import manifestSRI from 'vite-plugin-manifest-sri'; import { VitePWA } from 'vite-plugin-pwa'; import svgr from 'vite-plugin-svgr'; -import tsconfigPaths from 'vite-tsconfig-paths'; import { MastodonAssetsManifest } from './config/vite/plugin-assets-manifest'; import { MastodonEmojiCompressed } from './config/vite/plugin-emoji-compressed'; @@ -44,6 +44,7 @@ export const config: UserConfigFnPromise = async ({ mode, command }) => { base: `/${outDirName}/`, envDir: __dirname, resolve: { + tsconfigPaths: true, alias: { '~/': `${jsRoot}/`, '@/': `${jsRoot}/`, @@ -122,7 +123,7 @@ export const config: UserConfigFnPromise = async ({ mode, command }) => { assetsDir: 'assets', assetsInlineLimit: (filePath, _) => /\.woff2?$/.exec(filePath) ? false : undefined, - rollupOptions: { + rolldownOptions: { input: await findEntrypoints(), output: { chunkFileNames({ facadeModuleId, name }) { @@ -168,11 +169,9 @@ export const config: UserConfigFnPromise = async ({ mode, command }) => { format: 'es', }, plugins: [ - tsconfigPaths({ projects: [path.resolve(__dirname, 'tsconfig.json')] }), - react({ - babel: { - plugins: ['formatjs', 'transform-react-remove-prop-types'], - }, + react(), + babel({ + plugins: ['formatjs', 'transform-react-remove-prop-types'], }), MastodonThemes(), MastodonAssetsManifest(), diff --git a/vitest.config.mts b/vitest.config.mts index 16c1ba2e9e..3c1cb91de7 100644 --- a/vitest.config.mts +++ b/vitest.config.mts @@ -27,7 +27,6 @@ const storybookTests: TestProjectInlineConfiguration = { provider: playwright(), instances: [{ browser: 'chromium' }], }, - setupFiles: [resolve(__dirname, '.storybook/vitest.setup.ts')], }, }; diff --git a/yarn.lock b/yarn.lock index 4094a8629e..65829b400f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -52,7 +52,7 @@ __metadata: languageName: node linkType: hard -"@asamuzakjp/dom-selector@npm:^7.0.2": +"@asamuzakjp/dom-selector@npm:^7.0.3": version: 7.0.3 resolution: "@asamuzakjp/dom-selector@npm:7.0.3" dependencies: @@ -83,14 +83,14 @@ __metadata: languageName: node linkType: hard -"@babel/compat-data@npm:^7.27.7, @babel/compat-data@npm:^7.28.0, @babel/compat-data@npm:^7.28.6": +"@babel/compat-data@npm:^7.28.6, @babel/compat-data@npm:^7.29.0": version: 7.29.0 resolution: "@babel/compat-data@npm:7.29.0" checksum: 10c0/08f348554989d23aa801bf1405aa34b15e841c0d52d79da7e524285c77a5f9d298e70e11d91cc578d8e2c9542efc586d50c5f5cf8e1915b254a9dcf786913a94 languageName: node linkType: hard -"@babel/core@npm:^7.18.9, @babel/core@npm:^7.21.3, @babel/core@npm:^7.24.4, @babel/core@npm:^7.26.10, @babel/core@npm:^7.28.0, @babel/core@npm:^7.29.0": +"@babel/core@npm:^7.21.3, @babel/core@npm:^7.24.4, @babel/core@npm:^7.26.10, @babel/core@npm:^7.28.0, @babel/core@npm:^7.29.0": version: 7.29.0 resolution: "@babel/core@npm:7.29.0" dependencies: @@ -135,7 +135,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-compilation-targets@npm:^7.27.1, @babel/helper-compilation-targets@npm:^7.27.2, @babel/helper-compilation-targets@npm:^7.28.6": +"@babel/helper-compilation-targets@npm:^7.27.1, @babel/helper-compilation-targets@npm:^7.28.6": version: 7.28.6 resolution: "@babel/helper-compilation-targets@npm:7.28.6" dependencies: @@ -148,48 +148,48 @@ __metadata: languageName: node linkType: hard -"@babel/helper-create-class-features-plugin@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/helper-create-class-features-plugin@npm:7.27.1" +"@babel/helper-create-class-features-plugin@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/helper-create-class-features-plugin@npm:7.28.6" dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.27.1" - "@babel/helper-member-expression-to-functions": "npm:^7.27.1" + "@babel/helper-annotate-as-pure": "npm:^7.27.3" + "@babel/helper-member-expression-to-functions": "npm:^7.28.5" "@babel/helper-optimise-call-expression": "npm:^7.27.1" - "@babel/helper-replace-supers": "npm:^7.27.1" + "@babel/helper-replace-supers": "npm:^7.28.6" "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.27.1" - "@babel/traverse": "npm:^7.27.1" + "@babel/traverse": "npm:^7.28.6" semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/4ee199671d6b9bdd4988aa2eea4bdced9a73abfc831d81b00c7634f49a8fc271b3ceda01c067af58018eb720c6151322015d463abea7072a368ee13f35adbb4c + checksum: 10c0/0b62b46717891f4366006b88c9b7f277980d4f578c4c3789b7a4f5a2e09e121de4cda9a414ab403986745cd3ad1af3fe2d948c9f78ab80d4dc085afc9602af50 languageName: node linkType: hard -"@babel/helper-create-regexp-features-plugin@npm:^7.18.6, @babel/helper-create-regexp-features-plugin@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/helper-create-regexp-features-plugin@npm:7.27.1" +"@babel/helper-create-regexp-features-plugin@npm:^7.18.6, @babel/helper-create-regexp-features-plugin@npm:^7.27.1, @babel/helper-create-regexp-features-plugin@npm:^7.28.5": + version: 7.28.5 + resolution: "@babel/helper-create-regexp-features-plugin@npm:7.28.5" dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.27.1" - regexpu-core: "npm:^6.2.0" + "@babel/helper-annotate-as-pure": "npm:^7.27.3" + regexpu-core: "npm:^6.3.1" semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/591fe8bd3bb39679cc49588889b83bd628d8c4b99c55bafa81e80b1e605a348b64da955e3fd891c4ba3f36fd015367ba2eadea22af6a7de1610fbb5bcc2d3df0 + checksum: 10c0/7af3d604cadecdb2b0d2cedd696507f02a53a58be0523281c2d6766211443b55161dde1e6c0d96ab16ddfd82a2607a2f792390caa24797e9733631f8aa86859f languageName: node linkType: hard -"@babel/helper-define-polyfill-provider@npm:^0.6.5": - version: 0.6.5 - resolution: "@babel/helper-define-polyfill-provider@npm:0.6.5" +"@babel/helper-define-polyfill-provider@npm:^0.6.8": + version: 0.6.8 + resolution: "@babel/helper-define-polyfill-provider@npm:0.6.8" dependencies: - "@babel/helper-compilation-targets": "npm:^7.27.2" - "@babel/helper-plugin-utils": "npm:^7.27.1" - debug: "npm:^4.4.1" + "@babel/helper-compilation-targets": "npm:^7.28.6" + "@babel/helper-plugin-utils": "npm:^7.28.6" + debug: "npm:^4.4.3" lodash.debounce: "npm:^4.0.8" - resolve: "npm:^1.22.10" + resolve: "npm:^1.22.11" peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10c0/4886a068d9ca1e70af395340656a9dda33c50502c67eed39ff6451785f370bdfc6e57095b90cb92678adcd4a111ca60909af53d3a741120719c5604346ae409e + checksum: 10c0/306a169f2cb285f368578219ef18ea9702860d3d02d64334f8d45ea38648be0b9e1edad8c8f732fa34bb4206ccbb9883c395570fd57ab7bbcf293bc5964c5b3a languageName: node linkType: hard @@ -200,17 +200,17 @@ __metadata: languageName: node linkType: hard -"@babel/helper-member-expression-to-functions@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/helper-member-expression-to-functions@npm:7.27.1" +"@babel/helper-member-expression-to-functions@npm:^7.28.5": + version: 7.28.5 + resolution: "@babel/helper-member-expression-to-functions@npm:7.28.5" dependencies: - "@babel/traverse": "npm:^7.27.1" - "@babel/types": "npm:^7.27.1" - checksum: 10c0/5762ad009b6a3d8b0e6e79ff6011b3b8fdda0fefad56cfa8bfbe6aa02d5a8a8a9680a45748fe3ac47e735a03d2d88c0a676e3f9f59f20ae9fadcc8d51ccd5a53 + "@babel/traverse": "npm:^7.28.5" + "@babel/types": "npm:^7.28.5" + checksum: 10c0/4e6e05fbf4dffd0bc3e55e28fcaab008850be6de5a7013994ce874ec2beb90619cda4744b11607a60f8aae0227694502908add6188ceb1b5223596e765b44814 languageName: node linkType: hard -"@babel/helper-module-imports@npm:^7.10.4, @babel/helper-module-imports@npm:^7.16.7, @babel/helper-module-imports@npm:^7.27.1, @babel/helper-module-imports@npm:^7.28.6": +"@babel/helper-module-imports@npm:^7.10.4, @babel/helper-module-imports@npm:^7.16.7, @babel/helper-module-imports@npm:^7.28.6": version: 7.28.6 resolution: "@babel/helper-module-imports@npm:7.28.6" dependencies: @@ -242,10 +242,10 @@ __metadata: languageName: node linkType: hard -"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.26.5, @babel/helper-plugin-utils@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/helper-plugin-utils@npm:7.27.1" - checksum: 10c0/94cf22c81a0c11a09b197b41ab488d416ff62254ce13c57e62912c85700dc2e99e555225787a4099ff6bae7a1812d622c80fbaeda824b79baa10a6c5ac4cf69b +"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.26.5, @babel/helper-plugin-utils@npm:^7.27.1, @babel/helper-plugin-utils@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/helper-plugin-utils@npm:7.28.6" + checksum: 10c0/3f5f8acc152fdbb69a84b8624145ff4f9b9f6e776cb989f9f968f8606eb7185c5c3cfcf3ba08534e37e1e0e1c118ac67080610333f56baa4f7376c99b5f1143d languageName: node linkType: hard @@ -262,16 +262,16 @@ __metadata: languageName: node linkType: hard -"@babel/helper-replace-supers@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/helper-replace-supers@npm:7.27.1" +"@babel/helper-replace-supers@npm:^7.27.1, @babel/helper-replace-supers@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/helper-replace-supers@npm:7.28.6" dependencies: - "@babel/helper-member-expression-to-functions": "npm:^7.27.1" + "@babel/helper-member-expression-to-functions": "npm:^7.28.5" "@babel/helper-optimise-call-expression": "npm:^7.27.1" - "@babel/traverse": "npm:^7.27.1" + "@babel/traverse": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/4f2eaaf5fcc196580221a7ccd0f8873447b5d52745ad4096418f6101a1d2e712e9f93722c9a32bc9769a1dc197e001f60d6f5438d4dfde4b9c6a9e4df719354c + checksum: 10c0/04663c6389551b99b8c3e7ba4e2638b8ca2a156418c26771516124c53083aa8e74b6a45abe5dd46360af79709a0e9c6b72c076d0eab9efecdd5aaf836e79d8d5 languageName: node linkType: hard @@ -292,7 +292,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-validator-identifier@npm:^7.27.1, @babel/helper-validator-identifier@npm:^7.28.5": +"@babel/helper-validator-identifier@npm:^7.28.5": version: 7.28.5 resolution: "@babel/helper-validator-identifier@npm:7.28.5" checksum: 10c0/42aaebed91f739a41f3d80b72752d1f95fd7c72394e8e4bd7cdd88817e0774d80a432451bcba17c2c642c257c483bf1d409dd4548883429ea9493a3bc4ab0847 @@ -327,7 +327,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.28.5, @babel/parser@npm:^7.28.6, @babel/parser@npm:^7.29.0": +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.24.4, @babel/parser@npm:^7.28.6, @babel/parser@npm:^7.29.0": version: 7.29.0 resolution: "@babel/parser@npm:7.29.0" dependencies: @@ -338,15 +338,15 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:7.27.1" +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:^7.28.5": + version: 7.28.5 + resolution: "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:7.28.5" dependencies: "@babel/helper-plugin-utils": "npm:^7.27.1" - "@babel/traverse": "npm:^7.27.1" + "@babel/traverse": "npm:^7.28.5" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/7dfffa978ae1cd179641a7c4b4ad688c6828c2c58ec96b118c2fb10bc3715223de6b88bff1ebff67056bb5fccc568ae773e3b83c592a1b843423319f80c99ebd + checksum: 10c0/844b7c7e9eec6d858262b2f3d5af75d3a6bbd9d3ecc740d95271fbdd84985731674536f5d8ac98f2dc0e8872698b516e406636e4d0cb04b50afe471172095a53 languageName: node linkType: hard @@ -385,15 +385,15 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.27.1" +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" - "@babel/traverse": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.28.6" + "@babel/traverse": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/b94e6c3fc019e988b1499490829c327a1067b4ddea8ad402f6d0554793c9124148c2125338c723661b6dff040951abc1f092afbf3f2d234319cd580b68e52445 + checksum: 10c0/f1a9194e8d1742081def7af748e9249eb5082c25d0ced292720a1f054895f99041c764a05f45af669a2c8898aeb79266058aedb0d3e1038963ad49be8288918a languageName: node linkType: hard @@ -406,25 +406,25 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-import-assertions@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-syntax-import-assertions@npm:7.27.1" +"@babel/plugin-syntax-import-assertions@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-syntax-import-assertions@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/06a954ee672f7a7c44d52b6e55598da43a7064e80df219765c51c37a0692641277e90411028f7cae4f4d1dedeed084f0c453576fa421c35a81f1603c5e3e0146 + checksum: 10c0/f3b8bdccb9b4d3e3b9226684ca518e055399d05579da97dfe0160a38d65198cfe7dce809e73179d6463a863a040f980de32425a876d88efe4eda933d0d95982c languageName: node linkType: hard -"@babel/plugin-syntax-import-attributes@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-syntax-import-attributes@npm:7.27.1" +"@babel/plugin-syntax-import-attributes@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-syntax-import-attributes@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/e66f7a761b8360419bbb93ab67d87c8a97465ef4637a985ff682ce7ba6918b34b29d81190204cf908d0933058ee7b42737423cd8a999546c21b3aabad4affa9a + checksum: 10c0/1be160e2c426faa74e5be2e30e39e8d0d8c543063bd5d06cd804f8751b8fbcb82ce824ca7f9ce4b09c003693f6c06a11ce503b7e34d85e1a259631e4c3f72ad2 languageName: node linkType: hard @@ -462,29 +462,29 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-async-generator-functions@npm:^7.28.0": - version: 7.28.0 - resolution: "@babel/plugin-transform-async-generator-functions@npm:7.28.0" +"@babel/plugin-transform-async-generator-functions@npm:^7.29.0": + version: 7.29.0 + resolution: "@babel/plugin-transform-async-generator-functions@npm:7.29.0" dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.28.6" "@babel/helper-remap-async-to-generator": "npm:^7.27.1" - "@babel/traverse": "npm:^7.28.0" + "@babel/traverse": "npm:^7.29.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/739d577e649d7d7b9845dc309e132964327ab3eaea43ad04d04a7dcb977c63f9aa9a423d1ca39baf10939128d02f52e6fda39c834fb9f1753785b1497e72c4dc + checksum: 10c0/4080fc5e7dad7761bfebbb4fbe06bdfeb3a8bf0c027bcb4373e59e6b3dc7c5002eca7cbb1afba801d6439df8f92f7bcb3fb862e8fbbe43a9e59bb5653dcc0568 languageName: node linkType: hard -"@babel/plugin-transform-async-to-generator@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-async-to-generator@npm:7.27.1" +"@babel/plugin-transform-async-to-generator@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-async-to-generator@npm:7.28.6" dependencies: - "@babel/helper-module-imports": "npm:^7.27.1" - "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-module-imports": "npm:^7.28.6" + "@babel/helper-plugin-utils": "npm:^7.28.6" "@babel/helper-remap-async-to-generator": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/e76b1f6f9c3bbf72e17d7639406d47f09481806de4db99a8de375a0bb40957ea309b20aa705f0c25ab1d7c845e3f365af67eafa368034521151a0e352a03ef2f + checksum: 10c0/2eb0826248587df6e50038f36194a138771a7df22581020451c7779edeaf9ef39bf47c5b7a20ae2645af6416e8c896feeca273317329652e84abd79a4ab920ad languageName: node linkType: hard @@ -499,90 +499,90 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-block-scoping@npm:^7.28.0": - version: 7.28.0 - resolution: "@babel/plugin-transform-block-scoping@npm:7.28.0" +"@babel/plugin-transform-block-scoping@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-block-scoping@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/787d85e72a92917e735aa54e23062fa777031f8a07046e67f5026eff3d91e64eb535575dd1df917b0011bee014ae51287478af14c1d4ba60bc81e326bc044cfc + checksum: 10c0/2e3e09e1f9770b56cef4dcbffddf262508fd03416072f815ac66b2b224a3a12cd285cfec12fc067f1add414e7db5ce6dafb5164a6e0fb1a728e6a97d0c6f6e9d languageName: node linkType: hard -"@babel/plugin-transform-class-properties@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-class-properties@npm:7.27.1" +"@babel/plugin-transform-class-properties@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-class-properties@npm:7.28.6" dependencies: - "@babel/helper-create-class-features-plugin": "npm:^7.27.1" - "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-create-class-features-plugin": "npm:^7.28.6" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/cc0662633c0fe6df95819fef223506ddf26c369c8d64ab21a728d9007ec866bf9436a253909819216c24a82186b6ccbc1ec94d7aaf3f82df227c7c02fa6a704b + checksum: 10c0/c4327fcd730c239d9f173f9b695b57b801729e273b4848aef1f75818069dfd31d985d75175db188d947b9b1bbe5353dae298849042026a5e4fcf07582ff3f9f1 languageName: node linkType: hard -"@babel/plugin-transform-class-static-block@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-class-static-block@npm:7.27.1" +"@babel/plugin-transform-class-static-block@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-class-static-block@npm:7.28.6" dependencies: - "@babel/helper-create-class-features-plugin": "npm:^7.27.1" - "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-create-class-features-plugin": "npm:^7.28.6" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.12.0 - checksum: 10c0/396997dd81fc1cf242b921e337d25089d6b9dc3596e81322ff11a6359326dc44f2f8b82dcc279c2e514cafaf8964dc7ed39e9fab4b8af1308b57387d111f6a20 + checksum: 10c0/dbe9b1fd302ae41b73186e17ac8d8ecf625ebc2416a91f2dc8013977a1bdf21e6ea288a83f084752b412242f3866e789d4fddeb428af323fe35b60e0fae4f98c languageName: node linkType: hard -"@babel/plugin-transform-classes@npm:^7.28.0": - version: 7.28.0 - resolution: "@babel/plugin-transform-classes@npm:7.28.0" +"@babel/plugin-transform-classes@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-classes@npm:7.28.6" dependencies: "@babel/helper-annotate-as-pure": "npm:^7.27.3" - "@babel/helper-compilation-targets": "npm:^7.27.2" + "@babel/helper-compilation-targets": "npm:^7.28.6" "@babel/helper-globals": "npm:^7.28.0" - "@babel/helper-plugin-utils": "npm:^7.27.1" - "@babel/helper-replace-supers": "npm:^7.27.1" - "@babel/traverse": "npm:^7.28.0" + "@babel/helper-plugin-utils": "npm:^7.28.6" + "@babel/helper-replace-supers": "npm:^7.28.6" + "@babel/traverse": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/3b213b43104fe99dd7e79401a86d09e545836e057a70ffe77e8196a87bf67ae167e502ae90afdf0d1a2be683be5652514aaeda743bd984e583523dd8ecfef887 + checksum: 10c0/dc22f1f6eadab17305128fbf9cc5f30e87a51a77dd0a6d5498097994e8a9b9a90ab298c11edf2342acbeaac9edc9c601cad72eedcf4b592cd465a787d7f41490 languageName: node linkType: hard -"@babel/plugin-transform-computed-properties@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-computed-properties@npm:7.27.1" +"@babel/plugin-transform-computed-properties@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-computed-properties@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" - "@babel/template": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.28.6" + "@babel/template": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/e09a12f8c8ae0e6a6144c102956947b4ec05f6c844169121d0ec4529c2d30ad1dc59fee67736193b87a402f44552c888a519a680a31853bdb4d34788c28af3b0 + checksum: 10c0/1e9893503ae6d651125701cc29450e87c0b873c8febebff19da75da9c40cfb7968c52c28bf948244e461110aeb7b3591f2cc199b7406ff74a24c50c7a5729f39 languageName: node linkType: hard -"@babel/plugin-transform-destructuring@npm:^7.28.0": - version: 7.28.0 - resolution: "@babel/plugin-transform-destructuring@npm:7.28.0" +"@babel/plugin-transform-destructuring@npm:^7.28.5": + version: 7.28.5 + resolution: "@babel/plugin-transform-destructuring@npm:7.28.5" dependencies: "@babel/helper-plugin-utils": "npm:^7.27.1" - "@babel/traverse": "npm:^7.28.0" + "@babel/traverse": "npm:^7.28.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/cc7ccafa952b3ff7888544d5688cfafaba78c69ce1e2f04f3233f4f78c9de5e46e9695f5ea42c085b0c0cfa39b10f366d362a2be245b6d35b66d3eb1d427ccb2 + checksum: 10c0/288207f488412b23bb206c7c01ba143714e2506b72a9ec09e993f28366cc8188d121bde714659b3437984a86d2881d9b1b06de3089d5582823ccf2f3b3eaa2c4 languageName: node linkType: hard -"@babel/plugin-transform-dotall-regex@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-dotall-regex@npm:7.27.1" +"@babel/plugin-transform-dotall-regex@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-dotall-regex@npm:7.28.6" dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.27.1" - "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-create-regexp-features-plugin": "npm:^7.28.5" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/f9caddfad9a551b4dabe0dcb7c040f458fbaaa7bbb44200c20198b32c8259be8e050e58d2c853fdac901a4cfe490b86aa857036d8d461b192dd010d0e242dedb + checksum: 10c0/e2fb76b7ae99087cf4212013a3ca9dee07048f90f98fd6264855080fb6c3f169be11c9b8c9d8b26cf9a407e4d0a5fa6e103f7cef433a542b75cf7127c99d4f97 languageName: node linkType: hard @@ -597,15 +597,15 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:7.27.1" +"@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:^7.29.0": + version: 7.29.0 + resolution: "@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:7.29.0" dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.27.1" - "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-create-regexp-features-plugin": "npm:^7.28.5" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/121502a252b3206913e1e990a47fea34397b4cbf7804d4cd872d45961bc45b603423f60ca87f3a3023a62528f5feb475ac1c9ec76096899ec182fcb135eba375 + checksum: 10c0/6f03d9e5e31a05b28555541be6e283407e08447a36be6ddf8068b3efa970411d832e04b1282e2b894baf89a3864ff7e7f1e36346652a8d983170c6d548555167 languageName: node linkType: hard @@ -620,26 +620,26 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-explicit-resource-management@npm:^7.28.0": - version: 7.28.0 - resolution: "@babel/plugin-transform-explicit-resource-management@npm:7.28.0" +"@babel/plugin-transform-explicit-resource-management@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-explicit-resource-management@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" - "@babel/plugin-transform-destructuring": "npm:^7.28.0" + "@babel/helper-plugin-utils": "npm:^7.28.6" + "@babel/plugin-transform-destructuring": "npm:^7.28.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/3baa706af3112adf2ae0c7ec0dc61b63dd02695eb5582f3c3a2b2d05399c6aa7756f55e7bbbd5412e613a6ba1dd6b6736904074b4d7ebd6b45a1e3f9145e4094 + checksum: 10c0/e6ea28c26e058fe61ada3e70b0def1992dd5a44f5fc14d8e2c6a3a512fb4d4c6dc96a3e1d0b466d83db32a9101e0b02df94051e48d3140da115b8ea9f8a31f37 languageName: node linkType: hard -"@babel/plugin-transform-exponentiation-operator@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.27.1" +"@babel/plugin-transform-exponentiation-operator@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/953d21e01fed76da8e08fb5094cade7bf8927c1bb79301916bec2db0593b41dbcfbca1024ad5db886b72208a93ada8f57a219525aad048cf15814eeb65cf760d + checksum: 10c0/4572d955a50dbc9a652a19431b4bb822cb479ee6045f4e6df72659c499c13036da0a2adf650b07ca995f2781e80aa868943bea1e7bff1de3169ec3f0a73a902e languageName: node linkType: hard @@ -679,14 +679,14 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-json-strings@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-json-strings@npm:7.27.1" +"@babel/plugin-transform-json-strings@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-json-strings@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/2379714aca025516452a7c1afa1ca42a22b9b51a5050a653cc6198a51665ab82bdecf36106d32d731512706a1e373c5637f5ff635737319aa42f3827da2326d6 + checksum: 10c0/ab1091798c58e6c0bb8a864ee2b727c400924592c6ed69797a26b4c205f850a935de77ad516570be0419c279a3d9f7740c2aa448762eb8364ea77a6a357a9653 languageName: node linkType: hard @@ -701,14 +701,14 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-logical-assignment-operators@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.27.1" +"@babel/plugin-transform-logical-assignment-operators@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/5b0abc7c0d09d562bf555c646dce63a30288e5db46fd2ce809a61d064415da6efc3b2b3c59b8e4fe98accd072c89a2f7c3765b400e4bf488651735d314d9feeb + checksum: 10c0/4632a35453d2131f0be466681d0a33e3db44d868ff51ec46cd87e0ebd1e47c6a39b894f7d1c9b06f931addf6efa9d30e60c4cdedeb4f69d426f683e11f8490cf languageName: node linkType: hard @@ -735,29 +735,29 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-modules-commonjs@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-modules-commonjs@npm:7.27.1" +"@babel/plugin-transform-modules-commonjs@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-modules-commonjs@npm:7.28.6" dependencies: - "@babel/helper-module-transforms": "npm:^7.27.1" - "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-module-transforms": "npm:^7.28.6" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/4def972dcd23375a266ea1189115a4ff61744b2c9366fc1de648b3fab2c650faf1a94092de93a33ff18858d2e6c4dddeeee5384cb42ba0129baeab01a5cdf1e2 + checksum: 10c0/7c45992797c6150644c8552feff4a016ba7bd6d59ff2b039ed969a9c5b20a6804cd9d21db5045fc8cca8ca7f08262497e354e93f8f2be6a1cdf3fbfa8c31a9b6 languageName: node linkType: hard -"@babel/plugin-transform-modules-systemjs@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-modules-systemjs@npm:7.27.1" +"@babel/plugin-transform-modules-systemjs@npm:^7.29.0": + version: 7.29.0 + resolution: "@babel/plugin-transform-modules-systemjs@npm:7.29.0" dependencies: - "@babel/helper-module-transforms": "npm:^7.27.1" - "@babel/helper-plugin-utils": "npm:^7.27.1" - "@babel/helper-validator-identifier": "npm:^7.27.1" - "@babel/traverse": "npm:^7.27.1" + "@babel/helper-module-transforms": "npm:^7.28.6" + "@babel/helper-plugin-utils": "npm:^7.28.6" + "@babel/helper-validator-identifier": "npm:^7.28.5" + "@babel/traverse": "npm:^7.29.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/f16fca62d144d9cbf558e7b5f83e13bb6d0f21fdeff3024b0cecd42ffdec0b4151461da42bd0963512783ece31aafa5ffe03446b4869220ddd095b24d414e2b5 + checksum: 10c0/44ea502f2c990398b7d9adc5b44d9e1810a0a5e86eebc05c92d039458f0b3994fe243efa9353b90f8a648d8a91b79845fb353d8679d7324cc9de0162d732771d languageName: node linkType: hard @@ -773,15 +773,15 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-named-capturing-groups-regex@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-named-capturing-groups-regex@npm:7.27.1" +"@babel/plugin-transform-named-capturing-groups-regex@npm:^7.29.0": + version: 7.29.0 + resolution: "@babel/plugin-transform-named-capturing-groups-regex@npm:7.29.0" dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.27.1" - "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-create-regexp-features-plugin": "npm:^7.28.5" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/8eaa8c9aee00a00f3bd8bd8b561d3f569644d98cb2cfe3026d7398aabf9b29afd62f24f142b4112fa1f572d9b0e1928291b099cde59f56d6b59f4d565e58abf2 + checksum: 10c0/1904db22da7f2bc3e380cd2c0786bda330ee1b1b3efa3f5203d980708c4bfeb5daa4dff48d01692193040bcc5f275dbdc0c2eadc8b1eb1b6dfe363564ad6e898 languageName: node linkType: hard @@ -796,40 +796,40 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.27.1" +"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/a435fc03aaa65c6ef8e99b2d61af0994eb5cdd4a28562d78c3b0b0228ca7e501aa255e1dff091a6996d7d3ea808eb5a65fd50ecd28dfb10687a8a1095dcadc7a + checksum: 10c0/6607f2201d66ccb688f0b1db09475ef995837df19f14705da41f693b669f834c206147a854864ab107913d7b4f4748878b0cd9fe9ca8bfd1bee0c206fc027b49 languageName: node linkType: hard -"@babel/plugin-transform-numeric-separator@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-numeric-separator@npm:7.27.1" +"@babel/plugin-transform-numeric-separator@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-numeric-separator@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/b72cbebbfe46fcf319504edc1cf59f3f41c992dd6840db766367f6a1d232cd2c52143c5eaf57e0316710bee251cae94be97c6d646b5022fcd9274ccb131b470c + checksum: 10c0/191097d8d2753cdd16d1acca65a945d1645ab20b65655c2f5b030a9e38967a52e093dcb21ebf391e342222705c6ffe5dea15dafd6257f7b51b77fb64a830b637 languageName: node linkType: hard -"@babel/plugin-transform-object-rest-spread@npm:^7.28.0": - version: 7.28.0 - resolution: "@babel/plugin-transform-object-rest-spread@npm:7.28.0" +"@babel/plugin-transform-object-rest-spread@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-object-rest-spread@npm:7.28.6" dependencies: - "@babel/helper-compilation-targets": "npm:^7.27.2" - "@babel/helper-plugin-utils": "npm:^7.27.1" - "@babel/plugin-transform-destructuring": "npm:^7.28.0" + "@babel/helper-compilation-targets": "npm:^7.28.6" + "@babel/helper-plugin-utils": "npm:^7.28.6" + "@babel/plugin-transform-destructuring": "npm:^7.28.5" "@babel/plugin-transform-parameters": "npm:^7.27.7" - "@babel/traverse": "npm:^7.28.0" + "@babel/traverse": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/360dc6fd5285ee5e1d3be8a1fb0decd120b2a1726800317b4ab48b7c91616247030239b7fa06ceaa1a8a586fde1e143c24d45f8d41956876099d97d664f8ef1e + checksum: 10c0/f55334352d4fcde385f2e8a58836687e71ff668c9b6e4c34d52575bf2789cdde92d9d3116edba13647ac0bc3e51fb2a6d1e8fb822dce7e8123334b82600bc4c3 languageName: node linkType: hard @@ -845,26 +845,26 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-optional-catch-binding@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-optional-catch-binding@npm:7.27.1" +"@babel/plugin-transform-optional-catch-binding@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-optional-catch-binding@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/807a4330f1fac08e2682d57bc82e714868fc651c8876f9a8b3a3fd8f53c129e87371f8243e712ac7dae11e090b737a2219a02fe1b6459a29e664fa073c3277bb + checksum: 10c0/36e8face000ee65e478a55febf687ce9be7513ad498c60dfe585851555565e0c28e7cb891b3c59709318539ce46f7697d5f42130eb18f385cd47e47cfa297446 languageName: node linkType: hard -"@babel/plugin-transform-optional-chaining@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-optional-chaining@npm:7.27.1" +"@babel/plugin-transform-optional-chaining@npm:^7.27.1, @babel/plugin-transform-optional-chaining@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-optional-chaining@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.28.6" "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/5b18ff5124e503f0a25d6b195be7351a028b3992d6f2a91fb4037e2a2c386400d66bc1df8f6df0a94c708524f318729e81a95c41906e5a7919a06a43e573a525 + checksum: 10c0/c159cc74115c2266be21791f192dd079e2aeb65c8731157e53b80fcefa41e8e28ad370021d4dfbdb31f25e5afa0322669a8eb2d032cd96e65ac37e020324c763 languageName: node linkType: hard @@ -879,28 +879,28 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-private-methods@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-private-methods@npm:7.27.1" +"@babel/plugin-transform-private-methods@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-private-methods@npm:7.28.6" dependencies: - "@babel/helper-create-class-features-plugin": "npm:^7.27.1" - "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-create-class-features-plugin": "npm:^7.28.6" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/232bedfe9d28df215fb03cc7623bdde468b1246bdd6dc24465ff4bf9cc5f5a256ae33daea1fafa6cc59705e4d29da9024bb79baccaa5cd92811ac5db9b9244f2 + checksum: 10c0/fb504e2bfdcf3f734d2a90ab20d61427c58385f57f950d3de6ff4e6d12dd4aa7d552147312d218367e129b7920dccfc3230ba554de861986cda38921bad84067 languageName: node linkType: hard -"@babel/plugin-transform-private-property-in-object@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-private-property-in-object@npm:7.27.1" +"@babel/plugin-transform-private-property-in-object@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-private-property-in-object@npm:7.28.6" dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.27.1" - "@babel/helper-create-class-features-plugin": "npm:^7.27.1" - "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-annotate-as-pure": "npm:^7.27.3" + "@babel/helper-create-class-features-plugin": "npm:^7.28.6" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/a8c4536273ca716dcc98e74ea25ca76431528554922f184392be3ddaf1761d4aa0e06f1311577755bd1613f7054fb51d29de2ada1130f743d329170a1aa1fe56 + checksum: 10c0/0f6bbc6ec3f93b556d3de7d56bf49335255fc4c43488e51a5025d6ee0286183fd3cf950ffcac1bbeed8a45777f860a49996455c8d3b4a04c3b1a5f28e697fe31 languageName: node linkType: hard @@ -937,26 +937,26 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-regenerator@npm:^7.28.0": - version: 7.28.1 - resolution: "@babel/plugin-transform-regenerator@npm:7.28.1" +"@babel/plugin-transform-regenerator@npm:^7.29.0": + version: 7.29.0 + resolution: "@babel/plugin-transform-regenerator@npm:7.29.0" dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/6c9e6eb80ce9c0bde0876c80979e078fbc85dc802272cba4ee72b5b1c858472e38167c418917e4f0d4384ce888706d95544a8d266880c0e199e167e078168b67 + checksum: 10c0/86c7db9b97f85ee47c0fae0528802cbc06e5775e61580ee905335c16bb971270086764a3859873d9adcd7d0f913a5b93eb0dc271aec8fb9e93e090e4ac95e29e languageName: node linkType: hard -"@babel/plugin-transform-regexp-modifiers@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-regexp-modifiers@npm:7.27.1" +"@babel/plugin-transform-regexp-modifiers@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-regexp-modifiers@npm:7.28.6" dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.27.1" - "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-create-regexp-features-plugin": "npm:^7.28.5" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/31ae596ab56751cf43468a6c0a9d6bc3521d306d2bee9c6957cdb64bea53812ce24bd13a32f766150d62b737bca5b0650b2c62db379382fff0dccbf076055c33 + checksum: 10c0/97e36b086800f71694fa406abc00192e3833662f2bdd5f51c018bd0c95eef247c4ae187417c207d03a9c5374342eac0bb65a39112c431a9b23b09b1eda1562e5 languageName: node linkType: hard @@ -982,15 +982,15 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-spread@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-spread@npm:7.27.1" +"@babel/plugin-transform-spread@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-spread@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.28.6" "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/b34fc58b33bd35b47d67416655c2cbc8578fbb3948b4592bc15eb6d8b4046986e25c06e3b9929460fa4ab08e9653582415e7ef8b87d265e1239251bdf5a4c162 + checksum: 10c0/bcac50e558d6f0c501cbce19ec197af558cef51fe3b3a6eba27276e323e57a5be28109b4264a5425ac12a67bf95d6af9c2a42b05e79c522ce913fb9529259d76 languageName: node linkType: hard @@ -1038,15 +1038,15 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-unicode-property-regex@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-unicode-property-regex@npm:7.27.1" +"@babel/plugin-transform-unicode-property-regex@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-unicode-property-regex@npm:7.28.6" dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.27.1" - "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-create-regexp-features-plugin": "npm:^7.28.5" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/a332bc3cb3eeea67c47502bc52d13a0f8abae5a7bfcb08b93a8300ddaff8d9e1238f912969494c1b494c1898c6f19687054440706700b6d12cb0b90d88beb4d0 + checksum: 10c0/b25f8cde643f4f47e0fa4f7b5c552e2dfbb6ad0ce07cf40f7e8ae40daa9855ad855d76d4d6d010153b74e48c8794685955c92ca637c0da152ce5f0fa9e7c90fa languageName: node linkType: hard @@ -1062,95 +1062,95 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-unicode-sets-regex@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.27.1" +"@babel/plugin-transform-unicode-sets-regex@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.28.6" dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.27.1" - "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-create-regexp-features-plugin": "npm:^7.28.5" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/236645f4d0a1fba7c18dc8ffe3975933af93e478f2665650c2d91cf528cfa1587cde5cfe277e0e501fc03b5bf57638369575d6539cef478632fb93bd7d7d7178 + checksum: 10c0/c03c8818736b138db73d1f7a96fbfa22d1994639164d743f0f00e6383d3b7b3144d333de960ff4afad0bddd0baaac257295e3316969eba995b1b6a1b4dec933e languageName: node linkType: hard -"@babel/preset-env@npm:^7.11.0, @babel/preset-env@npm:^7.28.0": - version: 7.28.0 - resolution: "@babel/preset-env@npm:7.28.0" +"@babel/preset-env@npm:^7.11.0, @babel/preset-env@npm:^7.29.0": + version: 7.29.2 + resolution: "@babel/preset-env@npm:7.29.2" dependencies: - "@babel/compat-data": "npm:^7.28.0" - "@babel/helper-compilation-targets": "npm:^7.27.2" - "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/compat-data": "npm:^7.29.0" + "@babel/helper-compilation-targets": "npm:^7.28.6" + "@babel/helper-plugin-utils": "npm:^7.28.6" "@babel/helper-validator-option": "npm:^7.27.1" - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "npm:^7.27.1" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "npm:^7.28.5" "@babel/plugin-bugfix-safari-class-field-initializer-scope": "npm:^7.27.1" "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "npm:^7.27.1" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "npm:^7.27.1" - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "npm:^7.27.1" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "npm:^7.28.6" "@babel/plugin-proposal-private-property-in-object": "npm:7.21.0-placeholder-for-preset-env.2" - "@babel/plugin-syntax-import-assertions": "npm:^7.27.1" - "@babel/plugin-syntax-import-attributes": "npm:^7.27.1" + "@babel/plugin-syntax-import-assertions": "npm:^7.28.6" + "@babel/plugin-syntax-import-attributes": "npm:^7.28.6" "@babel/plugin-syntax-unicode-sets-regex": "npm:^7.18.6" "@babel/plugin-transform-arrow-functions": "npm:^7.27.1" - "@babel/plugin-transform-async-generator-functions": "npm:^7.28.0" - "@babel/plugin-transform-async-to-generator": "npm:^7.27.1" + "@babel/plugin-transform-async-generator-functions": "npm:^7.29.0" + "@babel/plugin-transform-async-to-generator": "npm:^7.28.6" "@babel/plugin-transform-block-scoped-functions": "npm:^7.27.1" - "@babel/plugin-transform-block-scoping": "npm:^7.28.0" - "@babel/plugin-transform-class-properties": "npm:^7.27.1" - "@babel/plugin-transform-class-static-block": "npm:^7.27.1" - "@babel/plugin-transform-classes": "npm:^7.28.0" - "@babel/plugin-transform-computed-properties": "npm:^7.27.1" - "@babel/plugin-transform-destructuring": "npm:^7.28.0" - "@babel/plugin-transform-dotall-regex": "npm:^7.27.1" + "@babel/plugin-transform-block-scoping": "npm:^7.28.6" + "@babel/plugin-transform-class-properties": "npm:^7.28.6" + "@babel/plugin-transform-class-static-block": "npm:^7.28.6" + "@babel/plugin-transform-classes": "npm:^7.28.6" + "@babel/plugin-transform-computed-properties": "npm:^7.28.6" + "@babel/plugin-transform-destructuring": "npm:^7.28.5" + "@babel/plugin-transform-dotall-regex": "npm:^7.28.6" "@babel/plugin-transform-duplicate-keys": "npm:^7.27.1" - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "npm:^7.27.1" + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "npm:^7.29.0" "@babel/plugin-transform-dynamic-import": "npm:^7.27.1" - "@babel/plugin-transform-explicit-resource-management": "npm:^7.28.0" - "@babel/plugin-transform-exponentiation-operator": "npm:^7.27.1" + "@babel/plugin-transform-explicit-resource-management": "npm:^7.28.6" + "@babel/plugin-transform-exponentiation-operator": "npm:^7.28.6" "@babel/plugin-transform-export-namespace-from": "npm:^7.27.1" "@babel/plugin-transform-for-of": "npm:^7.27.1" "@babel/plugin-transform-function-name": "npm:^7.27.1" - "@babel/plugin-transform-json-strings": "npm:^7.27.1" + "@babel/plugin-transform-json-strings": "npm:^7.28.6" "@babel/plugin-transform-literals": "npm:^7.27.1" - "@babel/plugin-transform-logical-assignment-operators": "npm:^7.27.1" + "@babel/plugin-transform-logical-assignment-operators": "npm:^7.28.6" "@babel/plugin-transform-member-expression-literals": "npm:^7.27.1" "@babel/plugin-transform-modules-amd": "npm:^7.27.1" - "@babel/plugin-transform-modules-commonjs": "npm:^7.27.1" - "@babel/plugin-transform-modules-systemjs": "npm:^7.27.1" + "@babel/plugin-transform-modules-commonjs": "npm:^7.28.6" + "@babel/plugin-transform-modules-systemjs": "npm:^7.29.0" "@babel/plugin-transform-modules-umd": "npm:^7.27.1" - "@babel/plugin-transform-named-capturing-groups-regex": "npm:^7.27.1" + "@babel/plugin-transform-named-capturing-groups-regex": "npm:^7.29.0" "@babel/plugin-transform-new-target": "npm:^7.27.1" - "@babel/plugin-transform-nullish-coalescing-operator": "npm:^7.27.1" - "@babel/plugin-transform-numeric-separator": "npm:^7.27.1" - "@babel/plugin-transform-object-rest-spread": "npm:^7.28.0" + "@babel/plugin-transform-nullish-coalescing-operator": "npm:^7.28.6" + "@babel/plugin-transform-numeric-separator": "npm:^7.28.6" + "@babel/plugin-transform-object-rest-spread": "npm:^7.28.6" "@babel/plugin-transform-object-super": "npm:^7.27.1" - "@babel/plugin-transform-optional-catch-binding": "npm:^7.27.1" - "@babel/plugin-transform-optional-chaining": "npm:^7.27.1" + "@babel/plugin-transform-optional-catch-binding": "npm:^7.28.6" + "@babel/plugin-transform-optional-chaining": "npm:^7.28.6" "@babel/plugin-transform-parameters": "npm:^7.27.7" - "@babel/plugin-transform-private-methods": "npm:^7.27.1" - "@babel/plugin-transform-private-property-in-object": "npm:^7.27.1" + "@babel/plugin-transform-private-methods": "npm:^7.28.6" + "@babel/plugin-transform-private-property-in-object": "npm:^7.28.6" "@babel/plugin-transform-property-literals": "npm:^7.27.1" - "@babel/plugin-transform-regenerator": "npm:^7.28.0" - "@babel/plugin-transform-regexp-modifiers": "npm:^7.27.1" + "@babel/plugin-transform-regenerator": "npm:^7.29.0" + "@babel/plugin-transform-regexp-modifiers": "npm:^7.28.6" "@babel/plugin-transform-reserved-words": "npm:^7.27.1" "@babel/plugin-transform-shorthand-properties": "npm:^7.27.1" - "@babel/plugin-transform-spread": "npm:^7.27.1" + "@babel/plugin-transform-spread": "npm:^7.28.6" "@babel/plugin-transform-sticky-regex": "npm:^7.27.1" "@babel/plugin-transform-template-literals": "npm:^7.27.1" "@babel/plugin-transform-typeof-symbol": "npm:^7.27.1" "@babel/plugin-transform-unicode-escapes": "npm:^7.27.1" - "@babel/plugin-transform-unicode-property-regex": "npm:^7.27.1" + "@babel/plugin-transform-unicode-property-regex": "npm:^7.28.6" "@babel/plugin-transform-unicode-regex": "npm:^7.27.1" - "@babel/plugin-transform-unicode-sets-regex": "npm:^7.27.1" + "@babel/plugin-transform-unicode-sets-regex": "npm:^7.28.6" "@babel/preset-modules": "npm:0.1.6-no-external-plugins" - babel-plugin-polyfill-corejs2: "npm:^0.4.14" - babel-plugin-polyfill-corejs3: "npm:^0.13.0" - babel-plugin-polyfill-regenerator: "npm:^0.6.5" - core-js-compat: "npm:^3.43.0" + babel-plugin-polyfill-corejs2: "npm:^0.4.15" + babel-plugin-polyfill-corejs3: "npm:^0.14.0" + babel-plugin-polyfill-regenerator: "npm:^0.6.6" + core-js-compat: "npm:^3.48.0" semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/f343103b8f0e8da5be4ae031aff8bf35da4764997af4af78ae9506f421b785dd45da1bc09f845b1fc308c8b7d134aead4a1f89e7fb6e213cd2f9fe1d2aa78bc9 + checksum: 10c0/d49cb005f2dbc3f2293ab6d80ee8f1380e6215af5518fe26b087c8961c1ea8ebaa554dfce589abe1fbebac25ad7c2515d943dec3859ea2d4981a3f8f4711c580 languageName: node linkType: hard @@ -1187,7 +1187,7 @@ __metadata: languageName: node linkType: hard -"@babel/traverse@npm:^7.18.9, @babel/traverse@npm:^7.26.10, @babel/traverse@npm:^7.27.1, @babel/traverse@npm:^7.28.0, @babel/traverse@npm:^7.28.6, @babel/traverse@npm:^7.29.0": +"@babel/traverse@npm:^7.26.10, @babel/traverse@npm:^7.27.1, @babel/traverse@npm:^7.28.0, @babel/traverse@npm:^7.28.5, @babel/traverse@npm:^7.28.6, @babel/traverse@npm:^7.29.0": version: 7.29.0 resolution: "@babel/traverse@npm:7.29.0" dependencies: @@ -1202,7 +1202,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.26.10, @babel/types@npm:^7.27.1, @babel/types@npm:^7.27.3, @babel/types@npm:^7.28.5, @babel/types@npm:^7.28.6, @babel/types@npm:^7.29.0, @babel/types@npm:^7.4.4": +"@babel/types@npm:^7.0.0, @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.2, @babel/types@npm:^7.28.5, @babel/types@npm:^7.28.6, @babel/types@npm:^7.29.0, @babel/types@npm:^7.4.4": version: 7.29.0 resolution: "@babel/types@npm:7.29.0" dependencies: @@ -1219,6 +1219,13 @@ __metadata: languageName: node linkType: hard +"@blazediff/core@npm:1.9.1": + version: 1.9.1 + resolution: "@blazediff/core@npm:1.9.1" + checksum: 10c0/fd45cdd0544002341d74831a179ef693a81414abd348c1ff0c01086c0ea03f5e5ee284c4e16c2e6fb3670c265f90a3d85752b9360320efa9a835928e604dae77 + languageName: node + linkType: hard + "@bramus/specificity@npm:^2.4.2": version: 2.4.2 resolution: "@bramus/specificity@npm:2.4.2" @@ -1952,31 +1959,31 @@ __metadata: languageName: node linkType: hard -"@emnapi/core@npm:^1.4.3": - version: 1.4.5 - resolution: "@emnapi/core@npm:1.4.5" +"@emnapi/core@npm:^1.4.3, @emnapi/core@npm:^1.7.1": + version: 1.9.0 + resolution: "@emnapi/core@npm:1.9.0" dependencies: - "@emnapi/wasi-threads": "npm:1.0.4" + "@emnapi/wasi-threads": "npm:1.2.0" tslib: "npm:^2.4.0" - checksum: 10c0/da4a57f65f325d720d0e0d1a9c6618b90c4c43a5027834a110476984e1d47c95ebaed4d316b5dddb9c0ed9a493ffeb97d1934f9677035f336d8a36c1f3b2818f + checksum: 10c0/defbfa5861aa5ff1346dbc6a19df50d727ae76ae276a31a97b178db8eecae0c5179976878087b43ac2441750e40e6c50e465280383256deb16dd2fb167dd515c languageName: node linkType: hard -"@emnapi/runtime@npm:^1.4.3": - version: 1.4.5 - resolution: "@emnapi/runtime@npm:1.4.5" +"@emnapi/runtime@npm:^1.4.3, @emnapi/runtime@npm:^1.7.1": + version: 1.9.0 + resolution: "@emnapi/runtime@npm:1.9.0" dependencies: tslib: "npm:^2.4.0" - checksum: 10c0/37a0278be5ac81e918efe36f1449875cbafba947039c53c65a1f8fc238001b866446fc66041513b286baaff5d6f9bec667f5164b3ca481373a8d9cb65bfc984b + checksum: 10c0/f825e53b2d3f9d31fd880e669197d006bb5158c3a52ab25f0546f3d52ac58eb539a4bd1dcc378af6c10d202956fa064b28ab7b572a76de58972c0b8656a692ef languageName: node linkType: hard -"@emnapi/wasi-threads@npm:1.0.4": - version: 1.0.4 - resolution: "@emnapi/wasi-threads@npm:1.0.4" +"@emnapi/wasi-threads@npm:1.2.0": + version: 1.2.0 + resolution: "@emnapi/wasi-threads@npm:1.2.0" dependencies: tslib: "npm:^2.4.0" - checksum: 10c0/2c91a53e62f875800baf035c4d42c9c0d18e5afd9a31ca2aac8b435aeaeaeaac386b5b3d0d0e70aa7a5a9852bbe05106b1f680cd82cce03145c703b423d41313 + checksum: 10c0/1e3724b5814b06c14782fda87eee9b9aa68af01576c81ffeaefdf621ddb74386e419d5b3b1027b6a8172397729d95a92f814fc4b8d3c224376428faa07a6a01a languageName: node linkType: hard @@ -2680,22 +2687,6 @@ __metadata: languageName: node linkType: hard -"@isaacs/balanced-match@npm:^4.0.1": - version: 4.0.1 - resolution: "@isaacs/balanced-match@npm:4.0.1" - checksum: 10c0/7da011805b259ec5c955f01cee903da72ad97c5e6f01ca96197267d3f33103d5b2f8a1af192140f3aa64526c593c8d098ae366c2b11f7f17645d12387c2fd420 - languageName: node - linkType: hard - -"@isaacs/brace-expansion@npm:^5.0.0": - version: 5.0.0 - resolution: "@isaacs/brace-expansion@npm:5.0.0" - dependencies: - "@isaacs/balanced-match": "npm:^4.0.1" - checksum: 10c0/b4d4812f4be53afc2c5b6c545001ff7a4659af68d4484804e9d514e183d20269bb81def8682c01a22b17c4d6aed14292c8494f7d2ac664e547101c1a905aa977 - languageName: node - linkType: hard - "@isaacs/cliui@npm:^8.0.2": version: 8.0.2 resolution: "@isaacs/cliui@npm:8.0.2" @@ -2719,12 +2710,11 @@ __metadata: languageName: node linkType: hard -"@joshwooding/vite-plugin-react-docgen-typescript@npm:0.6.1": - version: 0.6.1 - resolution: "@joshwooding/vite-plugin-react-docgen-typescript@npm:0.6.1" +"@joshwooding/vite-plugin-react-docgen-typescript@npm:^0.6.4": + version: 0.6.4 + resolution: "@joshwooding/vite-plugin-react-docgen-typescript@npm:0.6.4" dependencies: - glob: "npm:^10.0.0" - magic-string: "npm:^0.30.0" + glob: "npm:^13.0.1" react-docgen-typescript: "npm:^2.2.2" peerDependencies: typescript: ">= 4.3.x" @@ -2732,7 +2722,7 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 10c0/0bcc2adbb49158018102bd9d84cd8572c770daee3d46733157933ef0330953bd5b9e102c26f2338ee7dfb8f21a7bb937134d23f8a7935d5dc88525a253557467 + checksum: 10c0/73149b2d41d5b8eff7dfe4d037a6903fe4123ae46f3928d88535020539f44159c4ea1b342e6a77d4c14219f2f743fea0ef96e81279cce8b6d247dc4d582e27ed languageName: node linkType: hard @@ -2780,7 +2770,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:^0.3.23, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25, @jridgewell/trace-mapping@npm:^0.3.28, @jridgewell/trace-mapping@npm:^0.3.31": +"@jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25, @jridgewell/trace-mapping@npm:^0.3.28, @jridgewell/trace-mapping@npm:^0.3.31": version: 0.3.31 resolution: "@jridgewell/trace-mapping@npm:0.3.31" dependencies: @@ -2826,10 +2816,11 @@ __metadata: "@optimize-lodash/rollup-plugin": "npm:^6.0.0" "@react-spring/web": "npm:^9.7.5" "@reduxjs/toolkit": "npm:^2.0.1" - "@storybook/addon-a11y": "npm:^10.0.6" - "@storybook/addon-docs": "npm:^10.0.6" - "@storybook/addon-vitest": "npm:^10.0.6" - "@storybook/react-vite": "npm:^10.0.6" + "@rolldown/plugin-babel": "npm:^0.2.2" + "@storybook/addon-a11y": "npm:^10.3.0" + "@storybook/addon-docs": "npm:^10.3.0" + "@storybook/addon-vitest": "npm:^10.3.0" + "@storybook/react-vite": "npm:^10.3.0" "@testing-library/dom": "npm:^10.4.1" "@testing-library/react": "npm:^16.3.0" "@types/debug": "npm:^4" @@ -2855,12 +2846,12 @@ __metadata: "@types/redux-immutable": "npm:^4.0.3" "@types/requestidlecallback": "npm:^0.3.5" "@use-gesture/react": "npm:^10.3.1" - "@vitejs/plugin-legacy": "npm:^7.2.1" + "@vitejs/plugin-legacy": "npm:^8.0.0" "@vitejs/plugin-react": "npm:^5.0.0" - "@vitest/browser": "npm:^4.0.5" - "@vitest/browser-playwright": "npm:^4.0.5" - "@vitest/coverage-v8": "npm:^4.0.5" - "@vitest/ui": "npm:^4.0.5" + "@vitest/browser": "npm:^4.1.0" + "@vitest/browser-playwright": "npm:^4.1.0" + "@vitest/coverage-v8": "npm:^4.1.0" + "@vitest/ui": "npm:^4.1.0" arrow-key-navigation: "npm:^1.2.0" async-mutex: "npm:^0.5.0" atrament: "npm:0.2.4" @@ -2937,12 +2928,12 @@ __metadata: redux-immutable: "npm:^4.0.0" regenerator-runtime: "npm:^0.14.0" requestidlecallback: "npm:^0.3.0" - rollup-plugin-gzip: "npm:^4.1.1" - rollup-plugin-visualizer: "npm:^6.0.3" + rollup-plugin-gzip: "npm:^4.2.0" + rollup-plugin-visualizer: "npm:^7.0.1" sass: "npm:^1.62.1" scroll-behavior: "npm:^0.11.0" stacktrace-js: "npm:^2.0.2" - storybook: "npm:^10.0.5" + storybook: "npm:^10.3.0" stringz: "npm:^2.1.0" stylelint: "npm:^17.0.0" stylelint-config-standard-scss: "npm:^17.0.0" @@ -2954,12 +2945,11 @@ __metadata: typescript-eslint: "npm:^8.55.0" typescript-plugin-css-modules: "npm:^5.2.0" use-debounce: "npm:^10.0.0" - vite: "npm:^7.1.1" + vite: "npm:^8.0.0" vite-plugin-manifest-sri: "npm:^0.2.0" - vite-plugin-pwa: "npm:^1.0.2" - vite-plugin-svgr: "npm:^4.3.0" - vite-tsconfig-paths: "npm:^6.0.0" - vitest: "npm:^4.0.5" + vite-plugin-pwa: "npm:^1.2.0" + vite-plugin-svgr: "npm:^4.5.0" + vitest: "npm:^4.1.0" wicg-inert: "npm:^3.1.2" workbox-expiration: "npm:^7.3.0" workbox-routing: "npm:^7.3.0" @@ -3047,6 +3037,17 @@ __metadata: languageName: node linkType: hard +"@napi-rs/wasm-runtime@npm:^1.1.1": + version: 1.1.1 + resolution: "@napi-rs/wasm-runtime@npm:1.1.1" + dependencies: + "@emnapi/core": "npm:^1.7.1" + "@emnapi/runtime": "npm:^1.7.1" + "@tybys/wasm-util": "npm:^0.10.1" + checksum: 10c0/04d57b67e80736e41fe44674a011878db0a8ad893f4d44abb9d3608debb7c174224cba2796ed5b0c1d367368159f3ca6be45f1c59222f70e32ddc880f803d447 + languageName: node + linkType: hard + "@nodelib/fs.scandir@npm:2.1.5": version: 2.1.5 resolution: "@nodelib/fs.scandir@npm:2.1.5" @@ -3149,6 +3150,13 @@ __metadata: languageName: node linkType: hard +"@oxc-project/types@npm:=0.122.0": + version: 0.122.0 + resolution: "@oxc-project/types@npm:0.122.0" + checksum: 10c0/2c64dd0db949426fd0c86d4f61eded5902e7b7b166356a825bd3a248aeaa29a495f78918f66ab78e99644b67bd7556096e2a8123cec74ca4141c604f424f4f74 + 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" @@ -3553,6 +3561,142 @@ __metadata: languageName: node linkType: hard +"@rolldown/binding-android-arm64@npm:1.0.0-rc.11": + version: 1.0.0-rc.11 + resolution: "@rolldown/binding-android-arm64@npm:1.0.0-rc.11" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@rolldown/binding-darwin-arm64@npm:1.0.0-rc.11": + version: 1.0.0-rc.11 + resolution: "@rolldown/binding-darwin-arm64@npm:1.0.0-rc.11" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@rolldown/binding-darwin-x64@npm:1.0.0-rc.11": + version: 1.0.0-rc.11 + resolution: "@rolldown/binding-darwin-x64@npm:1.0.0-rc.11" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@rolldown/binding-freebsd-x64@npm:1.0.0-rc.11": + version: 1.0.0-rc.11 + resolution: "@rolldown/binding-freebsd-x64@npm:1.0.0-rc.11" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@rolldown/binding-linux-arm-gnueabihf@npm:1.0.0-rc.11": + version: 1.0.0-rc.11 + resolution: "@rolldown/binding-linux-arm-gnueabihf@npm:1.0.0-rc.11" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@rolldown/binding-linux-arm64-gnu@npm:1.0.0-rc.11": + version: 1.0.0-rc.11 + resolution: "@rolldown/binding-linux-arm64-gnu@npm:1.0.0-rc.11" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@rolldown/binding-linux-arm64-musl@npm:1.0.0-rc.11": + version: 1.0.0-rc.11 + resolution: "@rolldown/binding-linux-arm64-musl@npm:1.0.0-rc.11" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@rolldown/binding-linux-ppc64-gnu@npm:1.0.0-rc.11": + version: 1.0.0-rc.11 + resolution: "@rolldown/binding-linux-ppc64-gnu@npm:1.0.0-rc.11" + conditions: os=linux & cpu=ppc64 & libc=glibc + languageName: node + linkType: hard + +"@rolldown/binding-linux-s390x-gnu@npm:1.0.0-rc.11": + version: 1.0.0-rc.11 + resolution: "@rolldown/binding-linux-s390x-gnu@npm:1.0.0-rc.11" + conditions: os=linux & cpu=s390x & libc=glibc + languageName: node + linkType: hard + +"@rolldown/binding-linux-x64-gnu@npm:1.0.0-rc.11": + version: 1.0.0-rc.11 + resolution: "@rolldown/binding-linux-x64-gnu@npm:1.0.0-rc.11" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@rolldown/binding-linux-x64-musl@npm:1.0.0-rc.11": + version: 1.0.0-rc.11 + resolution: "@rolldown/binding-linux-x64-musl@npm:1.0.0-rc.11" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@rolldown/binding-openharmony-arm64@npm:1.0.0-rc.11": + version: 1.0.0-rc.11 + resolution: "@rolldown/binding-openharmony-arm64@npm:1.0.0-rc.11" + conditions: os=openharmony & cpu=arm64 + languageName: node + linkType: hard + +"@rolldown/binding-wasm32-wasi@npm:1.0.0-rc.11": + version: 1.0.0-rc.11 + resolution: "@rolldown/binding-wasm32-wasi@npm:1.0.0-rc.11" + dependencies: + "@napi-rs/wasm-runtime": "npm:^1.1.1" + conditions: cpu=wasm32 + languageName: node + linkType: hard + +"@rolldown/binding-win32-arm64-msvc@npm:1.0.0-rc.11": + version: 1.0.0-rc.11 + resolution: "@rolldown/binding-win32-arm64-msvc@npm:1.0.0-rc.11" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@rolldown/binding-win32-x64-msvc@npm:1.0.0-rc.11": + version: 1.0.0-rc.11 + resolution: "@rolldown/binding-win32-x64-msvc@npm:1.0.0-rc.11" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@rolldown/plugin-babel@npm:^0.2.2": + version: 0.2.2 + resolution: "@rolldown/plugin-babel@npm:0.2.2" + dependencies: + picomatch: "npm:^4.0.3" + peerDependencies: + "@babel/core": ^7.29.0 || ^8.0.0-rc.1 + "@babel/plugin-transform-runtime": ^7.29.0 || ^8.0.0-rc.1 + "@babel/runtime": ^7.27.0 || ^8.0.0-rc.1 + rolldown: ^1.0.0-rc.5 + vite: ^8.0.0 + peerDependenciesMeta: + "@babel/plugin-transform-runtime": + optional: true + "@babel/runtime": + optional: true + vite: + optional: true + checksum: 10c0/d00d6afd831c1efa5eac8bbe9eb4c78abfe731c744ffac99d2246e78a94ac8546ee26d0a304541143427e59a846c96d3d5728da540293d02c37bcbe3972428b3 + languageName: node + linkType: hard + +"@rolldown/pluginutils@npm:1.0.0-rc.11": + version: 1.0.0-rc.11 + resolution: "@rolldown/pluginutils@npm:1.0.0-rc.11" + checksum: 10c0/ed20f15c0d78bb3e82f1cb1924ed4b489c026e76cc28ed861609101c75790effa1e2e0fed37ee1b22ceec83aee8ab59098a0d5d3d1b62baa1b44753f88a5e4c6 + languageName: node + linkType: hard + "@rolldown/pluginutils@npm:1.0.0-rc.3": version: 1.0.0-rc.3 resolution: "@rolldown/pluginutils@npm:1.0.0-rc.3" @@ -3652,146 +3796,6 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-android-arm-eabi@npm:4.46.4": - version: 4.46.4 - resolution: "@rollup/rollup-android-arm-eabi@npm:4.46.4" - conditions: os=android & cpu=arm - languageName: node - linkType: hard - -"@rollup/rollup-android-arm64@npm:4.46.4": - version: 4.46.4 - resolution: "@rollup/rollup-android-arm64@npm:4.46.4" - conditions: os=android & cpu=arm64 - languageName: node - linkType: hard - -"@rollup/rollup-darwin-arm64@npm:4.46.4": - version: 4.46.4 - resolution: "@rollup/rollup-darwin-arm64@npm:4.46.4" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"@rollup/rollup-darwin-x64@npm:4.46.4": - version: 4.46.4 - resolution: "@rollup/rollup-darwin-x64@npm:4.46.4" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"@rollup/rollup-freebsd-arm64@npm:4.46.4": - version: 4.46.4 - resolution: "@rollup/rollup-freebsd-arm64@npm:4.46.4" - conditions: os=freebsd & cpu=arm64 - languageName: node - linkType: hard - -"@rollup/rollup-freebsd-x64@npm:4.46.4": - version: 4.46.4 - resolution: "@rollup/rollup-freebsd-x64@npm:4.46.4" - conditions: os=freebsd & cpu=x64 - languageName: node - linkType: hard - -"@rollup/rollup-linux-arm-gnueabihf@npm:4.46.4": - version: 4.46.4 - resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.46.4" - conditions: os=linux & cpu=arm & libc=glibc - languageName: node - linkType: hard - -"@rollup/rollup-linux-arm-musleabihf@npm:4.46.4": - version: 4.46.4 - resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.46.4" - conditions: os=linux & cpu=arm & libc=musl - languageName: node - linkType: hard - -"@rollup/rollup-linux-arm64-gnu@npm:4.46.4": - version: 4.46.4 - resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.46.4" - conditions: os=linux & cpu=arm64 & libc=glibc - languageName: node - linkType: hard - -"@rollup/rollup-linux-arm64-musl@npm:4.46.4": - version: 4.46.4 - resolution: "@rollup/rollup-linux-arm64-musl@npm:4.46.4" - conditions: os=linux & cpu=arm64 & libc=musl - languageName: node - linkType: hard - -"@rollup/rollup-linux-loongarch64-gnu@npm:4.46.4": - version: 4.46.4 - resolution: "@rollup/rollup-linux-loongarch64-gnu@npm:4.46.4" - conditions: os=linux & cpu=loong64 & libc=glibc - languageName: node - linkType: hard - -"@rollup/rollup-linux-ppc64-gnu@npm:4.46.4": - version: 4.46.4 - resolution: "@rollup/rollup-linux-ppc64-gnu@npm:4.46.4" - conditions: os=linux & cpu=ppc64 & libc=glibc - languageName: node - linkType: hard - -"@rollup/rollup-linux-riscv64-gnu@npm:4.46.4": - version: 4.46.4 - resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.46.4" - conditions: os=linux & cpu=riscv64 & libc=glibc - languageName: node - linkType: hard - -"@rollup/rollup-linux-riscv64-musl@npm:4.46.4": - version: 4.46.4 - resolution: "@rollup/rollup-linux-riscv64-musl@npm:4.46.4" - conditions: os=linux & cpu=riscv64 & libc=musl - languageName: node - linkType: hard - -"@rollup/rollup-linux-s390x-gnu@npm:4.46.4": - version: 4.46.4 - resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.46.4" - conditions: os=linux & cpu=s390x & libc=glibc - languageName: node - linkType: hard - -"@rollup/rollup-linux-x64-gnu@npm:4.46.4": - version: 4.46.4 - resolution: "@rollup/rollup-linux-x64-gnu@npm:4.46.4" - conditions: os=linux & cpu=x64 & libc=glibc - languageName: node - linkType: hard - -"@rollup/rollup-linux-x64-musl@npm:4.46.4": - version: 4.46.4 - resolution: "@rollup/rollup-linux-x64-musl@npm:4.46.4" - conditions: os=linux & cpu=x64 & libc=musl - languageName: node - linkType: hard - -"@rollup/rollup-win32-arm64-msvc@npm:4.46.4": - version: 4.46.4 - resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.46.4" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - -"@rollup/rollup-win32-ia32-msvc@npm:4.46.4": - version: 4.46.4 - resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.46.4" - conditions: os=win32 & cpu=ia32 - languageName: node - linkType: hard - -"@rollup/rollup-win32-x64-msvc@npm:4.46.4": - version: 4.46.4 - resolution: "@rollup/rollup-win32-x64-msvc@npm:4.46.4" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - "@rtsao/scc@npm:^1.1.0": version: 1.1.0 resolution: "@rtsao/scc@npm:1.1.0" @@ -3813,10 +3817,10 @@ __metadata: languageName: node linkType: hard -"@standard-schema/spec@npm:^1.0.0": - version: 1.0.0 - resolution: "@standard-schema/spec@npm:1.0.0" - checksum: 10c0/a1ab9a8bdc09b5b47aa8365d0e0ec40cc2df6437be02853696a0e377321653b0d3ac6f079a8c67d5ddbe9821025584b1fb71d9cc041a6666a96f1fadf2ece15f +"@standard-schema/spec@npm:^1.0.0, @standard-schema/spec@npm:^1.1.0": + version: 1.1.0 + resolution: "@standard-schema/spec@npm:1.1.0" + checksum: 10c0/d90f55acde4b2deb983529c87e8025fa693de1a5e8b49ecc6eb84d1fd96328add0e03d7d551442156c7432fd78165b2c26ff561b970a9a881f046abb78d6a526 languageName: node linkType: hard @@ -3827,48 +3831,46 @@ __metadata: languageName: node linkType: hard -"@storybook/addon-a11y@npm:^10.0.6": - version: 10.0.6 - resolution: "@storybook/addon-a11y@npm:10.0.6" +"@storybook/addon-a11y@npm:^10.3.0": + version: 10.3.0 + resolution: "@storybook/addon-a11y@npm:10.3.0" dependencies: "@storybook/global": "npm:^5.0.0" axe-core: "npm:^4.2.0" peerDependencies: - storybook: ^10.0.6 - checksum: 10c0/44ab785b48476a9de44686be2d60c3720ed59c0d95d4ca7e5693ec2acb0cc2b062e4abde0a04f6bc0aeb54156e00a65803bb85c2a21f69c8329139096316b299 + storybook: ^10.3.0 + checksum: 10c0/3efcaeeaadf028427ed7af929a4f9e8d5ae1cfba6b0f0c20832009ecc6088e3df998c567ba7a2ee695cc5da4d17fe404f2094b80119a1a34a8c1c0a900d19ebe languageName: node linkType: hard -"@storybook/addon-docs@npm:^10.0.6": - version: 10.0.6 - resolution: "@storybook/addon-docs@npm:10.0.6" +"@storybook/addon-docs@npm:^10.3.0": + version: 10.3.0 + resolution: "@storybook/addon-docs@npm:10.3.0" dependencies: "@mdx-js/react": "npm:^3.0.0" - "@storybook/csf-plugin": "npm:10.0.6" - "@storybook/icons": "npm:^1.6.0" - "@storybook/react-dom-shim": "npm:10.0.6" + "@storybook/csf-plugin": "npm:10.3.0" + "@storybook/icons": "npm:^2.0.1" + "@storybook/react-dom-shim": "npm:10.3.0" react: "npm:^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" react-dom: "npm:^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" ts-dedent: "npm:^2.0.0" peerDependencies: - storybook: ^10.0.6 - checksum: 10c0/4b1a59416cf54853a09a156e1e1016c13f4d477f73562be960b12d86eeb86d1f1d2da5111255cc9da1cd232955d0ea68b1c42e4e87671042682dcb7eb2a059a0 + storybook: ^10.3.0 + checksum: 10c0/f70ce1bb5bd31ace42386c8000b5e1b0a9b509c574b9b1dca4f1e55ebaa081b93db45a5661e3dfe0133581abfcb70a7acbd4bd45ee0f846cbc01f631ced54ffa languageName: node linkType: hard -"@storybook/addon-vitest@npm:^10.0.6": - version: 10.0.6 - resolution: "@storybook/addon-vitest@npm:10.0.6" +"@storybook/addon-vitest@npm:^10.3.0": + version: 10.3.0 + resolution: "@storybook/addon-vitest@npm:10.3.0" dependencies: "@storybook/global": "npm:^5.0.0" - "@storybook/icons": "npm:^1.6.0" - prompts: "npm:^2.4.0" - ts-dedent: "npm:^2.2.0" + "@storybook/icons": "npm:^2.0.1" peerDependencies: "@vitest/browser": ^3.0.0 || ^4.0.0 "@vitest/browser-playwright": ^4.0.0 "@vitest/runner": ^3.0.0 || ^4.0.0 - storybook: ^10.0.6 + storybook: ^10.3.0 vitest: ^3.0.0 || ^4.0.0 peerDependenciesMeta: "@vitest/browser": @@ -3879,32 +3881,32 @@ __metadata: optional: true vitest: optional: true - checksum: 10c0/6377cfbac4c2f9f9b43006131e0273c2d2f8b76b0ce01fdcb42f2935ac245a2236fab60b2543507a69852dba1ac4e3b770b0a96f5595123e0f9599609d0a57e2 + checksum: 10c0/d6c1c688af591155b9dcdc68be55ab04cb864b569b86c91fafc4407e5c1eec30bacc2d23258837eda0e069ae86f3f95d134b8e6cc7b1d7f4b73f7a00f7470244 languageName: node linkType: hard -"@storybook/builder-vite@npm:10.0.6": - version: 10.0.6 - resolution: "@storybook/builder-vite@npm:10.0.6" +"@storybook/builder-vite@npm:10.3.0": + version: 10.3.0 + resolution: "@storybook/builder-vite@npm:10.3.0" dependencies: - "@storybook/csf-plugin": "npm:10.0.6" + "@storybook/csf-plugin": "npm:10.3.0" ts-dedent: "npm:^2.0.0" peerDependencies: - storybook: ^10.0.6 - vite: ^5.0.0 || ^6.0.0 || ^7.0.0 - checksum: 10c0/1e5f163f2abd62f99292ee48cde10f68d8db1ba6f4613c20cb2af679d44c3b548c7a2209338d24b4ffda2a245ae68bfcfc57af9f76de7f4a251253635c4179d8 + storybook: ^10.3.0 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + checksum: 10c0/62dc1ead65b5a8a17187862ac13a47867dd6f1fc9ff43e6d0c8e1a82d6c4cc8a6bb219cd4adcbce664654cc1c0bf1cb82fd56b706923b3b7220290eef3011e3f languageName: node linkType: hard -"@storybook/csf-plugin@npm:10.0.6": - version: 10.0.6 - resolution: "@storybook/csf-plugin@npm:10.0.6" +"@storybook/csf-plugin@npm:10.3.0": + version: 10.3.0 + resolution: "@storybook/csf-plugin@npm:10.3.0" dependencies: unplugin: "npm:^2.3.5" peerDependencies: esbuild: "*" rollup: "*" - storybook: ^10.0.6 + storybook: ^10.3.0 vite: "*" webpack: "*" peerDependenciesMeta: @@ -3916,7 +3918,7 @@ __metadata: optional: true webpack: optional: true - checksum: 10c0/422286e7d2ef3f64ea2a71bdd1cad0bc3e850b31574f048529616eeb3cd0b1216b5d680c8b36bd300e31d141ad7781586cc7d57763babf993c31430b854491c4 + checksum: 10c0/59c1784257d313fb7298a34c079462ba0ad518f82369441e6432da1abdc47ecb16afc40bbb02fd1331183be10914d383ed1f68a6b431ea25019fd50b63453e7f languageName: node linkType: hard @@ -3927,16 +3929,6 @@ __metadata: languageName: node linkType: hard -"@storybook/icons@npm:^1.6.0": - version: 1.6.0 - resolution: "@storybook/icons@npm:1.6.0" - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - checksum: 10c0/bbec9201a78a730195f9cf377b15856dc414a54d04e30d16c379d062425cc617bfd0d6586ba1716012cfbdab461f0c9693a6a52920f9bd09c7b4291fb116f59c - languageName: node - linkType: hard - "@storybook/icons@npm:^2.0.1": version: 2.0.1 resolution: "@storybook/icons@npm:2.0.1" @@ -3947,25 +3939,25 @@ __metadata: languageName: node linkType: hard -"@storybook/react-dom-shim@npm:10.0.6": - version: 10.0.6 - resolution: "@storybook/react-dom-shim@npm:10.0.6" +"@storybook/react-dom-shim@npm:10.3.0": + version: 10.3.0 + resolution: "@storybook/react-dom-shim@npm:10.3.0" peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - storybook: ^10.0.6 - checksum: 10c0/067b86aeadc96d0fedccd3e047c4b506484e7b2af21796b995e97cd3f4f31d77f8a2674fb29f77b45245353cc714a4511f49fa618a7386ba12706c663701da08 + storybook: ^10.3.0 + checksum: 10c0/59690a34b39299853ae689e891b88b01dd3019b1b9da56aa9cfc318ccd3880ec3736ec2f36b08c924df6952e510ea62d2810c32d2fda5bb6db71d133b3c94984 languageName: node linkType: hard -"@storybook/react-vite@npm:^10.0.6": - version: 10.0.6 - resolution: "@storybook/react-vite@npm:10.0.6" +"@storybook/react-vite@npm:^10.3.0": + version: 10.3.0 + resolution: "@storybook/react-vite@npm:10.3.0" dependencies: - "@joshwooding/vite-plugin-react-docgen-typescript": "npm:0.6.1" + "@joshwooding/vite-plugin-react-docgen-typescript": "npm:^0.6.4" "@rollup/pluginutils": "npm:^5.0.2" - "@storybook/builder-vite": "npm:10.0.6" - "@storybook/react": "npm:10.0.6" + "@storybook/builder-vite": "npm:10.3.0" + "@storybook/react": "npm:10.3.0" empathic: "npm:^2.0.0" magic-string: "npm:^0.30.0" react-docgen: "npm:^8.0.0" @@ -3974,27 +3966,29 @@ __metadata: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - storybook: ^10.0.6 - vite: ^5.0.0 || ^6.0.0 || ^7.0.0 - checksum: 10c0/1689b7d866650912a8fe5ff2ec1c35292d408085d2d819f3a13055805f72d67b5c0fbeabe359de9a65f6f129500e20b935e832b280559afe5050b10432ccf6f2 + storybook: ^10.3.0 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + checksum: 10c0/ab000cb70698e971965d5970dd547579dc14428238055826b6d0d7069bb56fc5e6ce7dc22a0ee0f4c4b9c3f0c505a6c246367d5bedac0bc70720fee666a24d88 languageName: node linkType: hard -"@storybook/react@npm:10.0.6": - version: 10.0.6 - resolution: "@storybook/react@npm:10.0.6" +"@storybook/react@npm:10.3.0": + version: 10.3.0 + resolution: "@storybook/react@npm:10.3.0" dependencies: "@storybook/global": "npm:^5.0.0" - "@storybook/react-dom-shim": "npm:10.0.6" + "@storybook/react-dom-shim": "npm:10.3.0" + react-docgen: "npm:^8.0.2" + react-docgen-typescript: "npm:^2.2.2" peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - storybook: ^10.0.6 + storybook: ^10.3.0 typescript: ">= 4.9.x" peerDependenciesMeta: typescript: optional: true - checksum: 10c0/7545a3f84a64ccfacc84f41d4f4b744fb71861f1a413ba48e4440694fb89f591273182771324097c420fca65253d738bde852e14a776e5b1df30a0d4beb100b0 + checksum: 10c0/604414597b2093877b2ef5c9fc1d04d2b231a5cafdb1acc303b888fbf3c701c014642b20fa1f40048e3517bddd5b2e05f51427909f4c5475f1cecae768d352ab languageName: node linkType: hard @@ -4153,18 +4147,17 @@ __metadata: languageName: node linkType: hard -"@testing-library/jest-dom@npm:^6.6.3": - version: 6.6.3 - resolution: "@testing-library/jest-dom@npm:6.6.3" +"@testing-library/jest-dom@npm:^6.9.1": + version: 6.9.1 + resolution: "@testing-library/jest-dom@npm:6.9.1" dependencies: "@adobe/css-tools": "npm:^4.4.0" aria-query: "npm:^5.0.0" - chalk: "npm:^3.0.0" css.escape: "npm:^1.5.1" dom-accessibility-api: "npm:^0.6.3" - lodash: "npm:^4.17.21" + picocolors: "npm:^1.1.1" redent: "npm:^3.0.0" - checksum: 10c0/5566b6c0b7b0709bc244aec3aa3dc9e5f4663e8fb2b99d8cd456fc07279e59db6076cbf798f9d3099a98fca7ef4cd50e4e1f4c4dec5a60a8fad8d24a638a5bf6 + checksum: 10c0/4291ebd2f0f38d14cefac142c56c337941775a5807e2a3d6f1a14c2fbd6be76a18e498ed189e95bedc97d9e8cf1738049bc76c85b5bc5e23fae7c9e10f7b3a12 languageName: node linkType: hard @@ -4197,12 +4190,12 @@ __metadata: languageName: node linkType: hard -"@tybys/wasm-util@npm:^0.10.0": - version: 0.10.0 - resolution: "@tybys/wasm-util@npm:0.10.0" +"@tybys/wasm-util@npm:^0.10.0, @tybys/wasm-util@npm:^0.10.1": + version: 0.10.1 + resolution: "@tybys/wasm-util@npm:0.10.1" dependencies: tslib: "npm:^2.4.0" - checksum: 10c0/044feba55c1e2af703aa4946139969badb183ce1a659a75ed60bc195a90e73a3f3fc53bcd643497c9954597763ddb051fec62f80962b2ca6fc716ba897dc696e + checksum: 10c0/b255094f293794c6d2289300c5fbcafbb5532a3aed3a5ffd2f8dc1828e639b88d75f6a376dd8f94347a44813fd7a7149d8463477a9a49525c8b2dcaa38c2d1e8 languageName: node linkType: hard @@ -4213,7 +4206,7 @@ __metadata: languageName: node linkType: hard -"@types/babel__core@npm:*, @types/babel__core@npm:^7.18.0, @types/babel__core@npm:^7.20.5": +"@types/babel__core@npm:*, @types/babel__core@npm:^7.20.5": version: 7.20.5 resolution: "@types/babel__core@npm:7.20.5" dependencies: @@ -4254,12 +4247,12 @@ __metadata: languageName: node linkType: hard -"@types/babel__traverse@npm:*, @types/babel__traverse@npm:^7.18.0, @types/babel__traverse@npm:^7.20.6": - version: 7.20.7 - resolution: "@types/babel__traverse@npm:7.20.7" +"@types/babel__traverse@npm:*, @types/babel__traverse@npm:^7.20.6, @types/babel__traverse@npm:^7.20.7": + version: 7.28.0 + resolution: "@types/babel__traverse@npm:7.28.0" dependencies: - "@babel/types": "npm:^7.20.7" - checksum: 10c0/5386f0af44f8746b063b87418f06129a814e16bb2686965a575e9d7376b360b088b89177778d8c426012abc43dd1a2d8ec3218bfc382280c898682746ce2ffbd + "@babel/types": "npm:^7.28.2" + checksum: 10c0/b52d7d4e8fc6a9018fe7361c4062c1c190f5778cf2466817cb9ed19d69fbbb54f9a85ffedeb748ed8062d2cf7d4cc088ee739848f47c57740de1c48cbf0d0994 languageName: node linkType: hard @@ -4349,7 +4342,7 @@ __metadata: languageName: node linkType: hard -"@types/estree@npm:*, @types/estree@npm:1.0.8, @types/estree@npm:^1.0.0, @types/estree@npm:^1.0.6, @types/estree@npm:^1.0.8": +"@types/estree@npm:*, @types/estree@npm:^1.0.0, @types/estree@npm:^1.0.6, @types/estree@npm:^1.0.8": version: 1.0.8 resolution: "@types/estree@npm:1.0.8" checksum: 10c0/39d34d1afaa338ab9763f37ad6066e3f349444f9052b9676a7cc0252ef9485a41c6d81c9c4e0d26e9077993354edf25efc853f3224dd4b447175ef62bdcc86a5 @@ -5041,26 +5034,26 @@ __metadata: languageName: node linkType: hard -"@vitejs/plugin-legacy@npm:^7.2.1": - version: 7.2.1 - resolution: "@vitejs/plugin-legacy@npm:7.2.1" +"@vitejs/plugin-legacy@npm:^8.0.0": + version: 8.0.0 + resolution: "@vitejs/plugin-legacy@npm:8.0.0" dependencies: - "@babel/core": "npm:^7.28.0" + "@babel/core": "npm:^7.29.0" "@babel/plugin-transform-dynamic-import": "npm:^7.27.1" - "@babel/plugin-transform-modules-systemjs": "npm:^7.27.1" - "@babel/preset-env": "npm:^7.28.0" - babel-plugin-polyfill-corejs3: "npm:^0.13.0" - babel-plugin-polyfill-regenerator: "npm:^0.6.5" - browserslist: "npm:^4.25.1" + "@babel/plugin-transform-modules-systemjs": "npm:^7.29.0" + "@babel/preset-env": "npm:^7.29.0" + babel-plugin-polyfill-corejs3: "npm:^0.14.1" + babel-plugin-polyfill-regenerator: "npm:^0.6.7" + browserslist: "npm:^4.28.1" browserslist-to-esbuild: "npm:^2.1.1" - core-js: "npm:^3.45.0" - magic-string: "npm:^0.30.17" + core-js: "npm:^3.48.0" + magic-string: "npm:^0.30.21" regenerator-runtime: "npm:^0.14.1" systemjs: "npm:^6.15.1" peerDependencies: terser: ^5.16.0 - vite: ^7.0.0 - checksum: 10c0/bb9c14793c304ab84202a27218df4a71472ef8998c984121dcbc268b7dad8141d3c153f899794d5d62fed0e422ca756d24780e7da3f053e0ff87a37429808737 + vite: ^8.0.0 + checksum: 10c0/5b88d81ac1eb82aa607d9809f3df1354ee065095f5941b63b51d9aea2a73ba9cee8d08d7af944971b651dedf12fea931fec99baf9673fde54e2331abc8d709c9 languageName: node linkType: hard @@ -5080,63 +5073,62 @@ __metadata: languageName: node linkType: hard -"@vitest/browser-playwright@npm:^4.0.5": - version: 4.0.15 - resolution: "@vitest/browser-playwright@npm:4.0.15" +"@vitest/browser-playwright@npm:^4.1.0": + version: 4.1.0 + resolution: "@vitest/browser-playwright@npm:4.1.0" dependencies: - "@vitest/browser": "npm:4.0.15" - "@vitest/mocker": "npm:4.0.15" + "@vitest/browser": "npm:4.1.0" + "@vitest/mocker": "npm:4.1.0" tinyrainbow: "npm:^3.0.3" peerDependencies: playwright: "*" - vitest: 4.0.15 + vitest: 4.1.0 peerDependenciesMeta: playwright: optional: false - checksum: 10c0/ce357cc96b5d391fa701d545089475feac64e6febdce0d95a75e7c9c29ad35650372e6930a492750af2a4633f4f9354463968f435713da4f035befeb4e3ecf84 + checksum: 10c0/af2f6fc36eb56e3c1ac6e31b0ab2a2f4ca0bda86a306d0991b2f01047213fb191339b35775103af11ce1ef323ec72432eebe4bfeccd744d5e7c658716f1b985a languageName: node linkType: hard -"@vitest/browser@npm:4.0.15, @vitest/browser@npm:^4.0.5": - version: 4.0.15 - resolution: "@vitest/browser@npm:4.0.15" +"@vitest/browser@npm:4.1.0, @vitest/browser@npm:^4.1.0": + version: 4.1.0 + resolution: "@vitest/browser@npm:4.1.0" dependencies: - "@vitest/mocker": "npm:4.0.15" - "@vitest/utils": "npm:4.0.15" + "@blazediff/core": "npm:1.9.1" + "@vitest/mocker": "npm:4.1.0" + "@vitest/utils": "npm:4.1.0" 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" + ws: "npm:^8.19.0" peerDependencies: - vitest: 4.0.15 - checksum: 10c0/b74c1ab5b03a494b1a91e270417a794e616d3d9d5002de816b6a9913073fdf5939ca63b30a37e4e865cb9402b8682254facaf4b854d002b65b6ea85fccf38253 + vitest: 4.1.0 + checksum: 10c0/33b35cea63f392b6afafb6636bebe7ff0d234b1c120ec74a97462c7a7cbdbc67f415a5f0f95651f4074d53bfe12d4ff3ae8f16ba79045226df6365c77f950e18 languageName: node linkType: hard -"@vitest/coverage-v8@npm:^4.0.5": - version: 4.0.15 - resolution: "@vitest/coverage-v8@npm:4.0.15" +"@vitest/coverage-v8@npm:^4.1.0": + version: 4.1.0 + resolution: "@vitest/coverage-v8@npm:4.1.0" dependencies: "@bcoe/v8-coverage": "npm:^1.0.2" - "@vitest/utils": "npm:4.0.15" - ast-v8-to-istanbul: "npm:^0.3.8" + "@vitest/utils": "npm:4.1.0" + ast-v8-to-istanbul: "npm:^1.0.0" 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.5.1" + magicast: "npm:^0.5.2" obug: "npm:^2.1.1" - std-env: "npm:^3.10.0" + std-env: "npm:^4.0.0-rc.1" tinyrainbow: "npm:^3.0.3" peerDependencies: - "@vitest/browser": 4.0.15 - vitest: 4.0.15 + "@vitest/browser": 4.1.0 + vitest: 4.1.0 peerDependenciesMeta: "@vitest/browser": optional: true - checksum: 10c0/8810cb35fc443bdd5da46ea90804d7657d17ceb20dc9f7e05c7f6212480039c6079ec4ff0c305a658044b7cbd8792a71c7ae6661258fc5f3022e04bea04186a0 + checksum: 10c0/0bcbc9d20dd4c998ff76b82a721d6000f1300346b93cfc441f9012797a34be65bb73dc99451275d7f7dcb06b98856b4e5dc30b2c483051ec2320e9a89af14179 languageName: node linkType: hard @@ -5153,36 +5145,36 @@ __metadata: languageName: node linkType: hard -"@vitest/expect@npm:4.0.15": - version: 4.0.15 - resolution: "@vitest/expect@npm:4.0.15" +"@vitest/expect@npm:4.1.0": + version: 4.1.0 + resolution: "@vitest/expect@npm:4.1.0" dependencies: - "@standard-schema/spec": "npm:^1.0.0" + "@standard-schema/spec": "npm:^1.1.0" "@types/chai": "npm:^5.2.2" - "@vitest/spy": "npm:4.0.15" - "@vitest/utils": "npm:4.0.15" - chai: "npm:^6.2.1" + "@vitest/spy": "npm:4.1.0" + "@vitest/utils": "npm:4.1.0" + chai: "npm:^6.2.2" tinyrainbow: "npm:^3.0.3" - checksum: 10c0/0cb98a4918ca84b28cd14120bb66c1bc3084f8f95b649066cdab2f5234ecdbe247cdc6bc47c0d939521d964ff3c150aadd9558272495c26872c9f3a97373bf7b + checksum: 10c0/91cd7bb036401df5dfd9204f3de9a0afdb21dea6ee154622e5ed849e87a0df68b74258d490559c7046d3c03bc7aa634e9b0c166942a21d5e475c86c971486091 languageName: node linkType: hard -"@vitest/mocker@npm:4.0.15": - version: 4.0.15 - resolution: "@vitest/mocker@npm:4.0.15" +"@vitest/mocker@npm:4.1.0": + version: 4.1.0 + resolution: "@vitest/mocker@npm:4.1.0" dependencies: - "@vitest/spy": "npm:4.0.15" + "@vitest/spy": "npm:4.1.0" estree-walker: "npm:^3.0.3" magic-string: "npm:^0.30.21" peerDependencies: msw: ^2.4.9 - vite: ^6.0.0 || ^7.0.0-0 + vite: ^6.0.0 || ^7.0.0 || ^8.0.0-0 peerDependenciesMeta: msw: optional: true vite: optional: true - checksum: 10c0/7a164aa25daab3e92013ec95aab5c5778e805b1513e266ce6c00e0647eb9f7b281e33fcaf0d9d2aed88321079183b60c1aeab90961f618c24e2e3a5143308850 + checksum: 10c0/f61d3df6461008eb1e62ba465172207b29bd0d9866ff6bc88cd40fc99cd5d215ad89e2894ba6de87068e33f75de903b28a65ccc6074edf3de1fbead6a4a369cc languageName: node linkType: hard @@ -5195,33 +5187,34 @@ __metadata: languageName: node linkType: hard -"@vitest/pretty-format@npm:4.0.15": - version: 4.0.15 - resolution: "@vitest/pretty-format@npm:4.0.15" +"@vitest/pretty-format@npm:4.1.0": + version: 4.1.0 + resolution: "@vitest/pretty-format@npm:4.1.0" dependencies: tinyrainbow: "npm:^3.0.3" - checksum: 10c0/d863f3818627b198f9c66515f8faa200e76a1c30c7f2b25ac805e253204ae51abbfa6b6211c58b2d75e1a273a2e6925e3a8fa480ebfa9c479d75a19815e1cbea + checksum: 10c0/638077f53b5f24ff2d4bc062e69931fa718141db28ddafe435de98a402586b82e8c3cadfc580c0ad233d7f0203aa22d866ac2adca98b83038dbd5423c3d7fe27 languageName: node linkType: hard -"@vitest/runner@npm:4.0.15": - version: 4.0.15 - resolution: "@vitest/runner@npm:4.0.15" +"@vitest/runner@npm:4.1.0": + version: 4.1.0 + resolution: "@vitest/runner@npm:4.1.0" dependencies: - "@vitest/utils": "npm:4.0.15" + "@vitest/utils": "npm:4.1.0" pathe: "npm:^2.0.3" - checksum: 10c0/0b0f23b8fed1a98bb85d71a7fc105726e0fae68667b090c40b636011126fef548a5f853eab40aaf47314913ab6480eefe2aa5bd6bcefc4116e034fdc1ac0f7d0 + checksum: 10c0/9e09ca1b9070d3fe26c9bd48443d21b9fe2cb9abb2f694300bd9e5065f4e904f7322c07cd4bafadfed6fb11adfb50e4d1535f327ac6d24b6c373e92be90510bc languageName: node linkType: hard -"@vitest/snapshot@npm:4.0.15": - version: 4.0.15 - resolution: "@vitest/snapshot@npm:4.0.15" +"@vitest/snapshot@npm:4.1.0": + version: 4.1.0 + resolution: "@vitest/snapshot@npm:4.1.0" dependencies: - "@vitest/pretty-format": "npm:4.0.15" + "@vitest/pretty-format": "npm:4.1.0" + "@vitest/utils": "npm:4.1.0" magic-string: "npm:^0.30.21" pathe: "npm:^2.0.3" - checksum: 10c0/f05a19f74512cbad9bcfe4afe814c676b72b7e54ccf09c5b36e06e73614a24fdba47bdb8a94279162b7fdf83c9c840f557073a114a9339df7e75ccb9f4e99218 + checksum: 10c0/582c22988c47a99d93dd17ef660427fefe101f67ae4394b64fe58ec103ddc55fc5993626b4a2b556e0a38d40552abaca78196907455e794805ba197b3d56860f languageName: node linkType: hard @@ -5234,27 +5227,27 @@ __metadata: languageName: node linkType: hard -"@vitest/spy@npm:4.0.15": - version: 4.0.15 - resolution: "@vitest/spy@npm:4.0.15" - checksum: 10c0/22319cead44964882d9e7bd197a9cd317c945ff75a4a9baefe06c32c5719d4cb887e86b4560d79716765f288a93a6c76e78e3eeab0000f24b2236dab678b7c34 +"@vitest/spy@npm:4.1.0": + version: 4.1.0 + resolution: "@vitest/spy@npm:4.1.0" + checksum: 10c0/363776bbffda45af76ff500deacb9b1a35ad8b889462c1be9ebe5f29578ce1dd2c4bd7858c8188614a7db9699a5c802b7beb72e5a18ab5130a70326817961446 languageName: node linkType: hard -"@vitest/ui@npm:^4.0.5": - version: 4.0.15 - resolution: "@vitest/ui@npm:4.0.15" +"@vitest/ui@npm:^4.1.0": + version: 4.1.0 + resolution: "@vitest/ui@npm:4.1.0" dependencies: - "@vitest/utils": "npm:4.0.15" + "@vitest/utils": "npm:4.1.0" fflate: "npm:^0.8.2" - flatted: "npm:^3.3.3" + flatted: "npm:3.4.0" pathe: "npm:^2.0.3" sirv: "npm:^3.0.2" tinyglobby: "npm:^0.2.15" tinyrainbow: "npm:^3.0.3" peerDependencies: - vitest: 4.0.15 - checksum: 10c0/f6d1729de4d0ab43fbcc48aa1935315ab1c039fcf216abc01222e9170e0cb1829300a950952ca025ee9af0618fb4c24199cb1a912a76466c87a0eee86ed91d11 + vitest: 4.1.0 + checksum: 10c0/3629aadc120b992c80a18c32879358a40d936245ab987f64bd76cf6b13abb319b2ef9a029be69be7f6ea7f7ae9182e54f6d631fd57df32ba31060d6ae488048e languageName: node linkType: hard @@ -5269,13 +5262,14 @@ __metadata: languageName: node linkType: hard -"@vitest/utils@npm:4.0.15": - version: 4.0.15 - resolution: "@vitest/utils@npm:4.0.15" +"@vitest/utils@npm:4.1.0": + version: 4.1.0 + resolution: "@vitest/utils@npm:4.1.0" dependencies: - "@vitest/pretty-format": "npm:4.0.15" + "@vitest/pretty-format": "npm:4.1.0" + convert-source-map: "npm:^2.0.0" tinyrainbow: "npm:^3.0.3" - checksum: 10c0/2ef661c2c2359ae956087f0b728b6a0f7555cd10524a7def27909f320f6b8ba00560ee1bd856bf68d4debc01020cea21b200203a5d2af36c44e94528c5587aee + checksum: 10c0/222afbdef4f680a554bb6c3d946a4a879a441ebfb8597295cb7554d295e0e2624f3d4c2920b5767bbb8961a9f8a16756270ffc84032f5ea432cdce080ccab050 languageName: node linkType: hard @@ -5567,14 +5561,14 @@ __metadata: languageName: node linkType: hard -"ast-v8-to-istanbul@npm:^0.3.8": - version: 0.3.8 - resolution: "ast-v8-to-istanbul@npm:0.3.8" +"ast-v8-to-istanbul@npm:^1.0.0": + version: 1.0.0 + resolution: "ast-v8-to-istanbul@npm:1.0.0" dependencies: "@jridgewell/trace-mapping": "npm:^0.3.31" estree-walker: "npm:^3.0.3" - js-tokens: "npm:^9.0.1" - checksum: 10c0/6f7d74fc36011699af6d4ad88ecd8efc7d74bd90b8e8dbb1c69d43c8f4bec0ed361fb62a5b5bd98bbee02ee87c62cd8bcc25a39634964e45476bf5489dfa327f + js-tokens: "npm:^10.0.0" + checksum: 10c0/35e57b754ba63287358094d4f7ae8de2de27286fb4e76a1fbf28b2e67e3b670b59c3f511882473d0fd2cdbaa260062e3cd4f216b724c70032e2b09e5cebbd618 languageName: node linkType: hard @@ -5710,39 +5704,39 @@ __metadata: languageName: node linkType: hard -"babel-plugin-polyfill-corejs2@npm:^0.4.14": - version: 0.4.14 - resolution: "babel-plugin-polyfill-corejs2@npm:0.4.14" +"babel-plugin-polyfill-corejs2@npm:^0.4.15": + version: 0.4.17 + resolution: "babel-plugin-polyfill-corejs2@npm:0.4.17" dependencies: - "@babel/compat-data": "npm:^7.27.7" - "@babel/helper-define-polyfill-provider": "npm:^0.6.5" + "@babel/compat-data": "npm:^7.28.6" + "@babel/helper-define-polyfill-provider": "npm:^0.6.8" semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10c0/d74cba0600a6508e86d220bde7164eb528755d91be58020e5ea92ea7fbb12c9d8d2c29246525485adfe7f68ae02618ec428f9a589cac6cbedf53cc3972ad7fbe + checksum: 10c0/1284960ea403c63b0dd598f338666c4b17d489aefee30b4da6a7313eff1d91edffb0ccf26341a6e5d94231684b74e016eade66b3921ea112f8b0e4980fa08a5c languageName: node linkType: hard -"babel-plugin-polyfill-corejs3@npm:^0.13.0": - version: 0.13.0 - resolution: "babel-plugin-polyfill-corejs3@npm:0.13.0" +"babel-plugin-polyfill-corejs3@npm:^0.14.0, babel-plugin-polyfill-corejs3@npm:^0.14.1": + version: 0.14.2 + resolution: "babel-plugin-polyfill-corejs3@npm:0.14.2" dependencies: - "@babel/helper-define-polyfill-provider": "npm:^0.6.5" - core-js-compat: "npm:^3.43.0" + "@babel/helper-define-polyfill-provider": "npm:^0.6.8" + core-js-compat: "npm:^3.48.0" peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10c0/5d8e228da425edc040d8c868486fd01ba10b0440f841156a30d9f8986f330f723e2ee61553c180929519563ef5b64acce2caac36a5a847f095d708dda5d8206d + checksum: 10c0/32f70442f142d0f5607f4b57c121c573b106e09da8659c0f03108a85bf1d09ba5bdc89595a82b34ff76c19f1faf3d1c831b56166f03babf69c024f36da77c3bf languageName: node linkType: hard -"babel-plugin-polyfill-regenerator@npm:^0.6.5": - version: 0.6.5 - resolution: "babel-plugin-polyfill-regenerator@npm:0.6.5" +"babel-plugin-polyfill-regenerator@npm:^0.6.6, babel-plugin-polyfill-regenerator@npm:^0.6.7": + version: 0.6.8 + resolution: "babel-plugin-polyfill-regenerator@npm:0.6.8" dependencies: - "@babel/helper-define-polyfill-provider": "npm:^0.6.5" + "@babel/helper-define-polyfill-provider": "npm:^0.6.8" peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10c0/63aa8ed716df6a9277c6ab42b887858fa9f57a70cc1d0ae2b91bdf081e45d4502848cba306fb60b02f59f99b32fd02ff4753b373cac48ccdac9b7d19dd56f06d + checksum: 10c0/7c8b2497c29fa880e0acdc8e7b93e29b81b154179b83beb0476eb2c4e7a78b6b42fc35c2554ca250c9bd6d39941eaf75416254b8592ce50979f9a12e1d51c049 languageName: node linkType: hard @@ -5767,6 +5761,13 @@ __metadata: languageName: node linkType: hard +"balanced-match@npm:^4.0.2": + version: 4.0.4 + resolution: "balanced-match@npm:4.0.4" + checksum: 10c0/07e86102a3eb2ee2a6a1a89164f29d0dbaebd28f2ca3f5ca786f36b8b23d9e417eb3be45a4acf754f837be5ac0a2317de90d3fcb7f4f4dc95720a1f36b26a17b + languageName: node + linkType: hard + "baseline-browser-mapping@npm:^2.9.0": version: 2.9.2 resolution: "baseline-browser-mapping@npm:2.9.2" @@ -5842,6 +5843,15 @@ __metadata: languageName: node linkType: hard +"brace-expansion@npm:^5.0.2": + version: 5.0.4 + resolution: "brace-expansion@npm:5.0.4" + dependencies: + balanced-match: "npm:^4.0.2" + checksum: 10c0/359cbcfa80b2eb914ca1f3440e92313fbfe7919ee6b274c35db55bec555aded69dac5ee78f102cec90c35f98c20fa43d10936d0cd9978158823c249257e1643a + languageName: node + linkType: hard + "braces@npm:^3.0.3": version: 3.0.3 resolution: "braces@npm:3.0.3" @@ -5864,7 +5874,7 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.24.0, browserslist@npm:^4.25.1, browserslist@npm:^4.28.1": +"browserslist@npm:^4.24.0, browserslist@npm:^4.28.1": version: 4.28.1 resolution: "browserslist@npm:4.28.1" dependencies: @@ -6011,20 +6021,10 @@ __metadata: languageName: node linkType: hard -"chai@npm:^6.2.1": - version: 6.2.1 - resolution: "chai@npm:6.2.1" - checksum: 10c0/0c2d84392d7c6d44ca5d14d94204f1760e22af68b83d1f4278b5c4d301dabfc0242da70954dd86b1eda01e438f42950de6cf9d569df2103678538e4014abe50b - languageName: node - linkType: hard - -"chalk@npm:^3.0.0": - version: 3.0.0 - resolution: "chalk@npm:3.0.0" - dependencies: - ansi-styles: "npm:^4.1.0" - supports-color: "npm:^7.1.0" - checksum: 10c0/ee650b0a065b3d7a6fda258e75d3a86fc8e4effa55871da730a9e42ccb035bf5fd203525e5a1ef45ec2582ecc4f65b47eb11357c526b84dd29a14fb162c414d2 +"chai@npm:^6.2.2": + version: 6.2.2 + resolution: "chai@npm:6.2.2" + checksum: 10c0/e6c69e5f0c11dffe6ea13d0290936ebb68fcc1ad688b8e952e131df6a6d5797d5e860bc55cef1aca2e950c3e1f96daf79e9d5a70fb7dbaab4e46355e2635ed53 languageName: node linkType: hard @@ -6131,6 +6131,17 @@ __metadata: languageName: node linkType: hard +"cliui@npm:^9.0.1": + version: 9.0.1 + resolution: "cliui@npm:9.0.1" + dependencies: + string-width: "npm:^7.2.0" + strip-ansi: "npm:^7.1.0" + wrap-ansi: "npm:^9.0.0" + checksum: 10c0/13441832e9efe7c7a76bd2b8e683555c478d461a9f249dc5db9b17fe8d4b47fa9277b503914b90bd00e4a151abb6b9b02b2288972ffe2e5e3ca40bcb1c2330d3 + languageName: node + linkType: hard + "cluster-key-slot@npm:^1.1.0": version: 1.1.2 resolution: "cluster-key-slot@npm:1.1.2" @@ -6286,12 +6297,12 @@ __metadata: languageName: node linkType: hard -"core-js-compat@npm:^3.43.0": - version: 3.44.0 - resolution: "core-js-compat@npm:3.44.0" +"core-js-compat@npm:^3.48.0": + version: 3.49.0 + resolution: "core-js-compat@npm:3.49.0" dependencies: - browserslist: "npm:^4.25.1" - checksum: 10c0/5de4b042b8bb232b8390be3079030de5c7354610f136ed3eb91310a44455a78df02cfcf49b2fd05d5a5aa2695460620abf1b400784715f7482ed4770d40a68b2 + browserslist: "npm:^4.28.1" + checksum: 10c0/546e64b7ce45f724825bc13c1347f35c0459a6e71c0dcccff3ec21fbff463f5b0b97fc1220e6d90302153863489301793276fe2bf96f46001ff555ead4140308 languageName: node linkType: hard @@ -6302,7 +6313,7 @@ __metadata: languageName: node linkType: hard -"core-js@npm:^3.30.2, core-js@npm:^3.45.0": +"core-js@npm:^3.30.2, core-js@npm:^3.48.0": version: 3.49.0 resolution: "core-js@npm:3.49.0" checksum: 10c0/2e42edb47eda38fd5368380131623c8aa5d4a6b42164125b17744bdc08fa5ebbbdd06b4b4aa6ca3663470a560b0f2fba48e18f142dfe264b0039df85bc625694 @@ -6534,7 +6545,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.3.5, debug@npm:^4.3.6, debug@npm:^4.4.0, debug@npm:^4.4.1, debug@npm:^4.4.3": +"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.3.5, debug@npm:^4.3.6, debug@npm:^4.4.0, debug@npm:^4.4.1, debug@npm:^4.4.3": version: 4.4.3 resolution: "debug@npm:4.4.3" dependencies: @@ -6590,13 +6601,13 @@ __metadata: languageName: node linkType: hard -"default-browser@npm:^5.2.1": - version: 5.4.0 - resolution: "default-browser@npm:5.4.0" +"default-browser@npm:^5.2.1, default-browser@npm:^5.4.0": + version: 5.5.0 + resolution: "default-browser@npm:5.5.0" dependencies: bundle-name: "npm:^4.1.0" default-browser-id: "npm:^5.0.0" - checksum: 10c0/a49ddd0c7b1a319163f64a5fc68ebb45a98548ea23a3155e04518f026173d85cfa2f451b646366c36c8f70b01e4cb773e23d1d22d2c61d8b84e5fbf151b4b609 + checksum: 10c0/576593b617b17a7223014b4571bfe1c06a2581a4eb8b130985d90d253afa3f40999caec70eb0e5776e80d4af6a41cce91018cd3f86e57ad578bf59e46fb19abe languageName: node linkType: hard @@ -6611,13 +6622,6 @@ __metadata: languageName: node linkType: hard -"define-lazy-prop@npm:^2.0.0": - version: 2.0.0 - resolution: "define-lazy-prop@npm:2.0.0" - checksum: 10c0/db6c63864a9d3b7dc9def55d52764968a5af296de87c1b2cc71d8be8142e445208071953649e0386a8cc37cfcf9a2067a47207f1eb9ff250c2a269658fdae422 - languageName: node - linkType: hard - "define-lazy-prop@npm:^3.0.0": version: 3.0.0 resolution: "define-lazy-prop@npm:3.0.0" @@ -6689,6 +6693,13 @@ __metadata: languageName: node linkType: hard +"detect-libc@npm:^2.0.3": + version: 2.1.2 + resolution: "detect-libc@npm:2.1.2" + checksum: 10c0/acc675c29a5649fa1fb6e255f993b8ee829e510b6b56b0910666949c80c364738833417d0edb5f90e4e46be17228b0f2b66a010513984e18b15deeeac49369c4 + languageName: node + linkType: hard + "detect-passive-events@npm:^2.0.3": version: 2.0.3 resolution: "detect-passive-events@npm:2.0.3" @@ -7060,10 +7071,10 @@ __metadata: languageName: node linkType: hard -"es-module-lexer@npm:^1.7.0": - version: 1.7.0 - resolution: "es-module-lexer@npm:1.7.0" - checksum: 10c0/4c935affcbfeba7fb4533e1da10fa8568043df1e3574b869385980de9e2d475ddc36769891936dbb07036edb3c3786a8b78ccf44964cd130dedc1f2c984b6c7b +"es-module-lexer@npm:^2.0.0": + version: 2.0.0 + resolution: "es-module-lexer@npm:2.0.0" + checksum: 10c0/ae78dbbd43035a4b972c46cfb6877e374ea290adfc62bc2f5a083fea242c0b2baaab25c5886af86be55f092f4a326741cb94334cd3c478c383fdc8a9ec5ff817 languageName: node linkType: hard @@ -7108,7 +7119,7 @@ __metadata: languageName: node linkType: hard -"esbuild@npm:^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0 || ^0.26.0 || ^0.27.0, esbuild@npm:^0.27.0": +"esbuild@npm:^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0 || ^0.26.0 || ^0.27.0": version: 0.27.2 resolution: "esbuild@npm:0.27.2" dependencies: @@ -7624,10 +7635,10 @@ __metadata: languageName: node linkType: hard -"expect-type@npm:^1.2.2": - version: 1.2.2 - resolution: "expect-type@npm:1.2.2" - checksum: 10c0/6019019566063bbc7a690d9281d920b1a91284a4a093c2d55d71ffade5ac890cf37a51e1da4602546c4b56569d2ad2fc175a2ccee77d1ae06cb3af91ef84f44b +"expect-type@npm:^1.3.0": + version: 1.3.0 + resolution: "expect-type@npm:1.3.0" + checksum: 10c0/8412b3fe4f392c420ab41dae220b09700e4e47c639a29ba7ba2e83cc6cffd2b4926f7ac9e47d7e277e8f4f02acda76fd6931cb81fd2b382fa9477ef9ada953fd languageName: node linkType: hard @@ -7866,10 +7877,10 @@ __metadata: languageName: node linkType: hard -"flatted@npm:^3.2.9, flatted@npm:^3.3.3": - version: 3.3.3 - resolution: "flatted@npm:3.3.3" - checksum: 10c0/e957a1c6b0254aa15b8cce8533e24165abd98fadc98575db082b786b5da1b7d72062b81bfdcd1da2f4d46b6ed93bec2434e62333e9b4261d79ef2e75a10dd538 +"flatted@npm:3.4.0, flatted@npm:^3.2.9, flatted@npm:^3.3.3": + version: 3.4.0 + resolution: "flatted@npm:3.4.0" + checksum: 10c0/033b0d28dc7c11c20cdddfef160647d37ee6f49cac265e6315d7c172a8a518a971316938d49c72cce3e20bddd40f1bae1455a5cba29f9741fcfb0af4d3491fa4 languageName: node linkType: hard @@ -8131,7 +8142,7 @@ __metadata: languageName: node linkType: hard -"glob@npm:^10.0.0, glob@npm:^10.2.2": +"glob@npm:^10.2.2": version: 10.5.0 resolution: "glob@npm:10.5.0" dependencies: @@ -8163,6 +8174,17 @@ __metadata: languageName: node linkType: hard +"glob@npm:^13.0.1": + version: 13.0.6 + resolution: "glob@npm:13.0.6" + dependencies: + minimatch: "npm:^10.2.2" + minipass: "npm:^7.1.3" + path-scurry: "npm:^2.0.2" + checksum: 10c0/269c236f11a9b50357fe7a8c6aadac667e01deb5242b19c84975628f05f4438d8ee1354bb62c5d6c10f37fd59911b54d7799730633a2786660d8c69f1d18120a + languageName: node + linkType: hard + "glob@npm:^7.1.6": version: 7.2.3 resolution: "glob@npm:7.2.3" @@ -8242,13 +8264,6 @@ __metadata: languageName: node linkType: hard -"globrex@npm:^0.1.2": - version: 0.1.2 - resolution: "globrex@npm:0.1.2" - checksum: 10c0/a54c029520cf58bda1d8884f72bd49b4cd74e977883268d931fd83bcbd1a9eb96d57c7dbd4ad80148fb9247467ebfb9b215630b2ed7563b2a8de02e1ff7f89d1 - languageName: node - linkType: hard - "gopd@npm:^1.0.1, gopd@npm:^1.2.0": version: 1.2.0 resolution: "gopd@npm:1.2.0" @@ -8775,7 +8790,7 @@ __metadata: languageName: node linkType: hard -"is-core-module@npm:^2.13.0, is-core-module@npm:^2.16.0, is-core-module@npm:^2.16.1": +"is-core-module@npm:^2.13.0, is-core-module@npm:^2.16.1": version: 2.16.1 resolution: "is-core-module@npm:2.16.1" dependencies: @@ -8805,15 +8820,6 @@ __metadata: languageName: node linkType: hard -"is-docker@npm:^2.0.0, is-docker@npm:^2.1.1": - version: 2.2.1 - resolution: "is-docker@npm:2.2.1" - bin: - is-docker: cli.js - checksum: 10c0/e828365958d155f90c409cdbe958f64051d99e8aedc2c8c4cd7c89dcf35329daed42f7b99346f7828df013e27deb8f721cf9408ba878c76eb9e8290235fbcdcc - languageName: node - linkType: hard - "is-docker@npm:^3.0.0": version: 3.0.0 resolution: "is-docker@npm:3.0.0" @@ -8873,6 +8879,13 @@ __metadata: languageName: node linkType: hard +"is-in-ssh@npm:^1.0.0": + version: 1.0.0 + resolution: "is-in-ssh@npm:1.0.0" + checksum: 10c0/fbb4c25d85c543df09997fbe7aeca410ae0c839c5825bba2d4c672df765e9ce0e7558e781b371c0a21d6ef9bbac39b31875617a68eaaea5504438d07db9a2ffa + languageName: node + linkType: hard + "is-inside-container@npm:^1.0.0": version: 1.0.0 resolution: "is-inside-container@npm:1.0.0" @@ -9076,15 +9089,6 @@ __metadata: languageName: node linkType: hard -"is-wsl@npm:^2.2.0": - version: 2.2.0 - resolution: "is-wsl@npm:2.2.0" - dependencies: - is-docker: "npm:^2.0.0" - checksum: 10c0/a6fa2d370d21be487c0165c7a440d567274fbba1a817f2f0bfa41cc5e3af25041d84267baa22df66696956038a43973e72fca117918c91431920bdef490fa25e - languageName: node - linkType: hard - "is-wsl@npm:^3.1.0": version: 3.1.0 resolution: "is-wsl@npm:3.1.0" @@ -9140,17 +9144,6 @@ __metadata: languageName: node linkType: hard -"istanbul-lib-source-maps@npm:^5.0.6": - version: 5.0.6 - resolution: "istanbul-lib-source-maps@npm:5.0.6" - dependencies: - "@jridgewell/trace-mapping": "npm:^0.3.23" - debug: "npm:^4.1.1" - istanbul-lib-coverage: "npm:^3.0.0" - checksum: 10c0/ffe75d70b303a3621ee4671554f306e0831b16f39ab7f4ab52e54d356a5d33e534d97563e318f1333a6aae1d42f91ec49c76b6cd3f3fb378addcb5c81da0255f - languageName: node - linkType: hard - "istanbul-reports@npm:^3.2.0": version: 3.2.0 resolution: "istanbul-reports@npm:3.2.0" @@ -9218,6 +9211,13 @@ __metadata: languageName: node linkType: hard +"js-tokens@npm:^10.0.0": + version: 10.0.0 + resolution: "js-tokens@npm:10.0.0" + checksum: 10c0/a93498747812ba3e0c8626f95f75ab29319f2a13613a0de9e610700405760931624433a0de59eb7c27ff8836e526768fb20783861b86ef89be96676f2c996b64 + languageName: node + linkType: hard + "js-tokens@npm:^3.0.0 || ^4.0.0, js-tokens@npm:^4.0.0": version: 4.0.0 resolution: "js-tokens@npm:4.0.0" @@ -9225,13 +9225,6 @@ __metadata: languageName: node linkType: hard -"js-tokens@npm:^9.0.1": - version: 9.0.1 - resolution: "js-tokens@npm:9.0.1" - checksum: 10c0/68dcab8f233dde211a6b5fd98079783cbcd04b53617c1250e3553ee16ab3e6134f5e65478e41d82f6d351a052a63d71024553933808570f04dbf828d7921e80e - languageName: node - linkType: hard - "js-yaml@npm:^4.1.0": version: 4.1.1 resolution: "js-yaml@npm:4.1.1" @@ -9251,11 +9244,11 @@ __metadata: linkType: hard "jsdom@npm:^29.0.0": - version: 29.0.0 - resolution: "jsdom@npm:29.0.0" + version: 29.0.1 + resolution: "jsdom@npm:29.0.1" dependencies: "@asamuzakjp/css-color": "npm:^5.0.1" - "@asamuzakjp/dom-selector": "npm:^7.0.2" + "@asamuzakjp/dom-selector": "npm:^7.0.3" "@bramus/specificity": "npm:^2.4.2" "@csstools/css-syntax-patches-for-csstree": "npm:^1.1.1" "@exodus/bytes": "npm:^1.15.0" @@ -9269,7 +9262,7 @@ __metadata: saxes: "npm:^6.0.0" symbol-tree: "npm:^3.2.4" tough-cookie: "npm:^6.0.1" - undici: "npm:^7.24.3" + undici: "npm:^7.24.5" w3c-xmlserializer: "npm:^5.0.0" webidl-conversions: "npm:^8.0.1" whatwg-mimetype: "npm:^5.0.0" @@ -9280,16 +9273,16 @@ __metadata: peerDependenciesMeta: canvas: optional: true - checksum: 10c0/8bbb4f89bfb7013a729bf50419fa5878086b52068a5d3836b51b99be5faf7cf9f871818954d468ce1f2f1c6b86d16af6ed5167f4084f7df7de517b104b451454 + checksum: 10c0/f8eeadc9bb45fb5736501f855b5f8247c9eadcd7f52ef2e11677c3a2197284051b4623004889543eb9613ecdfb47ddb5405b822d9623b0524edd901288cc361d languageName: node linkType: hard -"jsesc@npm:^3.0.2, jsesc@npm:~3.0.2": - version: 3.0.2 - resolution: "jsesc@npm:3.0.2" +"jsesc@npm:^3.0.2, jsesc@npm:~3.1.0": + version: 3.1.0 + resolution: "jsesc@npm:3.1.0" bin: jsesc: bin/jsesc - checksum: 10c0/ef22148f9e793180b14d8a145ee6f9f60f301abf443288117b4b6c53d0ecd58354898dc506ccbb553a5f7827965cd38bc5fb726575aae93c5e8915e2de8290e1 + checksum: 10c0/531779df5ec94f47e462da26b4cbf05eb88a83d9f08aac2ba04206508fc598527a153d08bd462bae82fc78b3eaa1a908e1a4a79f886e9238641c4cdefaf118b1 languageName: node linkType: hard @@ -9432,13 +9425,6 @@ __metadata: languageName: node linkType: hard -"kleur@npm:^3.0.3": - version: 3.0.3 - resolution: "kleur@npm:3.0.3" - checksum: 10c0/cd3a0b8878e7d6d3799e54340efe3591ca787d9f95f109f28129bdd2915e37807bf8918bb295ab86afb8c82196beec5a1adcaf29042ce3f2bd932b038fe3aa4b - languageName: node - linkType: hard - "known-css-properties@npm:^0.37.0": version: 0.37.0 resolution: "known-css-properties@npm:0.37.0" @@ -9523,6 +9509,126 @@ __metadata: languageName: node linkType: hard +"lightningcss-android-arm64@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-android-arm64@npm:1.32.0" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"lightningcss-darwin-arm64@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-darwin-arm64@npm:1.32.0" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"lightningcss-darwin-x64@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-darwin-x64@npm:1.32.0" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"lightningcss-freebsd-x64@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-freebsd-x64@npm:1.32.0" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"lightningcss-linux-arm-gnueabihf@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-linux-arm-gnueabihf@npm:1.32.0" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"lightningcss-linux-arm64-gnu@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-linux-arm64-gnu@npm:1.32.0" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"lightningcss-linux-arm64-musl@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-linux-arm64-musl@npm:1.32.0" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"lightningcss-linux-x64-gnu@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-linux-x64-gnu@npm:1.32.0" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"lightningcss-linux-x64-musl@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-linux-x64-musl@npm:1.32.0" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"lightningcss-win32-arm64-msvc@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-win32-arm64-msvc@npm:1.32.0" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"lightningcss-win32-x64-msvc@npm:1.32.0": + version: 1.32.0 + resolution: "lightningcss-win32-x64-msvc@npm:1.32.0" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"lightningcss@npm:^1.32.0": + version: 1.32.0 + resolution: "lightningcss@npm:1.32.0" + dependencies: + detect-libc: "npm:^2.0.3" + lightningcss-android-arm64: "npm:1.32.0" + lightningcss-darwin-arm64: "npm:1.32.0" + lightningcss-darwin-x64: "npm:1.32.0" + lightningcss-freebsd-x64: "npm:1.32.0" + lightningcss-linux-arm-gnueabihf: "npm:1.32.0" + lightningcss-linux-arm64-gnu: "npm:1.32.0" + lightningcss-linux-arm64-musl: "npm:1.32.0" + lightningcss-linux-x64-gnu: "npm:1.32.0" + lightningcss-linux-x64-musl: "npm:1.32.0" + lightningcss-win32-arm64-msvc: "npm:1.32.0" + lightningcss-win32-x64-msvc: "npm:1.32.0" + dependenciesMeta: + lightningcss-android-arm64: + optional: true + lightningcss-darwin-arm64: + optional: true + lightningcss-darwin-x64: + optional: true + lightningcss-freebsd-x64: + optional: true + lightningcss-linux-arm-gnueabihf: + optional: true + lightningcss-linux-arm64-gnu: + optional: true + lightningcss-linux-arm64-musl: + optional: true + lightningcss-linux-x64-gnu: + optional: true + lightningcss-linux-x64-musl: + optional: true + lightningcss-win32-arm64-msvc: + optional: true + lightningcss-win32-x64-msvc: + optional: true + checksum: 10c0/70945bd55097af46fc9fab7f5ed09cd5869d85940a2acab7ee06d0117004a1d68155708a2d462531cea2fc3c67aefc9333a7068c80b0b78dd404c16838809e03 + languageName: node + linkType: hard + "lilconfig@npm:^2.0.5": version: 2.1.0 resolution: "lilconfig@npm:2.1.0" @@ -9714,7 +9820,7 @@ __metadata: languageName: node linkType: hard -"magic-string@npm:^0.30.0, magic-string@npm:^0.30.17, magic-string@npm:^0.30.21, magic-string@npm:~0.30.11": +"magic-string@npm:^0.30.0, magic-string@npm:^0.30.21, magic-string@npm:~0.30.11": version: 0.30.21 resolution: "magic-string@npm:0.30.21" dependencies: @@ -9723,14 +9829,14 @@ __metadata: languageName: node linkType: hard -"magicast@npm:^0.5.1": - version: 0.5.1 - resolution: "magicast@npm:0.5.1" +"magicast@npm:^0.5.2": + version: 0.5.2 + resolution: "magicast@npm:0.5.2" dependencies: - "@babel/parser": "npm:^7.28.5" - "@babel/types": "npm:^7.28.5" + "@babel/parser": "npm:^7.29.0" + "@babel/types": "npm:^7.29.0" source-map-js: "npm:^1.2.1" - checksum: 10c0/a00bbf3688b9b3e83c10b3bfe3f106cc2ccbf20c4f2dc1c9020a10556dfe0a6a6605a445ee8e86a6e2b484ec519a657b5e405532684f72678c62e4c0d32f962c + checksum: 10c0/924af677643c5a0a7d6cdb3247c0eb96fa7611b2ba6a5e720d35d81c503d3d9f5948eb5227f80f90f82ea3e7d38cffd10bb988f3fc09020db428e14f26e960d7 languageName: node linkType: hard @@ -9907,12 +10013,12 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^10.1.1": - version: 10.1.1 - resolution: "minimatch@npm:10.1.1" +"minimatch@npm:^10.1.1, minimatch@npm:^10.2.2": + version: 10.2.4 + resolution: "minimatch@npm:10.2.4" dependencies: - "@isaacs/brace-expansion": "npm:^5.0.0" - checksum: 10c0/c85d44821c71973d636091fddbfbffe62370f5ee3caf0241c5b60c18cd289e916200acb2361b7e987558cd06896d153e25d505db9fc1e43e6b4b6752e2702902 + brace-expansion: "npm:^5.0.2" + checksum: 10c0/35f3dfb7b99b51efd46afd378486889f590e7efb10e0f6a10ba6800428cf65c9a8dedb74427d0570b318d749b543dc4e85f06d46d2858bc8cac7e1eb49a95945 languageName: node linkType: hard @@ -10010,10 +10116,10 @@ __metadata: languageName: node linkType: hard -"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.0.4, minipass@npm:^7.1.2": - version: 7.1.2 - resolution: "minipass@npm:7.1.2" - checksum: 10c0/b0fd20bb9fb56e5fa9a8bfac539e8915ae07430a619e4b86ff71f5fc757ef3924b23b2c4230393af1eda647ed3d75739e4e0acb250a6b1eb277cf7f8fe449557 +"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.0.4, minipass@npm:^7.1.2, minipass@npm:^7.1.3": + version: 7.1.3 + resolution: "minipass@npm:7.1.3" + checksum: 10c0/539da88daca16533211ea5a9ee98dc62ff5742f531f54640dd34429e621955e91cc280a91a776026264b7f9f6735947629f920944e9c1558369e8bf22eb33fbb languageName: node linkType: hard @@ -10389,14 +10495,17 @@ __metadata: languageName: node linkType: hard -"open@npm:^8.0.0": - version: 8.4.2 - resolution: "open@npm:8.4.2" +"open@npm:^11.0.0": + version: 11.0.0 + resolution: "open@npm:11.0.0" dependencies: - define-lazy-prop: "npm:^2.0.0" - is-docker: "npm:^2.1.1" - is-wsl: "npm:^2.2.0" - checksum: 10c0/bb6b3a58401dacdb0aad14360626faf3fb7fba4b77816b373495988b724fb48941cad80c1b65d62bb31a17609b2cd91c41a181602caea597ca80dfbcc27e84c9 + default-browser: "npm:^5.4.0" + define-lazy-prop: "npm:^3.0.0" + is-in-ssh: "npm:^1.0.0" + is-inside-container: "npm:^1.0.0" + powershell-utils: "npm:^0.1.0" + wsl-utils: "npm:^0.3.0" + checksum: 10c0/7aeeda4131268ed90f90e7728dda5c46bb0c6205b27a4be3e86ea33593e30dd393423e20e31c00802a8e635ef59becaee33ef9749a8ceb027567cd253e9e7b1e languageName: node linkType: hard @@ -10654,13 +10763,13 @@ __metadata: languageName: node linkType: hard -"path-scurry@npm:^2.0.0": - version: 2.0.1 - resolution: "path-scurry@npm:2.0.1" +"path-scurry@npm:^2.0.0, path-scurry@npm:^2.0.2": + version: 2.0.2 + resolution: "path-scurry@npm:2.0.2" dependencies: lru-cache: "npm:^11.0.0" minipass: "npm:^7.1.2" - checksum: 10c0/2a16ed0e81fbc43513e245aa5763354e25e787dab0d539581a6c3f0f967461a159ed6236b2559de23aa5b88e7dc32b469b6c47568833dd142a4b24b4f5cd2620 + checksum: 10c0/b35ad37cf6557a87fd057121ce2be7695380c9138d93e87ae928609da259ea0a170fac6f3ef1eb3ece8a068e8b7f2f3adf5bb2374cf4d4a57fe484954fcc9482 languageName: node linkType: hard @@ -10898,17 +11007,6 @@ __metadata: languageName: node linkType: hard -"pixelmatch@npm:7.1.0": - version: 7.1.0 - resolution: "pixelmatch@npm:7.1.0" - dependencies: - pngjs: "npm:^7.0.0" - bin: - pixelmatch: bin/pixelmatch - checksum: 10c0/ff069f92edaa841ac9b58b0ab74e1afa1f3b5e770eea0218c96bac1da4e752f5f6b79a0f9c4ba6b02afb955d39b8c78bcc3cc884f8122b67a1f2efbbccbe1a73 - languageName: node - linkType: hard - "playwright-core@npm:1.57.0": version: 1.57.0 resolution: "playwright-core@npm:1.57.0" @@ -11420,14 +11518,14 @@ __metadata: languageName: node linkType: hard -"postcss@npm:^8.0.0, postcss@npm:^8.4.35, postcss@npm:^8.5.6": - version: 8.5.6 - resolution: "postcss@npm:8.5.6" +"postcss@npm:^8.0.0, postcss@npm:^8.4.35, postcss@npm:^8.5.6, postcss@npm:^8.5.8": + version: 8.5.8 + resolution: "postcss@npm:8.5.8" dependencies: nanoid: "npm:^3.3.11" picocolors: "npm:^1.1.1" source-map-js: "npm:^1.2.1" - checksum: 10c0/5127cc7c91ed7a133a1b7318012d8bfa112da9ef092dddf369ae699a1f10ebbd89b1b9f25f3228795b84585c72aabd5ced5fc11f2ba467eedf7b081a66fad024 + checksum: 10c0/dd918f7127ee7c60a0295bae2e72b3787892296e1d1c3c564d7a2a00c68d8df83cadc3178491259daa19ccc54804fb71ed8c937c6787e08d8bd4bedf8d17044c languageName: node linkType: hard @@ -11461,6 +11559,13 @@ __metadata: languageName: node linkType: hard +"powershell-utils@npm:^0.1.0": + version: 0.1.0 + resolution: "powershell-utils@npm:0.1.0" + checksum: 10c0/a64713cf3583259c9ed6be211c06b4b19e8608bcb0f7f6287ffac0a95b8c7582b6b662eea0e201fd659492c8e9f9c5fd0bfc4579645c5add9c1a600075621c95 + languageName: node + linkType: hard + "prelude-ls@npm:^1.2.1": version: 1.2.1 resolution: "prelude-ls@npm:1.2.1" @@ -11527,16 +11632,6 @@ __metadata: languageName: node linkType: hard -"prompts@npm:^2.4.0": - version: 2.4.2 - resolution: "prompts@npm:2.4.2" - dependencies: - kleur: "npm:^3.0.3" - sisteransi: "npm:^1.0.5" - checksum: 10c0/16f1ac2977b19fe2cf53f8411cc98db7a3c8b115c479b2ca5c82b5527cd937aa405fa04f9a5960abeb9daef53191b53b4d13e35c1f5d50e8718c76917c5f1ea4 - languageName: node - linkType: hard - "prop-types@npm:^15.5.10, prop-types@npm:^15.6.0, prop-types@npm:^15.6.2, prop-types@npm:^15.7.2, prop-types@npm:^15.8.1": version: 15.8.1 resolution: "prop-types@npm:15.8.1" @@ -11665,21 +11760,21 @@ __metadata: languageName: node linkType: hard -"react-docgen@npm:^8.0.0": - version: 8.0.0 - resolution: "react-docgen@npm:8.0.0" +"react-docgen@npm:^8.0.0, react-docgen@npm:^8.0.2": + version: 8.0.3 + resolution: "react-docgen@npm:8.0.3" dependencies: - "@babel/core": "npm:^7.18.9" - "@babel/traverse": "npm:^7.18.9" - "@babel/types": "npm:^7.18.9" - "@types/babel__core": "npm:^7.18.0" - "@types/babel__traverse": "npm:^7.18.0" + "@babel/core": "npm:^7.28.0" + "@babel/traverse": "npm:^7.28.0" + "@babel/types": "npm:^7.28.2" + "@types/babel__core": "npm:^7.20.5" + "@types/babel__traverse": "npm:^7.20.7" "@types/doctrine": "npm:^0.0.9" "@types/resolve": "npm:^1.20.2" doctrine: "npm:^3.0.0" resolve: "npm:^1.22.1" strip-indent: "npm:^4.0.0" - checksum: 10c0/2e3c187bed074895ac3420910129f23b30fe8f7faf984cbf6e210dd3914fa03a910583c5a4c4564edbef7461c37dfd6cd967c3bfc5d83c6f8c02cacedda38014 + checksum: 10c0/0231fb9177bc7c633f3d1f228eebb0ee90a2f0feac50b1869ef70b0a3683b400d7875547a2d5168f2619b63d4cc29d7c45ae33d3f621fc67a7fa6790ac2049f6 languageName: node linkType: hard @@ -12134,12 +12229,12 @@ __metadata: languageName: node linkType: hard -"regenerate-unicode-properties@npm:^10.2.0": - version: 10.2.0 - resolution: "regenerate-unicode-properties@npm:10.2.0" +"regenerate-unicode-properties@npm:^10.2.2": + version: 10.2.2 + resolution: "regenerate-unicode-properties@npm:10.2.2" dependencies: regenerate: "npm:^1.4.2" - checksum: 10c0/5510785eeaf56bbfdf4e663d6753f125c08d2a372d4107bc1b756b7bf142e2ed80c2733a8b54e68fb309ba37690e66a0362699b0e21d5c1f0255dea1b00e6460 + checksum: 10c0/66a1d6a1dbacdfc49afd88f20b2319a4c33cee56d245163e4d8f5f283e0f45d1085a78f7f7406dd19ea3a5dd7a7799cd020cd817c97464a7507f9d10fbdce87c languageName: node linkType: hard @@ -12178,17 +12273,17 @@ __metadata: languageName: node linkType: hard -"regexpu-core@npm:^6.2.0": - version: 6.2.0 - resolution: "regexpu-core@npm:6.2.0" +"regexpu-core@npm:^6.3.1": + version: 6.4.0 + resolution: "regexpu-core@npm:6.4.0" dependencies: regenerate: "npm:^1.4.2" - regenerate-unicode-properties: "npm:^10.2.0" + regenerate-unicode-properties: "npm:^10.2.2" regjsgen: "npm:^0.8.0" - regjsparser: "npm:^0.12.0" + regjsparser: "npm:^0.13.0" unicode-match-property-ecmascript: "npm:^2.0.0" - unicode-match-property-value-ecmascript: "npm:^2.1.0" - checksum: 10c0/bbcb83a854bf96ce4005ee4e4618b71c889cda72674ce6092432f0039b47890c2d0dfeb9057d08d440999d9ea03879ebbb7f26ca005ccf94390e55c348859b98 + unicode-match-property-value-ecmascript: "npm:^2.2.1" + checksum: 10c0/1eed9783c023dd06fb1f3ce4b6e3fdf0bc1e30cb036f30aeb2019b351e5e0b74355b40462282ea5db092c79a79331c374c7e9897e44a5ca4509e9f0b570263de languageName: node linkType: hard @@ -12199,14 +12294,14 @@ __metadata: languageName: node linkType: hard -"regjsparser@npm:^0.12.0": - version: 0.12.0 - resolution: "regjsparser@npm:0.12.0" +"regjsparser@npm:^0.13.0": + version: 0.13.0 + resolution: "regjsparser@npm:0.13.0" dependencies: - jsesc: "npm:~3.0.2" + jsesc: "npm:~3.1.0" bin: regjsparser: bin/parser - checksum: 10c0/99d3e4e10c8c7732eb7aa843b8da2fd8b647fe144d3711b480e4647dc3bff4b1e96691ccf17f3ace24aa866a50b064236177cb25e6e4fbbb18285d99edaed83b + checksum: 10c0/4702f85cda09f67747c1b2fb673a0f0e5d1ba39d55f177632265a0be471ba59e3f320623f411649141f752b126b8126eac3ff4c62d317921e430b0472bfc6071 languageName: node linkType: hard @@ -12273,16 +12368,16 @@ __metadata: languageName: node linkType: hard -"resolve@npm:^1.19.0, resolve@npm:^1.22.1, resolve@npm:^1.22.10, resolve@npm:^1.22.4, resolve@npm:^1.22.8": - version: 1.22.10 - resolution: "resolve@npm:1.22.10" +"resolve@npm:^1.19.0, resolve@npm:^1.22.1, resolve@npm:^1.22.11, resolve@npm:^1.22.4, resolve@npm:^1.22.8": + version: 1.22.11 + resolution: "resolve@npm:1.22.11" dependencies: - is-core-module: "npm:^2.16.0" + is-core-module: "npm:^2.16.1" path-parse: "npm:^1.0.7" supports-preserve-symlinks-flag: "npm:^1.0.0" bin: resolve: bin/resolve - checksum: 10c0/8967e1f4e2cc40f79b7e080b4582b9a8c5ee36ffb46041dccb20e6461161adf69f843b43067b4a375de926a2cd669157e29a29578191def399dd5ef89a1b5203 + checksum: 10c0/f657191507530f2cbecb5815b1ee99b20741ea6ee02a59c57028e9ec4c2c8d7681afcc35febbd554ac0ded459db6f2d8153382c53a2f266cee2575e512674409 languageName: node linkType: hard @@ -12299,16 +12394,16 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@npm%3A^1.19.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.1#optional!builtin, resolve@patch:resolve@npm%3A^1.22.10#optional!builtin, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin, resolve@patch:resolve@npm%3A^1.22.8#optional!builtin": - version: 1.22.10 - resolution: "resolve@patch:resolve@npm%3A1.22.10#optional!builtin::version=1.22.10&hash=c3c19d" +"resolve@patch:resolve@npm%3A^1.19.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.1#optional!builtin, resolve@patch:resolve@npm%3A^1.22.11#optional!builtin, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin, resolve@patch:resolve@npm%3A^1.22.8#optional!builtin": + version: 1.22.11 + resolution: "resolve@patch:resolve@npm%3A1.22.11#optional!builtin::version=1.22.11&hash=c3c19d" dependencies: - is-core-module: "npm:^2.16.0" + is-core-module: "npm:^2.16.1" path-parse: "npm:^1.0.7" supports-preserve-symlinks-flag: "npm:^1.0.0" bin: resolve: bin/resolve - checksum: 10c0/52a4e505bbfc7925ac8f4cd91fd8c4e096b6a89728b9f46861d3b405ac9a1ccf4dcbf8befb4e89a2e11370dacd0160918163885cbc669369590f2f31f4c58939 + checksum: 10c0/ee5b182f2e37cb1165465e58c6abc797fec0a80b5ba3231607beb4677db0c9291ac010c47cf092b6daa2b7f518d69a0e21888e7e2b633f68d501a874212a8c63 languageName: node linkType: hard @@ -12363,7 +12458,65 @@ __metadata: languageName: node linkType: hard -"rollup-plugin-gzip@npm:^4.1.1": +"rolldown@npm:1.0.0-rc.11": + version: 1.0.0-rc.11 + resolution: "rolldown@npm:1.0.0-rc.11" + dependencies: + "@oxc-project/types": "npm:=0.122.0" + "@rolldown/binding-android-arm64": "npm:1.0.0-rc.11" + "@rolldown/binding-darwin-arm64": "npm:1.0.0-rc.11" + "@rolldown/binding-darwin-x64": "npm:1.0.0-rc.11" + "@rolldown/binding-freebsd-x64": "npm:1.0.0-rc.11" + "@rolldown/binding-linux-arm-gnueabihf": "npm:1.0.0-rc.11" + "@rolldown/binding-linux-arm64-gnu": "npm:1.0.0-rc.11" + "@rolldown/binding-linux-arm64-musl": "npm:1.0.0-rc.11" + "@rolldown/binding-linux-ppc64-gnu": "npm:1.0.0-rc.11" + "@rolldown/binding-linux-s390x-gnu": "npm:1.0.0-rc.11" + "@rolldown/binding-linux-x64-gnu": "npm:1.0.0-rc.11" + "@rolldown/binding-linux-x64-musl": "npm:1.0.0-rc.11" + "@rolldown/binding-openharmony-arm64": "npm:1.0.0-rc.11" + "@rolldown/binding-wasm32-wasi": "npm:1.0.0-rc.11" + "@rolldown/binding-win32-arm64-msvc": "npm:1.0.0-rc.11" + "@rolldown/binding-win32-x64-msvc": "npm:1.0.0-rc.11" + "@rolldown/pluginutils": "npm:1.0.0-rc.11" + dependenciesMeta: + "@rolldown/binding-android-arm64": + optional: true + "@rolldown/binding-darwin-arm64": + optional: true + "@rolldown/binding-darwin-x64": + optional: true + "@rolldown/binding-freebsd-x64": + optional: true + "@rolldown/binding-linux-arm-gnueabihf": + optional: true + "@rolldown/binding-linux-arm64-gnu": + optional: true + "@rolldown/binding-linux-arm64-musl": + optional: true + "@rolldown/binding-linux-ppc64-gnu": + optional: true + "@rolldown/binding-linux-s390x-gnu": + optional: true + "@rolldown/binding-linux-x64-gnu": + optional: true + "@rolldown/binding-linux-x64-musl": + optional: true + "@rolldown/binding-openharmony-arm64": + optional: true + "@rolldown/binding-wasm32-wasi": + optional: true + "@rolldown/binding-win32-arm64-msvc": + optional: true + "@rolldown/binding-win32-x64-msvc": + optional: true + bin: + rolldown: bin/cli.mjs + checksum: 10c0/f92457aa26dac614bbaa92079d05c6a4819054468b46b2f46f68bae4bf42dc2c840a4d89be4ffa2a5821a63cd46157fa167a93e1f0b6671f89c16e3da8e2dbf3 + languageName: node + linkType: hard + +"rollup-plugin-gzip@npm:^4.2.0": version: 4.2.0 resolution: "rollup-plugin-gzip@npm:4.2.0" peerDependencies: @@ -12375,16 +12528,16 @@ __metadata: languageName: node linkType: hard -"rollup-plugin-visualizer@npm:^6.0.3": - version: 6.0.11 - resolution: "rollup-plugin-visualizer@npm:6.0.11" +"rollup-plugin-visualizer@npm:^7.0.1": + version: 7.0.1 + resolution: "rollup-plugin-visualizer@npm:7.0.1" dependencies: - open: "npm:^8.0.0" + open: "npm:^11.0.0" picomatch: "npm:^4.0.2" source-map: "npm:^0.7.4" - yargs: "npm:^17.5.1" + yargs: "npm:^18.0.0" peerDependencies: - rolldown: 1.x || ^1.0.0-beta + rolldown: 1.x || ^1.0.0-beta || ^1.0.0-rc rollup: 2.x || 3.x || 4.x peerDependenciesMeta: rolldown: @@ -12393,7 +12546,7 @@ __metadata: optional: true bin: rollup-plugin-visualizer: dist/bin/cli.js - checksum: 10c0/a8461e3b1178791e5834617c0e59b89a2832c0a371632e45c8c6934d17baa39f597e74cece5eaecd244f5b3dd0fab14c695f5860de3f3b0ac25e50a221442817 + checksum: 10c0/8ca591a465554d7a4a348538b35acd8eb796156fe24fb7252457640fa49a5aa399962e2cabb542ae8590a391918ae2927ed492081e5598977f3a69b91d0042f4 languageName: node linkType: hard @@ -12411,81 +12564,6 @@ __metadata: languageName: node linkType: hard -"rollup@npm:^4.43.0": - version: 4.46.4 - resolution: "rollup@npm:4.46.4" - dependencies: - "@rollup/rollup-android-arm-eabi": "npm:4.46.4" - "@rollup/rollup-android-arm64": "npm:4.46.4" - "@rollup/rollup-darwin-arm64": "npm:4.46.4" - "@rollup/rollup-darwin-x64": "npm:4.46.4" - "@rollup/rollup-freebsd-arm64": "npm:4.46.4" - "@rollup/rollup-freebsd-x64": "npm:4.46.4" - "@rollup/rollup-linux-arm-gnueabihf": "npm:4.46.4" - "@rollup/rollup-linux-arm-musleabihf": "npm:4.46.4" - "@rollup/rollup-linux-arm64-gnu": "npm:4.46.4" - "@rollup/rollup-linux-arm64-musl": "npm:4.46.4" - "@rollup/rollup-linux-loongarch64-gnu": "npm:4.46.4" - "@rollup/rollup-linux-ppc64-gnu": "npm:4.46.4" - "@rollup/rollup-linux-riscv64-gnu": "npm:4.46.4" - "@rollup/rollup-linux-riscv64-musl": "npm:4.46.4" - "@rollup/rollup-linux-s390x-gnu": "npm:4.46.4" - "@rollup/rollup-linux-x64-gnu": "npm:4.46.4" - "@rollup/rollup-linux-x64-musl": "npm:4.46.4" - "@rollup/rollup-win32-arm64-msvc": "npm:4.46.4" - "@rollup/rollup-win32-ia32-msvc": "npm:4.46.4" - "@rollup/rollup-win32-x64-msvc": "npm:4.46.4" - "@types/estree": "npm:1.0.8" - fsevents: "npm:~2.3.2" - dependenciesMeta: - "@rollup/rollup-android-arm-eabi": - optional: true - "@rollup/rollup-android-arm64": - optional: true - "@rollup/rollup-darwin-arm64": - optional: true - "@rollup/rollup-darwin-x64": - optional: true - "@rollup/rollup-freebsd-arm64": - optional: true - "@rollup/rollup-freebsd-x64": - optional: true - "@rollup/rollup-linux-arm-gnueabihf": - optional: true - "@rollup/rollup-linux-arm-musleabihf": - optional: true - "@rollup/rollup-linux-arm64-gnu": - optional: true - "@rollup/rollup-linux-arm64-musl": - optional: true - "@rollup/rollup-linux-loongarch64-gnu": - optional: true - "@rollup/rollup-linux-ppc64-gnu": - optional: true - "@rollup/rollup-linux-riscv64-gnu": - optional: true - "@rollup/rollup-linux-riscv64-musl": - optional: true - "@rollup/rollup-linux-s390x-gnu": - optional: true - "@rollup/rollup-linux-x64-gnu": - optional: true - "@rollup/rollup-linux-x64-musl": - optional: true - "@rollup/rollup-win32-arm64-msvc": - optional: true - "@rollup/rollup-win32-ia32-msvc": - optional: true - "@rollup/rollup-win32-x64-msvc": - optional: true - fsevents: - optional: true - bin: - rollup: dist/bin/rollup - checksum: 10c0/17871534544bd19ec9b5bc1d82a8509addbdb7ee0dd865f20352a8b5695e7b9288af842cd50187bed9fece61b0f1d7b7ff43cf070265d3a2e7d8348497e3ba1e - languageName: node - linkType: hard - "router@npm:^2.2.0": version: 2.2.0 resolution: "router@npm:2.2.0" @@ -12851,13 +12929,6 @@ __metadata: languageName: node linkType: hard -"sisteransi@npm:^1.0.5": - version: 1.0.5 - resolution: "sisteransi@npm:1.0.5" - checksum: 10c0/230ac975cca485b7f6fe2b96a711aa62a6a26ead3e6fb8ba17c5a00d61b8bed0d7adc21f5626b70d7c33c62ff4e63933017a6462942c719d1980bb0b1207ad46 - languageName: node - linkType: hard - "slash@npm:^5.1.0": version: 5.1.0 resolution: "slash@npm:5.1.0" @@ -13106,10 +13177,10 @@ __metadata: languageName: node linkType: hard -"std-env@npm:^3.10.0": - version: 3.10.0 - resolution: "std-env@npm:3.10.0" - checksum: 10c0/1814927a45004d36dde6707eaf17552a546769bc79a6421be2c16ce77d238158dfe5de30910b78ec30d95135cc1c59ea73ee22d2ca170f8b9753f84da34c427f +"std-env@npm:^4.0.0-rc.1": + version: 4.0.0 + resolution: "std-env@npm:4.0.0" + checksum: 10c0/63b1716eae27947adde49e21b7225a0f75fb2c3d410273ae9de8333c07c7d5fc7a0628ae4c8af6b4b49b4274ed46c2bf118ed69b64f1261c9d8213d76ed1c16c languageName: node linkType: hard @@ -13123,13 +13194,13 @@ __metadata: languageName: node linkType: hard -"storybook@npm:^10.0.5": - version: 10.2.13 - resolution: "storybook@npm:10.2.13" +"storybook@npm:^10.3.0": + version: 10.3.0 + resolution: "storybook@npm:10.3.0" dependencies: "@storybook/global": "npm:^5.0.0" "@storybook/icons": "npm:^2.0.1" - "@testing-library/jest-dom": "npm:^6.6.3" + "@testing-library/jest-dom": "npm:^6.9.1" "@testing-library/user-event": "npm:^14.6.1" "@vitest/expect": "npm:3.2.4" "@vitest/spy": "npm:3.2.4" @@ -13146,7 +13217,7 @@ __metadata: optional: true bin: storybook: ./dist/bin/dispatcher.js - checksum: 10c0/5ca338b707c3e7e94c16ecdcb00ca3c450157dceec758c15c416649e346e628a0e034d2265656650fc4fee4680631de7cc588e1a244e42cbb41af9416281a998 + checksum: 10c0/aaab242fb36948c122b8a9bd6b45120418e25af105e96c303f565ef19d08001adb17aaa9810c9f44b4d494fab999a53e58e4789c6202e0880d1e701e93f10e21 languageName: node linkType: hard @@ -13186,14 +13257,14 @@ __metadata: languageName: node linkType: hard -"string-width@npm:^7.0.0": - version: 7.0.0 - resolution: "string-width@npm:7.0.0" +"string-width@npm:^7.0.0, string-width@npm:^7.2.0": + version: 7.2.0 + resolution: "string-width@npm:7.2.0" dependencies: emoji-regex: "npm:^10.3.0" get-east-asian-width: "npm:^1.0.0" strip-ansi: "npm:^7.1.0" - checksum: 10c0/8ffaeeccf4a56ccce5b6235d0b99ee3a581e3e3e5d453708efe7aa8e264fa3a858b4fe2244310cb71c6a20d8c05921cedc8b2ccd88cbaad9f5c92051ff68edc6 + checksum: 10c0/eb0430dd43f3199c7a46dcbf7a0b34539c76fe3aa62763d0b0655acdcbdf360b3f66f3d58ca25ba0205f42ea3491fa00f09426d3b7d3040e506878fc7664c9b9 languageName: node linkType: hard @@ -13856,27 +13927,13 @@ __metadata: languageName: node linkType: hard -"ts-dedent@npm:^2.0.0, ts-dedent@npm:^2.2.0": +"ts-dedent@npm:^2.0.0": version: 2.2.0 resolution: "ts-dedent@npm:2.2.0" checksum: 10c0/175adea838468cc2ff7d5e97f970dcb798bbcb623f29c6088cb21aa2880d207c5784be81ab1741f56b9ac37840cbaba0c0d79f7f8b67ffe61c02634cafa5c303 languageName: node linkType: hard -"tsconfck@npm:^3.0.3": - version: 3.1.5 - resolution: "tsconfck@npm:3.1.5" - peerDependencies: - typescript: ^5.0.0 - peerDependenciesMeta: - typescript: - optional: true - bin: - tsconfck: bin/tsconfck.js - checksum: 10c0/9b62cd85d5702aa23ea50ea578d7124f3d59cc4518fcc7eacc04f4f9c9c481f720738ff8351bd4472247c0723a17dfd01af95a5b60ad623cdb8727fbe4881847 - languageName: node - linkType: hard - "tsconfig-paths@npm:^3.15.0": version: 3.15.0 resolution: "tsconfig-paths@npm:3.15.0" @@ -14117,10 +14174,10 @@ __metadata: languageName: node linkType: hard -"undici@npm:^7.24.3": - version: 7.24.4 - resolution: "undici@npm:7.24.4" - checksum: 10c0/cb302e81fadb7f0b7946ab77595715c0961b46a025ccecae79ba599432d0bc8d1e3da4dfe7ff66bc74f115c1b8ff0f099bc4e9bf313db4562da23995872c6d17 +"undici@npm:^7.24.5": + version: 7.24.5 + resolution: "undici@npm:7.24.5" + checksum: 10c0/2a836f1f6ab078fde3eeb4cc8fd5b34eeaf52cfbdf16a9bab61b7223f43f7847bcd2125d1da7c4e3f5996c528bf9f7940015d39909bab80cfbd71b855470cf21 languageName: node linkType: hard @@ -14150,10 +14207,10 @@ __metadata: languageName: node linkType: hard -"unicode-match-property-value-ecmascript@npm:^2.1.0": - version: 2.2.0 - resolution: "unicode-match-property-value-ecmascript@npm:2.2.0" - checksum: 10c0/1d0a2deefd97974ddff5b7cb84f9884177f4489928dfcebb4b2b091d6124f2739df51fc6ea15958e1b5637ac2a24cff9bf21ea81e45335086ac52c0b4c717d6d +"unicode-match-property-value-ecmascript@npm:^2.2.1": + version: 2.2.1 + resolution: "unicode-match-property-value-ecmascript@npm:2.2.1" + checksum: 10c0/93acd1ad9496b600e5379d1aaca154cf551c5d6d4a0aefaf0984fc2e6288e99220adbeb82c935cde461457fb6af0264a1774b8dfd4d9a9e31548df3352a4194d languageName: node linkType: hard @@ -14428,7 +14485,7 @@ __metadata: languageName: node linkType: hard -"vite-plugin-pwa@npm:^1.0.2": +"vite-plugin-pwa@npm:^1.2.0": version: 1.2.0 resolution: "vite-plugin-pwa@npm:1.2.0" dependencies: @@ -14449,7 +14506,7 @@ __metadata: languageName: node linkType: hard -"vite-plugin-svgr@npm:^4.3.0": +"vite-plugin-svgr@npm:^4.5.0": version: 4.5.0 resolution: "vite-plugin-svgr@npm:4.5.0" dependencies: @@ -14462,35 +14519,22 @@ __metadata: languageName: node linkType: hard -"vite-tsconfig-paths@npm:^6.0.0": - version: 6.1.1 - resolution: "vite-tsconfig-paths@npm:6.1.1" +"vite@npm:^6.0.0 || ^7.0.0 || ^8.0.0-0, vite@npm:^8.0.0": + version: 8.0.2 + resolution: "vite@npm:8.0.2" dependencies: - debug: "npm:^4.1.1" - globrex: "npm:^0.1.2" - tsconfck: "npm:^3.0.3" - peerDependencies: - vite: "*" - checksum: 10c0/5e61080991418fefa08c5b98995cdcada4931ae01ac97ef9e2ee941051f61b76890a6e7ba48bed3b2a229ec06fef33a06621bba4ce457b3f4233ad31dc0c1d1b - languageName: node - linkType: hard - -"vite@npm:^6.0.0 || ^7.0.0, vite@npm:^7.1.1": - version: 7.3.1 - resolution: "vite@npm:7.3.1" - dependencies: - esbuild: "npm:^0.27.0" - fdir: "npm:^6.5.0" fsevents: "npm:~2.3.3" + lightningcss: "npm:^1.32.0" picomatch: "npm:^4.0.3" - postcss: "npm:^8.5.6" - rollup: "npm:^4.43.0" + postcss: "npm:^8.5.8" + rolldown: "npm:1.0.0-rc.11" tinyglobby: "npm:^0.2.15" peerDependencies: "@types/node": ^20.19.0 || >=22.12.0 + "@vitejs/devtools": ^0.1.0 + esbuild: ^0.27.0 jiti: ">=1.21.0" less: ^4.0.0 - lightningcss: ^1.21.0 sass: ^1.70.0 sass-embedded: ^1.70.0 stylus: ">=0.54.8" @@ -14504,12 +14548,14 @@ __metadata: peerDependenciesMeta: "@types/node": optional: true + "@vitejs/devtools": + optional: true + esbuild: + optional: true jiti: optional: true less: optional: true - lightningcss: - optional: true sass: optional: true sass-embedded: @@ -14526,44 +14572,45 @@ __metadata: optional: true bin: vite: bin/vite.js - checksum: 10c0/5c7548f5f43a23533e53324304db4ad85f1896b1bfd3ee32ae9b866bac2933782c77b350eb2b52a02c625c8ad1ddd4c000df077419410650c982cd97fde8d014 + checksum: 10c0/b271a3c3f8100bab45ee16583cb046aa028f943205b56065b09d3f1851ed8e7068fc6a76e9dc01beca805e8bb1e53f229c4c1c623be87ef1acb00fc002a29cf6 languageName: node linkType: hard -"vitest@npm:^4.0.5": - version: 4.0.15 - resolution: "vitest@npm:4.0.15" +"vitest@npm:^4.1.0": + version: 4.1.0 + resolution: "vitest@npm:4.1.0" dependencies: - "@vitest/expect": "npm:4.0.15" - "@vitest/mocker": "npm:4.0.15" - "@vitest/pretty-format": "npm:4.0.15" - "@vitest/runner": "npm:4.0.15" - "@vitest/snapshot": "npm:4.0.15" - "@vitest/spy": "npm:4.0.15" - "@vitest/utils": "npm:4.0.15" - es-module-lexer: "npm:^1.7.0" - expect-type: "npm:^1.2.2" + "@vitest/expect": "npm:4.1.0" + "@vitest/mocker": "npm:4.1.0" + "@vitest/pretty-format": "npm:4.1.0" + "@vitest/runner": "npm:4.1.0" + "@vitest/snapshot": "npm:4.1.0" + "@vitest/spy": "npm:4.1.0" + "@vitest/utils": "npm:4.1.0" + es-module-lexer: "npm:^2.0.0" + expect-type: "npm:^1.3.0" magic-string: "npm:^0.30.21" obug: "npm:^2.1.1" pathe: "npm:^2.0.3" picomatch: "npm:^4.0.3" - std-env: "npm:^3.10.0" + std-env: "npm:^4.0.0-rc.1" tinybench: "npm:^2.9.0" tinyexec: "npm:^1.0.2" tinyglobby: "npm:^0.2.15" tinyrainbow: "npm:^3.0.3" - vite: "npm:^6.0.0 || ^7.0.0" + vite: "npm:^6.0.0 || ^7.0.0 || ^8.0.0-0" why-is-node-running: "npm:^2.3.0" peerDependencies: "@edge-runtime/vm": "*" "@opentelemetry/api": ^1.9.0 "@types/node": ^20.0.0 || ^22.0.0 || >=24.0.0 - "@vitest/browser-playwright": 4.0.15 - "@vitest/browser-preview": 4.0.15 - "@vitest/browser-webdriverio": 4.0.15 - "@vitest/ui": 4.0.15 + "@vitest/browser-playwright": 4.1.0 + "@vitest/browser-preview": 4.1.0 + "@vitest/browser-webdriverio": 4.1.0 + "@vitest/ui": 4.1.0 happy-dom: "*" jsdom: "*" + vite: ^6.0.0 || ^7.0.0 || ^8.0.0-0 peerDependenciesMeta: "@edge-runtime/vm": optional: true @@ -14583,9 +14630,11 @@ __metadata: optional: true jsdom: optional: true + vite: + optional: false bin: vitest: vitest.mjs - checksum: 10c0/fd57913dbcba81b67ca67bae37f0920f2785a60939a9029a82ebb843253f7a67f93f2c959cb90bb23a57055c0256ec0a6059ec9a10c129e8912c09b6e407242b + checksum: 10c0/48048e4391e4e8190aa12b1c868bef4ad8d346214631b4506e0dc1f3241ecb8bcb24f296c38a7d98eae712a042375ae209da4b35165db38f9a9bc79a3a9e2a04 languageName: node linkType: hard @@ -15045,7 +15094,7 @@ __metadata: languageName: node linkType: hard -"ws@npm:^8.12.1, ws@npm:^8.18.0, ws@npm:^8.18.3": +"ws@npm:^8.12.1, ws@npm:^8.18.0, ws@npm:^8.19.0": version: 8.19.0 resolution: "ws@npm:8.19.0" peerDependencies: @@ -15069,6 +15118,16 @@ __metadata: languageName: node linkType: hard +"wsl-utils@npm:^0.3.0": + version: 0.3.1 + resolution: "wsl-utils@npm:0.3.1" + dependencies: + is-wsl: "npm:^3.1.0" + powershell-utils: "npm:^0.1.0" + checksum: 10c0/b3ba99cc6b71f66457eef598d529beeb8cb57a72646877fe25993894b808c60b82f6d47df5463f0b6e54632272f62f5eaea105c12784fd09b06f500f3f53aa2e + languageName: node + linkType: hard + "xml-name-validator@npm:^5.0.0": version: 5.0.0 resolution: "xml-name-validator@npm:5.0.0" @@ -15141,7 +15200,14 @@ __metadata: languageName: node linkType: hard -"yargs@npm:^17.5.1, yargs@npm:^17.7.2": +"yargs-parser@npm:^22.0.0": + version: 22.0.0 + resolution: "yargs-parser@npm:22.0.0" + checksum: 10c0/cb7ef81759c4271cb1d96b9351dbbc9a9ce35d3e1122d2b739bf6c432603824fa02c67cc12dcef6ea80283379d63495686e8f41cc7b06c6576e792aba4d33e1c + languageName: node + linkType: hard + +"yargs@npm:^17.7.2": version: 17.7.2 resolution: "yargs@npm:17.7.2" dependencies: @@ -15156,6 +15222,20 @@ __metadata: languageName: node linkType: hard +"yargs@npm:^18.0.0": + version: 18.0.0 + resolution: "yargs@npm:18.0.0" + dependencies: + cliui: "npm:^9.0.1" + escalade: "npm:^3.1.1" + get-caller-file: "npm:^2.0.5" + string-width: "npm:^7.2.0" + y18n: "npm:^5.0.5" + yargs-parser: "npm:^22.0.0" + checksum: 10c0/bf290e4723876ea9c638c786a5c42ac28e03c9ca2325e1424bf43b94e5876456292d3ed905b853ebbba6daf43ed29e772ac2a6b3c5fb1b16533245d6211778f3 + languageName: node + linkType: hard + "yocto-queue@npm:^0.1.0": version: 0.1.0 resolution: "yocto-queue@npm:0.1.0"