diff --git a/.github/actions/setup-javascript/action.yml b/.github/actions/setup-javascript/action.yml
index 808adc7de6..0c7ead1c15 100644
--- a/.github/actions/setup-javascript/action.yml
+++ b/.github/actions/setup-javascript/action.yml
@@ -9,7 +9,7 @@ runs:
using: 'composite'
steps:
- name: Set up Node.js
- uses: actions/setup-node@v4
+ uses: actions/setup-node@v6
with:
node-version-file: '.nvmrc'
diff --git a/.github/workflows/build-container-image.yml b/.github/workflows/build-container-image.yml
index 260730004c..84b729df43 100644
--- a/.github/workflows/build-container-image.yml
+++ b/.github/workflows/build-container-image.yml
@@ -35,7 +35,7 @@ jobs:
- linux/arm64
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- name: Prepare
env:
@@ -100,7 +100,7 @@ jobs:
- name: Upload digest
if: ${{ inputs.push_to_images != '' }}
- uses: actions/upload-artifact@v4
+ uses: actions/upload-artifact@v5
with:
# `hashFiles` is used to disambiguate between streaming and non-streaming images
name: digests-${{ hashFiles(inputs.file_to_build) }}-${{ env.PLATFORM_PAIR }}
@@ -119,10 +119,10 @@ jobs:
PUSH_TO_IMAGES: ${{ inputs.push_to_images }}
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- name: Download digests
- uses: actions/download-artifact@v4
+ uses: actions/download-artifact@v6
with:
path: ${{ runner.temp }}/digests
# `hashFiles` is used to disambiguate between streaming and non-streaming images
diff --git a/.github/workflows/build-push-pr.yml b/.github/workflows/build-push-pr.yml
index 6ec561d2fb..f934f2e550 100644
--- a/.github/workflows/build-push-pr.yml
+++ b/.github/workflows/build-push-pr.yml
@@ -18,7 +18,7 @@ jobs:
steps:
# Repository needs to be cloned so `git rev-parse` below works
- name: Clone repository
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
- id: version_vars
run: |
echo mastodon_version_metadata=pr-${{ github.event.pull_request.number }}-$(git rev-parse --short ${{github.event.pull_request.head.sha}}) >> $GITHUB_OUTPUT
diff --git a/.github/workflows/bundler-audit.yml b/.github/workflows/bundler-audit.yml
index fa28d28f74..9cc49a7f79 100644
--- a/.github/workflows/bundler-audit.yml
+++ b/.github/workflows/bundler-audit.yml
@@ -28,7 +28,7 @@ jobs:
steps:
- name: Clone repository
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
- name: Set up Ruby
uses: ruby/setup-ruby@v1
diff --git a/.github/workflows/check-i18n.yml b/.github/workflows/check-i18n.yml
index c46090c1b5..9d500ffc44 100644
--- a/.github/workflows/check-i18n.yml
+++ b/.github/workflows/check-i18n.yml
@@ -21,7 +21,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- name: Set up Ruby environment
uses: ./.github/actions/setup-ruby
diff --git a/.github/workflows/chromatic.yml b/.github/workflows/chromatic.yml
index 4e6179bc77..e0383b83bc 100644
--- a/.github/workflows/chromatic.yml
+++ b/.github/workflows/chromatic.yml
@@ -23,7 +23,7 @@ jobs:
if: github.repository == 'mastodon/mastodon'
steps:
- name: Checkout code
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
with:
fetch-depth: 0
- name: Set up Javascript environment
@@ -33,7 +33,7 @@ jobs:
run: yarn build-storybook
- name: Run Chromatic
- uses: chromaui/action@v12
+ uses: chromaui/action@v13
with:
# â ī¸ Make sure to configure a `CHROMATIC_PROJECT_TOKEN` repository secret
projectToken: ${{ secrets.CHROMATIC_PROJECT_TOKEN }}
diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml
index c864e12d2d..cf038ae480 100644
--- a/.github/workflows/codeql.yml
+++ b/.github/workflows/codeql.yml
@@ -31,11 +31,11 @@ jobs:
steps:
- name: Checkout repository
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
- uses: github/codeql-action/init@v3
+ uses: github/codeql-action/init@v4
with:
languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file.
@@ -48,7 +48,7 @@ jobs:
# Autobuild attempts to build any compiled languages (C/C++, C#, Go, or Java).
# If this step fails, then you should remove it and run the build manually (see below)
- name: Autobuild
- uses: github/codeql-action/autobuild@v3
+ uses: github/codeql-action/autobuild@v4
# âšī¸ Command-line programs to run using the OS shell.
# đ See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
@@ -61,6 +61,6 @@ jobs:
# ./location_of_script_within_repo/buildscript.sh
- name: Perform CodeQL Analysis
- uses: github/codeql-action/analyze@v3
+ uses: github/codeql-action/analyze@v4
with:
category: '/language:${{matrix.language}}'
diff --git a/.github/workflows/crowdin-download-stable.yml b/.github/workflows/crowdin-download-stable.yml
index c9d5f6bbe0..6e7862b368 100644
--- a/.github/workflows/crowdin-download-stable.yml
+++ b/.github/workflows/crowdin-download-stable.yml
@@ -13,7 +13,7 @@ jobs:
steps:
- name: Checkout
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
- name: Increase Git http.postBuffer
# This is needed due to a bug in Ubuntu's cURL version?
diff --git a/.github/workflows/crowdin-download.yml b/.github/workflows/crowdin-download.yml
index 1fdd1e08b4..c0c3374219 100644
--- a/.github/workflows/crowdin-download.yml
+++ b/.github/workflows/crowdin-download.yml
@@ -15,7 +15,7 @@ jobs:
steps:
- name: Checkout
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
- name: Increase Git http.postBuffer
# This is needed due to a bug in Ubuntu's cURL version?
diff --git a/.github/workflows/crowdin-upload.yml b/.github/workflows/crowdin-upload.yml
index d6c542eb36..6bbd931c53 100644
--- a/.github/workflows/crowdin-upload.yml
+++ b/.github/workflows/crowdin-upload.yml
@@ -23,7 +23,7 @@ jobs:
steps:
- name: Checkout
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
- name: crowdin action
uses: crowdin/github-action@v2
diff --git a/.github/workflows/format-check.yml b/.github/workflows/format-check.yml
index c10f350a02..6803686b4f 100644
--- a/.github/workflows/format-check.yml
+++ b/.github/workflows/format-check.yml
@@ -13,7 +13,7 @@ jobs:
steps:
- name: Clone repository
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
- name: Set up Javascript environment
uses: ./.github/actions/setup-javascript
diff --git a/.github/workflows/lint-css.yml b/.github/workflows/lint-css.yml
index c1385bf789..51a78d679f 100644
--- a/.github/workflows/lint-css.yml
+++ b/.github/workflows/lint-css.yml
@@ -34,7 +34,7 @@ jobs:
steps:
- name: Clone repository
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
- name: Set up Javascript environment
uses: ./.github/actions/setup-javascript
diff --git a/.github/workflows/lint-haml.yml b/.github/workflows/lint-haml.yml
index 499be2010a..d3452c9ffc 100644
--- a/.github/workflows/lint-haml.yml
+++ b/.github/workflows/lint-haml.yml
@@ -33,7 +33,7 @@ jobs:
steps:
- name: Clone repository
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
- name: Set up Ruby
uses: ruby/setup-ruby@v1
diff --git a/.github/workflows/lint-js.yml b/.github/workflows/lint-js.yml
index 86e9af23e7..c9ba1a13f1 100644
--- a/.github/workflows/lint-js.yml
+++ b/.github/workflows/lint-js.yml
@@ -38,7 +38,7 @@ jobs:
steps:
- name: Clone repository
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
- name: Set up Javascript environment
uses: ./.github/actions/setup-javascript
diff --git a/.github/workflows/lint-ruby.yml b/.github/workflows/lint-ruby.yml
index 87f8aee24e..e73617d85d 100644
--- a/.github/workflows/lint-ruby.yml
+++ b/.github/workflows/lint-ruby.yml
@@ -35,7 +35,7 @@ jobs:
steps:
- name: Clone repository
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
- name: Set up Ruby
uses: ruby/setup-ruby@v1
diff --git a/.github/workflows/test-js.yml b/.github/workflows/test-js.yml
index 0699e6c9ef..b8e1cc89aa 100644
--- a/.github/workflows/test-js.yml
+++ b/.github/workflows/test-js.yml
@@ -34,7 +34,7 @@ jobs:
steps:
- name: Clone repository
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
- name: Set up Javascript environment
uses: ./.github/actions/setup-javascript
diff --git a/.github/workflows/test-migrations.yml b/.github/workflows/test-migrations.yml
index 7aab34f0cf..b1b94692f0 100644
--- a/.github/workflows/test-migrations.yml
+++ b/.github/workflows/test-migrations.yml
@@ -72,7 +72,7 @@ jobs:
BUNDLE_RETRY: 3
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- name: Set up Ruby environment
uses: ./.github/actions/setup-ruby
diff --git a/.github/workflows/test-ruby.yml b/.github/workflows/test-ruby.yml
index 63d3172504..8f05812d60 100644
--- a/.github/workflows/test-ruby.yml
+++ b/.github/workflows/test-ruby.yml
@@ -32,7 +32,7 @@ jobs:
SECRET_KEY_BASE_DUMMY: 1
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- name: Set up Ruby environment
uses: ./.github/actions/setup-ruby
@@ -65,7 +65,7 @@ jobs:
run: |
tar --exclude={"*.br","*.gz"} -zcf artifacts.tar.gz public/assets public/packs* tmp/cache/vite/last-build*.json
- - uses: actions/upload-artifact@v4
+ - uses: actions/upload-artifact@v5
if: matrix.mode == 'test'
with:
path: |-
@@ -128,9 +128,9 @@ jobs:
- '3.3'
- '.ruby-version'
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- - uses: actions/download-artifact@v4
+ - uses: actions/download-artifact@v6
with:
path: './'
name: ${{ github.sha }}
@@ -230,9 +230,9 @@ jobs:
- '3.3'
- '.ruby-version'
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- - uses: actions/download-artifact@v4
+ - uses: actions/download-artifact@v6
with:
path: './'
name: ${{ github.sha }}
@@ -309,9 +309,9 @@ jobs:
- '.ruby-version'
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- - uses: actions/download-artifact@v4
+ - uses: actions/download-artifact@v6
with:
path: './'
name: ${{ github.sha }}
@@ -350,14 +350,14 @@ jobs:
- run: bin/rspec spec/system --tag streaming --tag js
- name: Archive logs
- uses: actions/upload-artifact@v4
+ uses: actions/upload-artifact@v5
if: failure()
with:
name: e2e-logs-${{ matrix.ruby-version }}
path: log/
- name: Archive test screenshots
- uses: actions/upload-artifact@v4
+ uses: actions/upload-artifact@v5
if: failure()
with:
name: e2e-screenshots-${{ matrix.ruby-version }}
@@ -447,9 +447,9 @@ jobs:
search-image: opensearchproject/opensearch:2
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- - uses: actions/download-artifact@v4
+ - uses: actions/download-artifact@v6
with:
path: './'
name: ${{ github.sha }}
@@ -469,14 +469,14 @@ jobs:
- run: bin/rspec --tag search
- name: Archive logs
- uses: actions/upload-artifact@v4
+ uses: actions/upload-artifact@v5
if: failure()
with:
name: test-search-logs-${{ matrix.ruby-version }}
path: log/
- name: Archive test screenshots
- uses: actions/upload-artifact@v4
+ uses: actions/upload-artifact@v5
if: failure()
with:
name: test-search-screenshots
diff --git a/.storybook/main.ts b/.storybook/main.ts
index bb69f0c664..c249d1c06d 100644
--- a/.storybook/main.ts
+++ b/.storybook/main.ts
@@ -31,7 +31,7 @@ const config: StorybookConfig = {
viteFinal(config) {
// For an unknown reason, Storybook does not use the root
// from the Vite config so we need to set it manually.
- config.root = resolve(__dirname, '../app/javascript');
+ config.root = resolve(import.meta.dirname, '../app/javascript');
return config;
},
};
diff --git a/Gemfile b/Gemfile
index f5b1753aa6..91e2655886 100644
--- a/Gemfile
+++ b/Gemfile
@@ -114,7 +114,7 @@ group :opentelemetry do
gem 'opentelemetry-instrumentation-http', '~> 0.27.0', require: false
gem 'opentelemetry-instrumentation-http_client', '~> 0.26.0', require: false
gem 'opentelemetry-instrumentation-net_http', '~> 0.26.0', require: false
- gem 'opentelemetry-instrumentation-pg', '~> 0.32.0', require: false
+ gem 'opentelemetry-instrumentation-pg', '~> 0.33.0', require: false
gem 'opentelemetry-instrumentation-rack', '~> 0.29.0', require: false
gem 'opentelemetry-instrumentation-rails', '~> 0.39.0', require: false
gem 'opentelemetry-instrumentation-redis', '~> 0.28.0', require: false
diff --git a/Gemfile.lock b/Gemfile.lock
index 54fcff1efc..a798595fa7 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -128,7 +128,7 @@ GEM
blurhash (0.1.8)
bootsnap (1.18.6)
msgpack (~> 1.2)
- brakeman (7.0.2)
+ brakeman (7.1.1)
racc
browser (6.2.0)
builder (3.3.0)
@@ -512,9 +512,9 @@ GEM
opentelemetry-common (~> 0.20)
opentelemetry-sdk (~> 1.10)
opentelemetry-semantic_conventions
- opentelemetry-helpers-sql (0.2.0)
+ opentelemetry-helpers-sql (0.3.0)
opentelemetry-api (~> 1.7)
- opentelemetry-helpers-sql-obfuscation (0.4.0)
+ opentelemetry-helpers-sql-obfuscation (0.5.0)
opentelemetry-common (~> 0.21)
opentelemetry-instrumentation-action_mailer (0.6.1)
opentelemetry-instrumentation-active_support (~> 0.10)
@@ -548,7 +548,7 @@ GEM
opentelemetry-instrumentation-base (~> 0.25)
opentelemetry-instrumentation-net_http (0.26.0)
opentelemetry-instrumentation-base (~> 0.25)
- opentelemetry-instrumentation-pg (0.32.0)
+ opentelemetry-instrumentation-pg (0.33.0)
opentelemetry-helpers-sql
opentelemetry-helpers-sql-obfuscation
opentelemetry-instrumentation-base (~> 0.25)
@@ -621,7 +621,7 @@ GEM
activesupport (>= 3.0.0)
raabro (1.4.0)
racc (1.8.1)
- rack (3.2.3)
+ rack (3.2.4)
rack-attack (6.8.0)
rack (>= 1.0, < 4)
rack-cors (3.0.0)
@@ -803,9 +803,9 @@ GEM
activerecord (>= 4.0.0)
railties (>= 4.0.0)
securerandom (0.4.1)
- shoulda-matchers (6.5.0)
- activesupport (>= 5.2.0)
- sidekiq (8.0.8)
+ shoulda-matchers (7.0.1)
+ activesupport (>= 7.1)
+ sidekiq (8.0.9)
connection_pool (>= 2.5.0)
json (>= 2.9.0)
logger (>= 1.6.2)
@@ -883,7 +883,7 @@ GEM
unicode-display_width (3.2.0)
unicode-emoji (~> 4.1)
unicode-emoji (4.1.0)
- uri (1.0.4)
+ uri (1.1.1)
useragent (0.16.11)
validate_url (1.0.15)
activemodel (>= 3.0.0)
@@ -1018,7 +1018,7 @@ DEPENDENCIES
opentelemetry-instrumentation-http (~> 0.27.0)
opentelemetry-instrumentation-http_client (~> 0.26.0)
opentelemetry-instrumentation-net_http (~> 0.26.0)
- opentelemetry-instrumentation-pg (~> 0.32.0)
+ opentelemetry-instrumentation-pg (~> 0.33.0)
opentelemetry-instrumentation-rack (~> 0.29.0)
opentelemetry-instrumentation-rails (~> 0.39.0)
opentelemetry-instrumentation-redis (~> 0.28.0)
diff --git a/app/javascript/flavours/glitch/actions/compose.js b/app/javascript/flavours/glitch/actions/compose.js
index 09d6e7bbb3..3553378b44 100644
--- a/app/javascript/flavours/glitch/actions/compose.js
+++ b/app/javascript/flavours/glitch/actions/compose.js
@@ -58,7 +58,6 @@ export const COMPOSE_ADVANCED_OPTIONS_CHANGE = 'COMPOSE_ADVANCED_OPTIONS_CHANGE'
export const COMPOSE_SENSITIVITY_CHANGE = 'COMPOSE_SENSITIVITY_CHANGE';
export const COMPOSE_SPOILERNESS_CHANGE = 'COMPOSE_SPOILERNESS_CHANGE';
export const COMPOSE_SPOILER_TEXT_CHANGE = 'COMPOSE_SPOILER_TEXT_CHANGE';
-export const COMPOSE_VISIBILITY_CHANGE = 'COMPOSE_VISIBILITY_CHANGE';
export const COMPOSE_COMPOSING_CHANGE = 'COMPOSE_COMPOSING_CHANGE';
export const COMPOSE_CONTENT_TYPE_CHANGE = 'COMPOSE_CONTENT_TYPE_CHANGE';
export const COMPOSE_LANGUAGE_CHANGE = 'COMPOSE_LANGUAGE_CHANGE';
@@ -825,13 +824,6 @@ export function changeComposeSpoilerText(text) {
};
}
-export function changeComposeVisibility(value) {
- return {
- type: COMPOSE_VISIBILITY_CHANGE,
- value,
- };
-}
-
export function insertEmojiCompose(position, emoji, needsSpace) {
return {
type: COMPOSE_EMOJI_INSERT,
diff --git a/app/javascript/flavours/glitch/actions/compose_typed.ts b/app/javascript/flavours/glitch/actions/compose_typed.ts
index fea0b3f71d..257c867034 100644
--- a/app/javascript/flavours/glitch/actions/compose_typed.ts
+++ b/app/javascript/flavours/glitch/actions/compose_typed.ts
@@ -13,10 +13,11 @@ import {
} from 'flavours/glitch/store/typed_functions';
import type { ApiQuotePolicy } from '../api_types/quotes';
-import type { Status } from '../models/status';
+import type { Status, StatusVisibility } from '../models/status';
+import type { RootState } from '../store';
import { showAlert } from './alerts';
-import { focusCompose } from './compose';
+import { changeCompose, focusCompose } from './compose';
import { importFetchedStatuses } from './importer';
import { openModal } from './modal';
@@ -41,6 +42,10 @@ const messages = defineMessages({
id: 'quote_error.unauthorized',
defaultMessage: 'You are not authorized to quote this post.',
},
+ quoteErrorPrivateMention: {
+ id: 'quote_error.private_mentions',
+ defaultMessage: 'Quoting is not allowed with direct mentions.',
+ },
});
type SimulatedMediaAttachmentJSON = ApiMediaAttachmentJSON & {
@@ -67,6 +72,39 @@ const simulateModifiedApiResponse = (
return data;
};
+export const changeComposeVisibility = createAppThunk(
+ 'compose/visibility_change',
+ (visibility: StatusVisibility, { dispatch, getState }) => {
+ if (visibility !== 'direct') {
+ return visibility;
+ }
+
+ const state = getState();
+ const quotedStatusId = state.compose.get('quoted_status_id') as
+ | string
+ | null;
+ if (!quotedStatusId) {
+ return visibility;
+ }
+
+ // Remove the quoted status
+ dispatch(quoteComposeCancel());
+ const quotedStatus = state.statuses.get(quotedStatusId) as Status | null;
+ if (!quotedStatus) {
+ return visibility;
+ }
+
+ // Append the quoted status URL to the compose text
+ const url = quotedStatus.get('url') as string;
+ const text = state.compose.get('text') as string;
+ if (!text.includes(url)) {
+ const newText = text.trim() ? `${text}\n\n${url}` : url;
+ dispatch(changeCompose(newText));
+ }
+ return visibility;
+ },
+);
+
export const changeUploadCompose = createDataLoadingThunk(
'compose/changeUpload',
async (
@@ -130,6 +168,8 @@ export const quoteComposeByStatus = createAppThunk(
if (composeState.get('id')) {
dispatch(showAlert({ message: messages.quoteErrorEdit }));
+ } else if (composeState.get('privacy') === 'direct') {
+ dispatch(showAlert({ message: messages.quoteErrorPrivateMention }));
} else if (composeState.get('poll')) {
dispatch(showAlert({ message: messages.quoteErrorPoll }));
} else if (
@@ -173,6 +213,17 @@ export const quoteComposeById = createAppThunk(
},
);
+const composeStateForbidsLink = (composeState: RootState['compose']) => {
+ return (
+ composeState.get('quoted_status_id') ||
+ composeState.get('is_submitting') ||
+ composeState.get('poll') ||
+ composeState.get('is_uploading') ||
+ composeState.get('id') ||
+ composeState.get('privacy') === 'direct'
+ );
+};
+
export const pasteLinkCompose = createDataLoadingThunk(
'compose/pasteLink',
async ({ url }: { url: string }) => {
@@ -183,16 +234,12 @@ export const pasteLinkCompose = createDataLoadingThunk(
limit: 2,
});
},
- (data, { dispatch, getState }) => {
+ (data, { dispatch, getState, requestId }) => {
const composeState = getState().compose;
if (
- composeState.get('quoted_status_id') ||
- composeState.get('is_submitting') ||
- composeState.get('poll') ||
- composeState.get('is_uploading') ||
- composeState.get('id') ||
- composeState.get('privacy') === 'direct'
+ composeStateForbidsLink(composeState) ||
+ composeState.get('fetching_link') !== requestId // Request has been cancelled
)
return;
@@ -208,6 +255,17 @@ export const pasteLinkCompose = createDataLoadingThunk(
dispatch(quoteComposeById(data.statuses[0].id));
}
},
+ {
+ useLoadingBar: false,
+ condition: (_, { getState }) =>
+ !getState().compose.get('fetching_link') &&
+ !composeStateForbidsLink(getState().compose),
+ },
+);
+
+// Ideally this would cancel the action and the HTTP request, but this is good enough
+export const cancelPasteLinkCompose = createAction(
+ 'compose/cancelPasteLinkCompose',
);
export const quoteComposeCancel = createAction('compose/quoteComposeCancel');
diff --git a/app/javascript/flavours/glitch/containers/media_container.jsx b/app/javascript/flavours/glitch/containers/media_container.jsx
index 88091f6013..bdf56c8185 100644
--- a/app/javascript/flavours/glitch/containers/media_container.jsx
+++ b/app/javascript/flavours/glitch/containers/media_container.jsx
@@ -10,7 +10,7 @@ import ModalRoot from 'flavours/glitch/components/modal_root';
import { Poll } from 'flavours/glitch/components/poll';
import { Audio } from 'flavours/glitch/features/audio';
import Card from 'flavours/glitch/features/status/components/card';
-import MediaModal from 'flavours/glitch/features/ui/components/media_modal';
+import { MediaModal } from 'flavours/glitch/features/ui/components/media_modal';
import { Video } from 'flavours/glitch/features/video';
import { IntlProvider } from 'flavours/glitch/locales';
import { createPollFromServerJSON } from 'flavours/glitch/models/poll';
diff --git a/app/javascript/flavours/glitch/features/compose/components/compose_form.jsx b/app/javascript/flavours/glitch/features/compose/components/compose_form.jsx
index 42fbeb3a33..60ff881604 100644
--- a/app/javascript/flavours/glitch/features/compose/components/compose_form.jsx
+++ b/app/javascript/flavours/glitch/features/compose/components/compose_form.jsx
@@ -155,7 +155,11 @@ class ComposeForm extends ImmutablePureComponent {
return;
}
- this.props.onSubmit(missingAltTextModal && this.props.missingAltText && this.props.privacy !== 'direct', overridePrivacy);
+ this.props.onSubmit({
+ missingAltTextModal: missingAltTextModal && this.props.missingAltText && this.props.privacy !== 'direct',
+ quoteToPrivate: this.props.quoteToPrivate,
+ overridePrivacy,
+ });
if (e) {
e.preventDefault();
diff --git a/app/javascript/flavours/glitch/features/compose/components/quote_placeholder.tsx b/app/javascript/flavours/glitch/features/compose/components/quote_placeholder.tsx
new file mode 100644
index 0000000000..18e131ec5e
--- /dev/null
+++ b/app/javascript/flavours/glitch/features/compose/components/quote_placeholder.tsx
@@ -0,0 +1,48 @@
+import { useCallback } from 'react';
+import type { FC } from 'react';
+
+import { defineMessages, useIntl } from 'react-intl';
+
+import { cancelPasteLinkCompose } from '@/flavours/glitch/actions/compose_typed';
+import { useAppDispatch } from '@/flavours/glitch/store';
+import CancelFillIcon from '@/material-icons/400-24px/cancel-fill.svg?react';
+import { DisplayName } from 'flavours/glitch/components/display_name';
+import { IconButton } from 'flavours/glitch/components/icon_button';
+import { Skeleton } from 'flavours/glitch/components/skeleton';
+
+const messages = defineMessages({
+ quote_cancel: { id: 'status.quote.cancel', defaultMessage: 'Cancel quote' },
+});
+
+export const QuotePlaceholder: FC = () => {
+ const intl = useIntl();
+ const dispatch = useAppDispatch();
+ const handleQuoteCancel = useCallback(() => {
+ dispatch(cancelPasteLinkCompose());
+ }, [dispatch]);
+
+ return (
+
+ );
+};
diff --git a/app/javascript/flavours/glitch/features/compose/components/quoted_post.tsx b/app/javascript/flavours/glitch/features/compose/components/quoted_post.tsx
index db95c58cb9..a59ec923bb 100644
--- a/app/javascript/flavours/glitch/features/compose/components/quoted_post.tsx
+++ b/app/javascript/flavours/glitch/features/compose/components/quoted_post.tsx
@@ -7,11 +7,17 @@ import { quoteComposeCancel } from '@/flavours/glitch/actions/compose_typed';
import { QuotedStatus } from '@/flavours/glitch/components/status_quoted';
import { useAppDispatch, useAppSelector } from '@/flavours/glitch/store';
+import { QuotePlaceholder } from './quote_placeholder';
+
export const ComposeQuotedStatus: FC = () => {
const quotedStatusId = useAppSelector(
(state) => state.compose.get('quoted_status_id') as string | null,
);
+ const isFetchingLink = useAppSelector(
+ (state) => !!state.compose.get('fetching_link'),
+ );
+
const isEditing = useAppSelector((state) => !!state.compose.get('id'));
const quote = useMemo(
@@ -30,7 +36,9 @@ export const ComposeQuotedStatus: FC = () => {
dispatch(quoteComposeCancel());
}, [dispatch]);
- if (!quote) {
+ if (isFetchingLink && !quote) {
+ return ;
+ } else if (!quote) {
return null;
}
diff --git a/app/javascript/flavours/glitch/features/compose/components/visibility_button.tsx b/app/javascript/flavours/glitch/features/compose/components/visibility_button.tsx
index 1e6462ecd3..07f4815e02 100644
--- a/app/javascript/flavours/glitch/features/compose/components/visibility_button.tsx
+++ b/app/javascript/flavours/glitch/features/compose/components/visibility_button.tsx
@@ -5,8 +5,10 @@ import { defineMessages, useIntl } from 'react-intl';
import classNames from 'classnames';
-import { changeComposeVisibility } from '@/flavours/glitch/actions/compose';
-import { setComposeQuotePolicy } from '@/flavours/glitch/actions/compose_typed';
+import {
+ changeComposeVisibility,
+ setComposeQuotePolicy,
+} from '@/flavours/glitch/actions/compose_typed';
import { openModal } from '@/flavours/glitch/actions/modal';
import type { ApiQuotePolicy } from '@/flavours/glitch/api_types/quotes';
import type { StatusVisibility } from '@/flavours/glitch/api_types/statuses';
diff --git a/app/javascript/flavours/glitch/features/compose/containers/compose_form_container.js b/app/javascript/flavours/glitch/features/compose/containers/compose_form_container.js
index fd7186d71a..eb9efb2e32 100644
--- a/app/javascript/flavours/glitch/features/compose/containers/compose_form_container.js
+++ b/app/javascript/flavours/glitch/features/compose/containers/compose_form_container.js
@@ -12,6 +12,7 @@ import {
} from 'flavours/glitch/actions/compose';
import { pasteLinkCompose } from 'flavours/glitch/actions/compose_typed';
import { openModal } from 'flavours/glitch/actions/modal';
+import { PRIVATE_QUOTE_MODAL_ID } from 'flavours/glitch/features/ui/components/confirmation_modals/private_quote_notify';
import { privacyPreference } from 'flavours/glitch/utils/privacy_preference';
import ComposeForm from '../components/compose_form';
@@ -52,6 +53,10 @@ const mapStateToProps = state => ({
isUploading: state.getIn(['compose', 'is_uploading']),
anyMedia: state.getIn(['compose', 'media_attachments']).size > 0,
missingAltText: state.getIn(['compose', 'media_attachments']).some(media => ['image', 'gifv'].includes(media.get('type')) && (media.get('description') ?? '').length === 0),
+ quoteToPrivate:
+ !!state.getIn(['compose', 'quoted_status_id'])
+ && state.getIn(['compose', 'privacy']) === 'private'
+ && !state.getIn(['settings', 'dismissed_banners', PRIVATE_QUOTE_MODAL_ID]),
isInReply: state.getIn(['compose', 'in_reply_to']) !== null,
lang: state.getIn(['compose', 'language']),
sideArm: sideArmPrivacy(state),
@@ -65,12 +70,17 @@ const mapDispatchToProps = (dispatch, props) => ({
dispatch(changeCompose(text));
},
- onSubmit (missingAltText, overridePrivacy = null) {
+ onSubmit ({ missingAltText, quoteToPrivate, overridePrivacy = null }) {
if (missingAltText) {
dispatch(openModal({
modalType: 'CONFIRM_MISSING_ALT_TEXT',
modalProps: { overridePrivacy },
}));
+ } else if (quoteToPrivate) {
+ dispatch(openModal({
+ modalType: 'CONFIRM_PRIVATE_QUOTE_NOTIFY',
+ modalProps: {},
+ }));
} else {
dispatch(submitCompose(overridePrivacy, (status) => {
if (props.redirectOnSuccess) {
diff --git a/app/javascript/flavours/glitch/features/compose/containers/privacy_dropdown_container.js b/app/javascript/flavours/glitch/features/compose/containers/privacy_dropdown_container.js
index 6d3eef13aa..a44b5c0d97 100644
--- a/app/javascript/flavours/glitch/features/compose/containers/privacy_dropdown_container.js
+++ b/app/javascript/flavours/glitch/features/compose/containers/privacy_dropdown_container.js
@@ -1,8 +1,7 @@
import { connect } from 'react-redux';
-import { changeComposeVisibility } from '../../../actions/compose';
-import { openModal, closeModal } from '../../../actions/modal';
-import { isUserTouching } from '../../../is_mobile';
+import { changeComposeVisibility } from '@/flavours/glitch/actions/compose_typed';
+
import PrivacyDropdown from '../components/privacy_dropdown';
const mapStateToProps = state => ({
diff --git a/app/javascript/flavours/glitch/features/status/index.jsx b/app/javascript/flavours/glitch/features/status/index.jsx
index 072842ed3a..a1b3cced38 100644
--- a/app/javascript/flavours/glitch/features/status/index.jsx
+++ b/app/javascript/flavours/glitch/features/status/index.jsx
@@ -329,6 +329,12 @@ class Status extends ImmutablePureComponent {
dispatch(openModal({ modalType: 'COMPOSE_PRIVACY', modalProps: { statusId, onChange: handleChange } }));
};
+ handleQuote = (status) => {
+ const { dispatch } = this.props;
+
+ dispatch(quoteComposeById(status.get('id')));
+ };
+
handleEditClick = (status) => {
const { dispatch, askReplyConfirmation } = this.props;
@@ -624,7 +630,7 @@ class Status extends ImmutablePureComponent {
showBackButton
multiColumn={multiColumn}
extraButton={(
-
+
)}
/>
@@ -659,6 +665,7 @@ class Status extends ImmutablePureComponent {
onDelete={this.handleDeleteClick}
onRevokeQuote={this.handleRevokeQuoteClick}
onQuotePolicyChange={this.handleQuotePolicyChange}
+ onQuote={this.handleQuote}
onEdit={this.handleEditClick}
onDirect={this.handleDirectClick}
onMention={this.handleMentionClick}
diff --git a/app/javascript/flavours/glitch/features/ui/components/confirmation_modals/confirmation_modal.tsx b/app/javascript/flavours/glitch/features/ui/components/confirmation_modals/confirmation_modal.tsx
index 065ffc9d7c..cf22159073 100644
--- a/app/javascript/flavours/glitch/features/ui/components/confirmation_modals/confirmation_modal.tsx
+++ b/app/javascript/flavours/glitch/features/ui/components/confirmation_modals/confirmation_modal.tsx
@@ -26,6 +26,7 @@ export const ConfirmationModal: React.FC<
onSecondary?: () => void;
onConfirm: () => void;
closeWhenConfirm?: boolean;
+ extraContent?: React.ReactNode;
} & BaseConfirmationModalProps
> = ({
title,
@@ -37,6 +38,7 @@ export const ConfirmationModal: React.FC<
secondary,
onSecondary,
closeWhenConfirm = true,
+ extraContent,
}) => {
const handleClick = useCallback(() => {
if (closeWhenConfirm) {
@@ -57,6 +59,8 @@ export const ConfirmationModal: React.FC<
{title}
{message &&
{message}
}
+
+ {extraContent}
diff --git a/app/javascript/flavours/glitch/features/ui/components/confirmation_modals/private_quote_notify.tsx b/app/javascript/flavours/glitch/features/ui/components/confirmation_modals/private_quote_notify.tsx
new file mode 100644
index 0000000000..c461e1e43e
--- /dev/null
+++ b/app/javascript/flavours/glitch/features/ui/components/confirmation_modals/private_quote_notify.tsx
@@ -0,0 +1,88 @@
+import { forwardRef, useCallback, useState } from 'react';
+
+import { defineMessages, FormattedMessage, useIntl } from 'react-intl';
+
+import { submitCompose } from '@/flavours/glitch/actions/compose';
+import { changeSetting } from '@/flavours/glitch/actions/settings';
+import { CheckBox } from '@/flavours/glitch/components/check_box';
+import { useAppDispatch } from '@/flavours/glitch/store';
+
+import { ConfirmationModal } from './confirmation_modal';
+import type { BaseConfirmationModalProps } from './confirmation_modal';
+import classes from './styles.module.css';
+
+export const PRIVATE_QUOTE_MODAL_ID = 'quote/private_notify';
+
+const messages = defineMessages({
+ title: {
+ id: 'confirmations.private_quote_notify.title',
+ defaultMessage: 'Share with followers and mentioned users?',
+ },
+ message: {
+ id: 'confirmations.private_quote_notify.message',
+ defaultMessage:
+ 'The person you are quoting and other mentions ' +
+ "will be notified and will be able to view your post, even if they're not following you.",
+ },
+ confirm: {
+ id: 'confirmations.private_quote_notify.confirm',
+ defaultMessage: 'Publish post',
+ },
+ cancel: {
+ id: 'confirmations.private_quote_notify.cancel',
+ defaultMessage: 'Back to editing',
+ },
+});
+
+export const PrivateQuoteNotify = forwardRef<
+ HTMLDivElement,
+ BaseConfirmationModalProps
+>(
+ (
+ { onClose },
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
+ _ref,
+ ) => {
+ const intl = useIntl();
+
+ const [dismiss, setDismissed] = useState(false);
+ const handleDismissToggle = useCallback(() => {
+ setDismissed((prev) => !prev);
+ }, []);
+
+ const dispatch = useAppDispatch();
+ const handleConfirm = useCallback(() => {
+ dispatch(submitCompose());
+ if (dismiss) {
+ dispatch(
+ changeSetting(['dismissed_banners', PRIVATE_QUOTE_MODAL_ID], true),
+ );
+ }
+ }, [dismiss, dispatch]);
+
+ return (
+
+ {' '}
+
+
+ }
+ />
+ );
+ },
+);
+PrivateQuoteNotify.displayName = 'PrivateQuoteNotify';
diff --git a/app/javascript/flavours/glitch/features/ui/components/confirmation_modals/styles.module.css b/app/javascript/flavours/glitch/features/ui/components/confirmation_modals/styles.module.css
new file mode 100644
index 0000000000..f685c4525f
--- /dev/null
+++ b/app/javascript/flavours/glitch/features/ui/components/confirmation_modals/styles.module.css
@@ -0,0 +1,7 @@
+.checkbox_wrapper {
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+ margin: 1rem 0;
+ cursor: pointer;
+}
diff --git a/app/javascript/flavours/glitch/features/ui/components/media_modal.jsx b/app/javascript/flavours/glitch/features/ui/components/media_modal.jsx
deleted file mode 100644
index 1f59892d83..0000000000
--- a/app/javascript/flavours/glitch/features/ui/components/media_modal.jsx
+++ /dev/null
@@ -1,295 +0,0 @@
-import PropTypes from 'prop-types';
-
-import { defineMessages, injectIntl } from 'react-intl';
-
-import classNames from 'classnames';
-
-import ImmutablePropTypes from 'react-immutable-proptypes';
-import ImmutablePureComponent from 'react-immutable-pure-component';
-
-import ReactSwipeableViews from 'react-swipeable-views';
-
-import ChevronLeftIcon from '@/material-icons/400-24px/chevron_left.svg?react';
-import ChevronRightIcon from '@/material-icons/400-24px/chevron_right.svg?react';
-import CloseIcon from '@/material-icons/400-24px/close.svg?react';
-import FitScreenIcon from '@/material-icons/400-24px/fit_screen.svg?react';
-import ActualSizeIcon from '@/svg-icons/actual_size.svg?react';
-import { getAverageFromBlurhash } from 'flavours/glitch/blurhash';
-import { GIFV } from 'flavours/glitch/components/gifv';
-import { Icon } from 'flavours/glitch/components/icon';
-import { IconButton } from 'flavours/glitch/components/icon_button';
-import { Footer } from 'flavours/glitch/features/picture_in_picture/components/footer';
-import { Video } from 'flavours/glitch/features/video';
-import { disableSwiping } from 'flavours/glitch/initial_state';
-
-import { ZoomableImage } from './zoomable_image';
-
-const messages = defineMessages({
- close: { id: 'lightbox.close', defaultMessage: 'Close' },
- previous: { id: 'lightbox.previous', defaultMessage: 'Previous' },
- next: { id: 'lightbox.next', defaultMessage: 'Next' },
- zoomIn: { id: 'lightbox.zoom_in', defaultMessage: 'Zoom to actual size' },
- zoomOut: { id: 'lightbox.zoom_out', defaultMessage: 'Zoom to fit' },
-});
-
-class MediaModal extends ImmutablePureComponent {
-
- static propTypes = {
- media: ImmutablePropTypes.list.isRequired,
- statusId: PropTypes.string,
- lang: PropTypes.string,
- index: PropTypes.number.isRequired,
- onClose: PropTypes.func.isRequired,
- intl: PropTypes.object.isRequired,
- onChangeBackgroundColor: PropTypes.func.isRequired,
- currentTime: PropTypes.number,
- autoPlay: PropTypes.bool,
- volume: PropTypes.number,
- };
-
- state = {
- index: null,
- navigationHidden: false,
- zoomedIn: false,
- };
-
- handleZoomClick = () => {
- this.setState(prevState => ({
- zoomedIn: !prevState.zoomedIn,
- }));
- };
-
- handleZoomChange = (zoomedIn) => {
- this.setState({
- zoomedIn,
- });
- };
-
- handleSwipe = (index) => {
- this.setState({
- index: index % this.props.media.size,
- zoomedIn: false,
- });
- };
-
- handleTransitionEnd = () => {
- this.setState({
- zoomedIn: false,
- });
- };
-
- handleNextClick = () => {
- this.setState({
- index: (this.getIndex() + 1) % this.props.media.size,
- zoomedIn: false,
- });
- };
-
- handlePrevClick = () => {
- this.setState({
- index: (this.props.media.size + this.getIndex() - 1) % this.props.media.size,
- zoomedIn: false,
- });
- };
-
- handleChangeIndex = (e) => {
- const index = Number(e.currentTarget.getAttribute('data-index'));
-
- this.setState({
- index: index % this.props.media.size,
- zoomedIn: false,
- });
- };
-
- handleKeyDown = (e) => {
- switch(e.key) {
- case 'ArrowLeft':
- this.handlePrevClick();
- e.preventDefault();
- e.stopPropagation();
- break;
- case 'ArrowRight':
- this.handleNextClick();
- e.preventDefault();
- e.stopPropagation();
- break;
- }
- };
-
- componentDidMount () {
- window.addEventListener('keydown', this.handleKeyDown, false);
-
- this._sendBackgroundColor();
- }
-
- componentDidUpdate (prevProps, prevState) {
- if (prevState.index !== this.state.index) {
- this._sendBackgroundColor();
- }
- }
-
- _sendBackgroundColor () {
- const { media, onChangeBackgroundColor } = this.props;
- const index = this.getIndex();
- const blurhash = media.getIn([index, 'blurhash']);
-
- if (blurhash) {
- const backgroundColor = getAverageFromBlurhash(blurhash);
- onChangeBackgroundColor(backgroundColor);
- }
- }
-
- componentWillUnmount () {
- window.removeEventListener('keydown', this.handleKeyDown);
-
- this.props.onChangeBackgroundColor(null);
- }
-
- getIndex () {
- return this.state.index !== null ? this.state.index : this.props.index;
- }
-
- handleToggleNavigation = () => {
- this.setState(prevState => ({
- navigationHidden: !prevState.navigationHidden,
- }));
- };
-
- setRef = c => {
- this.setState({
- viewportWidth: c?.clientWidth,
- viewportHeight: c?.clientHeight,
- });
- };
-
- render () {
- const { media, statusId, lang, intl, onClose } = this.props;
- const { navigationHidden, zoomedIn, viewportWidth, viewportHeight } = this.state;
-
- const index = this.getIndex();
-
- const leftNav = media.size > 1 && ;
- const rightNav = media.size > 1 && ;
-
- const content = media.map((image, idx) => {
- const width = image.getIn(['meta', 'original', 'width']) || null;
- const height = image.getIn(['meta', 'original', 'height']) || null;
- const description = image.getIn(['translation', 'description']) || image.get('description');
-
- if (image.get('type') === 'image') {
- return (
-
- );
- } else if (image.get('type') === 'video') {
- const { currentTime, autoPlay, volume } = this.props;
-
- return (
-
- );
- } else if (image.get('type') === 'gifv') {
- return (
-
- );
- }
-
- return null;
- }).toArray();
-
- // you can't use 100vh, because the viewport height is taller
- // than the visible part of the document in some mobile
- // browsers when it's address bar is visible.
- // https://developers.google.com/web/updates/2016/12/url-bar-resizing
- const swipeableViewsStyle = {
- width: '100%',
- height: '100%',
- };
-
- const containerStyle = {
- alignItems: 'center', // center vertically
- };
-
- const navigationClassName = classNames('media-modal__navigation', {
- 'media-modal__navigation--hidden': navigationHidden,
- });
-
- let pagination;
-
- if (media.size > 1) {
- pagination = media.map((item, i) => (
-
- ));
- }
-
- const currentMedia = media.get(index);
- const zoomable = currentMedia.get('type') === 'image' && (currentMedia.getIn(['meta', 'original', 'width']) > viewportWidth || currentMedia.getIn(['meta', 'original', 'height']) > viewportHeight);
-
- return (
-
-
-
- {content}
-
-
-
-
-
- {zoomable && }
-
-
-
- {leftNav}
- {rightNav}
-
-
- {pagination &&
}
- {statusId &&
}
-
-
-
- );
- }
-
-}
-
-export default injectIntl(MediaModal);
diff --git a/app/javascript/flavours/glitch/features/ui/components/media_modal.tsx b/app/javascript/flavours/glitch/features/ui/components/media_modal.tsx
new file mode 100644
index 0000000000..a8cdeeab94
--- /dev/null
+++ b/app/javascript/flavours/glitch/features/ui/components/media_modal.tsx
@@ -0,0 +1,363 @@
+import { forwardRef, useCallback, useEffect, useMemo, useState } from 'react';
+import type { RefCallback, FC } from 'react';
+
+import { defineMessages, useIntl } from 'react-intl';
+
+import classNames from 'classnames';
+
+import type { List as ImmutableList } from 'immutable';
+
+import { animated, useSpring } from '@react-spring/web';
+import { useDrag } from '@use-gesture/react';
+
+import type { MediaAttachment } from '@/flavours/glitch/models/status';
+import ChevronLeftIcon from '@/material-icons/400-24px/chevron_left.svg?react';
+import ChevronRightIcon from '@/material-icons/400-24px/chevron_right.svg?react';
+import CloseIcon from '@/material-icons/400-24px/close.svg?react';
+import FitScreenIcon from '@/material-icons/400-24px/fit_screen.svg?react';
+import ActualSizeIcon from '@/svg-icons/actual_size.svg?react';
+import type { RGB } from 'flavours/glitch/blurhash';
+import { getAverageFromBlurhash } from 'flavours/glitch/blurhash';
+import { GIFV } from 'flavours/glitch/components/gifv';
+import { Icon } from 'flavours/glitch/components/icon';
+import { IconButton } from 'flavours/glitch/components/icon_button';
+import { Footer } from 'flavours/glitch/features/picture_in_picture/components/footer';
+import { Video } from 'flavours/glitch/features/video';
+
+import { ZoomableImage } from './zoomable_image';
+
+const messages = defineMessages({
+ close: { id: 'lightbox.close', defaultMessage: 'Close' },
+ previous: { id: 'lightbox.previous', defaultMessage: 'Previous' },
+ next: { id: 'lightbox.next', defaultMessage: 'Next' },
+ zoomIn: { id: 'lightbox.zoom_in', defaultMessage: 'Zoom to actual size' },
+ zoomOut: { id: 'lightbox.zoom_out', defaultMessage: 'Zoom to fit' },
+});
+
+interface MediaModalProps {
+ media: ImmutableList;
+ statusId?: string;
+ lang?: string;
+ index: number;
+ onClose: () => void;
+ onChangeBackgroundColor: (color: RGB | null) => void;
+ currentTime?: number;
+ autoPlay?: boolean;
+ volume?: number;
+}
+
+export const MediaModal: FC = forwardRef<
+ HTMLDivElement,
+ MediaModalProps
+>(
+ (
+ {
+ media,
+ onClose,
+ index: startIndex,
+ lang,
+ currentTime,
+ autoPlay,
+ volume,
+ statusId,
+ onChangeBackgroundColor,
+ },
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars -- _ref is required to keep the ref forwarding working
+ _ref,
+ ) => {
+ const [index, setIndex] = useState(startIndex);
+ const currentMedia = media.get(index);
+
+ const handleChangeIndex = useCallback(
+ (newIndex: number) => {
+ if (newIndex < 0) {
+ newIndex = media.size + newIndex;
+ }
+ setIndex(newIndex % media.size);
+ setZoomedIn(false);
+ },
+ [media.size],
+ );
+ const handlePrevClick = useCallback(() => {
+ handleChangeIndex(index - 1);
+ }, [handleChangeIndex, index]);
+ const handleNextClick = useCallback(() => {
+ handleChangeIndex(index + 1);
+ }, [handleChangeIndex, index]);
+
+ const handleKeyDown = useCallback(
+ (event: KeyboardEvent) => {
+ if (event.key === 'ArrowLeft') {
+ handlePrevClick();
+ event.preventDefault();
+ event.stopPropagation();
+ } else if (event.key === 'ArrowRight') {
+ handleNextClick();
+ event.preventDefault();
+ event.stopPropagation();
+ }
+ },
+ [handleNextClick, handlePrevClick],
+ );
+
+ useEffect(() => {
+ window.addEventListener('keydown', handleKeyDown, false);
+
+ return () => {
+ window.removeEventListener('keydown', handleKeyDown);
+ };
+ }, [handleKeyDown]);
+
+ useEffect(() => {
+ const blurhash = currentMedia?.get('blurhash') as string | undefined;
+ if (blurhash) {
+ const backgroundColor = getAverageFromBlurhash(blurhash);
+ if (backgroundColor) {
+ onChangeBackgroundColor(backgroundColor);
+ }
+ }
+ }, [currentMedia, onChangeBackgroundColor]);
+
+ const [viewportDimensions, setViewportDimensions] = useState<{
+ width: number;
+ height: number;
+ }>({ width: 0, height: 0 });
+ const handleRef: RefCallback = useCallback((ele) => {
+ if (ele?.clientWidth && ele.clientHeight) {
+ setViewportDimensions({
+ width: ele.clientWidth,
+ height: ele.clientHeight,
+ });
+ }
+ }, []);
+
+ const [zoomedIn, setZoomedIn] = useState(false);
+ const zoomable =
+ currentMedia?.get('type') === 'image' &&
+ ((currentMedia.getIn(['meta', 'original', 'width']) as number) >
+ viewportDimensions.width ||
+ (currentMedia.getIn(['meta', 'original', 'height']) as number) >
+ viewportDimensions.height);
+ const handleZoomClick = useCallback(() => {
+ setZoomedIn((prev) => !prev);
+ }, []);
+
+ const wrapperStyles = useSpring({
+ x: `-${index * 100}%`,
+ });
+ const bind = useDrag(
+ ({ swipe: [swipeX] }) => {
+ if (swipeX === 0) return;
+ handleChangeIndex(index + swipeX * -1); // Invert swipe as swiping left loads the next slide.
+ },
+ { pointer: { capture: false } },
+ );
+
+ const [navigationHidden, setNavigationHidden] = useState(false);
+ const handleToggleNavigation = useCallback(() => {
+ setNavigationHidden((prev) => !prev);
+ }, []);
+
+ const content = useMemo(
+ () =>
+ media.map((item, idx) => {
+ const url = item.get('url') as string;
+ const blurhash = item.get('blurhash') as string;
+ const width = item.getIn(['meta', 'original', 'width'], 0) as number;
+ const height = item.getIn(
+ ['meta', 'original', 'height'],
+ 0,
+ ) as number;
+ const description = item.getIn(
+ ['translation', 'description'],
+ item.get('description'),
+ ) as string;
+ if (item.get('type') === 'image') {
+ return (
+
+ );
+ } else if (item.get('type') === 'video') {
+ return (
+
+ );
+ } else if (item.get('type') === 'gifv') {
+ return (
+
+ );
+ }
+
+ return null;
+ }),
+ [
+ autoPlay,
+ currentTime,
+ handleToggleNavigation,
+ handleZoomClick,
+ index,
+ lang,
+ media,
+ onClose,
+ volume,
+ zoomedIn,
+ ],
+ );
+
+ const intl = useIntl();
+
+ const leftNav = media.size > 1 && (
+
+ );
+ const rightNav = media.size > 1 && (
+
+ );
+
+ return (
+
+
+ {content}
+
+
+
+
+ {zoomable && (
+
+ )}
+
+
+
+ {leftNav}
+ {rightNav}
+
+
+
+ {statusId && (
+
+ )}
+
+
+
+ );
+ },
+);
+MediaModal.displayName = 'MediaModal';
+
+interface MediaPaginationProps {
+ itemsCount: number;
+ index: number;
+ onChangeIndex: (newIndex: number) => void;
+}
+
+const MediaPagination: FC = ({
+ itemsCount,
+ index,
+ onChangeIndex,
+}) => {
+ const handleChangeIndex = useCallback(
+ (curIndex: number) => {
+ return () => {
+ onChangeIndex(curIndex);
+ };
+ },
+ [onChangeIndex],
+ );
+
+ if (itemsCount <= 1) {
+ return null;
+ }
+
+ return (
+
+ {Array.from({ length: itemsCount }).map((_, i) => (
+
+ ))}
+
+ );
+};
diff --git a/app/javascript/flavours/glitch/features/ui/components/modal_root.jsx b/app/javascript/flavours/glitch/features/ui/components/modal_root.jsx
index 4f2e63fb0d..badd4d2cf1 100644
--- a/app/javascript/flavours/glitch/features/ui/components/modal_root.jsx
+++ b/app/javascript/flavours/glitch/features/ui/components/modal_root.jsx
@@ -47,10 +47,11 @@ import DeprecatedSettingsModal from './deprecated_settings_modal';
import DoodleModal from './doodle_modal';
import { FavouriteModal } from './favourite_modal';
import { ImageModal } from './image_modal';
-import MediaModal from './media_modal';
+import { MediaModal } from './media_modal';
import { ModalPlaceholder } from './modal_placeholder';
import VideoModal from './video_modal';
import { VisibilityModal } from './visibility_modal';
+import { PrivateQuoteNotify } from './confirmation_modals/private_quote_notify';
export const MODAL_COMPONENTS = {
'MEDIA': () => Promise.resolve({ default: MediaModal }),
@@ -72,6 +73,7 @@ export const MODAL_COMPONENTS = {
'CONFIRM_LOG_OUT': () => Promise.resolve({ default: ConfirmLogOutModal }),
'CONFIRM_FOLLOW_TO_LIST': () => Promise.resolve({ default: ConfirmFollowToListModal }),
'CONFIRM_MISSING_ALT_TEXT': () => Promise.resolve({ default: ConfirmMissingAltTextModal }),
+ 'CONFIRM_PRIVATE_QUOTE_NOTIFY': () => Promise.resolve({ default: PrivateQuoteNotify }),
'CONFIRM_REVOKE_QUOTE': () => Promise.resolve({ default: ConfirmRevokeQuoteModal }),
'CONFIRM_QUIET_QUOTE': () => Promise.resolve({ default: QuietPostQuoteInfoModal }),
'MUTE': MuteModal,
diff --git a/app/javascript/flavours/glitch/features/ui/components/visibility_modal.tsx b/app/javascript/flavours/glitch/features/ui/components/visibility_modal.tsx
index 9edd061e9f..4184c84c4b 100644
--- a/app/javascript/flavours/glitch/features/ui/components/visibility_modal.tsx
+++ b/app/javascript/flavours/glitch/features/ui/components/visibility_modal.tsx
@@ -128,9 +128,12 @@ export const VisibilityModal: FC = forwardRef(
const disableVisibility = !!statusId;
const disableQuotePolicy =
visibility === 'private' || visibility === 'direct';
- const disablePublicVisibilities: boolean = useAppSelector(
+ const disablePublicVisibilities = useAppSelector(
selectDisablePublicVisibilities,
);
+ const isQuotePost = useAppSelector(
+ (state) => state.compose.get('quoted_status_id') !== null,
+ );
const visibilityItems = useMemo[]>(() => {
const items: SelectItem[] = [
@@ -315,6 +318,21 @@ export const VisibilityModal: FC = forwardRef(
id={quoteDescriptionId}
/>
+
+ {isQuotePost && visibility === 'direct' && (
+
+
+
+
+ )}
diff --git a/app/javascript/mastodon/features/ui/components/confirmation_modals/private_quote_notify.tsx b/app/javascript/mastodon/features/ui/components/confirmation_modals/private_quote_notify.tsx
new file mode 100644
index 0000000000..ef917a1027
--- /dev/null
+++ b/app/javascript/mastodon/features/ui/components/confirmation_modals/private_quote_notify.tsx
@@ -0,0 +1,88 @@
+import { forwardRef, useCallback, useState } from 'react';
+
+import { defineMessages, FormattedMessage, useIntl } from 'react-intl';
+
+import { submitCompose } from '@/mastodon/actions/compose';
+import { changeSetting } from '@/mastodon/actions/settings';
+import { CheckBox } from '@/mastodon/components/check_box';
+import { useAppDispatch } from '@/mastodon/store';
+
+import { ConfirmationModal } from './confirmation_modal';
+import type { BaseConfirmationModalProps } from './confirmation_modal';
+import classes from './styles.module.css';
+
+export const PRIVATE_QUOTE_MODAL_ID = 'quote/private_notify';
+
+const messages = defineMessages({
+ title: {
+ id: 'confirmations.private_quote_notify.title',
+ defaultMessage: 'Share with followers and mentioned users?',
+ },
+ message: {
+ id: 'confirmations.private_quote_notify.message',
+ defaultMessage:
+ 'The person you are quoting and other mentions ' +
+ "will be notified and will be able to view your post, even if they're not following you.",
+ },
+ confirm: {
+ id: 'confirmations.private_quote_notify.confirm',
+ defaultMessage: 'Publish post',
+ },
+ cancel: {
+ id: 'confirmations.private_quote_notify.cancel',
+ defaultMessage: 'Back to editing',
+ },
+});
+
+export const PrivateQuoteNotify = forwardRef<
+ HTMLDivElement,
+ BaseConfirmationModalProps
+>(
+ (
+ { onClose },
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
+ _ref,
+ ) => {
+ const intl = useIntl();
+
+ const [dismiss, setDismissed] = useState(false);
+ const handleDismissToggle = useCallback(() => {
+ setDismissed((prev) => !prev);
+ }, []);
+
+ const dispatch = useAppDispatch();
+ const handleConfirm = useCallback(() => {
+ dispatch(submitCompose());
+ if (dismiss) {
+ dispatch(
+ changeSetting(['dismissed_banners', PRIVATE_QUOTE_MODAL_ID], true),
+ );
+ }
+ }, [dismiss, dispatch]);
+
+ return (
+
+ {' '}
+
+
+ }
+ />
+ );
+ },
+);
+PrivateQuoteNotify.displayName = 'PrivateQuoteNotify';
diff --git a/app/javascript/mastodon/features/ui/components/confirmation_modals/styles.module.css b/app/javascript/mastodon/features/ui/components/confirmation_modals/styles.module.css
new file mode 100644
index 0000000000..f685c4525f
--- /dev/null
+++ b/app/javascript/mastodon/features/ui/components/confirmation_modals/styles.module.css
@@ -0,0 +1,7 @@
+.checkbox_wrapper {
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+ margin: 1rem 0;
+ cursor: pointer;
+}
diff --git a/app/javascript/mastodon/features/ui/components/media_modal.jsx b/app/javascript/mastodon/features/ui/components/media_modal.jsx
deleted file mode 100644
index 2ce13bf1d3..0000000000
--- a/app/javascript/mastodon/features/ui/components/media_modal.jsx
+++ /dev/null
@@ -1,296 +0,0 @@
-import PropTypes from 'prop-types';
-
-import { defineMessages, injectIntl } from 'react-intl';
-
-import classNames from 'classnames';
-
-import ImmutablePropTypes from 'react-immutable-proptypes';
-import ImmutablePureComponent from 'react-immutable-pure-component';
-
-import ReactSwipeableViews from 'react-swipeable-views';
-
-import ChevronLeftIcon from '@/material-icons/400-24px/chevron_left.svg?react';
-import ChevronRightIcon from '@/material-icons/400-24px/chevron_right.svg?react';
-import CloseIcon from '@/material-icons/400-24px/close.svg?react';
-import FitScreenIcon from '@/material-icons/400-24px/fit_screen.svg?react';
-import ActualSizeIcon from '@/svg-icons/actual_size.svg?react';
-import { getAverageFromBlurhash } from 'mastodon/blurhash';
-import { GIFV } from 'mastodon/components/gifv';
-import { Icon } from 'mastodon/components/icon';
-import { IconButton } from 'mastodon/components/icon_button';
-import { Footer } from 'mastodon/features/picture_in_picture/components/footer';
-import { Video } from 'mastodon/features/video';
-import { disableSwiping } from 'mastodon/initial_state';
-
-import { ZoomableImage } from './zoomable_image';
-
-const messages = defineMessages({
- close: { id: 'lightbox.close', defaultMessage: 'Close' },
- previous: { id: 'lightbox.previous', defaultMessage: 'Previous' },
- next: { id: 'lightbox.next', defaultMessage: 'Next' },
- zoomIn: { id: 'lightbox.zoom_in', defaultMessage: 'Zoom to actual size' },
- zoomOut: { id: 'lightbox.zoom_out', defaultMessage: 'Zoom to fit' },
-});
-
-class MediaModal extends ImmutablePureComponent {
-
- static propTypes = {
- media: ImmutablePropTypes.list.isRequired,
- statusId: PropTypes.string,
- lang: PropTypes.string,
- index: PropTypes.number.isRequired,
- onClose: PropTypes.func.isRequired,
- intl: PropTypes.object.isRequired,
- onChangeBackgroundColor: PropTypes.func.isRequired,
- currentTime: PropTypes.number,
- autoPlay: PropTypes.bool,
- volume: PropTypes.number,
- };
-
- state = {
- index: null,
- navigationHidden: false,
- zoomedIn: false,
- };
-
- handleZoomClick = () => {
- this.setState(prevState => ({
- zoomedIn: !prevState.zoomedIn,
- }));
- };
-
- handleZoomChange = (zoomedIn) => {
- this.setState({
- zoomedIn,
- });
- };
-
- handleSwipe = (index) => {
- this.setState({
- index: index % this.props.media.size,
- zoomedIn: false,
- });
- };
-
- handleTransitionEnd = () => {
- this.setState({
- zoomedIn: false,
- });
- };
-
- handleNextClick = () => {
- this.setState({
- index: (this.getIndex() + 1) % this.props.media.size,
- zoomedIn: false,
- });
- };
-
- handlePrevClick = () => {
- this.setState({
- index: (this.props.media.size + this.getIndex() - 1) % this.props.media.size,
- zoomedIn: false,
- });
- };
-
- handleChangeIndex = (e) => {
- const index = Number(e.currentTarget.getAttribute('data-index'));
-
- this.setState({
- index: index % this.props.media.size,
- zoomedIn: false,
- });
- };
-
- handleKeyDown = (e) => {
- switch(e.key) {
- case 'ArrowLeft':
- this.handlePrevClick();
- e.preventDefault();
- e.stopPropagation();
- break;
- case 'ArrowRight':
- this.handleNextClick();
- e.preventDefault();
- e.stopPropagation();
- break;
- }
- };
-
- componentDidMount () {
- window.addEventListener('keydown', this.handleKeyDown, false);
-
- this._sendBackgroundColor();
- }
-
- componentDidUpdate (prevProps, prevState) {
- if (prevState.index !== this.state.index) {
- this._sendBackgroundColor();
- }
- }
-
- _sendBackgroundColor () {
- const { media, onChangeBackgroundColor } = this.props;
- const index = this.getIndex();
- const blurhash = media.getIn([index, 'blurhash']);
-
- if (blurhash) {
- const backgroundColor = getAverageFromBlurhash(blurhash);
- onChangeBackgroundColor(backgroundColor);
- }
- }
-
- componentWillUnmount () {
- window.removeEventListener('keydown', this.handleKeyDown);
-
- this.props.onChangeBackgroundColor(null);
- }
-
- getIndex () {
- return this.state.index !== null ? this.state.index : this.props.index;
- }
-
- handleToggleNavigation = () => {
- this.setState(prevState => ({
- navigationHidden: !prevState.navigationHidden,
- }));
- };
-
- setRef = c => {
- this.setState({
- viewportWidth: c?.clientWidth,
- viewportHeight: c?.clientHeight,
- });
- };
-
- render () {
- const { media, statusId, lang, intl, onClose } = this.props;
- const { navigationHidden, zoomedIn, viewportWidth, viewportHeight } = this.state;
-
- const index = this.getIndex();
-
- const leftNav = media.size > 1 && ;
- const rightNav = media.size > 1 && ;
-
- const content = media.map((image, idx) => {
- const width = image.getIn(['meta', 'original', 'width']) || null;
- const height = image.getIn(['meta', 'original', 'height']) || null;
- const description = image.getIn(['translation', 'description']) || image.get('description');
-
- if (image.get('type') === 'image') {
- return (
-
- );
- } else if (image.get('type') === 'video') {
- const { currentTime, autoPlay, volume } = this.props;
-
- return (
-
- );
- } else if (image.get('type') === 'gifv') {
- return (
-
- );
- }
-
- return null;
- }).toArray();
-
- // you can't use 100vh, because the viewport height is taller
- // than the visible part of the document in some mobile
- // browsers when it's address bar is visible.
- // https://developers.google.com/web/updates/2016/12/url-bar-resizing
- const swipeableViewsStyle = {
- width: '100%',
- height: '100%',
- };
-
- const containerStyle = {
- alignItems: 'center', // center vertically
- };
-
- const navigationClassName = classNames('media-modal__navigation', {
- 'media-modal__navigation--hidden': navigationHidden,
- });
-
- let pagination;
-
- if (media.size > 1) {
- pagination = media.map((item, i) => (
-
- {i + 1}
-
- ));
- }
-
- const currentMedia = media.get(index);
- const zoomable = currentMedia.get('type') === 'image' && (currentMedia.getIn(['meta', 'original', 'width']) > viewportWidth || currentMedia.getIn(['meta', 'original', 'height']) > viewportHeight);
-
- return (
-
-
-
- {content}
-
-
-
-
-
- {zoomable && }
-
-
-
- {leftNav}
- {rightNav}
-
-
- {pagination &&
}
- {statusId &&
}
-
-
-
- );
- }
-
-}
-
-export default injectIntl(MediaModal);
diff --git a/app/javascript/mastodon/features/ui/components/media_modal.tsx b/app/javascript/mastodon/features/ui/components/media_modal.tsx
new file mode 100644
index 0000000000..d1203552ea
--- /dev/null
+++ b/app/javascript/mastodon/features/ui/components/media_modal.tsx
@@ -0,0 +1,363 @@
+import { forwardRef, useCallback, useEffect, useMemo, useState } from 'react';
+import type { RefCallback, FC } from 'react';
+
+import { defineMessages, useIntl } from 'react-intl';
+
+import classNames from 'classnames';
+
+import type { List as ImmutableList } from 'immutable';
+
+import { animated, useSpring } from '@react-spring/web';
+import { useDrag } from '@use-gesture/react';
+
+import type { MediaAttachment } from '@/mastodon/models/status';
+import ChevronLeftIcon from '@/material-icons/400-24px/chevron_left.svg?react';
+import ChevronRightIcon from '@/material-icons/400-24px/chevron_right.svg?react';
+import CloseIcon from '@/material-icons/400-24px/close.svg?react';
+import FitScreenIcon from '@/material-icons/400-24px/fit_screen.svg?react';
+import ActualSizeIcon from '@/svg-icons/actual_size.svg?react';
+import type { RGB } from 'mastodon/blurhash';
+import { getAverageFromBlurhash } from 'mastodon/blurhash';
+import { GIFV } from 'mastodon/components/gifv';
+import { Icon } from 'mastodon/components/icon';
+import { IconButton } from 'mastodon/components/icon_button';
+import { Footer } from 'mastodon/features/picture_in_picture/components/footer';
+import { Video } from 'mastodon/features/video';
+
+import { ZoomableImage } from './zoomable_image';
+
+const messages = defineMessages({
+ close: { id: 'lightbox.close', defaultMessage: 'Close' },
+ previous: { id: 'lightbox.previous', defaultMessage: 'Previous' },
+ next: { id: 'lightbox.next', defaultMessage: 'Next' },
+ zoomIn: { id: 'lightbox.zoom_in', defaultMessage: 'Zoom to actual size' },
+ zoomOut: { id: 'lightbox.zoom_out', defaultMessage: 'Zoom to fit' },
+});
+
+interface MediaModalProps {
+ media: ImmutableList;
+ statusId?: string;
+ lang?: string;
+ index: number;
+ onClose: () => void;
+ onChangeBackgroundColor: (color: RGB | null) => void;
+ currentTime?: number;
+ autoPlay?: boolean;
+ volume?: number;
+}
+
+export const MediaModal: FC = forwardRef<
+ HTMLDivElement,
+ MediaModalProps
+>(
+ (
+ {
+ media,
+ onClose,
+ index: startIndex,
+ lang,
+ currentTime,
+ autoPlay,
+ volume,
+ statusId,
+ onChangeBackgroundColor,
+ },
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars -- _ref is required to keep the ref forwarding working
+ _ref,
+ ) => {
+ const [index, setIndex] = useState(startIndex);
+ const currentMedia = media.get(index);
+
+ const handleChangeIndex = useCallback(
+ (newIndex: number) => {
+ if (newIndex < 0) {
+ newIndex = media.size + newIndex;
+ }
+ setIndex(newIndex % media.size);
+ setZoomedIn(false);
+ },
+ [media.size],
+ );
+ const handlePrevClick = useCallback(() => {
+ handleChangeIndex(index - 1);
+ }, [handleChangeIndex, index]);
+ const handleNextClick = useCallback(() => {
+ handleChangeIndex(index + 1);
+ }, [handleChangeIndex, index]);
+
+ const handleKeyDown = useCallback(
+ (event: KeyboardEvent) => {
+ if (event.key === 'ArrowLeft') {
+ handlePrevClick();
+ event.preventDefault();
+ event.stopPropagation();
+ } else if (event.key === 'ArrowRight') {
+ handleNextClick();
+ event.preventDefault();
+ event.stopPropagation();
+ }
+ },
+ [handleNextClick, handlePrevClick],
+ );
+
+ useEffect(() => {
+ window.addEventListener('keydown', handleKeyDown, false);
+
+ return () => {
+ window.removeEventListener('keydown', handleKeyDown);
+ };
+ }, [handleKeyDown]);
+
+ useEffect(() => {
+ const blurhash = currentMedia?.get('blurhash') as string | undefined;
+ if (blurhash) {
+ const backgroundColor = getAverageFromBlurhash(blurhash);
+ if (backgroundColor) {
+ onChangeBackgroundColor(backgroundColor);
+ }
+ }
+ }, [currentMedia, onChangeBackgroundColor]);
+
+ const [viewportDimensions, setViewportDimensions] = useState<{
+ width: number;
+ height: number;
+ }>({ width: 0, height: 0 });
+ const handleRef: RefCallback = useCallback((ele) => {
+ if (ele?.clientWidth && ele.clientHeight) {
+ setViewportDimensions({
+ width: ele.clientWidth,
+ height: ele.clientHeight,
+ });
+ }
+ }, []);
+
+ const [zoomedIn, setZoomedIn] = useState(false);
+ const zoomable =
+ currentMedia?.get('type') === 'image' &&
+ ((currentMedia.getIn(['meta', 'original', 'width']) as number) >
+ viewportDimensions.width ||
+ (currentMedia.getIn(['meta', 'original', 'height']) as number) >
+ viewportDimensions.height);
+ const handleZoomClick = useCallback(() => {
+ setZoomedIn((prev) => !prev);
+ }, []);
+
+ const wrapperStyles = useSpring({
+ x: `-${index * 100}%`,
+ });
+ const bind = useDrag(
+ ({ swipe: [swipeX] }) => {
+ if (swipeX === 0) return;
+ handleChangeIndex(index + swipeX * -1); // Invert swipe as swiping left loads the next slide.
+ },
+ { pointer: { capture: false } },
+ );
+
+ const [navigationHidden, setNavigationHidden] = useState(false);
+ const handleToggleNavigation = useCallback(() => {
+ setNavigationHidden((prev) => !prev);
+ }, []);
+
+ const content = useMemo(
+ () =>
+ media.map((item, idx) => {
+ const url = item.get('url') as string;
+ const blurhash = item.get('blurhash') as string;
+ const width = item.getIn(['meta', 'original', 'width'], 0) as number;
+ const height = item.getIn(
+ ['meta', 'original', 'height'],
+ 0,
+ ) as number;
+ const description = item.getIn(
+ ['translation', 'description'],
+ item.get('description'),
+ ) as string;
+ if (item.get('type') === 'image') {
+ return (
+
+ );
+ } else if (item.get('type') === 'video') {
+ return (
+
+ );
+ } else if (item.get('type') === 'gifv') {
+ return (
+
+ );
+ }
+
+ return null;
+ }),
+ [
+ autoPlay,
+ currentTime,
+ handleToggleNavigation,
+ handleZoomClick,
+ index,
+ lang,
+ media,
+ onClose,
+ volume,
+ zoomedIn,
+ ],
+ );
+
+ const intl = useIntl();
+
+ const leftNav = media.size > 1 && (
+
+
+
+ );
+ const rightNav = media.size > 1 && (
+
+
+
+ );
+
+ return (
+
+
+ {content}
+
+
+
+
+ {zoomable && (
+
+ )}
+
+
+
+ {leftNav}
+ {rightNav}
+
+
+
+ {statusId && (
+
+ )}
+
+
+
+ );
+ },
+);
+MediaModal.displayName = 'MediaModal';
+
+interface MediaPaginationProps {
+ itemsCount: number;
+ index: number;
+ onChangeIndex: (newIndex: number) => void;
+}
+
+const MediaPagination: FC = ({
+ itemsCount,
+ index,
+ onChangeIndex,
+}) => {
+ const handleChangeIndex = useCallback(
+ (curIndex: number) => {
+ return () => {
+ onChangeIndex(curIndex);
+ };
+ },
+ [onChangeIndex],
+ );
+
+ if (itemsCount <= 1) {
+ return null;
+ }
+
+ return (
+
+ {Array.from({ length: itemsCount }).map((_, i) => (
+
+ {i + 1}
+
+ ))}
+
+ );
+};
diff --git a/app/javascript/mastodon/features/ui/components/modal_root.jsx b/app/javascript/mastodon/features/ui/components/modal_root.jsx
index 944feb325e..9afda83908 100644
--- a/app/javascript/mastodon/features/ui/components/modal_root.jsx
+++ b/app/javascript/mastodon/features/ui/components/modal_root.jsx
@@ -43,10 +43,11 @@ import {
QuietPostQuoteInfoModal,
} from './confirmation_modals';
import { ImageModal } from './image_modal';
-import MediaModal from './media_modal';
+import { MediaModal } from './media_modal';
import { ModalPlaceholder } from './modal_placeholder';
import VideoModal from './video_modal';
import { VisibilityModal } from './visibility_modal';
+import { PrivateQuoteNotify } from './confirmation_modals/private_quote_notify';
export const MODAL_COMPONENTS = {
'MEDIA': () => Promise.resolve({ default: MediaModal }),
@@ -66,6 +67,7 @@ export const MODAL_COMPONENTS = {
'CONFIRM_LOG_OUT': () => Promise.resolve({ default: ConfirmLogOutModal }),
'CONFIRM_FOLLOW_TO_LIST': () => Promise.resolve({ default: ConfirmFollowToListModal }),
'CONFIRM_MISSING_ALT_TEXT': () => Promise.resolve({ default: ConfirmMissingAltTextModal }),
+ 'CONFIRM_PRIVATE_QUOTE_NOTIFY': () => Promise.resolve({ default: PrivateQuoteNotify }),
'CONFIRM_REVOKE_QUOTE': () => Promise.resolve({ default: ConfirmRevokeQuoteModal }),
'CONFIRM_QUIET_QUOTE': () => Promise.resolve({ default: QuietPostQuoteInfoModal }),
'MUTE': MuteModal,
diff --git a/app/javascript/mastodon/features/ui/components/visibility_modal.tsx b/app/javascript/mastodon/features/ui/components/visibility_modal.tsx
index afd9ee7ed0..7bc7e0ab97 100644
--- a/app/javascript/mastodon/features/ui/components/visibility_modal.tsx
+++ b/app/javascript/mastodon/features/ui/components/visibility_modal.tsx
@@ -128,9 +128,12 @@ export const VisibilityModal: FC = forwardRef(
const disableVisibility = !!statusId;
const disableQuotePolicy =
visibility === 'private' || visibility === 'direct';
- const disablePublicVisibilities: boolean = useAppSelector(
+ const disablePublicVisibilities = useAppSelector(
selectDisablePublicVisibilities,
);
+ const isQuotePost = useAppSelector(
+ (state) => state.compose.get('quoted_status_id') !== null,
+ );
const visibilityItems = useMemo[]>(() => {
const items: SelectItem[] = [
@@ -315,6 +318,21 @@ export const VisibilityModal: FC = forwardRef(
id={quoteDescriptionId}
/>
+
+ {isQuotePost && visibility === 'direct' && (
+
+
+
+
+ )}
diff --git a/app/javascript/mastodon/initial_state.ts b/app/javascript/mastodon/initial_state.ts
index 83c6c35e1b..86d36468f9 100644
--- a/app/javascript/mastodon/initial_state.ts
+++ b/app/javascript/mastodon/initial_state.ts
@@ -35,7 +35,7 @@ interface InitialStateMeta {
streaming_api_base_url: string;
local_live_feed_access: 'public' | 'authenticated' | 'disabled';
remote_live_feed_access: 'public' | 'authenticated' | 'disabled';
- local_topic_feed_access: 'public' | 'authenticated' | 'disabled';
+ local_topic_feed_access: 'public' | 'authenticated';
remote_topic_feed_access: 'public' | 'authenticated' | 'disabled';
title: string;
show_trends: boolean;
diff --git a/app/javascript/mastodon/locales/cy.json b/app/javascript/mastodon/locales/cy.json
index eb3fb66a08..5afe25a8c9 100644
--- a/app/javascript/mastodon/locales/cy.json
+++ b/app/javascript/mastodon/locales/cy.json
@@ -157,6 +157,8 @@
"bundle_modal_error.close": "Cau",
"bundle_modal_error.message": "Aeth rhywbeth o'i le wrth lwytho'r sgrin hon.",
"bundle_modal_error.retry": "Ceisiwch eto",
+ "carousel.current": "Sleid {current, number} / {max, number}",
+ "carousel.slide": "Sleid {current, number} o {max, number}",
"closed_registrations.other_server_instructions": "Gan fod Mastodon yn ddatganoledig, gallwch greu cyfrif ar weinydd arall a dal i ryngweithio gyda hwn.",
"closed_registrations_modal.description": "Ar hyn o bryd nid yw'n bosib creu cyfrif ar {domain}, ond cadwch mewn cof nad oes raid i chi gael cyfrif yn benodol ar {domain} i ddefnyddio Mastodon.",
"closed_registrations_modal.find_another_server": "Dod o hyd i weinydd arall",
@@ -173,6 +175,8 @@
"column.edit_list": "Golygu rhestr",
"column.favourites": "Ffefrynnau",
"column.firehose": "Ffrydiau byw",
+ "column.firehose_local": "Ffrwd fyw ar gyfer y gweinydd hwn",
+ "column.firehose_singular": "Ffrwd fyw",
"column.follow_requests": "Ceisiadau dilyn",
"column.home": "Cartref",
"column.list_members": "Rheoli aelodau rhestr",
@@ -192,6 +196,7 @@
"community.column_settings.local_only": "Lleol yn unig",
"community.column_settings.media_only": "Cyfryngau yn unig",
"community.column_settings.remote_only": "Pell yn unig",
+ "compose.error.blank_post": "Gall postiad ddim bod yn wag.",
"compose.language.change": "Newid iaith",
"compose.language.search": "Chwilio ieithoedd...",
"compose.published.body": "Postiad wedi ei gyhoeddi.",
@@ -358,7 +363,9 @@
"explore.trending_links": "Newyddion",
"explore.trending_statuses": "Postiadau",
"explore.trending_tags": "Hashnodau",
+ "featured_carousel.current": "Postiad {current, number} / {max, number}",
"featured_carousel.header": "{count, plural, one {Postiad wedi'i binio} other {Postiadau wedi'u pinio}}",
+ "featured_carousel.slide": "Postiad {current, number} of {max, number}",
"filter_modal.added.context_mismatch_explanation": "Dyw'r categori hidlo hwn ddim yn berthnasol i'r cyd-destun yr ydych wedi cyrchu'r postiad hwn ynddo. Os ydych chi am i'r postiad gael ei hidlo yn y cyd-destun hwn hefyd, bydd yn rhaid i chi olygu'r hidlydd.",
"filter_modal.added.context_mismatch_title": "Diffyg cyfatebiaeth cyd-destun!",
"filter_modal.added.expired_explanation": "Mae'r categori hidlydd hwn wedi dod i ben, bydd angen i chi newid y dyddiad dod i ben er mwyn iddo fod yn berthnasol.",
@@ -401,6 +408,7 @@
"follow_suggestions.who_to_follow": "Pwy i ddilyn",
"followed_tags": "Hashnodau rydych yn eu dilyn",
"footer.about": "Ynghylch",
+ "footer.about_this_server": "Ynghylch",
"footer.directory": "Cyfeiriadur proffiliau",
"footer.get_app": "Llwytho'r ap i lawr",
"footer.keyboard_shortcuts": "Bysellau brys",
@@ -905,9 +913,12 @@
"status.pin": "Pinio ar y proffil",
"status.quote": "Dyfynnu",
"status.quote.cancel": "Diddymu'r dyfyniad",
+ "status.quote_error.blocked_account_hint.title": "Mae'r postiad hwn wedi'i guddio oherwydd eich bod wedi rhwystro @{name}.",
+ "status.quote_error.blocked_domain_hint.title": "Mae'r postiad hwn wedi'i guddio oherwydd eich bod wedi rhwystro {domain}.",
"status.quote_error.filtered": "Wedi'i guddio oherwydd un o'ch hidlwyr",
"status.quote_error.limited_account_hint.action": "Dangos beth bynnag",
"status.quote_error.limited_account_hint.title": "Mae'r cyfrif hwn wedi'i guddio gan gymedrolwyr {domain}.",
+ "status.quote_error.muted_account_hint.title": "Mae'r postiad hwn wedi'i guddio oherwydd eich bod wedi mudo @{name}.",
"status.quote_error.not_available": "Postiad ddim ar gael",
"status.quote_error.pending_approval": "Postiad yn yr arfaeth",
"status.quote_error.pending_approval_popout.body": "Ar Mastodon, gallwch reoli os yw rhywun yn gallu eich dyfynnu. Mae'r postiad hwn yn cael ei ddal nôl tra'n bod yn cael cymeradwyaeth yr awdur gwreiddiol.",
diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json
index 8e4acf58fb..eea0052695 100644
--- a/app/javascript/mastodon/locales/da.json
+++ b/app/javascript/mastodon/locales/da.json
@@ -284,7 +284,7 @@
"directory.recently_active": "Aktive for nyligt",
"disabled_account_banner.account_settings": "Kontoindstillinger",
"disabled_account_banner.text": "Din konto {disabledAccount} er pt. deaktiveret.",
- "dismissable_banner.community_timeline": "Disse er de seneste offentlige indlÃĻg fra personer med konti hostet af {domain}.",
+ "dismissable_banner.community_timeline": "Dette er de seneste offentlige indlÃĻg fra personer med konti hostet af {domain}.",
"dismissable_banner.dismiss": "Afvis",
"dismissable_banner.public_timeline": "Dette er de seneste offentlige indlÃĻg fra personer pÃĨ fediverset, som folk pÃĨ {domain} følger.",
"domain_block_modal.block": "BlokÊr server",
diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json
index ec33821722..07f80c3a51 100644
--- a/app/javascript/mastodon/locales/en.json
+++ b/app/javascript/mastodon/locales/en.json
@@ -249,6 +249,11 @@
"confirmations.missing_alt_text.secondary": "Post anyway",
"confirmations.missing_alt_text.title": "Add alt text?",
"confirmations.mute.confirm": "Mute",
+ "confirmations.private_quote_notify.cancel": "Back to editing",
+ "confirmations.private_quote_notify.confirm": "Publish post",
+ "confirmations.private_quote_notify.do_not_show_again": "Don't show me this message again",
+ "confirmations.private_quote_notify.message": "The person you are quoting and other mentions will be notified and will be able to view your post, even if they're not following you.",
+ "confirmations.private_quote_notify.title": "Share with followers and mentioned users?",
"confirmations.quiet_post_quote_info.dismiss": "Don't remind me again",
"confirmations.quiet_post_quote_info.got_it": "Got it",
"confirmations.quiet_post_quote_info.message": "When quoting a quiet public post, your post will be hidden from trending timelines.",
@@ -760,6 +765,7 @@
"privacy_policy.title": "Privacy Policy",
"quote_error.edit": "Quotes cannot be added when editing a post.",
"quote_error.poll": "Quoting is not allowed with polls.",
+ "quote_error.private_mentions": "Quoting is not allowed with direct mentions.",
"quote_error.quote": "Only one quote at a time is allowed.",
"quote_error.unauthorized": "You are not authorized to quote this post.",
"quote_error.upload": "Quoting is not allowed with media attachments.",
@@ -1013,6 +1019,8 @@
"video.volume_down": "Volume down",
"video.volume_up": "Volume up",
"visibility_modal.button_title": "Set visibility",
+ "visibility_modal.direct_quote_warning.text": "If you save the current settings, the embedded quote will be converted to a link.",
+ "visibility_modal.direct_quote_warning.title": "Quotes can't be embedded in private mentions",
"visibility_modal.header": "Visibility and interaction",
"visibility_modal.helper.direct_quoting": "Private mentions authored on Mastodon can't be quoted by others.",
"visibility_modal.helper.privacy_editing": "Visibility can't be changed after a post is published.",
diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json
index b9f969bf61..3e8f8f84a3 100644
--- a/app/javascript/mastodon/locales/nl.json
+++ b/app/javascript/mastodon/locales/nl.json
@@ -743,7 +743,7 @@
"poll.votes": "{votes, plural, one {# stem} other {# stemmen}}",
"poll_button.add_poll": "Peiling toevoegen",
"poll_button.remove_poll": "Peiling verwijderen",
- "privacy.change": "Privacy voor een bericht aanpassen",
+ "privacy.change": "Privacy van dit bericht aanpassen",
"privacy.direct.long": "Alleen voor mensen die specifiek in het bericht worden vermeld",
"privacy.direct.short": "PrivÊbericht",
"privacy.private.long": "Alleen jouw volgers",
diff --git a/app/javascript/mastodon/locales/sq.json b/app/javascript/mastodon/locales/sq.json
index 2a6101e981..f8a1ff36f6 100644
--- a/app/javascript/mastodon/locales/sq.json
+++ b/app/javascript/mastodon/locales/sq.json
@@ -192,6 +192,7 @@
"community.column_settings.local_only": "VetÃĢm vendore",
"community.column_settings.media_only": "VetÃĢm Media",
"community.column_settings.remote_only": "VetÃĢm tÃĢ largÃĢta",
+ "compose.error.blank_post": "Postimi sâmund tÃĢ jetÃĢ i zbrazÃĢt.",
"compose.language.change": "Ndryshoni gjuhÃĢn",
"compose.language.search": "KÃĢrkoni te gjuhÃĢtâĻ",
"compose.published.body": "Postimi u botua.",
@@ -403,6 +404,7 @@
"follow_suggestions.who_to_follow": "CilÃĢt tÃĢ ndiqen",
"followed_tags": "Hashtag-ÃĢ tÃĢ ndjekur",
"footer.about": "Mbi",
+ "footer.about_this_server": "Mbi",
"footer.directory": "Drejtori profilesh",
"footer.get_app": "Merreni aplikacionin",
"footer.keyboard_shortcuts": "Shkurtore tastiere",
diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json
index fc9ddd2dbd..202670b30a 100644
--- a/app/javascript/mastodon/locales/zh-TW.json
+++ b/app/javascript/mastodon/locales/zh-TW.json
@@ -606,8 +606,8 @@
"notification.annual_report.view": "æĒĸčĻ #Wrapstodon",
"notification.favourite": "{name} 厞尿¨įåæå å
Ĩææ",
"notification.favourite.name_and_others_with_link": "{name} č{count, plural, other {å
ļäģ # åäēē}}厞尿¨įåæå å
Ĩææ",
- "notification.favourite_pm": "{name} å°æ¨įį§äēēæåå å
Ĩææ",
- "notification.favourite_pm.name_and_others_with_link": "{name} č{count, plural, other {å
ļäģ # åäēē}}厞尿¨įį§äēēæåå å
Ĩææ",
+ "notification.favourite_pm": "{name} å°æ¨įį§č¨å å
Ĩææ",
+ "notification.favourite_pm.name_and_others_with_link": "{name} č{count, plural, other {å
ļäģ # åäēē}}厞尿¨įį§č¨å å
Ĩææ",
"notification.follow": "{name} 厞čˇé¨æ¨",
"notification.follow.name_and_others": "{name} č{count, plural, other {å
ļäģ # åäēē}}厞čˇé¨æ¨",
"notification.follow_request": "{name} čĻæąčˇé¨æ¨",
@@ -1014,7 +1014,7 @@
"video.volume_up": "æéĢéŗé",
"visibility_modal.button_title": "č¨åŽå¯čĻæ§",
"visibility_modal.header": "å¯čĻæ§čäēå",
- "visibility_modal.helper.direct_quoting": "Mastodon ä¸įŧäŊäšį§äēēæååæįĄæŗčĸĢå
ļäģäŊŋį¨č
åŧį¨ã",
+ "visibility_modal.helper.direct_quoting": "Mastodon ä¸įŧäŊäšį§č¨åæįĄæŗčĸĢå
ļäģäŊŋį¨č
åŧį¨ã",
"visibility_modal.helper.privacy_editing": "åæįŧå¸åžįĄæŗčŽæ´å¯čĻæ§ã",
"visibility_modal.helper.privacy_private_self_quote": "čĒæåŧį¨äšį§åįĄæŗč¨įēå
Ŧéå¯čĻã",
"visibility_modal.helper.private_quoting": "Mastodon ä¸įŧäŊäšå
éčˇé¨č
åæįĄæŗčĸĢå
ļäģäŊŋį¨č
åŧį¨ã",
diff --git a/app/javascript/mastodon/reducers/compose.js b/app/javascript/mastodon/reducers/compose.js
index f27c3bb06b..e4cb9ac0eb 100644
--- a/app/javascript/mastodon/reducers/compose.js
+++ b/app/javascript/mastodon/reducers/compose.js
@@ -1,11 +1,14 @@
import { Map as ImmutableMap, List as ImmutableList, OrderedSet as ImmutableOrderedSet, fromJS } from 'immutable';
import {
+ changeComposeVisibility,
changeUploadCompose,
quoteCompose,
quoteComposeCancel,
setComposeQuotePolicy,
-} from 'mastodon/actions/compose_typed';
+ pasteLinkCompose,
+ cancelPasteLinkCompose,
+} from '@/mastodon/actions/compose_typed';
import { timelineDelete } from 'mastodon/actions/timelines_typed';
import {
@@ -38,7 +41,6 @@ import {
COMPOSE_SENSITIVITY_CHANGE,
COMPOSE_SPOILERNESS_CHANGE,
COMPOSE_SPOILER_TEXT_CHANGE,
- COMPOSE_VISIBILITY_CHANGE,
COMPOSE_LANGUAGE_CHANGE,
COMPOSE_COMPOSING_CHANGE,
COMPOSE_EMOJI_INSERT,
@@ -93,6 +95,7 @@ const initialState = ImmutableMap({
quoted_status_id: null,
quote_policy: 'public',
default_quote_policy: 'public', // Set in hydration.
+ fetching_link: null,
});
const initialPoll = ImmutableMap({
@@ -315,7 +318,11 @@ const calculateProgress = (loaded, total) => Math.min(Math.round((loaded / total
/** @type {import('@reduxjs/toolkit').Reducer} */
export const composeReducer = (state = initialState, action) => {
- if (changeUploadCompose.fulfilled.match(action)) {
+ if (changeComposeVisibility.match(action)) {
+ return state
+ .set('privacy', action.payload)
+ .set('idempotencyKey', uuid());
+ } else if (changeUploadCompose.fulfilled.match(action)) {
return state
.set('is_changing_upload', false)
.update('media_attachments', list => list.map(item => {
@@ -331,15 +338,27 @@ export const composeReducer = (state = initialState, action) => {
return state.set('is_changing_upload', false);
} else if (quoteCompose.match(action)) {
const status = action.payload;
+ const isDirect = state.get('privacy') === 'direct';
return state
- .set('quoted_status_id', status.get('id'))
+ .set('quoted_status_id', isDirect ? null : status.get('id'))
.set('spoiler', status.get('sensitive'))
.set('spoiler_text', status.get('spoiler_text'))
- .update('privacy', (visibility) => ['public', 'unlisted'].includes(visibility) && status.get('visibility') === 'private' ? 'private' : visibility);
+ .update('privacy', (visibility) => {
+ if (['public', 'unlisted'].includes(visibility) && status.get('visibility') === 'private') {
+ return 'private';
+ }
+ return visibility;
+ });
} else if (quoteComposeCancel.match(action)) {
return state.set('quoted_status_id', null);
} else if (setComposeQuotePolicy.match(action)) {
return state.set('quote_policy', action.payload);
+ } else if (pasteLinkCompose.pending.match(action)) {
+ return state.set('fetching_link', action.meta.requestId);
+ } else if (pasteLinkCompose.fulfilled.match(action) || pasteLinkCompose.rejected.match(action)) {
+ return action.meta.requestId === state.get('fetching_link') ? state.set('fetching_link', null) : state;
+ } else if (cancelPasteLinkCompose.match(action)) {
+ return state.set('fetching_link', null);
}
switch(action.type) {
@@ -383,10 +402,6 @@ export const composeReducer = (state = initialState, action) => {
return state
.set('spoiler_text', action.text)
.set('idempotencyKey', uuid());
- case COMPOSE_VISIBILITY_CHANGE:
- return state
- .set('privacy', action.value)
- .set('idempotencyKey', uuid());
case COMPOSE_CHANGE:
return state
.set('text', action.text)
diff --git a/app/javascript/mastodon/store/typed_functions.ts b/app/javascript/mastodon/store/typed_functions.ts
index 4d7341b0c8..5ceb05909f 100644
--- a/app/javascript/mastodon/store/typed_functions.ts
+++ b/app/javascript/mastodon/store/typed_functions.ts
@@ -42,7 +42,7 @@ interface AppThunkConfig {
}
export type AppThunkApi = Pick<
GetThunkAPI,
- 'getState' | 'dispatch'
+ 'getState' | 'dispatch' | 'requestId'
>;
interface AppThunkOptions {
@@ -60,7 +60,7 @@ type AppThunk = (
type AppThunkCreator = (
arg: Arg,
- api: AppThunkApi,
+ api: Pick,
extra?: ExtraArg,
) => Returned;
@@ -143,10 +143,10 @@ export function createAsyncThunk(
name,
async (
arg: Arg,
- { getState, dispatch, fulfillWithValue, rejectWithValue },
+ { getState, dispatch, requestId, fulfillWithValue, rejectWithValue },
) => {
try {
- const result = await creator(arg, { dispatch, getState });
+ const result = await creator(arg, { dispatch, getState, requestId });
return fulfillWithValue(result, {
useLoadingBar: options.useLoadingBar,
@@ -280,10 +280,11 @@ export function createDataLoadingThunk<
return createAsyncThunk(
name,
- async (arg, { getState, dispatch }) => {
+ async (arg, { getState, dispatch, requestId }) => {
const data = await loadData(arg, {
dispatch,
getState,
+ requestId,
});
if (!onData) return data as Returned;
@@ -291,6 +292,7 @@ export function createDataLoadingThunk<
const result = await onData(data, {
dispatch,
getState,
+ requestId,
discardLoadData: discardLoadDataInPayload,
actionArg: arg,
});
diff --git a/app/javascript/styles/mastodon/admin.scss b/app/javascript/styles/mastodon/admin.scss
index 419fac23d3..8f892ce209 100644
--- a/app/javascript/styles/mastodon/admin.scss
+++ b/app/javascript/styles/mastodon/admin.scss
@@ -1325,6 +1325,10 @@ a.sparkline {
line-height: 1;
width: 100%;
animation: skeleton 1.2s ease-in-out infinite;
+
+ .reduce-motion & {
+ animation: none;
+ }
}
@keyframes skeleton {
diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss
index bd09f3b8b0..1d2e9aca54 100644
--- a/app/javascript/styles/mastodon/components.scss
+++ b/app/javascript/styles/mastodon/components.scss
@@ -2685,6 +2685,7 @@ a.account__display-name {
outline-offset: -1px;
border-radius: 8px;
touch-action: none;
+ user-select: none;
}
&--zoomed-in {
@@ -5743,6 +5744,34 @@ a.status-card {
}
}
+.visibility-modal {
+ &__quote-warning {
+ color: var(--nested-card-text);
+ background:
+ /* This is a bit of a silly hack for layering two background colours
+ * since --nested-card-background is too transparent for a tooltip */
+ linear-gradient(
+ var(--nested-card-background),
+ var(--nested-card-background)
+ ),
+ linear-gradient(var(--background-color), var(--background-color));
+ border: var(--nested-card-border);
+ padding: 16px;
+ border-radius: 4px;
+
+ h3 {
+ font-weight: 500;
+ margin-bottom: 4px;
+ color: $darker-text-color;
+ }
+
+ p {
+ font-size: 0.8em;
+ color: $dark-text-color;
+ }
+ }
+}
+
.visibility-dropdown {
&__overlay[data-popper-placement] {
z-index: 9999;
@@ -6096,6 +6125,7 @@ a.status-card {
width: 100%;
height: 100%;
position: relative;
+ touch-action: pan-y;
&__buttons {
position: absolute;
@@ -6131,11 +6161,17 @@ a.status-card {
}
.media-modal__closer {
+ display: flex;
position: absolute;
top: 0;
inset-inline-start: 0;
inset-inline-end: 0;
bottom: 0;
+
+ > div {
+ flex-shrink: 0;
+ overflow: auto;
+ }
}
.media-modal__navigation {
@@ -8936,6 +8972,10 @@ noscript {
position: relative;
overflow: hidden;
+ .layout-multiple-columns & {
+ width: 100%;
+ }
+
@media screen and (max-width: (124px + 300px)) {
width: 100%;
}
diff --git a/app/lib/signed_request.rb b/app/lib/signed_request.rb
index d8887d9596..1cea2955f5 100644
--- a/app/lib/signed_request.rb
+++ b/app/lib/signed_request.rb
@@ -1,8 +1,6 @@
# frozen_string_literal: true
class SignedRequest
- include DomainControlHelper
-
EXPIRATION_WINDOW_LIMIT = 12.hours
CLOCK_SKEW_MARGIN = 1.hour
diff --git a/app/models/form/admin_settings.rb b/app/models/form/admin_settings.rb
index f4bd2179ac..7be9566b6e 100644
--- a/app/models/form/admin_settings.rb
+++ b/app/models/form/admin_settings.rb
@@ -102,6 +102,7 @@ class Form::AdminSettings
DOMAIN_BLOCK_AUDIENCES = %w(disabled users all).freeze
REGISTRATION_MODES = %w(open approved none).freeze
FEED_ACCESS_MODES = %w(public authenticated disabled).freeze
+ ALTERNATE_FEED_ACCESS_MODES = %w(public authenticated).freeze
LANDING_PAGE = %w(trends about local_feed).freeze
attr_accessor(*KEYS)
@@ -114,7 +115,7 @@ class Form::AdminSettings
validates :show_domain_blocks_rationale, inclusion: { in: DOMAIN_BLOCK_AUDIENCES }, if: -> { defined?(@show_domain_blocks_rationale) }
validates :local_live_feed_access, inclusion: { in: FEED_ACCESS_MODES }, if: -> { defined?(@local_live_feed_access) }
validates :remote_live_feed_access, inclusion: { in: FEED_ACCESS_MODES }, if: -> { defined?(@remote_live_feed_access) }
- validates :local_topic_feed_access, inclusion: { in: FEED_ACCESS_MODES }, if: -> { defined?(@local_topic_feed_access) }
+ validates :local_topic_feed_access, inclusion: { in: ALTERNATE_FEED_ACCESS_MODES }, if: -> { defined?(@local_topic_feed_access) }
validates :remote_topic_feed_access, inclusion: { in: FEED_ACCESS_MODES }, if: -> { defined?(@remote_topic_feed_access) }
validates :media_cache_retention_period, :content_cache_retention_period, :backups_retention_period, numericality: { only_integer: true }, allow_blank: true, if: -> { defined?(@media_cache_retention_period) || defined?(@content_cache_retention_period) || defined?(@backups_retention_period) }
validates :min_age, numericality: { only_integer: true }, allow_blank: true, if: -> { defined?(@min_age) }
diff --git a/app/views/admin/settings/discovery/show.html.haml b/app/views/admin/settings/discovery/show.html.haml
index 1c5433ad53..ae8d38c7a1 100644
--- a/app/views/admin/settings/discovery/show.html.haml
+++ b/app/views/admin/settings/discovery/show.html.haml
@@ -46,7 +46,7 @@
.fields-row
.fields-row__column.fields-row__column-6.fields-group
= f.input :local_topic_feed_access,
- collection: f.object.class::FEED_ACCESS_MODES,
+ collection: f.object.class::ALTERNATE_FEED_ACCESS_MODES,
include_blank: false,
label_method: ->(mode) { I18n.t("admin.settings.feed_access.modes.#{mode}") },
wrapper: :with_label
diff --git a/app/workers/activitypub/refetch_and_verify_quote_worker.rb b/app/workers/activitypub/refetch_and_verify_quote_worker.rb
index e2df023103..1a8dd40541 100644
--- a/app/workers/activitypub/refetch_and_verify_quote_worker.rb
+++ b/app/workers/activitypub/refetch_and_verify_quote_worker.rb
@@ -5,7 +5,7 @@ class ActivityPub::RefetchAndVerifyQuoteWorker
include ExponentialBackoff
include JsonLdHelper
- sidekiq_options queue: 'pull', retry: 3
+ sidekiq_options queue: 'pull', retry: 5
def perform(quote_id, quoted_uri, options = {})
quote = Quote.find(quote_id)
diff --git a/config/locales/be.yml b/config/locales/be.yml
index 2a9a61c347..dd46c81c8f 100644
--- a/config/locales/be.yml
+++ b/config/locales/be.yml
@@ -2015,6 +2015,7 @@ be:
errors:
in_reply_not_found: ĐдаĐĩŅŅа, Đ´ĐžĐŋŅŅ, ĐŊа ŅĐēŅ Đ˛Ņ ŅĐŋŅайŅĐĩŅĐĩ адĐēаСаŅŅ, ĐŊĐĩ ŅŅĐŊŅĐĩ.
quoted_status_not_found: ĐŅĐŗĐģŅдаĐĩ, ŅŅĐž Đ´ĐžĐŋŅŅŅ, ŅĐēŅ ĐŅ ŅĐŋŅайŅĐĩŅĐĩ ŅŅŅаваŅŅ, ĐŊĐĩ ŅŅĐŊŅĐĩ.
+ quoted_user_not_mentioned: ĐĐĩĐŧĐ°ĐŗŅŅĐŧа ŅŅŅаваŅŅ ĐŊĐĩĐˇĐŗĐ°Đ´Đ°ĐŊĐ°ĐŗĐ° ĐēаŅŅŅŅаĐģŅĐŊŅĐēа Ņ Đ´ĐžĐŋŅŅĐĩ ĐŋŅŅваŅĐŊĐ°ĐŗĐ° ĐˇĐŗĐ°Đ´Đ˛Đ°ĐŊĐŊŅ.
over_character_limit: ĐŋĐĩŅавŅŅаĐŊĐ°Ņ ĐēĐžĐģŅĐēаŅŅŅ ŅŅĐŧваĐģĐ°Ņ Ņ %{max}
pin_errors:
direct: ĐĐžĐŋŅŅŅ, йаŅĐŊŅŅ ŅĐžĐģŅĐēŅ ĐˇĐŗĐ°Đ´Đ°ĐŊŅĐŧ ĐēаŅŅŅŅаĐģŅĐŊŅĐēаĐŧ, ĐŊĐĩĐģŅĐŗĐ° СаĐŧаŅаваŅŅ
diff --git a/config/locales/cy.yml b/config/locales/cy.yml
index 4b875b2c02..54973fe9cc 100644
--- a/config/locales/cy.yml
+++ b/config/locales/cy.yml
@@ -911,6 +911,11 @@ cy:
authenticated: Defnyddwyr dilys yn unig
disabled: Gofyn am rôl defnyddiwr penodol
public: Pawb
+ landing_page:
+ values:
+ about: Ynghylch
+ local_feed: Ffrwd leol
+ trends: Trendiau
registrations:
moderation_recommandation: Gwnewch yn siÅĩr bod gennych chi dÃŽm cymedroli digonol ac adweithiol cyn i chi agor cofrestriadau i bawb!
preamble: Rheoli pwy all greu cyfrif ar eich gweinydd.
diff --git a/config/locales/da.yml b/config/locales/da.yml
index c6a30afaae..45f3a9365a 100644
--- a/config/locales/da.yml
+++ b/config/locales/da.yml
@@ -1929,6 +1929,7 @@ da:
errors:
in_reply_not_found: IndlÃĻgget, der forsøges besvaret, ser ikke ud til at eksistere.
quoted_status_not_found: IndlÃĻgget, du forsøger at citere, ser ikke ud til at eksistere.
+ quoted_user_not_mentioned: Kan ikke citere en ikke-omtalt bruger i et privat omtale-indlÃĻg.
over_character_limit: grÃĻnsen pÃĨ %{max} tegn overskredet
pin_errors:
direct: IndlÃĻg, som kun kan ses af omtalte brugere, kan ikke fastgøres
diff --git a/config/locales/de.yml b/config/locales/de.yml
index 4b2c10fa31..f24d79d7a7 100644
--- a/config/locales/de.yml
+++ b/config/locales/de.yml
@@ -1929,6 +1929,7 @@ de:
errors:
in_reply_not_found: Der Beitrag, auf den du antworten mÃļchtest, scheint nicht zu existieren.
quoted_status_not_found: Der Beitrag, den du zitieren mÃļchtest, scheint nicht zu existieren.
+ quoted_user_not_mentioned: Ein nicht erwähnter Nutzer kann in einem privaten Erwähnungsbeitrag nicht zitiert werden.
over_character_limit: Begrenzung von %{max} Zeichen Ãŧberschritten
pin_errors:
direct: Beiträge, die nur fÃŧr erwähnte Profile sichtbar sind, kÃļnnen nicht angeheftet werden
diff --git a/config/locales/el.yml b/config/locales/el.yml
index 0f2339b1ca..0bbffd2a13 100644
--- a/config/locales/el.yml
+++ b/config/locales/el.yml
@@ -1929,6 +1929,7 @@ el:
errors:
in_reply_not_found: Î ÎąÎŊÎŦĪĪΡĪΡ ĪĪΡÎŊ ÎŋĪÎŋÎ¯Îą ĪĪÎŋĪĪιθÎĩÎ¯Ī ÎŊÎą ÎąĪÎąÎŊĪÎŽĪÎĩÎšĪ Î´ÎĩÎŊ ĪÎąÎ¯ÎŊÎĩĪιΚ ÎŊÎą Ī
ĪÎŦĪĪÎĩΚ.
quoted_status_not_found: Î ÎąÎŊÎŦĪĪΡĪΡ ĪΡÎŊ ÎŋĪÎŋÎ¯Îą ĪĪÎŋĪĪιθÎĩÎ¯Ī ÎŊÎą ĪÎąĪιθÎĪÎĩÎšĪ Î´ÎĩÎŊ ĪÎąÎ¯ÎŊÎĩĪιΚ ÎŊÎą Ī
ĪÎŦĪĪÎĩΚ.
+ quoted_user_not_mentioned: ÎÎĩÎŊ ÎĩίÎŊιΚ δĪ
ÎŊÎąĪÎŽ Ρ ĪÎąĪÎŦθÎĩĪΡ ÎĩÎŊĪĪ ÎŧΡ ÎĩĪΚĪΡÎŧÎąĪÎŧÎÎŊÎŋĪ
ĪĪÎŽĪĪΡ ĪÎĩ ÎŧΚι ÎąÎŊÎŦĪĪΡĪΡ ÎδΚĪĪΚÎēÎŽĪ ÎĩĪΚĪÎŽÎŧÎąÎŊĪΡĪ.
over_character_limit: Ī
ĪÎĪβιĪΡ ÎŧÎÎŗÎšĪĪÎŋĪ
ÎŋĪίÎŋĪ
%{max} ĪÎąĪÎąÎēĪÎŽĪĪÎŊ
pin_errors:
direct: ÎÎŊÎąĪĪÎŽĪÎĩÎšĪ ĪÎŋĪ
ÎĩίÎŊιΚ ÎŋĪÎąĪÎĪ ÎŧĪÎŊÎŋ ĪĪÎŋĪ
Ī ÎąÎŊÎąĪÎĩĪĪÎŧÎĩÎŊÎŋĪ
Ī ĪĪÎŽĪĪÎĩĪ Î´ÎĩÎŊ ÎŧĪÎŋĪÎŋĪÎŊ ÎŊÎą ÎēÎąĪĪΚĪĪĪθÎŋĪÎŊ
diff --git a/config/locales/es-AR.yml b/config/locales/es-AR.yml
index eec0c3f465..cce8987f75 100644
--- a/config/locales/es-AR.yml
+++ b/config/locales/es-AR.yml
@@ -1929,6 +1929,7 @@ es-AR:
errors:
in_reply_not_found: El mensaje al que intentÃĄs responder no existe.
quoted_status_not_found: El mensaje al que intentÃĄs citar parece que no existe.
+ quoted_user_not_mentioned: No se puede citar a un usuario no mencionado en un mensaje de menciÃŗn privada.
over_character_limit: se excediÃŗ el lÃmite de %{max} caracteres
pin_errors:
direct: Los mensajes que sÃŗlo son visibles para los usuarios mencionados no pueden ser fijados
diff --git a/config/locales/fi.yml b/config/locales/fi.yml
index e8c9a2568a..d1203fbee6 100644
--- a/config/locales/fi.yml
+++ b/config/locales/fi.yml
@@ -1929,6 +1929,7 @@ fi:
errors:
in_reply_not_found: Julkaisua, johon yrität vastata, ei näytä olevan olemassa.
quoted_status_not_found: Julkaisua, jota yrität lainata, ei näytä olevan olemassa.
+ quoted_user_not_mentioned: Mainitsematonta käyttäjää ei voi lainata yksityismaininnassa.
over_character_limit: merkkimäärän rajoitus %{max} ylitetty
pin_errors:
direct: Vain mainituille käyttäjille näkyviä julkaisuja ei voi kiinnittää
diff --git a/config/locales/he.yml b/config/locales/he.yml
index eebc9000da..2670f51266 100644
--- a/config/locales/he.yml
+++ b/config/locales/he.yml
@@ -2015,6 +2015,7 @@ he:
errors:
in_reply_not_found: × ×¨×× ×Š×××××ĸ× ×Š× ×Ą××Ē ××××× ×× ×× ×§××××Ē.
quoted_status_not_found: × ×¨×× ×Š×××××ĸ× ×Š× ×Ą××Ē ××Ļ×× ×× ×§××××Ē.
+ quoted_user_not_mentioned: ×× × ××Ē× ××Ļ×× ×׊×Ē×׊ ׊××× × × ×××××ר ×××××ĸ× ×¤×¨×××Ē.
over_character_limit: ×ר××× ××××× ××Ē×××× ×Š× %{max}
pin_errors:
direct: ×× × ××Ē× ××§××ĸ ××××ĸ××Ē ×Š× ×¨×××Ē× ××××××Ē ×××××Ē××× ××××
diff --git a/config/locales/is.yml b/config/locales/is.yml
index 104bd63894..7f3b2290f5 100644
--- a/config/locales/is.yml
+++ b/config/locales/is.yml
@@ -1933,6 +1933,7 @@ is:
errors:
in_reply_not_found: FÃĻrslan sem ÞÃē ert að reyna að svara að er lÃklega ekki til.
quoted_status_not_found: FÃĻrslan sem ÞÃē ert að reyna að vitna à virðist ekki vera til.
+ quoted_user_not_mentioned: Ekki er hÃĻgt að vitna à aðila sem ekki er minnst ÃĄ à einkaspjalli.
over_character_limit: hÃĄmarksfjÃļlda stafa (%{max}) nÃĄÃ°
pin_errors:
direct: Ekki er hÃĻgt að festa fÃĻrslur sem einungis eru sÃŊnilegar Þeim notendum sem minnst er ÃĄ
diff --git a/config/locales/nl.yml b/config/locales/nl.yml
index 9179337c6f..ede7eb69c3 100644
--- a/config/locales/nl.yml
+++ b/config/locales/nl.yml
@@ -1929,6 +1929,7 @@ nl:
errors:
in_reply_not_found: Het bericht waarop je probeert te reageren lijkt niet te bestaan.
quoted_status_not_found: Het bericht die je probeert te citeren lijkt niet te bestaan.
+ quoted_user_not_mentioned: Een niet-vermelde gebruiker kan niet in een privÊbericht worden geciteerd.
over_character_limit: Limiet van %{max} tekens overschreden
pin_errors:
direct: Berichten die alleen zichtbaar zijn voor vermelde gebruikers, kunnen niet worden vastgezet
diff --git a/config/locales/simple_form.cy.yml b/config/locales/simple_form.cy.yml
index 0f79229caa..58b07f787b 100644
--- a/config/locales/simple_form.cy.yml
+++ b/config/locales/simple_form.cy.yml
@@ -93,6 +93,7 @@ cy:
content_cache_retention_period: Bydd yr holl bostiadau gan weinyddion eraill (gan gynnwys hwb ac atebion) yn cael eu dileu ar ôl y nifer penodedig o ddyddiau, heb ystyried unrhyw ryngweithio defnyddiwr lleol Ãĸ'r postiadau hynny. Mae hyn yn cynnwys postiadau lle mae defnyddiwr lleol wedi ei farcio fel nodau tudalen neu ffefrynnau. Bydd cyfeiriadau preifat rhwng defnyddwyr o wahanol achosion hefyd yn cael eu colli ac yn amhosibl eu hadfer. Mae'r defnydd o'r gosodiad hwn wedi'i fwriadu ar gyfer achosion pwrpas arbennig ac mae'n torri llawer o ddisgwyliadau defnyddwyr pan gaiff ei weithredu at ddibenion cyffredinol.
custom_css: Gallwch gymhwyso arddulliau cyfaddas ar fersiwn gwe Mastodon.
favicon: WEBP, PNG, GIF neu JPG. Yn diystyru'r favicon Mastodon rhagosodedig gydag eicon cyfaddas.
+ landing_page: Yn dewis pa dudalen y mae ymwelwyr newydd yn ei gweld pan fyddan nhw'n cyrraedd eich gweinydd am y tro cyntaf. Os dewiswch "Trendio", yna mae angen galluogi tueddiadau yn y Gosodiadau Darganfod. Os dewiswch "Ffrydiau lleol", yna mae angen gosod "Mynediad i ffrydiau byw sy'n cynnwys postiadau lleol" i "Pawb" yn y Gosodiadau Darganfod.
mascot: Yn diystyru'r darlun yn y rhyngwyneb gwe uwch.
media_cache_retention_period: Mae ffeiliau cyfryngau o bostiadau a wneir gan ddefnyddwyr o bell yn cael eu storio ar eich gweinydd. Pan gaiff ei osod i werth positif, bydd y cyfryngau yn cael eu dileu ar ôl y nifer penodedig o ddyddiau. Os gofynnir am y data cyfryngau ar ôl iddo gael ei ddileu, caiff ei ail-lwytho i lawr, os yw'r cynnwys ffynhonnell yn dal i fod ar gael. Oherwydd cyfyngiadau ar ba mor aml y mae cardiau rhagolwg cyswllt yn pleidleisio i wefannau trydydd parti, argymhellir gosod y gwerth hwn i o leiaf 14 diwrnod, neu ni fydd cardiau rhagolwg cyswllt yn cael eu diweddaru ar alw cyn yr amser hwnnw.
min_age: Mae gofyn i ddefnyddwyr gadarnhau eu dyddiad geni wrth gofrestru
@@ -290,6 +291,7 @@ cy:
content_cache_retention_period: Cyfnod cadw cynnwys o bell
custom_css: CSS cyfaddas
favicon: Favicon
+ landing_page: Tudalen cychwyn ar gyfer ymwelwyr newydd
local_live_feed_access: Mynediad i ffrydiau byw sy'n cynnwys postiadau lleol
local_topic_feed_access: Mynediad i ffrydiau hashnod a dolenni sy'n cynnwys postiadau lleol
mascot: Mascot cyfaddas (hen)
diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml
index 36ae9a4ca5..586c22ae6a 100644
--- a/config/locales/simple_form.en.yml
+++ b/config/locales/simple_form.en.yml
@@ -79,7 +79,7 @@ en:
featured_tag:
name: 'Here are some of the hashtags you used the most recently:'
filters:
- action: Chose which action to perform when a post matches the filter
+ action: Choose which action to perform when a post matches the filter
actions:
blur: Hide media behind a warning, without hiding the text itself
hide: Completely hide the filtered content, behaving as if it did not exist
diff --git a/config/locales/sq.yml b/config/locales/sq.yml
index 6aa95821d4..819dcd5556 100644
--- a/config/locales/sq.yml
+++ b/config/locales/sq.yml
@@ -1914,6 +1914,7 @@ sq:
errors:
in_reply_not_found: Gjendja tÃĢ cilÃĢs po provoni tâi pÃĢrgjigjeni sâduket se ekziston.
quoted_status_not_found: Postimi qÃĢ po rrekeni tÃĢ citoni nuk duket se ekziston.
+ quoted_user_not_mentioned: Sâmund tÃĢ citohet njÃĢ pÃĢrdorues qÃĢ sâÃĢshtÃĢ pÃĢrmendur nÃĢ njÃĢ postim PÃĢrmendje Private.
over_character_limit: u tejkalua kufi shenjash prej %{max}
pin_errors:
direct: Postimet qÃĢ janÃĢ tÃĢ dukshme vetÃĢm pÃĢr pÃĢrdoruesit e pÃĢrmendur sâmund tÃĢ fiksohen
diff --git a/config/locales/vi.yml b/config/locales/vi.yml
index 0d3866f652..ea21c767af 100644
--- a/config/locales/vi.yml
+++ b/config/locales/vi.yml
@@ -1886,6 +1886,7 @@ vi:
errors:
in_reply_not_found: BáēĄn Äang tráēŖ láģi máģt tÃēt không cÃ˛n táģn táēĄi.
quoted_status_not_found: BáēĄn Äang trÃch dáēĢn máģt tÃēt không cÃ˛n táģn táēĄi.
+ quoted_user_not_mentioned: Không tháģ trÃch dáēĢn ngưáģi dÚng không ÄÆ°áģŖc nháē¯c Äáēŋn trong tÃēt Nháē¯n riÃĒng.
over_character_limit: vưáģŖt quÃĄ giáģi háēĄn %{max} kÃŊ táģą
pin_errors:
direct: Không tháģ ghim nháģ¯ng tÃēt nháē¯n riÃĒng
diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml
index 6c56aaf90f..7c522752a6 100644
--- a/config/locales/zh-TW.yml
+++ b/config/locales/zh-TW.yml
@@ -1888,6 +1888,7 @@ zh-TW:
errors:
in_reply_not_found: æ¨åčŠĻåčĻäšåæäŧŧäšä¸åå¨ã
quoted_status_not_found: æ¨åčŠĻåŧį¨äšåæäŧŧäšä¸åå¨ã
+ quoted_user_not_mentioned: įĄæŗæŧį§č¨åæä¸åŧį¨įĄæåäšäŊŋį¨č
ã
over_character_limit: 厞čļ
é %{max} åįéåļ
pin_errors:
direct: įĄæŗéé¸åĒæå
æåäŊŋį¨č
å¯čĻäšåæ
diff --git a/package.json b/package.json
index e52235ede9..8fadcbe5ba 100644
--- a/package.json
+++ b/package.json
@@ -48,7 +48,7 @@
"@gamestdio/websocket": "^0.3.2",
"@github/webauthn-json": "^2.1.1",
"@optimize-lodash/rollup-plugin": "^5.0.2",
- "@rails/ujs": "7.1.502",
+ "@rails/ujs": "7.1.600",
"@react-spring/web": "^9.7.5",
"@reduxjs/toolkit": "^2.0.1",
"@use-gesture/react": "^10.3.1",
@@ -103,7 +103,6 @@
"react-router-dom": "^5.3.4",
"react-select": "^5.7.3",
"react-sparklines": "^1.7.0",
- "react-swipeable-views": "^0.14.0",
"react-textarea-autosize": "^8.4.1",
"react-toggle": "^4.1.3",
"redux-immutable": "^4.0.0",
@@ -135,10 +134,10 @@
"devDependencies": {
"@eslint/js": "^9.23.0",
"@formatjs/cli": "^6.1.1",
- "@storybook/addon-a11y": "^9.1.1",
- "@storybook/addon-docs": "^9.1.1",
- "@storybook/addon-vitest": "^9.1.1",
- "@storybook/react-vite": "^9.1.1",
+ "@storybook/addon-a11y": "^10.0.2",
+ "@storybook/addon-docs": "^10.0.2",
+ "@storybook/addon-vitest": "^10.0.2",
+ "@storybook/react-vite": "^10.0.2",
"@testing-library/dom": "^10.4.1",
"@testing-library/react": "^16.3.0",
"@types/debug": "^4",
@@ -160,14 +159,14 @@
"@types/react-router": "^5.1.20",
"@types/react-router-dom": "^5.3.3",
"@types/react-sparklines": "^1.7.2",
- "@types/react-swipeable-views": "^0.13.1",
"@types/react-test-renderer": "^18.0.0",
"@types/react-toggle": "^4.0.3",
"@types/redux-immutable": "^4.0.3",
"@types/requestidlecallback": "^0.3.5",
- "@vitest/browser": "^3.2.4",
- "@vitest/coverage-v8": "^3.2.4",
- "@vitest/ui": "^3.2.4",
+ "@vitest/browser": "^4.0.5",
+ "@vitest/browser-playwright": "^4.0.5",
+ "@vitest/coverage-v8": "^4.0.5",
+ "@vitest/ui": "^4.0.5",
"chromatic": "^13.1.3",
"eslint": "^9.23.0",
"eslint-import-resolver-typescript": "^4.2.5",
@@ -178,24 +177,24 @@
"eslint-plugin-promise": "~7.2.1",
"eslint-plugin-react": "^7.37.4",
"eslint-plugin-react-hooks": "^5.2.0",
- "eslint-plugin-storybook": "^9.0.4",
+ "eslint-plugin-storybook": "^10.0.2",
"fake-indexeddb": "^6.0.1",
"globals": "^16.0.0",
"husky": "^9.0.11",
- "lint-staged": "^16.0.0",
+ "lint-staged": "^16.2.6",
"msw": "^2.10.2",
"msw-storybook-addon": "^2.0.5",
"playwright": "^1.56.1",
"prettier": "^3.3.3",
"react-test-renderer": "^18.2.0",
- "storybook": "^9.1.1",
+ "storybook": "^10.0.2",
"stylelint": "^16.19.1",
"stylelint-config-prettier-scss": "^1.0.0",
"stylelint-config-standard-scss": "^16.0.0",
"typescript": "~5.9.0",
"typescript-eslint": "^8.45.0",
"typescript-plugin-css-modules": "^5.2.0",
- "vitest": "^3.2.4"
+ "vitest": "^4.0.5"
},
"resolutions": {
"@types/react": "^18.2.7",
diff --git a/streaming/package.json b/streaming/package.json
index 7df035d6e7..e64aeed4be 100644
--- a/streaming/package.json
+++ b/streaming/package.json
@@ -24,8 +24,8 @@
"jsdom": "^27.0.0",
"pg": "^8.5.0",
"pg-connection-string": "^2.6.0",
- "pino": "^9.0.0",
- "pino-http": "^10.0.0",
+ "pino": "^10.0.0",
+ "pino-http": "^11.0.0",
"prom-client": "^15.0.0",
"uuid": "^13.0.0",
"ws": "^8.12.1"
diff --git a/vitest.config.mts b/vitest.config.mts
index b129c293f4..16c1ba2e9e 100644
--- a/vitest.config.mts
+++ b/vitest.config.mts
@@ -1,6 +1,7 @@
import { resolve } from 'node:path';
import { storybookTest } from '@storybook/addon-vitest/vitest-plugin';
+import { playwright } from '@vitest/browser-playwright';
import {
configDefaults,
defineConfig,
@@ -23,7 +24,7 @@ const storybookTests: TestProjectInlineConfiguration = {
browser: {
enabled: true,
headless: true,
- provider: 'playwright',
+ provider: playwright(),
instances: [{ browser: 'chromium' }],
},
setupFiles: [resolve(__dirname, '.storybook/vitest.setup.ts')],
diff --git a/yarn.lock b/yarn.lock
index 55dfadfe79..9daae3e7a2 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -33,16 +33,6 @@ __metadata:
languageName: node
linkType: hard
-"@ampproject/remapping@npm:^2.3.0":
- version: 2.3.0
- resolution: "@ampproject/remapping@npm:2.3.0"
- dependencies:
- "@jridgewell/gen-mapping": "npm:^0.3.5"
- "@jridgewell/trace-mapping": "npm:^0.3.24"
- checksum: 10c0/81d63cca5443e0f0c72ae18b544cc28c7c0ec2cea46e7cb888bb0e0f411a1191d0d6b7af798d54e30777d8d1488b2ec0732aac2be342d3d7d3ffd271c6f489ed
- languageName: node
- linkType: hard
-
"@apideck/better-ajv-errors@npm:^0.3.1":
version: 0.3.6
resolution: "@apideck/better-ajv-errors@npm:0.3.6"
@@ -1184,16 +1174,7 @@ __metadata:
languageName: node
linkType: hard
-"@babel/runtime@npm:7.0.0":
- version: 7.0.0
- resolution: "@babel/runtime@npm:7.0.0"
- dependencies:
- regenerator-runtime: "npm:^0.12.0"
- checksum: 10c0/fbbdf86380a1cfa6ce32a743549f4e4c8b8eb06a18be5054441cc0f66e75a747ae43b042d8989f4657027e1be3b9a82069865ccc5080838f004abd1161093742
- languageName: node
- linkType: hard
-
-"@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.1.2, @babel/runtime@npm:^7.11.2, @babel/runtime@npm:^7.12.0, @babel/runtime@npm:^7.12.13, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.13.8, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.2.0, @babel/runtime@npm:^7.20.13, @babel/runtime@npm:^7.3.1, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.6.3, @babel/runtime@npm:^7.8.7, @babel/runtime@npm:^7.9.2":
+"@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.1.2, @babel/runtime@npm:^7.11.2, @babel/runtime@npm:^7.12.0, @babel/runtime@npm:^7.12.13, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.13.8, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.20.13, @babel/runtime@npm:^7.3.1, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.6.3, @babel/runtime@npm:^7.8.7, @babel/runtime@npm:^7.9.2":
version: 7.27.0
resolution: "@babel/runtime@npm:7.27.0"
dependencies:
@@ -2263,14 +2244,14 @@ __metadata:
languageName: node
linkType: hard
-"@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0, @eslint-community/eslint-utils@npm:^4.7.0":
- version: 4.7.0
- resolution: "@eslint-community/eslint-utils@npm:4.7.0"
+"@eslint-community/eslint-utils@npm:^4.4.0, @eslint-community/eslint-utils@npm:^4.7.0, @eslint-community/eslint-utils@npm:^4.8.0":
+ version: 4.9.0
+ resolution: "@eslint-community/eslint-utils@npm:4.9.0"
dependencies:
eslint-visitor-keys: "npm:^3.4.3"
peerDependencies:
eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
- checksum: 10c0/c0f4f2bd73b7b7a9de74b716a664873d08ab71ab439e51befe77d61915af41a81ecec93b408778b3a7856185244c34c2c8ee28912072ec14def84ba2dec70adf
+ checksum: 10c0/8881e22d519326e7dba85ea915ac7a143367c805e6ba1374c987aa2fbdd09195cc51183d2da72c0e2ff388f84363e1b220fd0d19bef10c272c63455162176817
languageName: node
linkType: hard
@@ -2281,30 +2262,32 @@ __metadata:
languageName: node
linkType: hard
-"@eslint/config-array@npm:^0.21.0":
- version: 0.21.0
- resolution: "@eslint/config-array@npm:0.21.0"
+"@eslint/config-array@npm:^0.21.1":
+ version: 0.21.1
+ resolution: "@eslint/config-array@npm:0.21.1"
dependencies:
- "@eslint/object-schema": "npm:^2.1.6"
+ "@eslint/object-schema": "npm:^2.1.7"
debug: "npm:^4.3.1"
minimatch: "npm:^3.1.2"
- checksum: 10c0/0ea801139166c4aa56465b309af512ef9b2d3c68f9198751bbc3e21894fe70f25fbf26e1b0e9fffff41857bc21bfddeee58649ae6d79aadcd747db0c5dca771f
+ checksum: 10c0/2f657d4edd6ddcb920579b72e7a5b127865d4c3fb4dda24f11d5c4f445a93ca481aebdbd6bf3291c536f5d034458dbcbb298ee3b698bc6c9dd02900fe87eec3c
languageName: node
linkType: hard
-"@eslint/config-helpers@npm:^0.3.0":
- version: 0.3.0
- resolution: "@eslint/config-helpers@npm:0.3.0"
- checksum: 10c0/013ae7b189eeae8b30cc2ee87bc5c9c091a9cd615579003290eb28bebad5d78806a478e74ba10b3fe08ed66975b52af7d2cd4b4b43990376412b14e5664878c8
+"@eslint/config-helpers@npm:^0.4.2":
+ version: 0.4.2
+ resolution: "@eslint/config-helpers@npm:0.4.2"
+ dependencies:
+ "@eslint/core": "npm:^0.17.0"
+ checksum: 10c0/92efd7a527b2d17eb1a148409d71d80f9ac160b565ac73ee092252e8bf08ecd08670699f46b306b94f13d22e88ac88a612120e7847570dd7cdc72f234d50dcb4
languageName: node
linkType: hard
-"@eslint/core@npm:^0.15.0, @eslint/core@npm:^0.15.1":
- version: 0.15.1
- resolution: "@eslint/core@npm:0.15.1"
+"@eslint/core@npm:^0.17.0":
+ version: 0.17.0
+ resolution: "@eslint/core@npm:0.17.0"
dependencies:
"@types/json-schema": "npm:^7.0.15"
- checksum: 10c0/abaf641940776638b8c15a38d99ce0dac551a8939310ec81b9acd15836a574cf362588eaab03ab11919bc2a0f9648b19ea8dee33bf12675eb5b6fd38bda6f25e
+ checksum: 10c0/9a580f2246633bc752298e7440dd942ec421860d1946d0801f0423830e67887e4aeba10ab9a23d281727a978eb93d053d1922a587d502942a713607f40ed704e
languageName: node
linkType: hard
@@ -2325,27 +2308,27 @@ __metadata:
languageName: node
linkType: hard
-"@eslint/js@npm:9.32.0, @eslint/js@npm:^9.23.0":
- version: 9.32.0
- resolution: "@eslint/js@npm:9.32.0"
- checksum: 10c0/f71e8f9146638d11fb15238279feff98801120a4d4130f1c587c4f09b024ff5ec01af1ba88e97ba6b7013488868898a668f77091300cc3d4394c7a8ed32d2667
+"@eslint/js@npm:9.39.1, @eslint/js@npm:^9.23.0":
+ version: 9.39.1
+ resolution: "@eslint/js@npm:9.39.1"
+ checksum: 10c0/6f7f26f8cdb7ad6327bbf9741973b6278eb946f18f70e35406e88194b0d5c522d0547a34a02f2a208eec95c5d1388cdf7ccb20039efd2e4cb6655615247a50f1
languageName: node
linkType: hard
-"@eslint/object-schema@npm:^2.1.6":
- version: 2.1.6
- resolution: "@eslint/object-schema@npm:2.1.6"
- checksum: 10c0/b8cdb7edea5bc5f6a96173f8d768d3554a628327af536da2fc6967a93b040f2557114d98dbcdbf389d5a7b290985ad6a9ce5babc547f36fc1fde42e674d11a56
+"@eslint/object-schema@npm:^2.1.7":
+ version: 2.1.7
+ resolution: "@eslint/object-schema@npm:2.1.7"
+ checksum: 10c0/936b6e499853d1335803f556d526c86f5fe2259ed241bc665000e1d6353828edd913feed43120d150adb75570cae162cf000b5b0dfc9596726761c36b82f4e87
languageName: node
linkType: hard
-"@eslint/plugin-kit@npm:^0.3.4":
- version: 0.3.4
- resolution: "@eslint/plugin-kit@npm:0.3.4"
+"@eslint/plugin-kit@npm:^0.4.1":
+ version: 0.4.1
+ resolution: "@eslint/plugin-kit@npm:0.4.1"
dependencies:
- "@eslint/core": "npm:^0.15.1"
+ "@eslint/core": "npm:^0.17.0"
levn: "npm:^0.4.1"
- checksum: 10c0/64331ca100f62a0115d10419a28059d0f377e390192163b867b9019517433d5073d10b4ec21f754fa01faf832aceb34178745924baab2957486f8bf95fd628d2
+ checksum: 10c0/51600f78b798f172a9915dffb295e2ffb44840d583427bc732baf12ecb963eb841b253300e657da91d890f4b323d10a1bd12934bf293e3018d8bb66fdce5217b
languageName: node
linkType: hard
@@ -2407,18 +2390,6 @@ __metadata:
languageName: node
linkType: hard
-"@formatjs/ecma402-abstract@npm:2.3.4":
- version: 2.3.4
- resolution: "@formatjs/ecma402-abstract@npm:2.3.4"
- dependencies:
- "@formatjs/fast-memoize": "npm:2.2.7"
- "@formatjs/intl-localematcher": "npm:0.6.1"
- decimal.js: "npm:^10.4.3"
- tslib: "npm:^2.8.0"
- checksum: 10c0/2644bc618a34dc610ef9691281eeb45ae6175e6982cf19f1bd140672fc95c748747ce3c85b934649ea7e4a304f7ae0060625fd53d5df76f92ca3acf743e1eb0a
- languageName: node
- linkType: hard
-
"@formatjs/ecma402-abstract@npm:2.3.6":
version: 2.3.6
resolution: "@formatjs/ecma402-abstract@npm:2.3.6"
@@ -2440,17 +2411,6 @@ __metadata:
languageName: node
linkType: hard
-"@formatjs/icu-messageformat-parser@npm:2.11.2":
- version: 2.11.2
- resolution: "@formatjs/icu-messageformat-parser@npm:2.11.2"
- dependencies:
- "@formatjs/ecma402-abstract": "npm:2.3.4"
- "@formatjs/icu-skeleton-parser": "npm:1.8.14"
- tslib: "npm:^2.8.0"
- checksum: 10c0/a121f2d2c6b36a1632ffd64c3545e2500c8ee0f7fee5db090318c035d635c430ab123faedb5d000f18d9423a7b55fbf670b84e2e2dd72cc307a38aed61d3b2e0
- languageName: node
- linkType: hard
-
"@formatjs/icu-messageformat-parser@npm:2.11.4":
version: 2.11.4
resolution: "@formatjs/icu-messageformat-parser@npm:2.11.4"
@@ -2462,16 +2422,6 @@ __metadata:
languageName: node
linkType: hard
-"@formatjs/icu-skeleton-parser@npm:1.8.14":
- version: 1.8.14
- resolution: "@formatjs/icu-skeleton-parser@npm:1.8.14"
- dependencies:
- "@formatjs/ecma402-abstract": "npm:2.3.4"
- tslib: "npm:^2.8.0"
- checksum: 10c0/a1807ed6e90b8a2e8d0e5b5125e6f9a2c057d3cff377fb031d2333af7cfaa6de4ed3a15c23da7294d4c3557f8b28b2163246434a19720f26b5db0497d97e9b58
- languageName: node
- linkType: hard
-
"@formatjs/icu-skeleton-parser@npm:1.8.16":
version: 1.8.16
resolution: "@formatjs/icu-skeleton-parser@npm:1.8.16"
@@ -2482,15 +2432,6 @@ __metadata:
languageName: node
linkType: hard
-"@formatjs/intl-localematcher@npm:0.6.1":
- version: 0.6.1
- resolution: "@formatjs/intl-localematcher@npm:0.6.1"
- dependencies:
- tslib: "npm:^2.8.0"
- checksum: 10c0/bacbedd508519c1bb5ca2620e89dc38f12101be59439aa14aa472b222915b462cb7d679726640f6dcf52a05dd218b5aa27ccd60f2e5010bb96f1d4929848cde0
- languageName: node
- linkType: hard
-
"@formatjs/intl-localematcher@npm:0.6.2":
version: 0.6.2
resolution: "@formatjs/intl-localematcher@npm:0.6.2"
@@ -2530,26 +2471,6 @@ __metadata:
languageName: node
linkType: hard
-"@formatjs/ts-transformer@npm:3.14.0":
- version: 3.14.0
- resolution: "@formatjs/ts-transformer@npm:3.14.0"
- dependencies:
- "@formatjs/icu-messageformat-parser": "npm:2.11.2"
- "@types/json-stable-stringify": "npm:^1.1.0"
- "@types/node": "npm:^22.0.0"
- chalk: "npm:^4.1.2"
- json-stable-stringify: "npm:^1.1.1"
- tslib: "npm:^2.8.0"
- typescript: "npm:^5.6.0"
- peerDependencies:
- ts-jest: ^29
- peerDependenciesMeta:
- ts-jest:
- optional: true
- checksum: 10c0/80599a9e76685d710aeba88857fc3d682cc4f17996e870c582a40288e149d6dd496a3be0684682f7ed3892ca677c6b9cbd6b804dbf457da87b493a7a756a18a1
- languageName: node
- linkType: hard
-
"@formatjs/ts-transformer@npm:3.14.2":
version: 3.14.2
resolution: "@formatjs/ts-transformer@npm:3.14.2"
@@ -2708,13 +2629,6 @@ __metadata:
languageName: node
linkType: hard
-"@istanbuljs/schema@npm:^0.1.2":
- version: 0.1.3
- resolution: "@istanbuljs/schema@npm:0.1.3"
- checksum: 10c0/61c5286771676c9ca3eb2bd8a7310a9c063fb6e0e9712225c8471c582d157392c88f5353581c8c9adbe0dff98892317d2fdfc56c3499aa42e0194405206a963a
- 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"
@@ -2769,20 +2683,20 @@ __metadata:
languageName: node
linkType: hard
-"@jridgewell/sourcemap-codec@npm:^1.4.14, @jridgewell/sourcemap-codec@npm:^1.5.0":
- version: 1.5.0
- resolution: "@jridgewell/sourcemap-codec@npm:1.5.0"
- checksum: 10c0/2eb864f276eb1096c3c11da3e9bb518f6d9fc0023c78344cdc037abadc725172c70314bdb360f2d4b7bffec7f5d657ce006816bc5d4ecb35e61b66132db00c18
+"@jridgewell/sourcemap-codec@npm:^1.4.14, @jridgewell/sourcemap-codec@npm:^1.5.0, @jridgewell/sourcemap-codec@npm:^1.5.5":
+ version: 1.5.5
+ resolution: "@jridgewell/sourcemap-codec@npm:1.5.5"
+ checksum: 10c0/f9e538f302b63c0ebc06eecb1dd9918dd4289ed36147a0ddce35d6ea4d7ebbda243cda7b2213b6a5e1d8087a298d5cf630fb2bd39329cdecb82017023f6081a0
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":
- version: 0.3.29
- resolution: "@jridgewell/trace-mapping@npm:0.3.29"
+"@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":
+ version: 0.3.31
+ resolution: "@jridgewell/trace-mapping@npm:0.3.31"
dependencies:
"@jridgewell/resolve-uri": "npm:^3.1.0"
"@jridgewell/sourcemap-codec": "npm:^1.4.14"
- checksum: 10c0/fb547ba31658c4d74eb17e7389f4908bf7c44cef47acb4c5baa57289daf68e6fe53c639f41f751b3923aca67010501264f70e7b49978ad1f040294b22c37b333
+ checksum: 10c0/4b30ec8cd56c5fd9a661f088230af01e0c1a3888d11ffb6b47639700f71225be21d1f7e168048d6d4f9449207b978a235c07c8f15c07705685d16dc06280e9d9
languageName: node
linkType: hard
@@ -2816,13 +2730,13 @@ __metadata:
"@gamestdio/websocket": "npm:^0.3.2"
"@github/webauthn-json": "npm:^2.1.1"
"@optimize-lodash/rollup-plugin": "npm:^5.0.2"
- "@rails/ujs": "npm:7.1.502"
+ "@rails/ujs": "npm:7.1.600"
"@react-spring/web": "npm:^9.7.5"
"@reduxjs/toolkit": "npm:^2.0.1"
- "@storybook/addon-a11y": "npm:^9.1.1"
- "@storybook/addon-docs": "npm:^9.1.1"
- "@storybook/addon-vitest": "npm:^9.1.1"
- "@storybook/react-vite": "npm:^9.1.1"
+ "@storybook/addon-a11y": "npm:^10.0.2"
+ "@storybook/addon-docs": "npm:^10.0.2"
+ "@storybook/addon-vitest": "npm:^10.0.2"
+ "@storybook/react-vite": "npm:^10.0.2"
"@testing-library/dom": "npm:^10.4.1"
"@testing-library/react": "npm:^16.3.0"
"@types/debug": "npm:^4"
@@ -2844,7 +2758,6 @@ __metadata:
"@types/react-router": "npm:^5.1.20"
"@types/react-router-dom": "npm:^5.3.3"
"@types/react-sparklines": "npm:^1.7.2"
- "@types/react-swipeable-views": "npm:^0.13.1"
"@types/react-test-renderer": "npm:^18.0.0"
"@types/react-toggle": "npm:^4.0.3"
"@types/redux-immutable": "npm:^4.0.3"
@@ -2852,9 +2765,10 @@ __metadata:
"@use-gesture/react": "npm:^10.3.1"
"@vitejs/plugin-legacy": "npm:^7.2.1"
"@vitejs/plugin-react": "npm:^5.0.0"
- "@vitest/browser": "npm:^3.2.4"
- "@vitest/coverage-v8": "npm:^3.2.4"
- "@vitest/ui": "npm:^3.2.4"
+ "@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"
arrow-key-navigation: "npm:^1.2.0"
async-mutex: "npm:^0.5.0"
atrament: "npm:0.2.4"
@@ -2884,7 +2798,7 @@ __metadata:
eslint-plugin-promise: "npm:~7.2.1"
eslint-plugin-react: "npm:^7.37.4"
eslint-plugin-react-hooks: "npm:^5.2.0"
- eslint-plugin-storybook: "npm:^9.0.4"
+ eslint-plugin-storybook: "npm:^10.0.2"
fake-indexeddb: "npm:^6.0.1"
fast-glob: "npm:^3.3.3"
favico.js: "npm:^0.3.10"
@@ -2899,7 +2813,7 @@ __metadata:
intl-messageformat: "npm:^10.7.16"
js-yaml: "npm:^4.1.0"
lande: "npm:^1.0.10"
- lint-staged: "npm:^16.0.0"
+ lint-staged: "npm:^16.2.6"
lodash: "npm:^4.17.21"
marky: "npm:^1.2.5"
msw: "npm:^2.10.2"
@@ -2923,7 +2837,6 @@ __metadata:
react-router-dom: "npm:^5.3.4"
react-select: "npm:^5.7.3"
react-sparklines: "npm:^1.7.0"
- react-swipeable-views: "npm:^0.14.0"
react-test-renderer: "npm:^18.2.0"
react-textarea-autosize: "npm:^8.4.1"
react-toggle: "npm:^4.1.3"
@@ -2935,7 +2848,7 @@ __metadata:
sass: "npm:^1.62.1"
scroll-behavior: "npm:^0.11.0"
stacktrace-js: "npm:^2.0.2"
- storybook: "npm:^9.1.1"
+ storybook: "npm:^10.0.2"
stringz: "npm:^2.1.0"
stylelint: "npm:^16.19.1"
stylelint-config-prettier-scss: "npm:^1.0.0"
@@ -2954,7 +2867,7 @@ __metadata:
vite-plugin-static-copy: "npm:^3.1.1"
vite-plugin-svgr: "npm:^4.3.0"
vite-tsconfig-paths: "npm:^5.1.4"
- vitest: "npm:^3.2.4"
+ vitest: "npm:^4.0.5"
wicg-inert: "npm:^3.1.2"
workbox-expiration: "npm:^7.3.0"
workbox-routing: "npm:^7.3.0"
@@ -2988,8 +2901,8 @@ __metadata:
jsdom: "npm:^27.0.0"
pg: "npm:^8.5.0"
pg-connection-string: "npm:^2.6.0"
- pino: "npm:^9.0.0"
- pino-http: "npm:^10.0.0"
+ pino: "npm:^10.0.0"
+ pino-http: "npm:^11.0.0"
pino-pretty: "npm:^13.0.0"
prom-client: "npm:^15.0.0"
typescript: "npm:~5.9.0"
@@ -3316,10 +3229,10 @@ __metadata:
languageName: node
linkType: hard
-"@rails/ujs@npm:7.1.502":
- version: 7.1.502
- resolution: "@rails/ujs@npm:7.1.502"
- checksum: 10c0/79b46e8abd03e3fc633d93cc4e4c23838c628b775802fb38c2ce68b0e609ce287a67b81db112a93cc78c07ec82ca3b4cf87e74eb556d35148ce5f64c8be9201f
+"@rails/ujs@npm:7.1.600":
+ version: 7.1.600
+ resolution: "@rails/ujs@npm:7.1.600"
+ checksum: 10c0/0ccaa68a08fbc7b084ab89a1fe49520a5cba6d99f4b0feaf0cb3d00334c59d8d798932d7e49b84aa388875d039ea1e17eb115ed96a80ad157e408a13eceef53e
languageName: node
linkType: hard
@@ -3689,80 +3602,96 @@ __metadata:
languageName: node
linkType: hard
-"@storybook/addon-a11y@npm:^9.1.1":
- version: 9.1.7
- resolution: "@storybook/addon-a11y@npm:9.1.7"
+"@storybook/addon-a11y@npm:^10.0.2":
+ version: 10.0.2
+ resolution: "@storybook/addon-a11y@npm:10.0.2"
dependencies:
"@storybook/global": "npm:^5.0.0"
axe-core: "npm:^4.2.0"
peerDependencies:
- storybook: ^9.1.7
- checksum: 10c0/c34f057acec41d6116669663e2a18b230c8905c409de6ef7fcff2cfe00741b8c435165c43301565e99ff275e541180de866c48c26d2676313334e2dd4696f5a3
+ storybook: ^10.0.2
+ checksum: 10c0/a47fed1aa098328bea173f257a0140dff4a5e2d2d6c90b0fa88a33a82583658afa09fa04d012930900fe87453a48d781847b7f5193da0f09b0b8598032596ca2
languageName: node
linkType: hard
-"@storybook/addon-docs@npm:^9.1.1":
- version: 9.1.7
- resolution: "@storybook/addon-docs@npm:9.1.7"
+"@storybook/addon-docs@npm:^10.0.2":
+ version: 10.0.2
+ resolution: "@storybook/addon-docs@npm:10.0.2"
dependencies:
"@mdx-js/react": "npm:^3.0.0"
- "@storybook/csf-plugin": "npm:9.1.7"
- "@storybook/icons": "npm:^1.4.0"
- "@storybook/react-dom-shim": "npm:9.1.7"
+ "@storybook/csf-plugin": "npm:10.0.2"
+ "@storybook/icons": "npm:^1.6.0"
+ "@storybook/react-dom-shim": "npm:10.0.2"
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: ^9.1.7
- checksum: 10c0/81f530b1230c60d344662aedb4839baa099da287c0188e8d5e10ab8cac0b02bb747e7d6475dbb1a85cba0cb5c475b8d48936355dd359020652ccbaba7d664aa0
+ storybook: ^10.0.2
+ checksum: 10c0/167e8b4b230431ac8afcb6dfceedc8450d8d2d5a84c61e7a5f8e28a1a47d1031194a780f16ed697bce03cce10c71a6aa9bb1f102bf68693c96cfc710f4b5dadb
languageName: node
linkType: hard
-"@storybook/addon-vitest@npm:^9.1.1":
- version: 9.1.7
- resolution: "@storybook/addon-vitest@npm:9.1.7"
+"@storybook/addon-vitest@npm:^10.0.2":
+ version: 10.0.2
+ resolution: "@storybook/addon-vitest@npm:10.0.2"
dependencies:
"@storybook/global": "npm:^5.0.0"
- "@storybook/icons": "npm:^1.4.0"
+ "@storybook/icons": "npm:^1.6.0"
prompts: "npm:^2.4.0"
ts-dedent: "npm:^2.2.0"
peerDependencies:
- "@vitest/browser": ^3.0.0
- "@vitest/runner": ^3.0.0
- storybook: ^9.1.7
- vitest: ^3.0.0
+ "@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.2
+ vitest: ^3.0.0 || ^4.0.0
peerDependenciesMeta:
"@vitest/browser":
optional: true
+ "@vitest/browser-playwright":
+ optional: true
"@vitest/runner":
optional: true
vitest:
optional: true
- checksum: 10c0/744358491481d21e7728d07bd244038d378b5883257c3a2291b2fa5abef917493c1421921bc020fecfb15740a1b6331fdf598b15c91961ffc7ea924f8d945957
+ checksum: 10c0/b97b6b01b242f1c71a44eadbe4d993a355954dab2515b6d21771bc1ff55636ffd32474ba4138d2f6d45a752c2b11cf6ac7aef68b9213f5188bc2ba90ee5d12c0
languageName: node
linkType: hard
-"@storybook/builder-vite@npm:9.1.7":
- version: 9.1.7
- resolution: "@storybook/builder-vite@npm:9.1.7"
+"@storybook/builder-vite@npm:10.0.2":
+ version: 10.0.2
+ resolution: "@storybook/builder-vite@npm:10.0.2"
dependencies:
- "@storybook/csf-plugin": "npm:9.1.7"
+ "@storybook/csf-plugin": "npm:10.0.2"
ts-dedent: "npm:^2.0.0"
peerDependencies:
- storybook: ^9.1.7
+ storybook: ^10.0.2
vite: ^5.0.0 || ^6.0.0 || ^7.0.0
- checksum: 10c0/39306d65373a934c4274196d5451467acb4128252c61b7abb801153fdf9b8278ca4ee8c9911def229f9c6045f24d39610fb5f0e553892478e9f541cdb9287859
+ checksum: 10c0/a93bbb763c1f5d47b7b6c36f9225ca9a1f9f70c9f07c7b4ee61dd97f77a676b7d31c5c27b6ca48bb237fbaed626f592653380c2999bf9ae48be1071c0c007acf
languageName: node
linkType: hard
-"@storybook/csf-plugin@npm:9.1.7":
- version: 9.1.7
- resolution: "@storybook/csf-plugin@npm:9.1.7"
+"@storybook/csf-plugin@npm:10.0.2":
+ version: 10.0.2
+ resolution: "@storybook/csf-plugin@npm:10.0.2"
dependencies:
- unplugin: "npm:^1.3.1"
+ unplugin: "npm:^2.3.5"
peerDependencies:
- storybook: ^9.1.7
- checksum: 10c0/059fa960174a3f421eb09b41d0da43c43a46548a2535acc17a0e7989bb78f954180212a43b58392dfec6e92a3482621a13ec1b6ff00d1157a2355d369129842a
+ esbuild: "*"
+ rollup: "*"
+ storybook: ^10.0.2
+ vite: "*"
+ webpack: "*"
+ peerDependenciesMeta:
+ esbuild:
+ optional: true
+ rollup:
+ optional: true
+ vite:
+ optional: true
+ webpack:
+ optional: true
+ checksum: 10c0/422823c3635c5bab48a258d8f6e7dadf02484afdfb48b08005be962d8bb5b4c8f507f3d68b79523ff11901178a7e913f98c047ec7aced5bcdf47a846c2bcd66f
languageName: node
linkType: hard
@@ -3773,64 +3702,64 @@ __metadata:
languageName: node
linkType: hard
-"@storybook/icons@npm:^1.4.0":
- version: 1.4.0
- resolution: "@storybook/icons@npm:1.4.0"
+"@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/fd0514fb3fa431a8b5939fe1d9fc336b253ef2c25b34792d2d4ee59e13321108d34f8bf223a0981482f54f83c5ef47ffd1a98c376ca9071011c1b8afe2b01d43
+ checksum: 10c0/bbec9201a78a730195f9cf377b15856dc414a54d04e30d16c379d062425cc617bfd0d6586ba1716012cfbdab461f0c9693a6a52920f9bd09c7b4291fb116f59c
languageName: node
linkType: hard
-"@storybook/react-dom-shim@npm:9.1.7":
- version: 9.1.7
- resolution: "@storybook/react-dom-shim@npm:9.1.7"
+"@storybook/react-dom-shim@npm:10.0.2":
+ version: 10.0.2
+ resolution: "@storybook/react-dom-shim@npm:10.0.2"
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
- storybook: ^9.1.7
- checksum: 10c0/bed0ebf47f2d2027a28d82be1af5c2413297bfae928b0c6d6a0752f3e30819821660c6abdcc75fa97e15593dc1c181dc36b36f488c8710db3adcabaf70695964
+ 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.2
+ checksum: 10c0/8d915c4c0f4e88cc582fe653aadc9b7797105081e84bb22d4911dbb72c6dd4df0054bb074ae92ad1634a92332f4331d250431ca654f621de9f7f0a53e0eefff6
languageName: node
linkType: hard
-"@storybook/react-vite@npm:^9.1.1":
- version: 9.1.7
- resolution: "@storybook/react-vite@npm:9.1.7"
+"@storybook/react-vite@npm:^10.0.2":
+ version: 10.0.2
+ resolution: "@storybook/react-vite@npm:10.0.2"
dependencies:
"@joshwooding/vite-plugin-react-docgen-typescript": "npm:0.6.1"
"@rollup/pluginutils": "npm:^5.0.2"
- "@storybook/builder-vite": "npm:9.1.7"
- "@storybook/react": "npm:9.1.7"
- find-up: "npm:^7.0.0"
+ "@storybook/builder-vite": "npm:10.0.2"
+ "@storybook/react": "npm:10.0.2"
+ empathic: "npm:^2.0.0"
magic-string: "npm:^0.30.0"
react-docgen: "npm:^8.0.0"
resolve: "npm:^1.22.8"
tsconfig-paths: "npm:^4.2.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
- storybook: ^9.1.7
+ 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.2
vite: ^5.0.0 || ^6.0.0 || ^7.0.0
- checksum: 10c0/be74d1cacafc83f0c9dc22019aeb1e62a3c6faa2bcf98c1cd109ba3219fb61387d1be9875ffa5a59e824e7b7182c3491de47b2dcb4136368ee6c2189cff74e20
+ checksum: 10c0/982e903ce89d5a87676bd345abee1cf26d4c78d477c5659b7c279ab5af80e3b1246610fd5f434e33895ca2dcd2efd06f7238c82b1b84f6fdec9e3ed0907f4cb3
languageName: node
linkType: hard
-"@storybook/react@npm:9.1.7":
- version: 9.1.7
- resolution: "@storybook/react@npm:9.1.7"
+"@storybook/react@npm:10.0.2":
+ version: 10.0.2
+ resolution: "@storybook/react@npm:10.0.2"
dependencies:
"@storybook/global": "npm:^5.0.0"
- "@storybook/react-dom-shim": "npm:9.1.7"
+ "@storybook/react-dom-shim": "npm:10.0.2"
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
- storybook: ^9.1.7
+ 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.2
typescript: ">= 4.9.x"
peerDependenciesMeta:
typescript:
optional: true
- checksum: 10c0/6ba0d3877075c380d8ab47423cc8e93ff297018fadbbe2ecd224e3d60e6a0fdba561ea84c1ffb39228cb2efd1d8d432710c6ec0337b30f74a62dc2384df96c91
+ checksum: 10c0/298054e8c5e61f6d7392154e704f5db26ce22c9cdc1cd178c020eb6abd30dc380e10be28269b8d9c7706b8edefaa737360af906d7e0d6ffc4cbac76f1d835805
languageName: node
linkType: hard
@@ -3973,7 +3902,7 @@ __metadata:
languageName: node
linkType: hard
-"@testing-library/dom@npm:^10.4.0, @testing-library/dom@npm:^10.4.1":
+"@testing-library/dom@npm:^10.4.1":
version: 10.4.1
resolution: "@testing-library/dom@npm:10.4.1"
dependencies:
@@ -4219,14 +4148,14 @@ __metadata:
linkType: hard
"@types/express@npm:^4.17.17":
- version: 4.17.23
- resolution: "@types/express@npm:4.17.23"
+ version: 4.17.25
+ resolution: "@types/express@npm:4.17.25"
dependencies:
"@types/body-parser": "npm:*"
"@types/express-serve-static-core": "npm:^4.17.33"
"@types/qs": "npm:*"
- "@types/serve-static": "npm:*"
- checksum: 10c0/60490cd4f73085007247e7d4fafad0a7abdafa34fa3caba2757512564ca5e094ece7459f0f324030a63d513f967bb86579a8682af76ae2fd718e889b0a2a4fe8
+ "@types/serve-static": "npm:^1"
+ checksum: 10c0/f42b616d2c9dbc50352c820db7de182f64ebbfa8dba6fb6c98e5f8f0e2ef3edde0131719d9dc6874803d25ad9ca2d53471d0fec2fbc60a6003a43d015bab72c4
languageName: node
linkType: hard
@@ -4285,13 +4214,6 @@ __metadata:
languageName: node
linkType: hard
-"@types/json-stable-stringify@npm:^1.1.0":
- version: 1.1.0
- resolution: "@types/json-stable-stringify@npm:1.1.0"
- checksum: 10c0/8f69944701510243cd3a83aa44363a8a4d366f11a659b258f69fb3ad0f94ab1e2533206a2c929ac7fd18784d201b663b3f02a45934f545c926f051d8cb4df095
- languageName: node
- linkType: hard
-
"@types/json5@npm:^0.0.29":
version: 0.0.29
resolution: "@types/json5@npm:0.0.29"
@@ -4313,13 +4235,6 @@ __metadata:
languageName: node
linkType: hard
-"@types/mime@npm:*":
- version: 3.0.4
- resolution: "@types/mime@npm:3.0.4"
- checksum: 10c0/db478bc0f99e40f7b3e01d356a9bdf7817060808a294978111340317bcd80ca35382855578c5b60fbc84ae449674bd9bb38427b18417e1f8f19e4f72f8b242cd
- languageName: node
- linkType: hard
-
"@types/mime@npm:^1":
version: 1.3.5
resolution: "@types/mime@npm:1.3.5"
@@ -4358,13 +4273,13 @@ __metadata:
linkType: hard
"@types/pg@npm:^8.6.6":
- version: 8.15.5
- resolution: "@types/pg@npm:8.15.5"
+ version: 8.15.6
+ resolution: "@types/pg@npm:8.15.6"
dependencies:
"@types/node": "npm:*"
pg-protocol: "npm:*"
pg-types: "npm:^2.2.0"
- checksum: 10c0/19a3cc1811918753f8c827733648c3a85c7b0355bf207c44eb1a3b79b2e6a0d85cb5457ec550d860fc9be7e88c7587a3600958ec8c61fa1ad573061c63af93f0
+ checksum: 10c0/7f93f83a4da0dc6133918f824d826fa34e78fb8cf86392d28a0e095c836c6910c014ced5d4b364d83e8485a65ce369adeb9663b14ba301241d4c0f80073007f3
languageName: node
linkType: hard
@@ -4486,15 +4401,6 @@ __metadata:
languageName: node
linkType: hard
-"@types/react-swipeable-views@npm:^0.13.1":
- version: 0.13.6
- resolution: "@types/react-swipeable-views@npm:0.13.6"
- dependencies:
- "@types/react": "npm:*"
- checksum: 10c0/a26879146748417234bb7f44c5a71e6bab2b76c0b34c72f0493c18403487a5d77021510e8665bd8bd22786904fbbd90d6db55c8dd2bf983c32421139de851c94
- languageName: node
- linkType: hard
-
"@types/react-test-renderer@npm:^18.0.0":
version: 18.3.1
resolution: "@types/react-test-renderer@npm:18.3.1"
@@ -4523,12 +4429,12 @@ __metadata:
linkType: hard
"@types/react@npm:^18.2.7":
- version: 18.3.24
- resolution: "@types/react@npm:18.3.24"
+ version: 18.3.26
+ resolution: "@types/react@npm:18.3.26"
dependencies:
"@types/prop-types": "npm:*"
csstype: "npm:^3.0.2"
- checksum: 10c0/9e188fa8e50f172cf647fc48fea2e04d88602afff47190b697de281a8ac88df9ee059864757a2a438ff599eaf9276d9a9e0e60585e88f7d57f01a2e4877d37ec
+ checksum: 10c0/7b62d91c33758f14637311921c92db6045b6328e2300666a35ef8130d06385e39acada005eaf317eee93228edc10ea5f0cd34a0385654d2014d24699a65bfeef
languageName: node
linkType: hard
@@ -4563,24 +4469,24 @@ __metadata:
languageName: node
linkType: hard
-"@types/send@npm:*":
- version: 0.17.4
- resolution: "@types/send@npm:0.17.4"
+"@types/send@npm:*, @types/send@npm:<1":
+ version: 0.17.6
+ resolution: "@types/send@npm:0.17.6"
dependencies:
"@types/mime": "npm:^1"
"@types/node": "npm:*"
- checksum: 10c0/7f17fa696cb83be0a104b04b424fdedc7eaba1c9a34b06027239aba513b398a0e2b7279778af521f516a397ced417c96960e5f50fcfce40c4bc4509fb1a5883c
+ checksum: 10c0/a9d76797f0637738062f1b974e0fcf3d396a28c5dc18c3f95ecec5dabda82e223afbc2d56a0bca46b6326fd7bb229979916cea40de2270a98128fd94441b87c2
languageName: node
linkType: hard
-"@types/serve-static@npm:*":
- version: 1.15.5
- resolution: "@types/serve-static@npm:1.15.5"
+"@types/serve-static@npm:^1":
+ version: 1.15.10
+ resolution: "@types/serve-static@npm:1.15.10"
dependencies:
"@types/http-errors": "npm:*"
- "@types/mime": "npm:*"
"@types/node": "npm:*"
- checksum: 10c0/811d1a2f7e74a872195e7a013bcd87a2fb1edf07eaedcb9dcfd20c1eb4bc56ad4ea0d52141c13192c91ccda7c8aeb8a530d8a7e60b9c27f5990d7e62e0fecb03
+ "@types/send": "npm:<1"
+ checksum: 10c0/842fca14c9e80468f89b6cea361773f2dcd685d4616a9f59013b55e1e83f536e4c93d6d8e3ba5072d40c4e7e64085210edd6646b15d538ded94512940a23021f
languageName: node
linkType: hard
@@ -4621,113 +4527,106 @@ __metadata:
languageName: node
linkType: hard
-"@typescript-eslint/eslint-plugin@npm:8.45.0":
- version: 8.45.0
- resolution: "@typescript-eslint/eslint-plugin@npm:8.45.0"
+"@typescript-eslint/eslint-plugin@npm:8.46.3":
+ version: 8.46.3
+ resolution: "@typescript-eslint/eslint-plugin@npm:8.46.3"
dependencies:
"@eslint-community/regexpp": "npm:^4.10.0"
- "@typescript-eslint/scope-manager": "npm:8.45.0"
- "@typescript-eslint/type-utils": "npm:8.45.0"
- "@typescript-eslint/utils": "npm:8.45.0"
- "@typescript-eslint/visitor-keys": "npm:8.45.0"
+ "@typescript-eslint/scope-manager": "npm:8.46.3"
+ "@typescript-eslint/type-utils": "npm:8.46.3"
+ "@typescript-eslint/utils": "npm:8.46.3"
+ "@typescript-eslint/visitor-keys": "npm:8.46.3"
graphemer: "npm:^1.4.0"
ignore: "npm:^7.0.0"
natural-compare: "npm:^1.4.0"
ts-api-utils: "npm:^2.1.0"
peerDependencies:
- "@typescript-eslint/parser": ^8.45.0
+ "@typescript-eslint/parser": ^8.46.3
eslint: ^8.57.0 || ^9.0.0
typescript: ">=4.8.4 <6.0.0"
- checksum: 10c0/0c60a0e5d07fa8618348db38b5a81e66143d528e1b3cdb5678bbc6c60590cd559b27c98c36f5663230fc4cf6920dff2cd604de30b58df26a37fcfcc5dc1dbd45
+ checksum: 10c0/9c8a5efd9779418d2096634a072a9e2b108e146d0fc541572db56ff28ff37469f03dd404fdb3b0c3161be4cc4857ce14259f30eba1a93d4771de5d1562624e45
languageName: node
linkType: hard
-"@typescript-eslint/parser@npm:8.45.0":
- version: 8.45.0
- resolution: "@typescript-eslint/parser@npm:8.45.0"
+"@typescript-eslint/parser@npm:8.46.3":
+ version: 8.46.3
+ resolution: "@typescript-eslint/parser@npm:8.46.3"
dependencies:
- "@typescript-eslint/scope-manager": "npm:8.45.0"
- "@typescript-eslint/types": "npm:8.45.0"
- "@typescript-eslint/typescript-estree": "npm:8.45.0"
- "@typescript-eslint/visitor-keys": "npm:8.45.0"
+ "@typescript-eslint/scope-manager": "npm:8.46.3"
+ "@typescript-eslint/types": "npm:8.46.3"
+ "@typescript-eslint/typescript-estree": "npm:8.46.3"
+ "@typescript-eslint/visitor-keys": "npm:8.46.3"
debug: "npm:^4.3.4"
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
typescript: ">=4.8.4 <6.0.0"
- checksum: 10c0/8b419bcf795b112a39fcac05dcf147835059345b6399035ffa3f76a9d8e320f3fac79cae2fe4320dcda83fa059b017ca7626a7b4e3da08a614415c8867d169b8
+ checksum: 10c0/8a8b47abbbc8bbc68f423df23189afefd296305d50a31c6bec9bdde563adc9ddf99b89a6b8466965fda4aee9118263bae36422dd1c25d7595dd82f8897b5df61
languageName: node
linkType: hard
-"@typescript-eslint/project-service@npm:8.45.0":
- version: 8.45.0
- resolution: "@typescript-eslint/project-service@npm:8.45.0"
+"@typescript-eslint/project-service@npm:8.46.3":
+ version: 8.46.3
+ resolution: "@typescript-eslint/project-service@npm:8.46.3"
dependencies:
- "@typescript-eslint/tsconfig-utils": "npm:^8.45.0"
- "@typescript-eslint/types": "npm:^8.45.0"
+ "@typescript-eslint/tsconfig-utils": "npm:^8.46.3"
+ "@typescript-eslint/types": "npm:^8.46.3"
debug: "npm:^4.3.4"
peerDependencies:
typescript: ">=4.8.4 <6.0.0"
- checksum: 10c0/98af065a1a3ed9d3d1eb265e09d3e9c2ae676d500a8c1d764f5609fe2c1b86749516b709804eb814fae688be7809d11748b9ae691d43c28da51dac390ca81fa9
+ checksum: 10c0/24ef305bbb550a8e27a7d6377663c1f2773b39b7a9f12c8b95c66c0d15f8150787b036bbff9ae4c2a0a18ab68c62435b0e03889df294bef00b3ae8846cd20659
languageName: node
linkType: hard
-"@typescript-eslint/scope-manager@npm:8.45.0":
- version: 8.45.0
- resolution: "@typescript-eslint/scope-manager@npm:8.45.0"
+"@typescript-eslint/scope-manager@npm:8.46.3":
+ version: 8.46.3
+ resolution: "@typescript-eslint/scope-manager@npm:8.46.3"
dependencies:
- "@typescript-eslint/types": "npm:8.45.0"
- "@typescript-eslint/visitor-keys": "npm:8.45.0"
- checksum: 10c0/54cd36206f6b4fc8e1e48576ed01e0d6ab20c2a9c4c7d90d5cc3a2d317dd8a13abe148ffecf471b16f1224aba5749e0905472745626bef9ae5bed771776f4abe
+ "@typescript-eslint/types": "npm:8.46.3"
+ "@typescript-eslint/visitor-keys": "npm:8.46.3"
+ checksum: 10c0/de8c116477e2a05a895ecd848a8289974a76cab884e07683c8085b3a2ce53895871d9bcd9de94723d6b2a437a6c526c77afcc75d6030cc4f1dccb9b47f4fc069
languageName: node
linkType: hard
-"@typescript-eslint/tsconfig-utils@npm:8.45.0, @typescript-eslint/tsconfig-utils@npm:^8.45.0":
- version: 8.45.0
- resolution: "@typescript-eslint/tsconfig-utils@npm:8.45.0"
+"@typescript-eslint/tsconfig-utils@npm:8.46.3, @typescript-eslint/tsconfig-utils@npm:^8.46.3":
+ version: 8.46.3
+ resolution: "@typescript-eslint/tsconfig-utils@npm:8.46.3"
peerDependencies:
typescript: ">=4.8.4 <6.0.0"
- checksum: 10c0/227a9b7a5baaf35466fd369992cb933192515df1156ddf22f438deb344c2523695208e1036f5590b20603f31724de75a47fe0ee84e2fd4c8e9f3606f23f68112
+ checksum: 10c0/a9686141204a96591ee51814a79fa676a8da845638eabb2363f9d82902660fd48ea47f7ec15a618129e45021ad154e1d193127248915752546d60d475d6a566e
languageName: node
linkType: hard
-"@typescript-eslint/type-utils@npm:8.45.0":
- version: 8.45.0
- resolution: "@typescript-eslint/type-utils@npm:8.45.0"
+"@typescript-eslint/type-utils@npm:8.46.3":
+ version: 8.46.3
+ resolution: "@typescript-eslint/type-utils@npm:8.46.3"
dependencies:
- "@typescript-eslint/types": "npm:8.45.0"
- "@typescript-eslint/typescript-estree": "npm:8.45.0"
- "@typescript-eslint/utils": "npm:8.45.0"
+ "@typescript-eslint/types": "npm:8.46.3"
+ "@typescript-eslint/typescript-estree": "npm:8.46.3"
+ "@typescript-eslint/utils": "npm:8.46.3"
debug: "npm:^4.3.4"
ts-api-utils: "npm:^2.1.0"
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
typescript: ">=4.8.4 <6.0.0"
- checksum: 10c0/ce0f4c209c2418ebeb65e7de053499fb68bf6000bdd71068594fdb8c8ac3dbbd62935a3cea233989491f7da3ef5db87e7efd2910133c6abf6d0cbf57248f6442
+ checksum: 10c0/06e20dff5a22feb6581703e8d35159ad6694d9e1df8fbb75869fcd89893826ca533b7b30b795a16d532e9d8ea6720462b1361d1e7a11d431a4cd11b3f47a22b5
languageName: node
linkType: hard
-"@typescript-eslint/types@npm:8.45.0":
- version: 8.45.0
- resolution: "@typescript-eslint/types@npm:8.45.0"
- checksum: 10c0/0213a0573c671d13bc91961a2b2e814ec7f6381ff093bce6704017bd96b2fc7fee25906c815cedb32a0601cf5071ca6c7c5f940d087c3b0d3dd7d4bc03478278
+"@typescript-eslint/types@npm:8.46.3, @typescript-eslint/types@npm:^8.46.0, @typescript-eslint/types@npm:^8.46.3":
+ version: 8.46.3
+ resolution: "@typescript-eslint/types@npm:8.46.3"
+ checksum: 10c0/6a6ccefbd086e6c38172fe14d04ba27c1c34755af7c25e752547c42d978b91bf6b97da56a5e63d098fbd679b4a5076c4dd4be6c947fd39b4c5feea5fed6deeb6
languageName: node
linkType: hard
-"@typescript-eslint/types@npm:^8.45.0, @typescript-eslint/types@npm:^8.46.0":
- version: 8.46.1
- resolution: "@typescript-eslint/types@npm:8.46.1"
- checksum: 10c0/90887acaa5b33b45af20cf7f87ec4ae098c0daa88484245473e73903fa6e542f613247c22148132167891ca06af6549a60b9d2fd14a65b22871e016901ce3756
- languageName: node
- linkType: hard
-
-"@typescript-eslint/typescript-estree@npm:8.45.0":
- version: 8.45.0
- resolution: "@typescript-eslint/typescript-estree@npm:8.45.0"
+"@typescript-eslint/typescript-estree@npm:8.46.3":
+ version: 8.46.3
+ resolution: "@typescript-eslint/typescript-estree@npm:8.46.3"
dependencies:
- "@typescript-eslint/project-service": "npm:8.45.0"
- "@typescript-eslint/tsconfig-utils": "npm:8.45.0"
- "@typescript-eslint/types": "npm:8.45.0"
- "@typescript-eslint/visitor-keys": "npm:8.45.0"
+ "@typescript-eslint/project-service": "npm:8.46.3"
+ "@typescript-eslint/tsconfig-utils": "npm:8.46.3"
+ "@typescript-eslint/types": "npm:8.46.3"
+ "@typescript-eslint/visitor-keys": "npm:8.46.3"
debug: "npm:^4.3.4"
fast-glob: "npm:^3.3.2"
is-glob: "npm:^4.0.3"
@@ -4736,32 +4635,32 @@ __metadata:
ts-api-utils: "npm:^2.1.0"
peerDependencies:
typescript: ">=4.8.4 <6.0.0"
- checksum: 10c0/8c2f44a00fe859a6cd4b50157c484c5b6a1c7af5d48e89ae79c5f4924947964962fc8f478ad4c2ade788907fceee9b72d4e376508ea79b51392f91082a37d239
+ checksum: 10c0/3a2bb879a3b42eda478015beee42729efdc78c0cfc70fa009442706626813114f8f9a1e918638ab957df385681ab073cf2076c508973ff9a72e2425e4e521b4f
languageName: node
linkType: hard
-"@typescript-eslint/utils@npm:8.45.0, @typescript-eslint/utils@npm:^8.27.0, @typescript-eslint/utils@npm:^8.8.1":
- version: 8.45.0
- resolution: "@typescript-eslint/utils@npm:8.45.0"
+"@typescript-eslint/utils@npm:8.46.3, @typescript-eslint/utils@npm:^8.27.0, @typescript-eslint/utils@npm:^8.8.1":
+ version: 8.46.3
+ resolution: "@typescript-eslint/utils@npm:8.46.3"
dependencies:
"@eslint-community/eslint-utils": "npm:^4.7.0"
- "@typescript-eslint/scope-manager": "npm:8.45.0"
- "@typescript-eslint/types": "npm:8.45.0"
- "@typescript-eslint/typescript-estree": "npm:8.45.0"
+ "@typescript-eslint/scope-manager": "npm:8.46.3"
+ "@typescript-eslint/types": "npm:8.46.3"
+ "@typescript-eslint/typescript-estree": "npm:8.46.3"
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
typescript: ">=4.8.4 <6.0.0"
- checksum: 10c0/b3c83a23813b15e20e303d7153789508c01e06dec355b1a80547c59aa36998d498102f45fcd13f111031fac57270608abb04d20560248d4448fd00b1cf4dc4ab
+ checksum: 10c0/cf85b166f75c2fd248004fb59643315347489d9ab589738cda1b4c36c25e7947c197a1c21e46cb25959be7d0f310b352c4436f8d3e0a91d64e4fafb3ef4b4e3d
languageName: node
linkType: hard
-"@typescript-eslint/visitor-keys@npm:8.45.0":
- version: 8.45.0
- resolution: "@typescript-eslint/visitor-keys@npm:8.45.0"
+"@typescript-eslint/visitor-keys@npm:8.46.3":
+ version: 8.46.3
+ resolution: "@typescript-eslint/visitor-keys@npm:8.46.3"
dependencies:
- "@typescript-eslint/types": "npm:8.45.0"
+ "@typescript-eslint/types": "npm:8.46.3"
eslint-visitor-keys: "npm:^4.2.1"
- checksum: 10c0/119adcf50c902dad7f7757bcdd88fad0a23a171d309d9b7cefe78af12e451cf84c04ae611f4c31f7e23f16c2b47665ad92e6e5648fc77d542ef306f465bf1f29
+ checksum: 10c0/c5f96840e0c31541e1a2390712a6cb290eff59fc97a3ffa7ecab353d3bb3cf0d8c6f62d68db271bf194aa8c4582be735b6121fcc5b30449e01799642be77de6e
languageName: node
linkType: hard
@@ -4957,57 +4856,63 @@ __metadata:
languageName: node
linkType: hard
-"@vitest/browser@npm:^3.2.4":
- version: 3.2.4
- resolution: "@vitest/browser@npm:3.2.4"
+"@vitest/browser-playwright@npm:^4.0.5":
+ version: 4.0.5
+ resolution: "@vitest/browser-playwright@npm:4.0.5"
dependencies:
- "@testing-library/dom": "npm:^10.4.0"
- "@testing-library/user-event": "npm:^14.6.1"
- "@vitest/mocker": "npm:3.2.4"
- "@vitest/utils": "npm:3.2.4"
- magic-string: "npm:^0.30.17"
- sirv: "npm:^3.0.1"
- tinyrainbow: "npm:^2.0.0"
- ws: "npm:^8.18.2"
+ "@vitest/browser": "npm:4.0.5"
+ "@vitest/mocker": "npm:4.0.5"
+ tinyrainbow: "npm:^3.0.3"
peerDependencies:
playwright: "*"
- vitest: 3.2.4
- webdriverio: ^7.0.0 || ^8.0.0 || ^9.0.0
+ vitest: 4.0.5
peerDependenciesMeta:
playwright:
- optional: true
- safaridriver:
- optional: true
- webdriverio:
- optional: true
- checksum: 10c0/0db39daad675aad187eff27d5a7f17a9f533d7abc7476ee1a0b83a9c62a7227b24395f4814e034ecb2ebe39f1a2dec0a8c6a7f79b8d5680c3ac79e408727d742
+ optional: false
+ checksum: 10c0/401dd2eca6b24bc1b764f2c4ac3388203082844f81df2dd67aa1e595fb46316a9646346e01f5fb1a7973b2b89444356bd18abe1f7d475206603ed1a39e80cabd
languageName: node
linkType: hard
-"@vitest/coverage-v8@npm:^3.2.4":
- version: 3.2.4
- resolution: "@vitest/coverage-v8@npm:3.2.4"
+"@vitest/browser@npm:4.0.5, @vitest/browser@npm:^4.0.5":
+ version: 4.0.5
+ resolution: "@vitest/browser@npm:4.0.5"
+ dependencies:
+ "@vitest/mocker": "npm:4.0.5"
+ "@vitest/utils": "npm:4.0.5"
+ magic-string: "npm:^0.30.19"
+ pixelmatch: "npm:7.1.0"
+ pngjs: "npm:^7.0.0"
+ sirv: "npm:^3.0.2"
+ tinyrainbow: "npm:^3.0.3"
+ ws: "npm:^8.18.3"
+ peerDependencies:
+ vitest: 4.0.5
+ checksum: 10c0/a696061589b9715d44e16e6cf0552e0da727c1f2c9c353c02157e86f6345f5bdbcaf65b5135296e588fc40a444543e552dc93fb2ec37811cdbe0685e036fb976
+ languageName: node
+ linkType: hard
+
+"@vitest/coverage-v8@npm:^4.0.5":
+ version: 4.0.5
+ resolution: "@vitest/coverage-v8@npm:4.0.5"
dependencies:
- "@ampproject/remapping": "npm:^2.3.0"
"@bcoe/v8-coverage": "npm:^1.0.2"
- ast-v8-to-istanbul: "npm:^0.3.3"
- debug: "npm:^4.4.1"
+ "@vitest/utils": "npm:4.0.5"
+ ast-v8-to-istanbul: "npm:^0.3.5"
+ debug: "npm:^4.4.3"
istanbul-lib-coverage: "npm:^3.2.2"
istanbul-lib-report: "npm:^3.0.1"
istanbul-lib-source-maps: "npm:^5.0.6"
- istanbul-reports: "npm:^3.1.7"
- magic-string: "npm:^0.30.17"
+ istanbul-reports: "npm:^3.2.0"
magicast: "npm:^0.3.5"
std-env: "npm:^3.9.0"
- test-exclude: "npm:^7.0.1"
- tinyrainbow: "npm:^2.0.0"
+ tinyrainbow: "npm:^3.0.3"
peerDependencies:
- "@vitest/browser": 3.2.4
- vitest: 3.2.4
+ "@vitest/browser": 4.0.5
+ vitest: 4.0.5
peerDependenciesMeta:
"@vitest/browser":
optional: true
- checksum: 10c0/cae3e58d81d56e7e1cdecd7b5baab7edd0ad9dee8dec9353c52796e390e452377d3f04174d40b6986b17c73241a5e773e422931eaa8102dcba0605ff24b25193
+ checksum: 10c0/6c93ff8a4c38f9a1cb8044eaae9553badfd7e82a8f46c642769fef47ebdd7ea9cc1f05e9e9c31feeb76f32f65ca76396ab35a285604648e02283793c8bd655a4
languageName: node
linkType: hard
@@ -5024,6 +4929,20 @@ __metadata:
languageName: node
linkType: hard
+"@vitest/expect@npm:4.0.5":
+ version: 4.0.5
+ resolution: "@vitest/expect@npm:4.0.5"
+ dependencies:
+ "@standard-schema/spec": "npm:^1.0.0"
+ "@types/chai": "npm:^5.2.2"
+ "@vitest/spy": "npm:4.0.5"
+ "@vitest/utils": "npm:4.0.5"
+ chai: "npm:^6.0.1"
+ tinyrainbow: "npm:^3.0.3"
+ checksum: 10c0/297235c7032ddf0f3673ec81fecd8cb31f8203b079f6e664094f3479f93bda02f919dcfa8cd3c4380e461f91ee1e232eaf945c0c2447df3bfde685c400f95eda
+ languageName: node
+ linkType: hard
+
"@vitest/mocker@npm:3.2.4":
version: 3.2.4
resolution: "@vitest/mocker@npm:3.2.4"
@@ -5043,7 +4962,26 @@ __metadata:
languageName: node
linkType: hard
-"@vitest/pretty-format@npm:3.2.4, @vitest/pretty-format@npm:^3.2.4":
+"@vitest/mocker@npm:4.0.5":
+ version: 4.0.5
+ resolution: "@vitest/mocker@npm:4.0.5"
+ dependencies:
+ "@vitest/spy": "npm:4.0.5"
+ estree-walker: "npm:^3.0.3"
+ magic-string: "npm:^0.30.19"
+ peerDependencies:
+ msw: ^2.4.9
+ vite: ^6.0.0 || ^7.0.0-0
+ peerDependenciesMeta:
+ msw:
+ optional: true
+ vite:
+ optional: true
+ checksum: 10c0/d98a30c2c2313771b7c02b23273f9bcbfa154d9389dc1c513889eab6de5be447e672109571e20cfff63d849bf1b1373e1540c331699b90b650fae38b20cc73b6
+ languageName: node
+ linkType: hard
+
+"@vitest/pretty-format@npm:3.2.4":
version: 3.2.4
resolution: "@vitest/pretty-format@npm:3.2.4"
dependencies:
@@ -5052,25 +4990,33 @@ __metadata:
languageName: node
linkType: hard
-"@vitest/runner@npm:3.2.4":
- version: 3.2.4
- resolution: "@vitest/runner@npm:3.2.4"
+"@vitest/pretty-format@npm:4.0.5":
+ version: 4.0.5
+ resolution: "@vitest/pretty-format@npm:4.0.5"
dependencies:
- "@vitest/utils": "npm:3.2.4"
- pathe: "npm:^2.0.3"
- strip-literal: "npm:^3.0.0"
- checksum: 10c0/e8be51666c72b3668ae3ea348b0196656a4a5adb836cb5e270720885d9517421815b0d6c98bfdf1795ed02b994b7bfb2b21566ee356a40021f5bf4f6ed4e418a
+ tinyrainbow: "npm:^3.0.3"
+ checksum: 10c0/76b36512ba8978475223a4f15041f66aeda32a54b9426b372d75f3584243521e3a8976eeb82b50534c48271f30023ee6345213e22add750ffb49a69098bc8619
languageName: node
linkType: hard
-"@vitest/snapshot@npm:3.2.4":
- version: 3.2.4
- resolution: "@vitest/snapshot@npm:3.2.4"
+"@vitest/runner@npm:4.0.5":
+ version: 4.0.5
+ resolution: "@vitest/runner@npm:4.0.5"
dependencies:
- "@vitest/pretty-format": "npm:3.2.4"
- magic-string: "npm:^0.30.17"
+ "@vitest/utils": "npm:4.0.5"
pathe: "npm:^2.0.3"
- checksum: 10c0/f8301a3d7d1559fd3d59ed51176dd52e1ed5c2d23aa6d8d6aa18787ef46e295056bc726a021698d8454c16ed825ecba163362f42fa90258bb4a98cfd2c9424fc
+ checksum: 10c0/935d55cf587301ed88ff698759bcfbc150d7a7c9d89fdb6dd80fcc6120c2edddcb3e4c7d6e5d8ae13abb01eb0f0f42e6e25d637dbf2576b973c332ee47032fda
+ languageName: node
+ linkType: hard
+
+"@vitest/snapshot@npm:4.0.5":
+ version: 4.0.5
+ resolution: "@vitest/snapshot@npm:4.0.5"
+ dependencies:
+ "@vitest/pretty-format": "npm:4.0.5"
+ magic-string: "npm:^0.30.19"
+ pathe: "npm:^2.0.3"
+ checksum: 10c0/9faa7589d147c1b36d4020a3764420e5464c8c4838369491398d9e5938fc3ba4a647f3cdc994d630ab106790b7c5bda8fd52236e131b1fcf09e8bc5ee4c3bb2b
languageName: node
linkType: hard
@@ -5083,20 +5029,27 @@ __metadata:
languageName: node
linkType: hard
-"@vitest/ui@npm:^3.2.4":
- version: 3.2.4
- resolution: "@vitest/ui@npm:3.2.4"
+"@vitest/spy@npm:4.0.5":
+ version: 4.0.5
+ resolution: "@vitest/spy@npm:4.0.5"
+ checksum: 10c0/f07cf4506b80839b61f2fedf2b68330906f5d019e60beb42abea0a66672d69b31cfc8576a1d22f42ea4707429dcb96677321b222da272e29e6b3a0d6c0d67057
+ languageName: node
+ linkType: hard
+
+"@vitest/ui@npm:^4.0.5":
+ version: 4.0.5
+ resolution: "@vitest/ui@npm:4.0.5"
dependencies:
- "@vitest/utils": "npm:3.2.4"
+ "@vitest/utils": "npm:4.0.5"
fflate: "npm:^0.8.2"
flatted: "npm:^3.3.3"
pathe: "npm:^2.0.3"
- sirv: "npm:^3.0.1"
- tinyglobby: "npm:^0.2.14"
- tinyrainbow: "npm:^2.0.0"
+ sirv: "npm:^3.0.2"
+ tinyglobby: "npm:^0.2.15"
+ tinyrainbow: "npm:^3.0.3"
peerDependencies:
- vitest: 3.2.4
- checksum: 10c0/c3de1b757905d050706c7ab0199185dd8c7e115f2f348b8d5a7468528c6bf90c2c46096e8901602349ac04f5ba83ac23cd98c38827b104d5151cf8ba21739a0c
+ vitest: 4.0.5
+ checksum: 10c0/586be4700915fde0163158dc20790ab734707ac3a950e6131184886328ad735c66fccd574f03f6dd6858c498b7d94ab3597c9c274f5c920127d4a4bb7fc0b92d
languageName: node
linkType: hard
@@ -5111,6 +5064,16 @@ __metadata:
languageName: node
linkType: hard
+"@vitest/utils@npm:4.0.5":
+ version: 4.0.5
+ resolution: "@vitest/utils@npm:4.0.5"
+ dependencies:
+ "@vitest/pretty-format": "npm:4.0.5"
+ tinyrainbow: "npm:^3.0.3"
+ checksum: 10c0/1b772533bb7020c14c22036f94027afa9b51aad683abf048f377af776186ecc41d6abd716daf18ac7f5654b4569409c5f5668b8e0f2ac3a33fe291bcd839cb8c
+ languageName: node
+ linkType: hard
+
"abbrev@npm:^3.0.0":
version: 3.0.1
resolution: "abbrev@npm:3.0.1"
@@ -5137,7 +5100,7 @@ __metadata:
languageName: node
linkType: hard
-"acorn@npm:^8.14.0, acorn@npm:^8.15.0, acorn@npm:^8.8.2":
+"acorn@npm:^8.15.0, acorn@npm:^8.8.2":
version: 8.15.0
resolution: "acorn@npm:8.15.0"
bin:
@@ -5423,14 +5386,14 @@ __metadata:
languageName: node
linkType: hard
-"ast-v8-to-istanbul@npm:^0.3.3":
- version: 0.3.3
- resolution: "ast-v8-to-istanbul@npm:0.3.3"
+"ast-v8-to-istanbul@npm:^0.3.5":
+ version: 0.3.8
+ resolution: "ast-v8-to-istanbul@npm:0.3.8"
dependencies:
- "@jridgewell/trace-mapping": "npm:^0.3.25"
+ "@jridgewell/trace-mapping": "npm:^0.3.31"
estree-walker: "npm:^3.0.3"
js-tokens: "npm:^9.0.1"
- checksum: 10c0/ffc39bc3ab4b8c1f7aea945960ce6b1e518bab3da7c800277eab2da07d397eeae4a2cb8a5a5f817225646c8ea495c1e4434fbe082c84bae8042abddef53f50b2
+ checksum: 10c0/6f7d74fc36011699af6d4ad88ecd8efc7d74bd90b8e8dbb1c69d43c8f4bec0ed361fb62a5b5bd98bbee02ee87c62cd8bcc25a39634964e45476bf5489dfa327f
languageName: node
linkType: hard
@@ -5633,15 +5596,6 @@ __metadata:
languageName: node
linkType: hard
-"better-opn@npm:^3.0.2":
- version: 3.0.2
- resolution: "better-opn@npm:3.0.2"
- dependencies:
- open: "npm:^8.0.4"
- checksum: 10c0/911ef25d44da75aabfd2444ce7a4294a8000ebcac73068c04a60298b0f7c7506b60421aa4cd02ac82502fb42baaff7e4892234b51e6923eded44c5a11185f2f5
- languageName: node
- linkType: hard
-
"bidi-js@npm:^1.0.3":
version: 1.0.3
resolution: "bidi-js@npm:1.0.3"
@@ -5779,13 +5733,6 @@ __metadata:
languageName: node
linkType: hard
-"cac@npm:^6.7.14":
- version: 6.7.14
- resolution: "cac@npm:6.7.14"
- checksum: 10c0/4ee06aaa7bab8981f0d54e5f5f9d4adcd64058e9697563ce336d8a3878ed018ee18ebe5359b2430eceae87e0758e62ea2019c3f52ae6e211b1bd2e133856cd10
- languageName: node
- linkType: hard
-
"cacache@npm:^19.0.1":
version: 19.0.1
resolution: "cacache@npm:19.0.1"
@@ -5885,6 +5832,13 @@ __metadata:
languageName: node
linkType: hard
+"chai@npm:^6.0.1":
+ version: 6.2.0
+ resolution: "chai@npm:6.2.0"
+ checksum: 10c0/a4b7d7f5907187e09f1847afa838d6d1608adc7d822031b7900813c4ed5d9702911ac2468bf290676f22fddb3d727b1be90b57c1d0a69b902534ee29cdc6ff8a
+ languageName: node
+ linkType: hard
+
"chalk@npm:^3.0.0":
version: 3.0.0
resolution: "chalk@npm:3.0.0"
@@ -6077,10 +6031,10 @@ __metadata:
languageName: node
linkType: hard
-"commander@npm:14.0.1":
- version: 14.0.1
- resolution: "commander@npm:14.0.1"
- checksum: 10c0/64439c0651ddd01c1d0f48c8f08e97c18a0a1fa693879451f1203ad01132af2c2aa85da24cf0d8e098ab9e6dc385a756be670d2999a3c628ec745c3ec124587b
+"commander@npm:^14.0.1":
+ version: 14.0.2
+ resolution: "commander@npm:14.0.2"
+ checksum: 10c0/245abd1349dbad5414cb6517b7b5c584895c02c4f7836ff5395f301192b8566f9796c82d7bd6c92d07eba8775fe4df86602fca5d86d8d10bcc2aded1e21c2aeb
languageName: node
linkType: hard
@@ -6746,6 +6700,13 @@ __metadata:
languageName: node
linkType: hard
+"empathic@npm:^2.0.0":
+ version: 2.0.0
+ resolution: "empathic@npm:2.0.0"
+ checksum: 10c0/7d3b14b04a93b35c47bcc950467ec914fd241cd9acc0269b0ea160f13026ec110f520c90fae64720fde72cc1757b57f3f292fb606617b7fccac1f4d008a76506
+ languageName: node
+ linkType: hard
+
"encodeurl@npm:~1.0.2":
version: 1.0.2
resolution: "encodeurl@npm:1.0.2"
@@ -6990,17 +6951,6 @@ __metadata:
languageName: node
linkType: hard
-"esbuild-register@npm:^3.5.0":
- version: 3.6.0
- resolution: "esbuild-register@npm:3.6.0"
- dependencies:
- debug: "npm:^4.3.4"
- peerDependencies:
- esbuild: ">=0.12 <1"
- checksum: 10c0/77193b7ca32ba9f81b35ddf3d3d0138efb0b1429d71b39480cfee932e1189dd2e492bd32bf04a4d0bc3adfbc7ec7381ceb5ffd06efe35f3e70904f1f686566d5
- 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, esbuild@npm:^0.25.0":
version: 0.25.5
resolution: "esbuild@npm:0.25.5"
@@ -7171,11 +7121,11 @@ __metadata:
linkType: hard
"eslint-plugin-formatjs@npm:^5.3.1":
- version: 5.4.0
- resolution: "eslint-plugin-formatjs@npm:5.4.0"
+ version: 5.4.2
+ resolution: "eslint-plugin-formatjs@npm:5.4.2"
dependencies:
- "@formatjs/icu-messageformat-parser": "npm:2.11.2"
- "@formatjs/ts-transformer": "npm:3.14.0"
+ "@formatjs/icu-messageformat-parser": "npm:2.11.4"
+ "@formatjs/ts-transformer": "npm:3.14.2"
"@types/eslint": "npm:^9.6.1"
"@types/picomatch": "npm:^3"
"@typescript-eslint/utils": "npm:^8.27.0"
@@ -7185,7 +7135,7 @@ __metadata:
unicode-emoji-utils: "npm:^1.2.0"
peerDependencies:
eslint: ^9.23.0
- checksum: 10c0/5c74a53988df68ffed4e68bb58a4ee75cdcd92b7d94f699e2edbcdd8c2c45930f500c7211da0a4616714d7d83bbbdc105328e5aacf0c9c7582a78fdfc9fa2b55
+ checksum: 10c0/46bee038c54a7da58647eaccee6c956857ad81499b60f814914921b26852e6bf9b0efabb9556d7aab0e151ba349dcf949dc5f14a356b80bc5e63f338e7f7cc7f
languageName: node
linkType: hard
@@ -7219,8 +7169,8 @@ __metadata:
linkType: hard
"eslint-plugin-jsdoc@npm:^61.1.11":
- version: 61.1.11
- resolution: "eslint-plugin-jsdoc@npm:61.1.11"
+ version: 61.1.12
+ resolution: "eslint-plugin-jsdoc@npm:61.1.12"
dependencies:
"@es-joy/jsdoccomment": "npm:~0.76.0"
"@es-joy/resolve.exports": "npm:1.2.0"
@@ -7238,7 +7188,7 @@ __metadata:
to-valid-identifier: "npm:^1.0.0"
peerDependencies:
eslint: ^7.0.0 || ^8.0.0 || ^9.0.0
- checksum: 10c0/bdc5353eddd40440924aa9b908289ab7d5f50bd64585a9ac1d49be56a22af802b90648e9e0fd27729f38508aee3f6c3437330d98be4c6398aa2dfd7a3fcd5028
+ checksum: 10c0/a0d291796029f8c3711ece955afde3cbac2b366735ad99f22723e4d53e54b9dcb6224a7a23369d9bf95a25c01e64b7cf6e7807218b73a18fd33bfe6eabf0bbdd
languageName: node
linkType: hard
@@ -7315,15 +7265,15 @@ __metadata:
languageName: node
linkType: hard
-"eslint-plugin-storybook@npm:^9.0.4":
- version: 9.1.1
- resolution: "eslint-plugin-storybook@npm:9.1.1"
+"eslint-plugin-storybook@npm:^10.0.2":
+ version: 10.0.4
+ resolution: "eslint-plugin-storybook@npm:10.0.4"
dependencies:
"@typescript-eslint/utils": "npm:^8.8.1"
peerDependencies:
eslint: ">=8"
- storybook: ^9.1.1
- checksum: 10c0/4cf80aa078633021b153a3a5b790a39c9919b5fa7203727c15d8ae066e75d6e134d7d718e66a6a5db9815275f32942a2deae1979aeb36be2543572507faced2c
+ storybook: ^10.0.4
+ checksum: 10c0/a2d486a6e45d1ce731333c439b51fc44b4a9292e8c0bca914534dab11cd37a3c25c62e8cbb1bb3b35e5e8b87d6ff2c7d8256c4f89a34c444138c4c738c52e1fc
languageName: node
linkType: hard
@@ -7352,22 +7302,21 @@ __metadata:
linkType: hard
"eslint@npm:^9.23.0":
- version: 9.32.0
- resolution: "eslint@npm:9.32.0"
+ version: 9.39.1
+ resolution: "eslint@npm:9.39.1"
dependencies:
- "@eslint-community/eslint-utils": "npm:^4.2.0"
+ "@eslint-community/eslint-utils": "npm:^4.8.0"
"@eslint-community/regexpp": "npm:^4.12.1"
- "@eslint/config-array": "npm:^0.21.0"
- "@eslint/config-helpers": "npm:^0.3.0"
- "@eslint/core": "npm:^0.15.0"
+ "@eslint/config-array": "npm:^0.21.1"
+ "@eslint/config-helpers": "npm:^0.4.2"
+ "@eslint/core": "npm:^0.17.0"
"@eslint/eslintrc": "npm:^3.3.1"
- "@eslint/js": "npm:9.32.0"
- "@eslint/plugin-kit": "npm:^0.3.4"
+ "@eslint/js": "npm:9.39.1"
+ "@eslint/plugin-kit": "npm:^0.4.1"
"@humanfs/node": "npm:^0.16.6"
"@humanwhocodes/module-importer": "npm:^1.0.1"
"@humanwhocodes/retry": "npm:^0.4.2"
"@types/estree": "npm:^1.0.6"
- "@types/json-schema": "npm:^7.0.15"
ajv: "npm:^6.12.4"
chalk: "npm:^4.0.0"
cross-spawn: "npm:^7.0.6"
@@ -7397,7 +7346,7 @@ __metadata:
optional: true
bin:
eslint: bin/eslint.js
- checksum: 10c0/e8a23924ec5f8b62e95483002ca25db74e25c23bd9c6d98a9f656ee32f820169bee3bfdf548ec728b16694f198b3db857d85a49210ee4a035242711d08fdc602
+ checksum: 10c0/59b2480639404ba24578ca480f973683b87b7aac8aa7e349240474a39067804fd13cd8b9cb22fee074170b8c7c563b57bab703ec0f0d3f81ea017e5d2cad299d
languageName: node
linkType: hard
@@ -7491,10 +7440,10 @@ __metadata:
languageName: node
linkType: hard
-"expect-type@npm:^1.2.1":
- version: 1.2.1
- resolution: "expect-type@npm:1.2.1"
- checksum: 10c0/b775c9adab3c190dd0d398c722531726cdd6022849b4adba19dceab58dda7e000a7c6c872408cd73d665baa20d381eca36af4f7b393a4ba60dd10232d1fb8898
+"expect-type@npm:^1.2.2":
+ version: 1.2.2
+ resolution: "expect-type@npm:1.2.2"
+ checksum: 10c0/6019019566063bbc7a690d9281d920b1a91284a4a093c2d55d71ffade5ac890cf37a51e1da4602546c4b56569d2ad2fc175a2ccee77d1ae06cb3af91ef84f44b
languageName: node
linkType: hard
@@ -7716,17 +7665,6 @@ __metadata:
languageName: node
linkType: hard
-"find-up@npm:^7.0.0":
- version: 7.0.0
- resolution: "find-up@npm:7.0.0"
- dependencies:
- locate-path: "npm:^7.2.0"
- path-exists: "npm:^5.0.0"
- unicorn-magic: "npm:^0.1.0"
- checksum: 10c0/e6ee3e6154560bc0ab3bc3b7d1348b31513f9bdf49a5dd2e952495427d559fa48cdf33953e85a309a323898b43fa1bfbc8b80c880dfc16068384783034030008
- languageName: node
- linkType: hard
-
"flat-cache@npm:^4.0.0":
version: 4.0.1
resolution: "flat-cache@npm:4.0.1"
@@ -8013,7 +7951,7 @@ __metadata:
languageName: node
linkType: hard
-"glob@npm:^10.0.0, glob@npm:^10.2.2, glob@npm:^10.4.1":
+"glob@npm:^10.0.0, glob@npm:^10.2.2":
version: 10.4.5
resolution: "glob@npm:10.4.5"
dependencies:
@@ -8071,9 +8009,9 @@ __metadata:
linkType: hard
"globals@npm:^16.0.0":
- version: 16.3.0
- resolution: "globals@npm:16.3.0"
- checksum: 10c0/c62dc20357d1c0bf2be4545d6c4141265d1a229bf1c3294955efb5b5ef611145391895e3f2729f8603809e81b30b516c33e6c2597573844449978606aad6eb38
+ version: 16.5.0
+ resolution: "globals@npm:16.5.0"
+ checksum: 10c0/615241dae7851c8012f5aa0223005b1ed6607713d6813de0741768bd4ddc39353117648f1a7086b4b0fa45eae733f1c0a0fe369aa4e543bb63f8de8990178ea9
languageName: node
linkType: hard
@@ -8951,13 +8889,13 @@ __metadata:
languageName: node
linkType: hard
-"istanbul-reports@npm:^3.1.7":
- version: 3.1.7
- resolution: "istanbul-reports@npm:3.1.7"
+"istanbul-reports@npm:^3.2.0":
+ version: 3.2.0
+ resolution: "istanbul-reports@npm:3.2.0"
dependencies:
html-escaper: "npm:^2.0.0"
istanbul-lib-report: "npm:^3.0.0"
- checksum: 10c0/a379fadf9cf8dc5dfe25568115721d4a7eb82fbd50b005a6672aff9c6989b20cc9312d7865814e0859cd8df58cbf664482e1d3604be0afde1f7fc3ccc1394a51
+ checksum: 10c0/d596317cfd9c22e1394f22a8d8ba0303d2074fe2e971887b32d870e4b33f8464b10f8ccbe6847808f7db485f084eba09e6c2ed706b3a978e4b52f07085b8f9bc
languageName: node
linkType: hard
@@ -9125,7 +9063,7 @@ __metadata:
languageName: node
linkType: hard
-"json-stable-stringify@npm:^1.1.1, json-stable-stringify@npm:^1.3.0":
+"json-stable-stringify@npm:^1.3.0":
version: 1.3.0
resolution: "json-stable-stringify@npm:1.3.0"
dependencies:
@@ -9197,13 +9135,6 @@ __metadata:
languageName: node
linkType: hard
-"keycode@npm:^2.1.7":
- version: 2.2.1
- resolution: "keycode@npm:2.2.1"
- checksum: 10c0/e38ecbdc62f57e18ef9f7ad88aefded84e05b89115a40eea3081a7002d7c055765ddb5f5c3e2dd36ac2b2ab3901053c8286c9db082fd807b3abeb7e44034d96a
- languageName: node
- linkType: hard
-
"keyv@npm:^4.5.4":
version: 4.5.4
resolution: "keyv@npm:4.5.4"
@@ -9341,26 +9272,26 @@ __metadata:
languageName: node
linkType: hard
-"lint-staged@npm:^16.0.0":
- version: 16.2.0
- resolution: "lint-staged@npm:16.2.0"
+"lint-staged@npm:^16.2.6":
+ version: 16.2.6
+ resolution: "lint-staged@npm:16.2.6"
dependencies:
- commander: "npm:14.0.1"
- listr2: "npm:9.0.4"
- micromatch: "npm:4.0.8"
- nano-spawn: "npm:1.0.3"
- pidtree: "npm:0.6.0"
- string-argv: "npm:0.3.2"
- yaml: "npm:2.8.1"
+ commander: "npm:^14.0.1"
+ listr2: "npm:^9.0.5"
+ micromatch: "npm:^4.0.8"
+ nano-spawn: "npm:^2.0.0"
+ pidtree: "npm:^0.6.0"
+ string-argv: "npm:^0.3.2"
+ yaml: "npm:^2.8.1"
bin:
lint-staged: bin/lint-staged.js
- checksum: 10c0/0903eea526d390fd04ec10c2b6c3c3accdff53647d1918d3c30236d46fa7714a4a109d1aeda7364ecc689728c7b188bc430911b170834228fe0010d938c9a631
+ checksum: 10c0/6bae38082a0fcb3f699b144d1a4b85394f259f17a1f8a58b22122b9f1c6bb5e8340d6ee4bff12e52dbc4267377d6dde9e5c206157f381f1924a2640717f769c1
languageName: node
linkType: hard
-"listr2@npm:9.0.4":
- version: 9.0.4
- resolution: "listr2@npm:9.0.4"
+"listr2@npm:^9.0.5":
+ version: 9.0.5
+ resolution: "listr2@npm:9.0.5"
dependencies:
cli-truncate: "npm:^5.0.0"
colorette: "npm:^2.0.20"
@@ -9368,7 +9299,7 @@ __metadata:
log-update: "npm:^6.1.0"
rfdc: "npm:^1.4.1"
wrap-ansi: "npm:^9.0.0"
- checksum: 10c0/69feca532f5b3317112a74bc7589ad29f98ccfbe1a582bdab556d536978b094e5841b94069e01cf59ea919684dfb68218754526ddd317b1dc829ab57f7450e45
+ checksum: 10c0/46448d1ba0addc9d71aeafd05bb8e86ded9641ccad930ac302c2bd2ad71580375604743e18586fcb8f11906edf98e8e17fca75ba0759947bf275d381f68e311d
languageName: node
linkType: hard
@@ -9381,15 +9312,6 @@ __metadata:
languageName: node
linkType: hard
-"locate-path@npm:^7.2.0":
- version: 7.2.0
- resolution: "locate-path@npm:7.2.0"
- dependencies:
- p-locate: "npm:^6.0.0"
- checksum: 10c0/139e8a7fe11cfbd7f20db03923cacfa5db9e14fa14887ea121345597472b4a63c1a42a8a5187defeeff6acf98fd568da7382aa39682d38f0af27433953a97751
- languageName: node
- linkType: hard
-
"lodash.camelcase@npm:^4.3.0":
version: 4.3.0
resolution: "lodash.camelcase@npm:4.3.0"
@@ -9527,12 +9449,12 @@ __metadata:
languageName: node
linkType: hard
-"magic-string@npm:^0.30.0, magic-string@npm:^0.30.17, magic-string@npm:~0.30.11":
- version: 0.30.17
- resolution: "magic-string@npm:0.30.17"
+"magic-string@npm:^0.30.0, magic-string@npm:^0.30.17, magic-string@npm:^0.30.19, magic-string@npm:~0.30.11":
+ version: 0.30.21
+ resolution: "magic-string@npm:0.30.21"
dependencies:
- "@jridgewell/sourcemap-codec": "npm:^1.5.0"
- checksum: 10c0/16826e415d04b88378f200fe022b53e638e3838b9e496edda6c0e086d7753a44a6ed187adc72d19f3623810589bf139af1a315541cd6a26ae0771a0193eaf7b8
+ "@jridgewell/sourcemap-codec": "npm:^1.5.5"
+ checksum: 10c0/299378e38f9a270069fc62358522ddfb44e94244baa0d6a8980ab2a9b2490a1d03b236b447eee309e17eb3bddfa482c61259d47960eb018a904f0ded52780c4a
languageName: node
linkType: hard
@@ -9662,7 +9584,7 @@ __metadata:
languageName: node
linkType: hard
-"micromatch@npm:4.0.8, micromatch@npm:^4.0.5, micromatch@npm:^4.0.8":
+"micromatch@npm:^4.0.5, micromatch@npm:^4.0.8":
version: 4.0.8
resolution: "micromatch@npm:4.0.8"
dependencies:
@@ -9903,10 +9825,10 @@ __metadata:
languageName: node
linkType: hard
-"nano-spawn@npm:1.0.3":
- version: 1.0.3
- resolution: "nano-spawn@npm:1.0.3"
- checksum: 10c0/ea18857e493710a50ded333dd71677953bd9bd9e6a17ade74af957763c50a9a02205ef31bc0d6784f5b3ad82db3d9f47531e9baac2acf01118f9b7c35bd9d5de
+"nano-spawn@npm:^2.0.0":
+ version: 2.0.0
+ resolution: "nano-spawn@npm:2.0.0"
+ checksum: 10c0/d00f9b5739f86e28cb732ffd774793e110810cded246b8393c75c4f22674af47f98ee37b19f022ada2d8c9425f800e841caa0662fbff4c0930a10e39339fb366
languageName: node
linkType: hard
@@ -10180,7 +10102,7 @@ __metadata:
languageName: node
linkType: hard
-"open@npm:^8.0.0, open@npm:^8.0.4":
+"open@npm:^8.0.0":
version: 8.4.2
resolution: "open@npm:8.4.2"
dependencies:
@@ -10241,15 +10163,6 @@ __metadata:
languageName: node
linkType: hard
-"p-limit@npm:^4.0.0":
- version: 4.0.0
- resolution: "p-limit@npm:4.0.0"
- dependencies:
- yocto-queue: "npm:^1.0.0"
- checksum: 10c0/a56af34a77f8df2ff61ddfb29431044557fcbcb7642d5a3233143ebba805fc7306ac1d448de724352861cb99de934bc9ab74f0d16fe6a5460bdbdf938de875ad
- languageName: node
- linkType: hard
-
"p-locate@npm:^5.0.0":
version: 5.0.0
resolution: "p-locate@npm:5.0.0"
@@ -10259,15 +10172,6 @@ __metadata:
languageName: node
linkType: hard
-"p-locate@npm:^6.0.0":
- version: 6.0.0
- resolution: "p-locate@npm:6.0.0"
- dependencies:
- p-limit: "npm:^4.0.0"
- checksum: 10c0/d72fa2f41adce59c198270aa4d3c832536c87a1806e0f69dffb7c1a7ca998fb053915ca833d90f166a8c082d3859eabfed95f01698a3214c20df6bb8de046312
- languageName: node
- linkType: hard
-
"p-map@npm:^7.0.2, p-map@npm:^7.0.3":
version: 7.0.3
resolution: "p-map@npm:7.0.3"
@@ -10363,13 +10267,6 @@ __metadata:
languageName: node
linkType: hard
-"path-exists@npm:^5.0.0":
- version: 5.0.0
- resolution: "path-exists@npm:5.0.0"
- checksum: 10c0/b170f3060b31604cde93eefdb7392b89d832dfbc1bed717c9718cbe0f230c1669b7e75f87e19901da2250b84d092989a0f9e44d2ef41deb09aa3ad28e691a40a
- languageName: node
- linkType: hard
-
"path-is-absolute@npm:^1.0.0":
version: 1.0.1
resolution: "path-is-absolute@npm:1.0.1"
@@ -10547,7 +10444,7 @@ __metadata:
languageName: node
linkType: hard
-"pidtree@npm:0.6.0":
+"pidtree@npm:^0.6.0":
version: 0.6.0
resolution: "pidtree@npm:0.6.0"
bin:
@@ -10572,15 +10469,15 @@ __metadata:
languageName: node
linkType: hard
-"pino-http@npm:^10.0.0":
- version: 10.5.0
- resolution: "pino-http@npm:10.5.0"
+"pino-http@npm:^11.0.0":
+ version: 11.0.0
+ resolution: "pino-http@npm:11.0.0"
dependencies:
get-caller-file: "npm:^2.0.5"
- pino: "npm:^9.0.0"
+ pino: "npm:^10.0.0"
pino-std-serializers: "npm:^7.0.0"
process-warning: "npm:^5.0.0"
- checksum: 10c0/17597d653a4088f7faed4d58500a5ef51d4d05247307696760006313c33c1d23177af98fb902e15b8e2cd92d81306c884673f841ba5b9bf0c064802f3c0bd775
+ checksum: 10c0/75110c7a7f1b1c4eadfbff3b87599ef9d100c20c3ffd19541f0cb37cd11285a3f221bb90d33df0772ed94a3f7d5b2007bd7365c5f5525cff2178d4deef140ee5
languageName: node
linkType: hard
@@ -10614,9 +10511,9 @@ __metadata:
languageName: node
linkType: hard
-"pino@npm:^9.0.0":
- version: 9.14.0
- resolution: "pino@npm:9.14.0"
+"pino@npm:^10.0.0":
+ version: 10.1.0
+ resolution: "pino@npm:10.1.0"
dependencies:
"@pinojs/redact": "npm:^0.4.0"
atomic-sleep: "npm:^1.0.0"
@@ -10631,7 +10528,18 @@ __metadata:
thread-stream: "npm:^3.0.0"
bin:
pino: bin.js
- checksum: 10c0/9a10d9bf820a585eae9bc270fb4e55c895e48280d54adbbb4063ec061694b22d8809c80203cf5fe9f920a54c832b0b8dfb67cb28a04baa13abebaf261a9c9f3e
+ checksum: 10c0/49c1dd80d5f99f02bde1acf2f60cef7686948a937f751f6cb368c2868c7e82e54aeabac63a34587e16019965cbf0eb6e609edf92c439a98a0a4fcb0add277eaf
+ 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
@@ -10659,6 +10567,13 @@ __metadata:
languageName: node
linkType: hard
+"pngjs@npm:^7.0.0":
+ version: 7.0.0
+ resolution: "pngjs@npm:7.0.0"
+ checksum: 10c0/0d4c7a0fd476a9c33df7d0a2a73e1d56537628a668841f6995c2bca070cf30819f9254a64363266bc14ef2fee47659dd3b4f2b18eec7ab65143015139f497b38
+ languageName: node
+ linkType: hard
+
"possible-typed-array-names@npm:^1.0.0":
version: 1.0.0
resolution: "possible-typed-array-names@npm:1.0.0"
@@ -11259,7 +11174,7 @@ __metadata:
languageName: node
linkType: hard
-"prop-types@npm:^15.5.10, prop-types@npm:^15.5.4, prop-types@npm:^15.6.0, prop-types@npm:^15.6.2, prop-types@npm:^15.7.2, prop-types@npm:^15.8.1":
+"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"
dependencies:
@@ -11419,19 +11334,6 @@ __metadata:
languageName: node
linkType: hard
-"react-event-listener@npm:^0.6.0":
- version: 0.6.6
- resolution: "react-event-listener@npm:0.6.6"
- dependencies:
- "@babel/runtime": "npm:^7.2.0"
- prop-types: "npm:^15.6.0"
- warning: "npm:^4.0.1"
- peerDependencies:
- react: ^16.3.0
- checksum: 10c0/07ca093d74b7963cb6048953517f881a0fdee9b485d31dabd49814cda51543eee20e714dd423e25946984b0ac26dbcb80aaf1211b0170e9b0cfa92fa85b0984e
- languageName: node
- linkType: hard
-
"react-fast-compare@npm:^3.1.1":
version: 3.2.2
resolution: "react-fast-compare@npm:3.2.2"
@@ -11674,49 +11576,6 @@ __metadata:
languageName: node
linkType: hard
-"react-swipeable-views-core@npm:^0.14.1":
- version: 0.14.1
- resolution: "react-swipeable-views-core@npm:0.14.1"
- dependencies:
- "@babel/runtime": "npm:7.0.0"
- warning: "npm:^4.0.1"
- peerDependencies:
- react: ^15.3.0 || ^16.0.0 || ^17.0.0
- checksum: 10c0/4da08493dad34f8498b66c596c1f40cd9a62e4968e71d00c79a26bf45e25ba3a3323e690641121cc8e7fd9c695e7da37fe781fa3f69e7d2b60fff3bfe4621426
- languageName: node
- linkType: hard
-
-"react-swipeable-views-utils@npm:^0.14.1":
- version: 0.14.1
- resolution: "react-swipeable-views-utils@npm:0.14.1"
- dependencies:
- "@babel/runtime": "npm:7.0.0"
- keycode: "npm:^2.1.7"
- prop-types: "npm:^15.6.0"
- react-event-listener: "npm:^0.6.0"
- react-swipeable-views-core: "npm:^0.14.1"
- shallow-equal: "npm:^1.2.1"
- peerDependencies:
- react: ^15.3.0 || ^16.0.0 || ^17.0.0
- checksum: 10c0/f9a9930e7df9dab9cd0f5344c7cf0423cc8aff4728436eb7dc13588186fbd1a557c8250b6329ec09242f3f6d2700d33e1155ab191ce8de48aa860fad6fb1814b
- languageName: node
- linkType: hard
-
-"react-swipeable-views@npm:^0.14.0":
- version: 0.14.1
- resolution: "react-swipeable-views@npm:0.14.1"
- dependencies:
- "@babel/runtime": "npm:7.0.0"
- prop-types: "npm:^15.5.4"
- react-swipeable-views-core: "npm:^0.14.1"
- react-swipeable-views-utils: "npm:^0.14.1"
- warning: "npm:^4.0.1"
- peerDependencies:
- react: ^15.3.0 || ^16.0.0 || ^17.0.0
- checksum: 10c0/7ee6d19cc33172e0846835eafd4b24ece0f26aed5cc9bbe80d3ec7c8d22f327443df8b2d50ddb4b837e1d6fbb40744abc41f62cdcab8e941e0663a952d627a15
- languageName: node
- linkType: hard
-
"react-test-renderer@npm:^18.2.0":
version: 18.3.1
resolution: "react-test-renderer@npm:18.3.1"
@@ -11915,13 +11774,6 @@ __metadata:
languageName: node
linkType: hard
-"regenerator-runtime@npm:^0.12.0":
- version: 0.12.1
- resolution: "regenerator-runtime@npm:0.12.1"
- checksum: 10c0/dbefbb38f5d6d55261aec1182d7c97ac93f2eec6ef9c756d9656eb5152f5cb3f8d873df020ddb4a3a8126c2ac1a3c2e534413cffe18d8f89b1c2a480a0a38601
- languageName: node
- linkType: hard
-
"regenerator-runtime@npm:^0.13.3":
version: 0.13.11
resolution: "regenerator-runtime@npm:0.13.11"
@@ -12513,13 +12365,6 @@ __metadata:
languageName: node
linkType: hard
-"shallow-equal@npm:^1.2.1":
- version: 1.2.1
- resolution: "shallow-equal@npm:1.2.1"
- checksum: 10c0/51e03abadd97c9ebe590547d92db9148446962a3f23a3a0fb1ba2fccab80af881eef0ff1f8ccefd3f066c0bc5a4c8ca53706194813b95c8835fa66448a843a26
- languageName: node
- linkType: hard
-
"shebang-command@npm:^2.0.0":
version: 2.0.0
resolution: "shebang-command@npm:2.0.0"
@@ -12598,14 +12443,14 @@ __metadata:
languageName: node
linkType: hard
-"sirv@npm:^3.0.1":
- version: 3.0.1
- resolution: "sirv@npm:3.0.1"
+"sirv@npm:^3.0.2":
+ version: 3.0.2
+ resolution: "sirv@npm:3.0.2"
dependencies:
"@polka/url": "npm:^1.0.0-next.24"
mrmime: "npm:^2.0.0"
totalist: "npm:^3.0.0"
- checksum: 10c0/7cf64b28daa69b15f77b38b0efdd02c007b72bb3ec5f107b208ebf59f01b174ef63a1db3aca16d2df925501831f4c209be6ece3302b98765919ef5088b45bf80
+ checksum: 10c0/5930e4397afdb14fbae13751c3be983af4bda5c9aadec832607dc2af15a7162f7d518c71b30e83ae3644b9a24cea041543cc969e5fe2b80af6ce8ea3174b2d04
languageName: node
linkType: hard
@@ -12888,19 +12733,18 @@ __metadata:
languageName: node
linkType: hard
-"storybook@npm:^9.1.1":
- version: 9.1.7
- resolution: "storybook@npm:9.1.7"
+"storybook@npm:^10.0.2":
+ version: 10.0.2
+ resolution: "storybook@npm:10.0.2"
dependencies:
"@storybook/global": "npm:^5.0.0"
+ "@storybook/icons": "npm:^1.6.0"
"@testing-library/jest-dom": "npm:^6.6.3"
"@testing-library/user-event": "npm:^14.6.1"
"@vitest/expect": "npm:3.2.4"
"@vitest/mocker": "npm:3.2.4"
"@vitest/spy": "npm:3.2.4"
- better-opn: "npm:^3.0.2"
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"
- esbuild-register: "npm:^3.5.0"
recast: "npm:^0.23.5"
semver: "npm:^7.6.2"
ws: "npm:^8.18.0"
@@ -12910,8 +12754,8 @@ __metadata:
prettier:
optional: true
bin:
- storybook: ./bin/index.cjs
- checksum: 10c0/daf3fb47ada1368604db7a1bc53775a5ceb485cd103351670e74d3378cb7bc1e396f72530a4821f3919207fb55ce7904ce894f55566844f9a14279553a8bd534
+ storybook: ./dist/bin/dispatcher.js
+ checksum: 10c0/abf796718bff0a848959f9dcfdb2699ce8aa824c3d190c401fcff325db0a0fcd5d0436be5628a93284e03a6f8bc5d2be3147eeef352cf9b879e3b7644875dcf5
languageName: node
linkType: hard
@@ -12922,7 +12766,7 @@ __metadata:
languageName: node
linkType: hard
-"string-argv@npm:0.3.2":
+"string-argv@npm:^0.3.2":
version: 0.3.2
resolution: "string-argv@npm:0.3.2"
checksum: 10c0/75c02a83759ad1722e040b86823909d9a2fc75d15dd71ec4b537c3560746e33b5f5a07f7332d1e3f88319909f82190843aa2f0a0d8c8d591ec08e93d5b8dec82
@@ -13136,15 +12980,6 @@ __metadata:
languageName: node
linkType: hard
-"strip-literal@npm:^3.0.0":
- version: 3.0.0
- resolution: "strip-literal@npm:3.0.0"
- dependencies:
- js-tokens: "npm:^9.0.1"
- checksum: 10c0/d81657f84aba42d4bbaf2a677f7e7f34c1f3de5a6726db8bc1797f9c0b303ba54d4660383a74bde43df401cf37cce1dff2c842c55b077a4ceee11f9e31fba828
- languageName: node
- linkType: hard
-
"stylelint-config-prettier-scss@npm:^1.0.0":
version: 1.0.0
resolution: "stylelint-config-prettier-scss@npm:1.0.0"
@@ -13452,17 +13287,6 @@ __metadata:
languageName: node
linkType: hard
-"test-exclude@npm:^7.0.1":
- version: 7.0.1
- resolution: "test-exclude@npm:7.0.1"
- dependencies:
- "@istanbuljs/schema": "npm:^0.1.2"
- glob: "npm:^10.4.1"
- minimatch: "npm:^9.0.4"
- checksum: 10c0/6d67b9af4336a2e12b26a68c83308c7863534c65f27ed4ff7068a56f5a58f7ac703e8fc80f698a19bb154fd8f705cdf7ec347d9512b2c522c737269507e7b263
- languageName: node
- linkType: hard
-
"thread-stream@npm:^3.0.0":
version: 3.0.0
resolution: "thread-stream@npm:3.0.0"
@@ -13517,13 +13341,6 @@ __metadata:
languageName: node
linkType: hard
-"tinypool@npm:^1.1.1":
- version: 1.1.1
- resolution: "tinypool@npm:1.1.1"
- checksum: 10c0/bf26727d01443061b04fa863f571016950888ea994ba0cd8cba3a1c51e2458d84574341ab8dbc3664f1c3ab20885c8cf9ff1cc4b18201f04c2cde7d317fff69b
- languageName: node
- linkType: hard
-
"tinyrainbow@npm:^2.0.0":
version: 2.0.0
resolution: "tinyrainbow@npm:2.0.0"
@@ -13531,6 +13348,13 @@ __metadata:
languageName: node
linkType: hard
+"tinyrainbow@npm:^3.0.3":
+ version: 3.0.3
+ resolution: "tinyrainbow@npm:3.0.3"
+ checksum: 10c0/1e799d35cd23cabe02e22550985a3051dc88814a979be02dc632a159c393a998628eacfc558e4c746b3006606d54b00bcdea0c39301133956d10a27aa27e988c
+ languageName: node
+ linkType: hard
+
"tinyspy@npm:^4.0.3":
version: 4.0.3
resolution: "tinyspy@npm:4.0.3"
@@ -13803,17 +13627,17 @@ __metadata:
linkType: hard
"typescript-eslint@npm:^8.28.0, typescript-eslint@npm:^8.45.0":
- version: 8.45.0
- resolution: "typescript-eslint@npm:8.45.0"
+ version: 8.46.3
+ resolution: "typescript-eslint@npm:8.46.3"
dependencies:
- "@typescript-eslint/eslint-plugin": "npm:8.45.0"
- "@typescript-eslint/parser": "npm:8.45.0"
- "@typescript-eslint/typescript-estree": "npm:8.45.0"
- "@typescript-eslint/utils": "npm:8.45.0"
+ "@typescript-eslint/eslint-plugin": "npm:8.46.3"
+ "@typescript-eslint/parser": "npm:8.46.3"
+ "@typescript-eslint/typescript-estree": "npm:8.46.3"
+ "@typescript-eslint/utils": "npm:8.46.3"
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
typescript: ">=4.8.4 <6.0.0"
- checksum: 10c0/2342b0bffe6f719711adbb42116f90cb1fe1670e2e74dde2739482c9d61c2a975ee16e2d560684613050544b543342ec1b11b46e158a48ecc605f5882d2d5da7
+ checksum: 10c0/c6d9398b16429b614c96405caae018b7ea74df55abf5ba9248ca9d02327704d6e1c3bdd2e2f52cfb25c9e5465ad93d73e19ee7fc3afbb837a6aeeecdf02c979b
languageName: node
linkType: hard
@@ -13847,22 +13671,22 @@ __metadata:
linkType: hard
"typescript@npm:^5.6.0, typescript@npm:~5.9.0":
- version: 5.9.2
- resolution: "typescript@npm:5.9.2"
+ version: 5.9.3
+ resolution: "typescript@npm:5.9.3"
bin:
tsc: bin/tsc
tsserver: bin/tsserver
- checksum: 10c0/cd635d50f02d6cf98ed42de2f76289701c1ec587a363369255f01ed15aaf22be0813226bff3c53e99d971f9b540e0b3cc7583dbe05faded49b1b0bed2f638a18
+ checksum: 10c0/6bd7552ce39f97e711db5aa048f6f9995b53f1c52f7d8667c1abdc1700c68a76a308f579cd309ce6b53646deb4e9a1be7c813a93baaf0a28ccd536a30270e1c5
languageName: node
linkType: hard
"typescript@patch:typescript@npm%3A^5.6.0#optional!builtin, typescript@patch:typescript@npm%3A~5.9.0#optional!builtin":
- version: 5.9.2
- resolution: "typescript@patch:typescript@npm%3A5.9.2#optional!builtin::version=5.9.2&hash=5786d5"
+ version: 5.9.3
+ resolution: "typescript@patch:typescript@npm%3A5.9.3#optional!builtin::version=5.9.3&hash=5786d5"
bin:
tsc: bin/tsc
tsserver: bin/tsserver
- checksum: 10c0/34d2a8e23eb8e0d1875072064d5e1d9c102e0bdce56a10a25c0b917b8aa9001a9cf5c225df12497e99da107dc379360bc138163c66b55b95f5b105b50578067e
+ checksum: 10c0/ad09fdf7a756814dce65bc60c1657b40d44451346858eea230e10f2e95a289d9183b6e32e5c11e95acc0ccc214b4f36289dcad4bf1886b0adb84d711d336a430
languageName: node
linkType: hard
@@ -13939,13 +13763,6 @@ __metadata:
languageName: node
linkType: hard
-"unicorn-magic@npm:^0.1.0":
- version: 0.1.0
- resolution: "unicorn-magic@npm:0.1.0"
- checksum: 10c0/e4ed0de05b0a05e735c7d8a2930881e5efcfc3ec897204d5d33e7e6247f4c31eac92e383a15d9a6bccb7319b4271ee4bea946e211bf14951fec6ff2cbbb66a92
- languageName: node
- linkType: hard
-
"unique-filename@npm:^4.0.0":
version: 4.0.0
resolution: "unique-filename@npm:4.0.0"
@@ -13987,13 +13804,15 @@ __metadata:
languageName: node
linkType: hard
-"unplugin@npm:^1.3.1":
- version: 1.16.1
- resolution: "unplugin@npm:1.16.1"
+"unplugin@npm:^2.3.5":
+ version: 2.3.10
+ resolution: "unplugin@npm:2.3.10"
dependencies:
- acorn: "npm:^8.14.0"
+ "@jridgewell/remapping": "npm:^2.3.5"
+ acorn: "npm:^8.15.0"
+ picomatch: "npm:^4.0.3"
webpack-virtual-modules: "npm:^0.6.2"
- checksum: 10c0/dd5f8c5727d0135847da73cf03fb199107f1acf458167034886fda3405737dab871ad3926431b4f70e1e82cdac482ac1383cea4019d782a68515c8e3e611b6cc
+ checksum: 10c0/29dcd738772aeff91c6f0154f156c95c58a37a4674fcb7cc34d6868af763834f0f447a1c3af074818c0c5602baead49bd3b9399a13f0425d69a00a527e58ddda
languageName: node
linkType: hard
@@ -14201,21 +14020,6 @@ __metadata:
languageName: node
linkType: hard
-"vite-node@npm:3.2.4":
- version: 3.2.4
- resolution: "vite-node@npm:3.2.4"
- dependencies:
- cac: "npm:^6.7.14"
- debug: "npm:^4.4.1"
- es-module-lexer: "npm:^1.7.0"
- pathe: "npm:^2.0.3"
- vite: "npm:^5.0.0 || ^6.0.0 || ^7.0.0-0"
- bin:
- vite-node: vite-node.mjs
- checksum: 10c0/6ceca67c002f8ef6397d58b9539f80f2b5d79e103a18367288b3f00a8ab55affa3d711d86d9112fce5a7fa658a212a087a005a045eb8f4758947dd99af2a6c6b
- languageName: node
- linkType: hard
-
"vite-plugin-manifest-sri@npm:^0.2.0":
version: 0.2.0
resolution: "vite-plugin-manifest-sri@npm:0.2.0"
@@ -14287,7 +14091,7 @@ __metadata:
languageName: node
linkType: hard
-"vite@npm:^5.0.0 || ^6.0.0 || ^7.0.0-0, vite@npm:^7.1.1":
+"vite@npm:^6.0.0 || ^7.0.0, vite@npm:^7.1.1":
version: 7.1.12
resolution: "vite@npm:7.1.12"
dependencies:
@@ -14342,39 +14146,38 @@ __metadata:
languageName: node
linkType: hard
-"vitest@npm:^3.2.4":
- version: 3.2.4
- resolution: "vitest@npm:3.2.4"
+"vitest@npm:^4.0.5":
+ version: 4.0.5
+ resolution: "vitest@npm:4.0.5"
dependencies:
- "@types/chai": "npm:^5.2.2"
- "@vitest/expect": "npm:3.2.4"
- "@vitest/mocker": "npm:3.2.4"
- "@vitest/pretty-format": "npm:^3.2.4"
- "@vitest/runner": "npm:3.2.4"
- "@vitest/snapshot": "npm:3.2.4"
- "@vitest/spy": "npm:3.2.4"
- "@vitest/utils": "npm:3.2.4"
- chai: "npm:^5.2.0"
- debug: "npm:^4.4.1"
- expect-type: "npm:^1.2.1"
- magic-string: "npm:^0.30.17"
+ "@vitest/expect": "npm:4.0.5"
+ "@vitest/mocker": "npm:4.0.5"
+ "@vitest/pretty-format": "npm:4.0.5"
+ "@vitest/runner": "npm:4.0.5"
+ "@vitest/snapshot": "npm:4.0.5"
+ "@vitest/spy": "npm:4.0.5"
+ "@vitest/utils": "npm:4.0.5"
+ debug: "npm:^4.4.3"
+ es-module-lexer: "npm:^1.7.0"
+ expect-type: "npm:^1.2.2"
+ magic-string: "npm:^0.30.19"
pathe: "npm:^2.0.3"
- picomatch: "npm:^4.0.2"
+ picomatch: "npm:^4.0.3"
std-env: "npm:^3.9.0"
tinybench: "npm:^2.9.0"
tinyexec: "npm:^0.3.2"
- tinyglobby: "npm:^0.2.14"
- tinypool: "npm:^1.1.1"
- tinyrainbow: "npm:^2.0.0"
- vite: "npm:^5.0.0 || ^6.0.0 || ^7.0.0-0"
- vite-node: "npm:3.2.4"
+ tinyglobby: "npm:^0.2.15"
+ tinyrainbow: "npm:^3.0.3"
+ vite: "npm:^6.0.0 || ^7.0.0"
why-is-node-running: "npm:^2.3.0"
peerDependencies:
"@edge-runtime/vm": "*"
"@types/debug": ^4.1.12
- "@types/node": ^18.0.0 || ^20.0.0 || >=22.0.0
- "@vitest/browser": 3.2.4
- "@vitest/ui": 3.2.4
+ "@types/node": ^20.0.0 || ^22.0.0 || >=24.0.0
+ "@vitest/browser-playwright": 4.0.5
+ "@vitest/browser-preview": 4.0.5
+ "@vitest/browser-webdriverio": 4.0.5
+ "@vitest/ui": 4.0.5
happy-dom: "*"
jsdom: "*"
peerDependenciesMeta:
@@ -14384,7 +14187,11 @@ __metadata:
optional: true
"@types/node":
optional: true
- "@vitest/browser":
+ "@vitest/browser-playwright":
+ optional: true
+ "@vitest/browser-preview":
+ optional: true
+ "@vitest/browser-webdriverio":
optional: true
"@vitest/ui":
optional: true
@@ -14394,7 +14201,7 @@ __metadata:
optional: true
bin:
vitest: vitest.mjs
- checksum: 10c0/5bf53ede3ae6a0e08956d72dab279ae90503f6b5a05298a6a5e6ef47d2fd1ab386aaf48fafa61ed07a0ebfe9e371772f1ccbe5c258dd765206a8218bf2eb79eb
+ checksum: 10c0/11232e3f8847a1b96c51d8d8dc60b9c629cd8663ba53a455f0edcbee58a6fc2162754c590b45bc07ad25a065e1602680d591d01f273c0c0146fe52caddc51a8b
languageName: node
linkType: hard
@@ -14407,7 +14214,7 @@ __metadata:
languageName: node
linkType: hard
-"warning@npm:^4.0.1, warning@npm:^4.0.3":
+"warning@npm:^4.0.3":
version: 4.0.3
resolution: "warning@npm:4.0.3"
dependencies:
@@ -14862,7 +14669,7 @@ __metadata:
languageName: node
linkType: hard
-"ws@npm:^8.12.1, ws@npm:^8.18.0, ws@npm:^8.18.2, ws@npm:^8.18.3":
+"ws@npm:^8.12.1, ws@npm:^8.18.0, ws@npm:^8.18.3":
version: 8.18.3
resolution: "ws@npm:8.18.3"
peerDependencies:
@@ -14926,7 +14733,14 @@ __metadata:
languageName: node
linkType: hard
-"yaml@npm:2.8.1":
+"yaml@npm:^1.10.0, yaml@npm:^1.10.2":
+ version: 1.10.2
+ resolution: "yaml@npm:1.10.2"
+ checksum: 10c0/5c28b9eb7adc46544f28d9a8d20c5b3cb1215a886609a2fd41f51628d8aaa5878ccd628b755dbcd29f6bb4921bd04ffbc6dcc370689bb96e594e2f9813d2605f
+ languageName: node
+ linkType: hard
+
+"yaml@npm:^2.8.1":
version: 2.8.1
resolution: "yaml@npm:2.8.1"
bin:
@@ -14935,13 +14749,6 @@ __metadata:
languageName: node
linkType: hard
-"yaml@npm:^1.10.0, yaml@npm:^1.10.2":
- version: 1.10.2
- resolution: "yaml@npm:1.10.2"
- checksum: 10c0/5c28b9eb7adc46544f28d9a8d20c5b3cb1215a886609a2fd41f51628d8aaa5878ccd628b755dbcd29f6bb4921bd04ffbc6dcc370689bb96e594e2f9813d2605f
- languageName: node
- linkType: hard
-
"yargs-parser@npm:^21.1.1":
version: 21.1.1
resolution: "yargs-parser@npm:21.1.1"
@@ -14971,13 +14778,6 @@ __metadata:
languageName: node
linkType: hard
-"yocto-queue@npm:^1.0.0":
- version: 1.2.1
- resolution: "yocto-queue@npm:1.2.1"
- checksum: 10c0/5762caa3d0b421f4bdb7a1926b2ae2189fc6e4a14469258f183600028eb16db3e9e0306f46e8ebf5a52ff4b81a881f22637afefbef5399d6ad440824e9b27f9f
- languageName: node
- linkType: hard
-
"yoctocolors-cjs@npm:^2.1.2":
version: 2.1.2
resolution: "yoctocolors-cjs@npm:2.1.2"