diff --git a/.storybook/preview-body.html b/.storybook/preview-body.html index 7a92b6f95f..7c078c0b3b 100644 --- a/.storybook/preview-body.html +++ b/.storybook/preview-body.html @@ -1,2 +1,2 @@ - + \ No newline at end of file diff --git a/Gemfile b/Gemfile index 3cc9580fea..f5da754b1a 100644 --- a/Gemfile +++ b/Gemfile @@ -55,7 +55,7 @@ gem 'hiredis-client' gem 'htmlentities', '~> 4.3' gem 'http', '~> 5.3.0' gem 'http_accept_language', '~> 2.1' -gem 'httplog', '~> 1.7.0', require: false +gem 'httplog', '~> 1.8.0', require: false gem 'i18n' gem 'idn-ruby', require: 'idn' gem 'inline_svg' @@ -109,12 +109,12 @@ group :opentelemetry do gem 'opentelemetry-instrumentation-active_job', '~> 0.10.0', require: false gem 'opentelemetry-instrumentation-active_model_serializers', '~> 0.24.0', require: false gem 'opentelemetry-instrumentation-concurrent_ruby', '~> 0.24.0', require: false - gem 'opentelemetry-instrumentation-excon', '~> 0.26.0', require: false - gem 'opentelemetry-instrumentation-faraday', '~> 0.30.0', require: false - 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.34.0', require: false + gem 'opentelemetry-instrumentation-excon', '~> 0.27.0', require: false + gem 'opentelemetry-instrumentation-faraday', '~> 0.31.0', require: false + gem 'opentelemetry-instrumentation-http', '~> 0.28.0', require: false + gem 'opentelemetry-instrumentation-http_client', '~> 0.27.0', require: false + gem 'opentelemetry-instrumentation-net_http', '~> 0.27.0', require: false + gem 'opentelemetry-instrumentation-pg', '~> 0.35.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 a54c979764..f920acecbf 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -320,7 +320,8 @@ GEM http_accept_language (2.1.1) httpclient (2.9.0) mutex_m - httplog (1.7.3) + httplog (1.8.0) + benchmark rack (>= 2.0) rainbow (>= 2.0.0) i18n (1.14.8) @@ -520,7 +521,8 @@ GEM opentelemetry-semantic_conventions opentelemetry-helpers-sql (0.3.0) opentelemetry-api (~> 1.7) - opentelemetry-helpers-sql-processor (0.3.1) + opentelemetry-helpers-sql-processor (0.4.0) + opentelemetry-api (~> 1.0) opentelemetry-common (~> 0.21) opentelemetry-instrumentation-action_mailer (0.6.1) opentelemetry-instrumentation-active_support (~> 0.10) @@ -544,17 +546,17 @@ GEM opentelemetry-registry (~> 0.1) opentelemetry-instrumentation-concurrent_ruby (0.24.0) opentelemetry-instrumentation-base (~> 0.25) - opentelemetry-instrumentation-excon (0.26.1) + opentelemetry-instrumentation-excon (0.27.0) opentelemetry-instrumentation-base (~> 0.25) - opentelemetry-instrumentation-faraday (0.30.1) + opentelemetry-instrumentation-faraday (0.31.0) opentelemetry-instrumentation-base (~> 0.25) - opentelemetry-instrumentation-http (0.27.1) + opentelemetry-instrumentation-http (0.28.0) opentelemetry-instrumentation-base (~> 0.25) - opentelemetry-instrumentation-http_client (0.26.1) + opentelemetry-instrumentation-http_client (0.27.0) opentelemetry-instrumentation-base (~> 0.25) - opentelemetry-instrumentation-net_http (0.26.1) + opentelemetry-instrumentation-net_http (0.27.0) opentelemetry-instrumentation-base (~> 0.25) - opentelemetry-instrumentation-pg (0.34.1) + opentelemetry-instrumentation-pg (0.35.0) opentelemetry-helpers-sql opentelemetry-helpers-sql-processor opentelemetry-instrumentation-base (~> 0.25) @@ -985,7 +987,7 @@ DEPENDENCIES htmlentities (~> 4.3) http (~> 5.3.0) http_accept_language (~> 2.1) - httplog (~> 1.7.0) + httplog (~> 1.8.0) i18n i18n-tasks (~> 1.0) idn-ruby @@ -1021,12 +1023,12 @@ DEPENDENCIES opentelemetry-instrumentation-active_job (~> 0.10.0) opentelemetry-instrumentation-active_model_serializers (~> 0.24.0) opentelemetry-instrumentation-concurrent_ruby (~> 0.24.0) - opentelemetry-instrumentation-excon (~> 0.26.0) - opentelemetry-instrumentation-faraday (~> 0.30.0) - opentelemetry-instrumentation-http (~> 0.27.0) - opentelemetry-instrumentation-http_client (~> 0.26.0) - opentelemetry-instrumentation-net_http (~> 0.26.0) - opentelemetry-instrumentation-pg (~> 0.34.0) + opentelemetry-instrumentation-excon (~> 0.27.0) + opentelemetry-instrumentation-faraday (~> 0.31.0) + opentelemetry-instrumentation-http (~> 0.28.0) + opentelemetry-instrumentation-http_client (~> 0.27.0) + opentelemetry-instrumentation-net_http (~> 0.27.0) + opentelemetry-instrumentation-pg (~> 0.35.0) opentelemetry-instrumentation-rack (~> 0.29.0) opentelemetry-instrumentation-rails (~> 0.39.0) opentelemetry-instrumentation-redis (~> 0.28.0) diff --git a/SECURITY.md b/SECURITY.md index 12052652e6..e5790a66fa 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -18,5 +18,4 @@ A "vulnerability in Mastodon" is a vulnerability in the code distributed through | 4.5.x | Yes | | 4.4.x | Yes | | 4.3.x | Until 2026-05-06 | -| 4.2.x | Until 2026-01-08 | -| < 4.2 | No | +| < 4.3 | No | diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 8d40823417..205817e44c 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -89,6 +89,12 @@ module ApplicationHelper Rails.env.production? ? site_title : "#{site_title} (Dev)" end + def page_color_scheme + return content_for(:force_color_scheme) if content_for(:force_color_scheme) + + color_scheme + end + def label_for_scope(scope) safe_join [ tag.samp(scope, class: { 'scope-danger' => SessionActivation::DEFAULT_SCOPES.include?(scope.to_s) }), @@ -153,6 +159,19 @@ module ApplicationHelper tag.meta(content: content, property: property) end + def html_attributes + base = { + lang: I18n.locale, + class: html_classes, + 'data-contrast': contrast.parameterize, + 'data-color-scheme': page_color_scheme.parameterize, + } + + base[:'data-system-theme'] = 'true' if page_color_scheme == 'auto' + + base + end + def html_classes output = [] output << content_for(:html_classes) diff --git a/app/javascript/inline/theme-selection.js b/app/javascript/inline/theme-selection.js index b3a2b03163..680fbb23ec 100644 --- a/app/javascript/inline/theme-selection.js +++ b/app/javascript/inline/theme-selection.js @@ -1,16 +1,17 @@ (function (element) { - const {userTheme} = element.dataset; + const {colorScheme, contrast} = element.dataset; const colorSchemeMediaWatcher = window.matchMedia('(prefers-color-scheme: dark)'); const contrastMediaWatcher = window.matchMedia('(prefers-contrast: more)'); const updateColorScheme = () => { - const useDarkMode = userTheme === 'system' ? colorSchemeMediaWatcher.matches : userTheme !== 'mastodon-light'; - element.dataset.mode = useDarkMode ? 'dark' : 'light'; + const useDarkMode = colorScheme === 'auto' ? colorSchemeMediaWatcher.matches : colorScheme === 'dark'; + + element.dataset.colorScheme = useDarkMode ? 'dark' : 'light'; }; const updateContrast = () => { - const useHighContrast = userTheme === 'contrast' || contrastMediaWatcher.matches; + const useHighContrast = contrast === 'high' || contrastMediaWatcher.matches; element.dataset.contrast = useHighContrast ? 'high' : 'default'; } diff --git a/app/javascript/mastodon/components/mini_card/index.tsx b/app/javascript/mastodon/components/mini_card/index.tsx new file mode 100644 index 0000000000..a619bb214a --- /dev/null +++ b/app/javascript/mastodon/components/mini_card/index.tsx @@ -0,0 +1,33 @@ +import type { FC, ReactNode } from 'react'; + +import classNames from 'classnames'; + +import classes from './styles.module.css'; + +export interface MiniCardProps { + label: ReactNode; + value: ReactNode; + className?: string; + hidden?: boolean; +} + +export const MiniCard: FC = ({ + label, + value, + className, + hidden, +}) => { + if (!label) { + return null; + } + + return ( +
+
{label}
+
{value}
+
+ ); +}; diff --git a/app/javascript/mastodon/components/mini_card/list.tsx b/app/javascript/mastodon/components/mini_card/list.tsx new file mode 100644 index 0000000000..b5b8fbc2c8 --- /dev/null +++ b/app/javascript/mastodon/components/mini_card/list.tsx @@ -0,0 +1,208 @@ +import { useCallback, useEffect, useRef, useState } from 'react'; +import type { FC, Key, MouseEventHandler } from 'react'; + +import { FormattedMessage } from 'react-intl'; + +import classNames from 'classnames'; + +import { MiniCard } from '.'; +import type { MiniCardProps } from '.'; +import classes from './styles.module.css'; + +interface MiniCardListProps { + cards?: (Pick & { key?: Key })[]; + onOverflowClick?: MouseEventHandler; +} + +export const MiniCardList: FC = ({ + cards = [], + onOverflowClick, +}) => { + const { + wrapperRef, + listRef, + hiddenCount, + hasOverflow, + hiddenIndex, + maxWidth, + } = useOverflow(); + + return ( +
+
+ {cards.map((card, index) => ( +
+ +
+ ); +}; + +function useOverflow() { + const [hiddenIndex, setHiddenIndex] = useState(-1); + const [hiddenCount, setHiddenCount] = useState(0); + const [maxWidth, setMaxWidth] = useState('none'); + + // This is the item container element. + const listRef = useRef(null); + + // The main recalculation function. + const handleRecalculate = useCallback(() => { + const listEle = listRef.current; + if (!listEle) return; + + const reset = () => { + setHiddenIndex(-1); + setHiddenCount(0); + setMaxWidth('none'); + }; + + // Calculate the width via the parent element, minus the more button, minus the padding. + const maxWidth = + (listEle.parentElement?.offsetWidth ?? 0) - + (listEle.nextElementSibling?.scrollWidth ?? 0) - + 4; + if (maxWidth <= 0) { + reset(); + return; + } + + // Iterate through children until we exceed max width. + let visible = 0; + let index = 0; + let totalWidth = 0; + for (const child of listEle.children) { + if (child instanceof HTMLElement) { + const rightOffset = child.offsetLeft + child.offsetWidth; + if (rightOffset <= maxWidth) { + visible += 1; + totalWidth = rightOffset; + } else { + break; + } + } + index++; + } + + // All are visible, so remove max-width restriction. + if (visible === listEle.children.length) { + reset(); + return; + } + + // Set the width to avoid wrapping, and set hidden count. + setHiddenIndex(index); + setHiddenCount(listEle.children.length - visible); + setMaxWidth(totalWidth); + }, []); + + // Set up observers to watch for size and content changes. + const resizeObserverRef = useRef(null); + const mutationObserverRef = useRef(null); + + // Helper to get or create the resize observer. + const resizeObserver = useCallback(() => { + const observer = (resizeObserverRef.current ??= new ResizeObserver( + handleRecalculate, + )); + return observer; + }, [handleRecalculate]); + + // Iterate through children and observe them for size changes. + const handleChildrenChange = useCallback(() => { + const listEle = listRef.current; + const observer = resizeObserver(); + + if (listEle) { + for (const child of listEle.children) { + if (child instanceof HTMLElement) { + observer.observe(child); + } + } + } + handleRecalculate(); + }, [handleRecalculate, resizeObserver]); + + // Helper to get or create the mutation observer. + const mutationObserver = useCallback(() => { + const observer = (mutationObserverRef.current ??= new MutationObserver( + handleChildrenChange, + )); + return observer; + }, [handleChildrenChange]); + + // Set up observers. + const handleObserve = useCallback(() => { + if (wrapperRef.current) { + resizeObserver().observe(wrapperRef.current); + } + if (listRef.current) { + mutationObserver().observe(listRef.current, { childList: true }); + handleChildrenChange(); + } + }, [handleChildrenChange, mutationObserver, resizeObserver]); + + // Watch the wrapper for size changes, and recalculate when it resizes. + const wrapperRef = useRef(null); + const wrapperRefCallback = useCallback( + (node: HTMLElement | null) => { + if (node) { + wrapperRef.current = node; + handleObserve(); + } + }, + [handleObserve], + ); + + // If there are changes to the children, recalculate which are visible. + const listRefCallback = useCallback( + (node: HTMLElement | null) => { + if (node) { + listRef.current = node; + handleObserve(); + } + }, + [handleObserve], + ); + + useEffect(() => { + handleObserve(); + + return () => { + if (resizeObserverRef.current) { + resizeObserverRef.current.disconnect(); + resizeObserverRef.current = null; + } + if (mutationObserverRef.current) { + mutationObserverRef.current.disconnect(); + mutationObserverRef.current = null; + } + }; + }, [handleObserve]); + + return { + hiddenCount, + hasOverflow: hiddenCount > 0, + wrapperRef: wrapperRefCallback, + hiddenIndex, + maxWidth, + listRef: listRefCallback, + recalculate: handleRecalculate, + }; +} diff --git a/app/javascript/mastodon/components/mini_card/mini_card.stories.tsx b/app/javascript/mastodon/components/mini_card/mini_card.stories.tsx new file mode 100644 index 0000000000..ada76011b2 --- /dev/null +++ b/app/javascript/mastodon/components/mini_card/mini_card.stories.tsx @@ -0,0 +1,62 @@ +import type { Meta, StoryObj } from '@storybook/react-vite'; +import { action } from 'storybook/actions'; + +import { MiniCardList } from './list'; + +const meta = { + title: 'Components/MiniCard', + component: MiniCardList, + args: { + cards: [ + { label: 'Pronouns', value: 'they/them' }, + { + label: 'Website', + value: bowie-the-db.meow, + }, + { + label: 'Free playlists', + value: soundcloud.com, + }, + { label: 'Location', value: 'Purris, France' }, + ], + onOverflowClick: action('Overflow clicked'), + }, + render(args) { + return ( +
+ +
+ ); + }, +} satisfies Meta; + +export default meta; + +type Story = StoryObj; + +export const Default: Story = {}; + +export const LongValue: Story = { + args: { + cards: [ + { + label: 'Username', + value: 'bowie-the-dj', + }, + { + label: 'Bio', + value: + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.', + }, + ], + }, +}; diff --git a/app/javascript/mastodon/components/mini_card/styles.module.css b/app/javascript/mastodon/components/mini_card/styles.module.css new file mode 100644 index 0000000000..d912f1e5cf --- /dev/null +++ b/app/javascript/mastodon/components/mini_card/styles.module.css @@ -0,0 +1,55 @@ +.wrapper { + display: flex; + flex-wrap: nowrap; + justify-content: flex-start; + gap: 4px; +} + +.list { + min-width: 0; + display: flex; + gap: 4px; + overflow: hidden; + position: relative; +} + +.card, +.more { + border: 1px solid var(--color-border-primary); + padding: 8px; + border-radius: 8px; + flex-shrink: 0; +} + +.card { + max-width: 20vw; + overflow: hidden; +} + +.more { + color: var(--color-text-secondary); + font-weight: 600; + appearance: none; + background: none; +} + +.hidden { + display: none; +} + +.label { + color: var(--color-text-secondary); + margin-bottom: 2px; +} + +.value { + color: var(--color-text-primary); + font-weight: 600; +} + +.label, +.value { + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} diff --git a/app/javascript/mastodon/features/account_timeline/components/account_header.tsx b/app/javascript/mastodon/features/account_timeline/components/account_header.tsx index 040ca16c72..4244d7f702 100644 --- a/app/javascript/mastodon/features/account_timeline/components/account_header.tsx +++ b/app/javascript/mastodon/features/account_timeline/components/account_header.tsx @@ -1,177 +1,35 @@ -import { useCallback, useMemo } from 'react'; +import { useCallback } from 'react'; -import { defineMessages, useIntl, FormattedMessage } from 'react-intl'; +import { useIntl, FormattedMessage } from 'react-intl'; import classNames from 'classnames'; import { Helmet } from 'react-helmet'; -import { NavLink } from 'react-router-dom'; import { AccountBio } from '@/mastodon/components/account_bio'; import { AccountFields } from '@/mastodon/components/account_fields'; import { DisplayName } from '@/mastodon/components/display_name'; import { AnimateEmojiProvider } from '@/mastodon/components/emoji/context'; import LockIcon from '@/material-icons/400-24px/lock.svg?react'; -import MoreHorizIcon from '@/material-icons/400-24px/more_horiz.svg?react'; -import NotificationsIcon from '@/material-icons/400-24px/notifications.svg?react'; -import NotificationsActiveIcon from '@/material-icons/400-24px/notifications_active-fill.svg?react'; -import ShareIcon from '@/material-icons/400-24px/share.svg?react'; -import { - followAccount, - unblockAccount, - unmuteAccount, - pinAccount, - unpinAccount, - removeAccountFromFollowers, -} from 'mastodon/actions/accounts'; -import { initBlockModal } from 'mastodon/actions/blocks'; -import { mentionCompose, directCompose } from 'mastodon/actions/compose'; -import { - initDomainBlockModal, - unblockDomain, -} from 'mastodon/actions/domain_blocks'; import { openModal } from 'mastodon/actions/modal'; -import { initMuteModal } from 'mastodon/actions/mutes'; -import { initReport } from 'mastodon/actions/reports'; import { Avatar } from 'mastodon/components/avatar'; -import { Badge, AutomatedBadge, GroupBadge } from 'mastodon/components/badge'; -import { CopyIconButton } from 'mastodon/components/copy_icon_button'; -import { - FollowersCounter, - FollowingCounter, - StatusesCounter, -} from 'mastodon/components/counters'; -import { Dropdown } from 'mastodon/components/dropdown_menu'; -import { FollowButton } from 'mastodon/components/follow_button'; import { FormattedDateWrapper } from 'mastodon/components/formatted_date'; import { Icon } from 'mastodon/components/icon'; -import { IconButton } from 'mastodon/components/icon_button'; -import { ShortNumber } from 'mastodon/components/short_number'; import { AccountNote } from 'mastodon/features/account/components/account_note'; import { DomainPill } from 'mastodon/features/account/components/domain_pill'; import FollowRequestNoteContainer from 'mastodon/features/account/containers/follow_request_note_container'; -import { useIdentity } from 'mastodon/identity_context'; import { autoPlayGif, me, domain as localDomain } from 'mastodon/initial_state'; import type { Account } from 'mastodon/models/account'; -import type { MenuItem } from 'mastodon/models/dropdown_menu'; -import { - PERMISSION_MANAGE_USERS, - PERMISSION_MANAGE_FEDERATION, -} from 'mastodon/permissions'; import { getAccountHidden } from 'mastodon/selectors/accounts'; import { useAppSelector, useAppDispatch } from 'mastodon/store'; +import { AccountBadges } from './badges'; +import { AccountButtons } from './buttons'; import { FamiliarFollowers } from './familiar_followers'; +import { AccountInfo } from './info'; +import { AccountLinks } from './links'; import { MemorialNote } from './memorial_note'; import { MovedNote } from './moved_note'; - -const messages = defineMessages({ - unblock: { id: 'account.unblock', defaultMessage: 'Unblock @{name}' }, - edit_profile: { id: 'account.edit_profile', defaultMessage: 'Edit profile' }, - linkVerifiedOn: { - id: 'account.link_verified_on', - defaultMessage: 'Ownership of this link was checked on {date}', - }, - account_locked: { - id: 'account.locked_info', - defaultMessage: - 'This account privacy status is set to locked. The owner manually reviews who can follow them.', - }, - mention: { id: 'account.mention', defaultMessage: 'Mention @{name}' }, - direct: { id: 'account.direct', defaultMessage: 'Privately mention @{name}' }, - unmute: { id: 'account.unmute', defaultMessage: 'Unmute @{name}' }, - block: { id: 'account.block', defaultMessage: 'Block @{name}' }, - mute: { id: 'account.mute', defaultMessage: 'Mute @{name}' }, - report: { id: 'account.report', defaultMessage: 'Report @{name}' }, - share: { id: 'account.share', defaultMessage: "Share @{name}'s profile" }, - copy: { id: 'account.copy', defaultMessage: 'Copy link to profile' }, - media: { id: 'account.media', defaultMessage: 'Media' }, - blockDomain: { - id: 'account.block_domain', - defaultMessage: 'Block domain {domain}', - }, - unblockDomain: { - id: 'account.unblock_domain', - defaultMessage: 'Unblock domain {domain}', - }, - hideReblogs: { - id: 'account.hide_reblogs', - defaultMessage: 'Hide boosts from @{name}', - }, - showReblogs: { - id: 'account.show_reblogs', - defaultMessage: 'Show boosts from @{name}', - }, - enableNotifications: { - id: 'account.enable_notifications', - defaultMessage: 'Notify me when @{name} posts', - }, - disableNotifications: { - id: 'account.disable_notifications', - defaultMessage: 'Stop notifying me when @{name} posts', - }, - preferences: { - id: 'navigation_bar.preferences', - defaultMessage: 'Preferences', - }, - follow_requests: { - id: 'navigation_bar.follow_requests', - defaultMessage: 'Follow requests', - }, - favourites: { id: 'navigation_bar.favourites', defaultMessage: 'Favorites' }, - lists: { id: 'navigation_bar.lists', defaultMessage: 'Lists' }, - followed_tags: { - id: 'navigation_bar.followed_tags', - defaultMessage: 'Followed hashtags', - }, - blocks: { id: 'navigation_bar.blocks', defaultMessage: 'Blocked users' }, - domain_blocks: { - id: 'navigation_bar.domain_blocks', - defaultMessage: 'Blocked domains', - }, - mutes: { id: 'navigation_bar.mutes', defaultMessage: 'Muted users' }, - endorse: { id: 'account.endorse', defaultMessage: 'Feature on profile' }, - unendorse: { - id: 'account.unendorse', - defaultMessage: "Don't feature on profile", - }, - add_or_remove_from_list: { - id: 'account.add_or_remove_from_list', - defaultMessage: 'Add or Remove from lists', - }, - admin_account: { - id: 'status.admin_account', - defaultMessage: 'Open moderation interface for @{name}', - }, - admin_domain: { - id: 'status.admin_domain', - defaultMessage: 'Open moderation interface for {domain}', - }, - languages: { - id: 'account.languages', - defaultMessage: 'Change subscribed languages', - }, - openOriginalPage: { - id: 'account.open_original_page', - defaultMessage: 'Open original page', - }, - removeFromFollowers: { - id: 'account.remove_from_followers', - defaultMessage: 'Remove {name} from followers', - }, - confirmRemoveFromFollowersTitle: { - id: 'confirmations.remove_from_followers.title', - defaultMessage: 'Remove follower?', - }, - confirmRemoveFromFollowersMessage: { - id: 'confirmations.remove_from_followers.message', - defaultMessage: - '{name} will stop following you. Are you sure you want to proceed?', - }, - confirmRemoveFromFollowersButton: { - id: 'confirmations.remove_from_followers.confirm', - defaultMessage: 'Remove follower', - }, -}); +import { AccountTabs } from './tabs'; const titleFromAccount = (account: Account) => { const displayName = account.display_name; @@ -191,149 +49,12 @@ export const AccountHeader: React.FC<{ }> = ({ accountId, hideTabs }) => { const dispatch = useAppDispatch(); const intl = useIntl(); - const { signedIn, permissions } = useIdentity(); const account = useAppSelector((state) => state.accounts.get(accountId)); const relationship = useAppSelector((state) => state.relationships.get(accountId), ); const hidden = useAppSelector((state) => getAccountHidden(state, accountId)); - const handleBlock = useCallback(() => { - if (!account) { - return; - } - - if (relationship?.blocking) { - dispatch(unblockAccount(account.id)); - } else { - dispatch(initBlockModal(account)); - } - }, [dispatch, account, relationship]); - - const handleMention = useCallback(() => { - if (!account) { - return; - } - - dispatch(mentionCompose(account)); - }, [dispatch, account]); - - const handleDirect = useCallback(() => { - if (!account) { - return; - } - - dispatch(directCompose(account)); - }, [dispatch, account]); - - const handleReport = useCallback(() => { - if (!account) { - return; - } - - dispatch(initReport(account)); - }, [dispatch, account]); - - const handleReblogToggle = useCallback(() => { - if (!account) { - return; - } - - if (relationship?.showing_reblogs) { - dispatch(followAccount(account.id, { reblogs: false })); - } else { - dispatch(followAccount(account.id, { reblogs: true })); - } - }, [dispatch, account, relationship]); - - const handleNotifyToggle = useCallback(() => { - if (!account) { - return; - } - - if (relationship?.notifying) { - dispatch(followAccount(account.id, { notify: false })); - } else { - dispatch(followAccount(account.id, { notify: true })); - } - }, [dispatch, account, relationship]); - - const handleMute = useCallback(() => { - if (!account) { - return; - } - - if (relationship?.muting) { - dispatch(unmuteAccount(account.id)); - } else { - dispatch(initMuteModal(account)); - } - }, [dispatch, account, relationship]); - - const handleBlockDomain = useCallback(() => { - if (!account) { - return; - } - - dispatch(initDomainBlockModal(account)); - }, [dispatch, account]); - - const handleUnblockDomain = useCallback(() => { - if (!account) { - return; - } - - const domain = account.acct.split('@')[1]; - - if (!domain) { - return; - } - - dispatch(unblockDomain(domain)); - }, [dispatch, account]); - - const handleEndorseToggle = useCallback(() => { - if (!account) { - return; - } - - if (relationship?.endorsed) { - dispatch(unpinAccount(account.id)); - } else { - dispatch(pinAccount(account.id)); - } - }, [dispatch, account, relationship]); - - const handleAddToList = useCallback(() => { - if (!account) { - return; - } - - dispatch( - openModal({ - modalType: 'LIST_ADDER', - modalProps: { - accountId: account.id, - }, - }), - ); - }, [dispatch, account]); - - const handleChangeLanguages = useCallback(() => { - if (!account) { - return; - } - - dispatch( - openModal({ - modalType: 'SUBSCRIBED_LANGUAGES', - modalProps: { - accountId: account.id, - }, - }), - ); - }, [dispatch, account]); - const handleOpenAvatar = useCallback( (e: React.MouseEvent) => { if (e.button !== 0 || e.ctrlKey || e.metaKey) { @@ -359,410 +80,14 @@ export const AccountHeader: React.FC<{ [dispatch, account], ); - const handleShare = useCallback(() => { - if (!account) { - return; - } - - void navigator.share({ - url: account.url, - }); - }, [account]); - - const suspended = account?.suspended; - const isRemote = account?.acct !== account?.username; - const remoteDomain = isRemote ? account?.acct.split('@')[1] : null; - - const menuItems = useMemo(() => { - const arr: MenuItem[] = []; - - if (!account) { - return arr; - } - - if (signedIn && !account.suspended) { - arr.push({ - text: intl.formatMessage(messages.mention, { - name: account.username, - }), - action: handleMention, - }); - arr.push({ - text: intl.formatMessage(messages.direct, { - name: account.username, - }), - action: handleDirect, - }); - arr.push(null); - } - - if (isRemote) { - arr.push({ - text: intl.formatMessage(messages.openOriginalPage), - href: account.url, - }); - arr.push(null); - } - - if (signedIn) { - if (relationship?.following) { - if (!relationship.muting) { - if (relationship.showing_reblogs) { - arr.push({ - text: intl.formatMessage(messages.hideReblogs, { - name: account.username, - }), - action: handleReblogToggle, - }); - } else { - arr.push({ - text: intl.formatMessage(messages.showReblogs, { - name: account.username, - }), - action: handleReblogToggle, - }); - } - - arr.push({ - text: intl.formatMessage(messages.languages), - action: handleChangeLanguages, - }); - arr.push(null); - } - - arr.push({ - text: intl.formatMessage( - relationship.endorsed ? messages.unendorse : messages.endorse, - ), - action: handleEndorseToggle, - }); - arr.push({ - text: intl.formatMessage(messages.add_or_remove_from_list), - action: handleAddToList, - }); - arr.push(null); - } - - if (relationship?.followed_by) { - const handleRemoveFromFollowers = () => { - dispatch( - openModal({ - modalType: 'CONFIRM', - modalProps: { - title: intl.formatMessage( - messages.confirmRemoveFromFollowersTitle, - ), - message: intl.formatMessage( - messages.confirmRemoveFromFollowersMessage, - { name: {account.acct} }, - ), - confirm: intl.formatMessage( - messages.confirmRemoveFromFollowersButton, - ), - onConfirm: () => { - void dispatch(removeAccountFromFollowers({ accountId })); - }, - }, - }), - ); - }; - - arr.push({ - text: intl.formatMessage(messages.removeFromFollowers, { - name: account.username, - }), - action: handleRemoveFromFollowers, - dangerous: true, - }); - } - - if (relationship?.muting) { - arr.push({ - text: intl.formatMessage(messages.unmute, { - name: account.username, - }), - action: handleMute, - }); - } else { - arr.push({ - text: intl.formatMessage(messages.mute, { - name: account.username, - }), - action: handleMute, - dangerous: true, - }); - } - - if (relationship?.blocking) { - arr.push({ - text: intl.formatMessage(messages.unblock, { - name: account.username, - }), - action: handleBlock, - }); - } else { - arr.push({ - text: intl.formatMessage(messages.block, { - name: account.username, - }), - action: handleBlock, - dangerous: true, - }); - } - - if (!account.suspended) { - arr.push({ - text: intl.formatMessage(messages.report, { - name: account.username, - }), - action: handleReport, - dangerous: true, - }); - } - } - - if (signedIn && isRemote) { - arr.push(null); - - if (relationship?.domain_blocking) { - arr.push({ - text: intl.formatMessage(messages.unblockDomain, { - domain: remoteDomain, - }), - action: handleUnblockDomain, - }); - } else { - arr.push({ - text: intl.formatMessage(messages.blockDomain, { - domain: remoteDomain, - }), - action: handleBlockDomain, - dangerous: true, - }); - } - } - - if ( - (permissions & PERMISSION_MANAGE_USERS) === PERMISSION_MANAGE_USERS || - (isRemote && - (permissions & PERMISSION_MANAGE_FEDERATION) === - PERMISSION_MANAGE_FEDERATION) - ) { - arr.push(null); - if ((permissions & PERMISSION_MANAGE_USERS) === PERMISSION_MANAGE_USERS) { - arr.push({ - text: intl.formatMessage(messages.admin_account, { - name: account.username, - }), - href: `/admin/accounts/${account.id}`, - }); - } - if ( - isRemote && - (permissions & PERMISSION_MANAGE_FEDERATION) === - PERMISSION_MANAGE_FEDERATION - ) { - arr.push({ - text: intl.formatMessage(messages.admin_domain, { - domain: remoteDomain, - }), - href: `/admin/instances/${remoteDomain}`, - }); - } - } - - return arr; - }, [ - dispatch, - accountId, - account, - relationship, - permissions, - isRemote, - remoteDomain, - intl, - signedIn, - handleAddToList, - handleBlock, - handleBlockDomain, - handleChangeLanguages, - handleDirect, - handleEndorseToggle, - handleMention, - handleMute, - handleReblogToggle, - handleReport, - handleUnblockDomain, - ]); - - const menu = accountId !== me && ( - - ); - if (!account) { return null; } - let actionBtn: React.ReactNode, - bellBtn: React.ReactNode, - lockedIcon: React.ReactNode, - shareBtn: React.ReactNode; - - const info: React.ReactNode[] = []; - - if (me !== account.id && relationship) { - if ( - relationship.followed_by && - (relationship.following || relationship.requested) - ) { - info.push( - - - , - ); - } else if (relationship.followed_by) { - info.push( - - - , - ); - } else if (relationship.requested_by) { - info.push( - - - , - ); - } - - if (relationship.blocking) { - info.push( - - - , - ); - } - - if (relationship.muting) { - info.push( - - - , - ); - } - - if (relationship.domain_blocking) { - info.push( - - - , - ); - } - } - - if (relationship?.requested || relationship?.following) { - bellBtn = ( - - ); - } - - if ('share' in navigator) { - shareBtn = ( - - ); - } else { - shareBtn = ( - - ); - } - - const isMovedAndUnfollowedAccount = account.moved && !relationship?.following; - - if (!isMovedAndUnfollowedAccount) { - actionBtn = ( - - ); - } - - if (account.locked) { - lockedIcon = ( - - ); - } - - const fields = account.fields; + const suspendedOrHidden = hidden || account.suspended; const isLocal = !account.acct.includes('@'); const username = account.acct.split('@')[0]; const domain = isLocal ? localDomain : account.acct.split('@')[1]; - const isIndexable = !account.noindex; - - const badges = []; - - if (account.bot) { - badges.push(); - } else if (account.group) { - badges.push(); - } - - account.roles.forEach((role) => { - badges.push( - {role.get('name')}} - domain={domain} - roleId={role.get('id')} - />, - ); - }); return (
@@ -776,15 +101,16 @@ export const AccountHeader: React.FC<{ inactive: !!account.moved, })} > - {!(suspended || hidden || account.moved) && - relationship?.requested_by && ( - - )} + {!suspendedOrHidden && !account.moved && relationship?.requested_by && ( + + )}
-
{info}
+ {me !== account.id && relationship && ( + + )} - {!(suspended || hidden) && ( + {!suspendedOrHidden && (
@@ -829,29 +153,37 @@ export const AccountHeader: React.FC<{ domain={domain ?? ''} isSelf={me === account.id} /> - {lockedIcon} + {account.locked && ( + + )}
- {badges.length > 0 && ( -
{badges}
- )} + - {account.id !== me && signedIn && !(suspended || hidden) && ( + {me && account.id !== me && !suspendedOrHidden && ( )} -
- {!hidden && actionBtn} - {!hidden && bellBtn} - {menu} -
+ - {!(suspended || hidden) && ( + {!suspendedOrHidden && (
- {account.id !== me && signedIn && ( + {me && account.id !== me && ( )} @@ -878,73 +210,26 @@ export const AccountHeader: React.FC<{ - +
-
- - - - - - - - - - - -
+
)} - {!(hideTabs || hidden) && ( -
- - - - - - - - - - - - -
- )} + {!hideTabs && !hidden && } {titleFromAccount(account)} diff --git a/app/javascript/mastodon/features/account_timeline/components/badges.tsx b/app/javascript/mastodon/features/account_timeline/components/badges.tsx new file mode 100644 index 0000000000..cc6c456e9c --- /dev/null +++ b/app/javascript/mastodon/features/account_timeline/components/badges.tsx @@ -0,0 +1,43 @@ +import type { FC } from 'react'; + +import { AutomatedBadge, Badge, GroupBadge } from '@/mastodon/components/badge'; +import { useAccount } from '@/mastodon/hooks/useAccount'; +import { useAppSelector } from '@/mastodon/store'; + +export const AccountBadges: FC<{ accountId: string }> = ({ accountId }) => { + const account = useAccount(accountId); + const localDomain = useAppSelector( + (state) => state.meta.get('domain') as string, + ); + const badges = []; + + if (!account) { + return null; + } + + if (account.bot) { + badges.push(); + } else if (account.group) { + badges.push(); + } + + const domain = account.acct.includes('@') + ? account.acct.split('@')[1] + : localDomain; + account.roles.forEach((role) => { + badges.push( + {role.get('name')}} + domain={domain} + roleId={role.get('id')} + />, + ); + }); + + if (!badges.length) { + return null; + } + + return
{badges}
; +}; diff --git a/app/javascript/mastodon/features/account_timeline/components/buttons.tsx b/app/javascript/mastodon/features/account_timeline/components/buttons.tsx new file mode 100644 index 0000000000..c998d1472c --- /dev/null +++ b/app/javascript/mastodon/features/account_timeline/components/buttons.tsx @@ -0,0 +1,134 @@ +import { useCallback } from 'react'; +import type { FC } from 'react'; + +import { defineMessages, useIntl } from 'react-intl'; + +import classNames from 'classnames'; + +import { followAccount } from '@/mastodon/actions/accounts'; +import { CopyIconButton } from '@/mastodon/components/copy_icon_button'; +import { FollowButton } from '@/mastodon/components/follow_button'; +import { IconButton } from '@/mastodon/components/icon_button'; +import { useAccount } from '@/mastodon/hooks/useAccount'; +import { getAccountHidden } from '@/mastodon/selectors/accounts'; +import { useAppDispatch, useAppSelector } from '@/mastodon/store'; +import NotificationsIcon from '@/material-icons/400-24px/notifications.svg?react'; +import NotificationsActiveIcon from '@/material-icons/400-24px/notifications_active-fill.svg?react'; +import ShareIcon from '@/material-icons/400-24px/share.svg?react'; + +import { AccountMenu } from './menu'; + +const messages = defineMessages({ + enableNotifications: { + id: 'account.enable_notifications', + defaultMessage: 'Notify me when @{name} posts', + }, + disableNotifications: { + id: 'account.disable_notifications', + defaultMessage: 'Stop notifying me when @{name} posts', + }, + share: { id: 'account.share', defaultMessage: "Share @{name}'s profile" }, + copy: { id: 'account.copy', defaultMessage: 'Copy link to profile' }, +}); + +interface AccountButtonsProps { + accountId: string; + className?: string; + noShare?: boolean; +} + +export const AccountButtons: FC = ({ + accountId, + className, + noShare, +}) => { + const hidden = useAppSelector((state) => getAccountHidden(state, accountId)); + const me = useAppSelector((state) => state.meta.get('me') as string); + + return ( +
+ {!hidden && ( + + )} + {accountId !== me && } +
+ ); +}; + +const AccountButtonsOther: FC< + Pick +> = ({ accountId, noShare }) => { + const intl = useIntl(); + const account = useAccount(accountId); + const relationship = useAppSelector((state) => + state.relationships.get(accountId), + ); + + const dispatch = useAppDispatch(); + const handleNotifyToggle = useCallback(() => { + if (account) { + dispatch(followAccount(account.id, { notify: !relationship?.notifying })); + } + }, [dispatch, account, relationship]); + const accountUrl = account?.url; + const handleShare = useCallback(() => { + if (accountUrl) { + void navigator.share({ + url: accountUrl, + }); + } + }, [accountUrl]); + + if (!account) { + return null; + } + + const isMovedAndUnfollowedAccount = account.moved && !relationship?.following; + const isFollowing = relationship?.requested || relationship?.following; + + return ( + <> + {!isMovedAndUnfollowedAccount && ( + + )} + {isFollowing && ( + + )} + {!noShare && + ('share' in navigator ? ( + + ) : ( + + ))} + + ); +}; diff --git a/app/javascript/mastodon/features/account_timeline/components/info.tsx b/app/javascript/mastodon/features/account_timeline/components/info.tsx new file mode 100644 index 0000000000..bb99999c41 --- /dev/null +++ b/app/javascript/mastodon/features/account_timeline/components/info.tsx @@ -0,0 +1,68 @@ +import type { FC } from 'react'; + +import { FormattedMessage } from 'react-intl'; + +import type { Relationship } from '@/mastodon/models/relationship'; + +export const AccountInfo: FC<{ relationship?: Relationship }> = ({ + relationship, +}) => { + if (!relationship) { + return null; + } + return ( +
+ {(relationship.followed_by || relationship.requested_by) && ( + + + + )} + {relationship.blocking && ( + + + + )} + {relationship.muting && ( + + + + )} + {relationship.domain_blocking && ( + + + + )} +
+ ); +}; + +const AccountInfoFollower: FC<{ relationship: Relationship }> = ({ + relationship, +}) => { + if ( + relationship.followed_by && + (relationship.following || relationship.requested) + ) { + return ( + + ); + } else if (relationship.followed_by) { + return ( + + ); + } else if (relationship.requested_by) { + return ( + + ); + } + return null; +}; diff --git a/app/javascript/mastodon/features/account_timeline/components/links.tsx b/app/javascript/mastodon/features/account_timeline/components/links.tsx new file mode 100644 index 0000000000..2e056e4e57 --- /dev/null +++ b/app/javascript/mastodon/features/account_timeline/components/links.tsx @@ -0,0 +1,58 @@ +import type { FC } from 'react'; + +import { useIntl } from 'react-intl'; + +import { NavLink } from 'react-router-dom'; + +import { + FollowersCounter, + FollowingCounter, + StatusesCounter, +} from '@/mastodon/components/counters'; +import { ShortNumber } from '@/mastodon/components/short_number'; +import { useAccount } from '@/mastodon/hooks/useAccount'; + +export const AccountLinks: FC<{ accountId: string }> = ({ accountId }) => { + const intl = useIntl(); + const account = useAccount(accountId); + + if (!account) { + return null; + } + + return ( +
+ + + + + + + + + + + +
+ ); +}; diff --git a/app/javascript/mastodon/features/account_timeline/components/menu.tsx b/app/javascript/mastodon/features/account_timeline/components/menu.tsx new file mode 100644 index 0000000000..ce98c61f76 --- /dev/null +++ b/app/javascript/mastodon/features/account_timeline/components/menu.tsx @@ -0,0 +1,373 @@ +import { useMemo } from 'react'; +import type { FC } from 'react'; + +import { defineMessages, useIntl } from 'react-intl'; + +import { + blockAccount, + followAccount, + pinAccount, + unblockAccount, + unmuteAccount, + unpinAccount, +} from '@/mastodon/actions/accounts'; +import { removeAccountFromFollowers } from '@/mastodon/actions/accounts_typed'; +import { directCompose, mentionCompose } from '@/mastodon/actions/compose'; +import { + initDomainBlockModal, + unblockDomain, +} from '@/mastodon/actions/domain_blocks'; +import { openModal } from '@/mastodon/actions/modal'; +import { initMuteModal } from '@/mastodon/actions/mutes'; +import { initReport } from '@/mastodon/actions/reports'; +import { Dropdown } from '@/mastodon/components/dropdown_menu'; +import { useAccount } from '@/mastodon/hooks/useAccount'; +import { useIdentity } from '@/mastodon/identity_context'; +import type { MenuItem } from '@/mastodon/models/dropdown_menu'; +import { + PERMISSION_MANAGE_FEDERATION, + PERMISSION_MANAGE_USERS, +} from '@/mastodon/permissions'; +import { useAppDispatch, useAppSelector } from '@/mastodon/store'; +import MoreHorizIcon from '@/material-icons/400-24px/more_horiz.svg?react'; + +const messages = defineMessages({ + unblock: { id: 'account.unblock', defaultMessage: 'Unblock @{name}' }, + mention: { id: 'account.mention', defaultMessage: 'Mention @{name}' }, + direct: { id: 'account.direct', defaultMessage: 'Privately mention @{name}' }, + unmute: { id: 'account.unmute', defaultMessage: 'Unmute @{name}' }, + block: { id: 'account.block', defaultMessage: 'Block @{name}' }, + mute: { id: 'account.mute', defaultMessage: 'Mute @{name}' }, + report: { id: 'account.report', defaultMessage: 'Report @{name}' }, + blockDomain: { + id: 'account.block_domain', + defaultMessage: 'Block domain {domain}', + }, + unblockDomain: { + id: 'account.unblock_domain', + defaultMessage: 'Unblock domain {domain}', + }, + hideReblogs: { + id: 'account.hide_reblogs', + defaultMessage: 'Hide boosts from @{name}', + }, + showReblogs: { + id: 'account.show_reblogs', + defaultMessage: 'Show boosts from @{name}', + }, + endorse: { id: 'account.endorse', defaultMessage: 'Feature on profile' }, + unendorse: { + id: 'account.unendorse', + defaultMessage: "Don't feature on profile", + }, + add_or_remove_from_list: { + id: 'account.add_or_remove_from_list', + defaultMessage: 'Add or Remove from lists', + }, + admin_account: { + id: 'status.admin_account', + defaultMessage: 'Open moderation interface for @{name}', + }, + admin_domain: { + id: 'status.admin_domain', + defaultMessage: 'Open moderation interface for {domain}', + }, + languages: { + id: 'account.languages', + defaultMessage: 'Change subscribed languages', + }, + openOriginalPage: { + id: 'account.open_original_page', + defaultMessage: 'Open original page', + }, + removeFromFollowers: { + id: 'account.remove_from_followers', + defaultMessage: 'Remove {name} from followers', + }, + confirmRemoveFromFollowersTitle: { + id: 'confirmations.remove_from_followers.title', + defaultMessage: 'Remove follower?', + }, + confirmRemoveFromFollowersMessage: { + id: 'confirmations.remove_from_followers.message', + defaultMessage: + '{name} will stop following you. Are you sure you want to proceed?', + }, + confirmRemoveFromFollowersButton: { + id: 'confirmations.remove_from_followers.confirm', + defaultMessage: 'Remove follower', + }, +}); + +export const AccountMenu: FC<{ accountId: string }> = ({ accountId }) => { + const intl = useIntl(); + const { signedIn, permissions } = useIdentity(); + + const account = useAccount(accountId); + const relationship = useAppSelector((state) => + state.relationships.get(accountId), + ); + + const dispatch = useAppDispatch(); + const menuItems = useMemo(() => { + const arr: MenuItem[] = []; + + if (!account) { + return arr; + } + + const isRemote = account.acct !== account.username; + + if (signedIn && !account.suspended) { + arr.push({ + text: intl.formatMessage(messages.mention, { + name: account.username, + }), + action: () => { + dispatch(mentionCompose(account)); + }, + }); + arr.push({ + text: intl.formatMessage(messages.direct, { + name: account.username, + }), + action: () => { + dispatch(directCompose(account)); + }, + }); + arr.push(null); + } + + if (isRemote) { + arr.push({ + text: intl.formatMessage(messages.openOriginalPage), + href: account.url, + }); + arr.push(null); + } + + if (!signedIn) { + return arr; + } + + if (relationship?.following) { + if (!relationship.muting) { + if (relationship.showing_reblogs) { + arr.push({ + text: intl.formatMessage(messages.hideReblogs, { + name: account.username, + }), + action: () => { + dispatch(followAccount(account.id, { reblogs: false })); + }, + }); + } else { + arr.push({ + text: intl.formatMessage(messages.showReblogs, { + name: account.username, + }), + action: () => { + dispatch(followAccount(account.id, { reblogs: true })); + }, + }); + } + + arr.push({ + text: intl.formatMessage(messages.languages), + action: () => { + dispatch( + openModal({ + modalType: 'SUBSCRIBED_LANGUAGES', + modalProps: { + accountId: account.id, + }, + }), + ); + }, + }); + arr.push(null); + } + + arr.push({ + text: intl.formatMessage( + relationship.endorsed ? messages.unendorse : messages.endorse, + ), + action: () => { + if (relationship.endorsed) { + dispatch(unpinAccount(account.id)); + } else { + dispatch(pinAccount(account.id)); + } + }, + }); + arr.push({ + text: intl.formatMessage(messages.add_or_remove_from_list), + action: () => { + dispatch( + openModal({ + modalType: 'LIST_ADDER', + modalProps: { + accountId: account.id, + }, + }), + ); + }, + }); + arr.push(null); + } + + if (relationship?.followed_by) { + const handleRemoveFromFollowers = () => { + dispatch( + openModal({ + modalType: 'CONFIRM', + modalProps: { + title: intl.formatMessage( + messages.confirmRemoveFromFollowersTitle, + ), + message: intl.formatMessage( + messages.confirmRemoveFromFollowersMessage, + { name: {account.acct} }, + ), + confirm: intl.formatMessage( + messages.confirmRemoveFromFollowersButton, + ), + onConfirm: () => { + void dispatch( + removeAccountFromFollowers({ accountId: account.id }), + ); + }, + }, + }), + ); + }; + + arr.push({ + text: intl.formatMessage(messages.removeFromFollowers, { + name: account.username, + }), + action: handleRemoveFromFollowers, + dangerous: true, + }); + } + + if (relationship?.muting) { + arr.push({ + text: intl.formatMessage(messages.unmute, { + name: account.username, + }), + action: () => { + dispatch(unmuteAccount(account.id)); + }, + }); + } else { + arr.push({ + text: intl.formatMessage(messages.mute, { + name: account.username, + }), + action: () => { + dispatch(initMuteModal(account)); + }, + dangerous: true, + }); + } + + if (relationship?.blocking) { + arr.push({ + text: intl.formatMessage(messages.unblock, { + name: account.username, + }), + action: () => { + dispatch(unblockAccount(account.id)); + }, + }); + } else { + arr.push({ + text: intl.formatMessage(messages.block, { + name: account.username, + }), + action: () => { + dispatch(blockAccount(account.id)); + }, + dangerous: true, + }); + } + + if (!account.suspended) { + arr.push({ + text: intl.formatMessage(messages.report, { + name: account.username, + }), + action: () => { + dispatch(initReport(account)); + }, + dangerous: true, + }); + } + + const remoteDomain = isRemote ? account.acct.split('@')[1] : null; + if (remoteDomain) { + arr.push(null); + + if (relationship?.domain_blocking) { + arr.push({ + text: intl.formatMessage(messages.unblockDomain, { + domain: remoteDomain, + }), + action: () => { + dispatch(unblockDomain(remoteDomain)); + }, + }); + } else { + arr.push({ + text: intl.formatMessage(messages.blockDomain, { + domain: remoteDomain, + }), + action: () => { + dispatch(initDomainBlockModal(account)); + }, + dangerous: true, + }); + } + } + + if ( + (permissions & PERMISSION_MANAGE_USERS) === PERMISSION_MANAGE_USERS || + (isRemote && + (permissions & PERMISSION_MANAGE_FEDERATION) === + PERMISSION_MANAGE_FEDERATION) + ) { + arr.push(null); + if ((permissions & PERMISSION_MANAGE_USERS) === PERMISSION_MANAGE_USERS) { + arr.push({ + text: intl.formatMessage(messages.admin_account, { + name: account.username, + }), + href: `/admin/accounts/${account.id}`, + }); + } + if ( + isRemote && + (permissions & PERMISSION_MANAGE_FEDERATION) === + PERMISSION_MANAGE_FEDERATION + ) { + arr.push({ + text: intl.formatMessage(messages.admin_domain, { + domain: remoteDomain, + }), + href: `/admin/instances/${remoteDomain}`, + }); + } + } + + return arr; + }, [account, signedIn, permissions, intl, relationship, dispatch]); + return ( + + ); +}; diff --git a/app/javascript/mastodon/features/account_timeline/components/tabs.tsx b/app/javascript/mastodon/features/account_timeline/components/tabs.tsx new file mode 100644 index 0000000000..c08de1390e --- /dev/null +++ b/app/javascript/mastodon/features/account_timeline/components/tabs.tsx @@ -0,0 +1,27 @@ +import type { FC } from 'react'; + +import { FormattedMessage } from 'react-intl'; + +import { NavLink } from 'react-router-dom'; + +export const AccountTabs: FC<{ acct: string }> = ({ acct }) => { + return ( +
+ + + + + + + + + + + + +
+ ); +}; diff --git a/app/javascript/mastodon/features/annual_report/announcement/index.tsx b/app/javascript/mastodon/features/annual_report/announcement/index.tsx index 283e95f594..d96b109271 100644 --- a/app/javascript/mastodon/features/annual_report/announcement/index.tsx +++ b/app/javascript/mastodon/features/annual_report/announcement/index.tsx @@ -1,7 +1,5 @@ import { FormattedMessage } from 'react-intl'; -import classNames from 'classnames'; - import type { ApiAnnualReportState } from '@/mastodon/api/annual_report'; import { Button } from '@/mastodon/components/button'; @@ -19,7 +17,7 @@ export const AnnualReportAnnouncement: React.FC< AnnualReportAnnouncementProps > = ({ year, state, onRequestBuild, onOpen, onDismiss }) => { return ( -
+
= ({ const topHashtag = report.data.top_hashtags[0]; return ( -
+

Wrapstodon {report.year}

{account &&

@{account.acct}

} diff --git a/app/javascript/mastodon/features/annual_report/modal.tsx b/app/javascript/mastodon/features/annual_report/modal.tsx index 01d7c4bbdb..d591954bbf 100644 --- a/app/javascript/mastodon/features/annual_report/modal.tsx +++ b/app/javascript/mastodon/features/annual_report/modal.tsx @@ -60,11 +60,8 @@ const AnnualReportModal: React.FC<{ // default modal backdrop, preventing clicks to pass through. // eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions
{!showAnnouncement ? ( diff --git a/app/javascript/mastodon/features/emoji/__tests__/emoji-test.js b/app/javascript/mastodon/features/emoji/__tests__/emoji-test.js index 35804de82a..5d0683dace 100644 --- a/app/javascript/mastodon/features/emoji/__tests__/emoji-test.js +++ b/app/javascript/mastodon/features/emoji/__tests__/emoji-test.js @@ -86,7 +86,7 @@ describe('emoji', () => { it('does an emoji containing ZWJ properly', () => { expect(emojify('💂‍♀️💂‍♂️')) - .toEqual('💂\u200D♀️💂\u200D♂️'); + .toEqual('💂‍♀️💂‍♂️'); }); it('keeps ordering as expected (issue fixed by PR 20677)', () => { diff --git a/app/javascript/mastodon/features/emoji/emoji.js b/app/javascript/mastodon/features/emoji/emoji.js index f8fa0ae192..859665a531 100644 --- a/app/javascript/mastodon/features/emoji/emoji.js +++ b/app/javascript/mastodon/features/emoji/emoji.js @@ -1,6 +1,6 @@ import Trie from 'substring-trie'; -import { getUserTheme, isDarkMode } from '@/mastodon/utils/theme'; +import { getIsSystemTheme, isDarkMode } from '@/mastodon/utils/theme'; import { assetHost } from 'mastodon/utils/config'; import { autoPlayGif } from '../../initial_state'; @@ -98,7 +98,7 @@ const emojifyTextNode = (node, customEmojis) => { const { filename, shortCode } = unicodeMapping[unicode_emoji]; const title = shortCode ? `:${shortCode}:` : ''; - const isSystemTheme = getUserTheme() === 'system'; + const isSystemTheme = getIsSystemTheme(); const theme = (isSystemTheme || !isDarkMode()) ? 'light' : 'dark'; diff --git a/app/javascript/mastodon/hooks/useAccount.ts b/app/javascript/mastodon/hooks/useAccount.ts new file mode 100644 index 0000000000..277fa16931 --- /dev/null +++ b/app/javascript/mastodon/hooks/useAccount.ts @@ -0,0 +1,26 @@ +import { useEffect } from 'react'; + +import { fetchAccount } from '../actions/accounts'; +import { createAppSelector, useAppDispatch, useAppSelector } from '../store'; + +export const accountSelector = createAppSelector( + [ + (state) => state.accounts, + (_, accountId: string | null | undefined) => accountId, + ], + (accounts, accountId) => (accountId ? accounts.get(accountId) : undefined), +); + +export function useAccount(accountId: string | null | undefined) { + const account = useAppSelector((state) => accountSelector(state, accountId)); + + const dispatch = useAppDispatch(); + const accountInStore = !!account; + useEffect(() => { + if (accountId && !accountInStore) { + dispatch(fetchAccount(accountId)); + } + }, [accountId, accountInStore, dispatch]); + + return account; +} diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index f1ab23570a..77dd953887 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -589,6 +589,7 @@ "load_pending": "{count, plural, one {# new item} other {# new items}}", "loading_indicator.label": "Loading…", "media_gallery.hide": "Hide", + "minicard.more_items": "+ {count} more", "moved_to_account_banner.text": "Your account {disabledAccount} is currently disabled because you moved to {movedToAccount}.", "mute_modal.hide_from_notifications": "Hide from notifications", "mute_modal.hide_options": "Hide options", diff --git a/app/javascript/mastodon/locales/gd.json b/app/javascript/mastodon/locales/gd.json index e48c60ff2c..50db4dfb4b 100644 --- a/app/javascript/mastodon/locales/gd.json +++ b/app/javascript/mastodon/locales/gd.json @@ -283,7 +283,7 @@ "confirmations.private_quote_notify.title": "A bheil thu airson a cho-roinneadh leis an luchd-leantainn ’s na cleachdaichean le iomradh orra?", "confirmations.quiet_post_quote_info.dismiss": "Na cuiribh seo ’nam chuimhne a-rithist", "confirmations.quiet_post_quote_info.got_it": "Tha mi agaibh", - "confirmations.quiet_post_quote_info.message": "Nuair a luaidheas tu post a tha poblach ach sàmhach, thèid am post agad fhalach o loidhnichean-ama nan treandaichean.", + "confirmations.quiet_post_quote_info.message": "Nuair a luaidheas tu post sàmhach, thèid am post agad fhalach o loidhnichean-ama nan treandaichean.", "confirmations.quiet_post_quote_info.title": "Luaidh air postaichean sàmhach", "confirmations.redraft.confirm": "Sguab às ⁊ dèan dreachd ùr", "confirmations.redraft.message": "A bheil thu cinnteach gu bheil thu airson am post seo a sguabadh às agus dreachd ùr a thòiseachadh? Caillidh tu gach annsachd is brosnachadh air agus thèid freagairtean dhan phost thùsail ’nan dìlleachdanan.", @@ -790,7 +790,7 @@ "privacy.quote.disabled": "{visibility}, luaidh à comas", "privacy.quote.limited": "{visibility}, luaidh cuingichte", "privacy.unlisted.additional": "Tha seo coltach ris an fhaicsinneachd phoblach ach cha nochd am post air loidhnichean-ama an t-saoghail phoblaich, nan tagaichean hais no an rùrachaidh no ann an toraidhean luirg Mhastodon fiù ’s ma thug thu ro-aonta airson sin seachad.", - "privacy.unlisted.long": "Poblach ach falaichte o na toraidhean-luirg, na treandaichean ’s na loichnichean-ama poblach", + "privacy.unlisted.long": "Falaichte o na toraidhean-luirg, na treandaichean ’s na loidhnichean-ama poblach", "privacy.unlisted.short": "Sàmhach", "privacy_policy.last_updated": "An t-ùrachadh mu dheireadh {date}", "privacy_policy.title": "Poileasaidh prìobhaideachd", diff --git a/app/javascript/mastodon/utils/theme.ts b/app/javascript/mastodon/utils/theme.ts index 921787a6c4..494ee3cb53 100644 --- a/app/javascript/mastodon/utils/theme.ts +++ b/app/javascript/mastodon/utils/theme.ts @@ -1,11 +1,9 @@ -export function getUserTheme() { - const { userTheme } = document.documentElement.dataset; - return userTheme; +export function getIsSystemTheme() { + const { systemTheme } = document.documentElement.dataset; + return systemTheme === 'true'; } export function isDarkMode() { - const { userTheme } = document.documentElement.dataset; - return userTheme === 'system' - ? window.matchMedia('(prefers-color-scheme: dark)').matches - : userTheme !== 'mastodon-light'; + const { colorScheme } = document.documentElement.dataset; + return colorScheme === 'dark'; } diff --git a/app/javascript/styles/mastodon/theme/index.scss b/app/javascript/styles/mastodon/theme/index.scss index a907299887..a84b8b80da 100644 --- a/app/javascript/styles/mastodon/theme/index.scss +++ b/app/javascript/styles/mastodon/theme/index.scss @@ -5,49 +5,29 @@ html { @include base.palette; - - &:where([data-user-theme='system']) { - color-scheme: dark light; - - @media (prefers-color-scheme: dark) { - @include dark.tokens; - @include utils.invert-on-dark; - - @media (prefers-contrast: more) { - @include dark.contrast-overrides; - } - } - - @media (prefers-color-scheme: light) { - @include light.tokens; - @include utils.invert-on-light; - - @media (prefers-contrast: more) { - @include light.contrast-overrides; - } - } - } } -.theme-dark, -html:where( - :not([data-user-theme='mastodon-light'], [data-user-theme='system']) -) { +[data-color-scheme='dark'], +html:not([data-color-scheme]) { color-scheme: dark; @include dark.tokens; @include utils.invert-on-dark; + + &[data-contrast='high'], + [data-contrast='high'] & { + @include dark.contrast-overrides; + } } -html[data-user-theme='contrast'], -html[data-user-theme='contrast'] .theme-dark { - @include dark.contrast-overrides; -} - -.theme-light, -html:where([data-user-theme='mastodon-light']) { +[data-color-scheme='light'] { color-scheme: light; @include light.tokens; @include utils.invert-on-light; + + &[data-contrast='high'], + [data-contrast='high'] & { + @include light.contrast-overrides; + } } diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml index 501e1b8205..6ad1050c80 100755 --- a/app/views/layouts/application.html.haml +++ b/app/views/layouts/application.html.haml @@ -1,5 +1,5 @@ !!! 5 -%html{ lang: I18n.locale, class: html_classes, 'data-user-theme': current_skin.parameterize, 'data-user-flavour': current_flavour.parameterize, 'data-contrast': contrast.parameterize, 'data-mode': color_scheme.parameterize } +%html{ html_attributes } %head %meta{ charset: 'utf-8' }/ %meta{ name: 'viewport', content: 'width=device-width, initial-scale=1, viewport-fit=cover' }/ diff --git a/app/views/wrapstodon/show.html.haml b/app/views/wrapstodon/show.html.haml index 7d1c15bf94..77f370c692 100644 --- a/app/views/wrapstodon/show.html.haml +++ b/app/views/wrapstodon/show.html.haml @@ -13,7 +13,7 @@ = flavoured_vite_typescript_tag 'wrapstodon.tsx', crossorigin: 'anonymous' -- content_for :html_classes, 'theme-dark' +- content_for :force_color_scheme, 'dark' #wrapstodon = render_wrapstodon_share_data @generated_annual_report diff --git a/config/locales/gd.yml b/config/locales/gd.yml index 8f64ee1984..543cd0cb46 100644 --- a/config/locales/gd.yml +++ b/config/locales/gd.yml @@ -2054,7 +2054,7 @@ gd: public: Poblach public_long: Neach sam bith taobh a-staigh no a-muigh Mhastodon unlisted: Sàmhach - unlisted_long: Falaichte o na toraidhean-luirg, na treandaichean ’s na loichnichean-ama poblach + unlisted_long: Falaichte o na toraidhean-luirg, na treandaichean ’s na loidhnichean-ama poblach statuses_cleanup: enabled: Sguab às seann-phostaichean gu fèin-obrachail enabled_hint: Sguabaidh seo às na seann-phostaichean agad gu fèin-obrachail nuair a ruigeas iad stairsneach aoise sònraichte ach ma fhreagras iad ri gin dhe na h-eisgeachdan gu h-ìosal diff --git a/package.json b/package.json index 27698169cd..d815970f5e 100644 --- a/package.json +++ b/package.json @@ -87,7 +87,7 @@ "lodash": "^4.17.21", "marky": "^1.2.5", "path-complete-extname": "^1.0.0", - "postcss-preset-env": "^10.1.5", + "postcss-preset-env": "^11.0.0", "prop-types": "^15.8.1", "punycode": "^2.3.0", "react": "^18.2.0", diff --git a/spec/requests/content_security_policy_spec.rb b/spec/requests/content_security_policy_spec.rb index 0aa4494ef0..c84c3802f2 100644 --- a/spec/requests/content_security_policy_spec.rb +++ b/spec/requests/content_security_policy_spec.rb @@ -32,7 +32,7 @@ RSpec.describe 'Content-Security-Policy' do img-src 'self' data: blob: #{local_domain} manifest-src 'self' #{local_domain} media-src 'self' data: #{local_domain} - script-src 'self' #{local_domain} 'wasm-unsafe-eval' 'sha256-Q/2Cjx8v06hAdOF8/DeBUpsmBcSj7sLN3I/WpTF8T8c=' + script-src 'self' #{local_domain} 'wasm-unsafe-eval' 'sha256-Z5KW83D+6/pygIQS3h9XDpF52xW3l3BHc7JL9tj3uMs=' style-src 'self' #{local_domain} 'nonce-ZbA+JmE7+bK8F5qvADZHuQ==' worker-src 'self' blob: #{local_domain} CSP diff --git a/yarn.lock b/yarn.lock index 7a865de00f..76d8ab616b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1248,13 +1248,13 @@ __metadata: languageName: node linkType: hard -"@csstools/cascade-layer-name-parser@npm:^2.0.5": - version: 2.0.5 - resolution: "@csstools/cascade-layer-name-parser@npm:2.0.5" +"@csstools/cascade-layer-name-parser@npm:^3.0.0": + version: 3.0.0 + resolution: "@csstools/cascade-layer-name-parser@npm:3.0.0" peerDependencies: - "@csstools/css-parser-algorithms": ^3.0.5 - "@csstools/css-tokenizer": ^3.0.4 - checksum: 10c0/b6c73d5c8132f922edc88b9df5272c93c9753945f1e1077b80d03b314076ffe03c2cc9bf6cbc85501ee7c7f27e477263df96997c9125fd2fd0cfe82fe2d7c141 + "@csstools/css-parser-algorithms": ^4.0.0 + "@csstools/css-tokenizer": ^4.0.0 + checksum: 10c0/657b325261dfa567e26b56a1a6a00fcfc877b9e95ce8ae3595ec95c89323fc2123dad7a4ca79bede8dec475ccc41d9d528470b0be01c4f22104f6962f2bfb40c languageName: node linkType: hard @@ -1265,6 +1265,13 @@ __metadata: languageName: node linkType: hard +"@csstools/color-helpers@npm:^6.0.0": + version: 6.0.0 + resolution: "@csstools/color-helpers@npm:6.0.0" + checksum: 10c0/784447fa6ba2f5fec30f8676c48f9f66bff30a7a16582e3c3b3e9aa2574df1ac4e5f8e7455dfa6d991fd84ceceb22ff4016e2ea3a8116e76772b3972dbab7bec + languageName: node + linkType: hard + "@csstools/css-calc@npm:^2.1.4": version: 2.1.4 resolution: "@csstools/css-calc@npm:2.1.4" @@ -1275,6 +1282,16 @@ __metadata: languageName: node linkType: hard +"@csstools/css-calc@npm:^3.0.0": + version: 3.0.0 + resolution: "@csstools/css-calc@npm:3.0.0" + peerDependencies: + "@csstools/css-parser-algorithms": ^4.0.0 + "@csstools/css-tokenizer": ^4.0.0 + checksum: 10c0/2f062db206dcdcb561a802d791aaf8b410f0e4d91ded89eb4075f75f1eafe8f5392c431a8d602d6ae660fca6299e02fcc555efdb235f3403ffc56ac6f14a1c2b + languageName: node + linkType: hard + "@csstools/css-color-parser@npm:^3.1.0": version: 3.1.0 resolution: "@csstools/css-color-parser@npm:3.1.0" @@ -1288,6 +1305,19 @@ __metadata: languageName: node linkType: hard +"@csstools/css-color-parser@npm:^4.0.0": + version: 4.0.0 + resolution: "@csstools/css-color-parser@npm:4.0.0" + dependencies: + "@csstools/color-helpers": "npm:^6.0.0" + "@csstools/css-calc": "npm:^3.0.0" + peerDependencies: + "@csstools/css-parser-algorithms": ^4.0.0 + "@csstools/css-tokenizer": ^4.0.0 + checksum: 10c0/bbfa3855bd53d5f31e2e9d40d8bc7b1143c7efd3dd6fa43c0ef2222a66bdc94f7ffedc8932a4eb4f10c5cbc38d1ed110fda99240037e0a2dae61c6b25527b0a2 + languageName: node + linkType: hard + "@csstools/css-parser-algorithms@npm:^3.0.5": version: 3.0.5 resolution: "@csstools/css-parser-algorithms@npm:3.0.5" @@ -1297,6 +1327,15 @@ __metadata: languageName: node linkType: hard +"@csstools/css-parser-algorithms@npm:^4.0.0": + version: 4.0.0 + resolution: "@csstools/css-parser-algorithms@npm:4.0.0" + peerDependencies: + "@csstools/css-tokenizer": ^4.0.0 + checksum: 10c0/94558c2428d6ef0ddef542e86e0a8376aa1263a12a59770abb13ba50d7b83086822c75433f32aa2e7fef00555e1cc88292f9ca5bce79aed232bb3fed73b1528d + languageName: node + linkType: hard + "@csstools/css-syntax-patches-for-csstree@npm:1.0.14": version: 1.0.14 resolution: "@csstools/css-syntax-patches-for-csstree@npm:1.0.14" @@ -1320,6 +1359,13 @@ __metadata: languageName: node linkType: hard +"@csstools/css-tokenizer@npm:^4.0.0": + version: 4.0.0 + resolution: "@csstools/css-tokenizer@npm:4.0.0" + checksum: 10c0/669cf3d0f9c8e1ffdf8c9955ad8beba0c8cfe03197fe29a4fcbd9ee6f7a18856cfa42c62670021a75183d9ab37f5d14a866e6a9df753a6c07f59e36797a9ea9f + languageName: node + linkType: hard + "@csstools/media-query-list-parser@npm:^4.0.3": version: 4.0.3 resolution: "@csstools/media-query-list-parser@npm:4.0.3" @@ -1330,513 +1376,523 @@ __metadata: languageName: node linkType: hard -"@csstools/postcss-alpha-function@npm:^1.0.1": - version: 1.0.1 - resolution: "@csstools/postcss-alpha-function@npm:1.0.1" - dependencies: - "@csstools/css-color-parser": "npm:^3.1.0" - "@csstools/css-parser-algorithms": "npm:^3.0.5" - "@csstools/css-tokenizer": "npm:^3.0.4" - "@csstools/postcss-progressive-custom-properties": "npm:^4.2.1" - "@csstools/utilities": "npm:^2.0.0" +"@csstools/media-query-list-parser@npm:^5.0.0": + version: 5.0.0 + resolution: "@csstools/media-query-list-parser@npm:5.0.0" peerDependencies: - postcss: ^8.4 - checksum: 10c0/35ca209e572534ade21ac5c18aad702aa492eb39e2d0e475f441371063418fe9650554e6a59b1318d3a615da83ef54d9a588faa27063ecc0a568ef7290a6b488 + "@csstools/css-parser-algorithms": ^4.0.0 + "@csstools/css-tokenizer": ^4.0.0 + checksum: 10c0/dbc22654769eca02c182f3a57be02cd5b8d0b958adc8397e66770b64b0e8fcd32faa93a3f6a99e1457bde11862485de3cd83a31dac7b03925d32f9891b31ccfd languageName: node linkType: hard -"@csstools/postcss-cascade-layers@npm:^5.0.2": - version: 5.0.2 - resolution: "@csstools/postcss-cascade-layers@npm:5.0.2" - dependencies: - "@csstools/selector-specificity": "npm:^5.0.0" - postcss-selector-parser: "npm:^7.0.0" - peerDependencies: - postcss: ^8.4 - checksum: 10c0/dd8e29cfd3a93932fa35e3a59aa62fd2e720772d450f40f38f65ce1e736e2fe839635eb6f033abcc8ee8bc2856161a297f4458b352b26d2216856feb03176612 - languageName: node - linkType: hard - -"@csstools/postcss-color-function-display-p3-linear@npm:^1.0.1": - version: 1.0.1 - resolution: "@csstools/postcss-color-function-display-p3-linear@npm:1.0.1" - dependencies: - "@csstools/css-color-parser": "npm:^3.1.0" - "@csstools/css-parser-algorithms": "npm:^3.0.5" - "@csstools/css-tokenizer": "npm:^3.0.4" - "@csstools/postcss-progressive-custom-properties": "npm:^4.2.1" - "@csstools/utilities": "npm:^2.0.0" - peerDependencies: - postcss: ^8.4 - checksum: 10c0/d02d45410c9257f5620c766f861f8fa3762b74ef01fdba8060b33a4c98f929e2219cd476b25bd4181ac186158a4d99a0da555c0b6ba45a7ac4a3a5885baad1f5 - languageName: node - linkType: hard - -"@csstools/postcss-color-function@npm:^4.0.12": - version: 4.0.12 - resolution: "@csstools/postcss-color-function@npm:4.0.12" - dependencies: - "@csstools/css-color-parser": "npm:^3.1.0" - "@csstools/css-parser-algorithms": "npm:^3.0.5" - "@csstools/css-tokenizer": "npm:^3.0.4" - "@csstools/postcss-progressive-custom-properties": "npm:^4.2.1" - "@csstools/utilities": "npm:^2.0.0" - peerDependencies: - postcss: ^8.4 - checksum: 10c0/a355b04d90f89c8e37a4a23543151558060acc68fb2e7d1c3549bebeeae2b147eec26af1fbc6ee690f0ba4830263f2d181f5331d16d3483b5542be46996fa755 - languageName: node - linkType: hard - -"@csstools/postcss-color-mix-function@npm:^3.0.12": - version: 3.0.12 - resolution: "@csstools/postcss-color-mix-function@npm:3.0.12" - dependencies: - "@csstools/css-color-parser": "npm:^3.1.0" - "@csstools/css-parser-algorithms": "npm:^3.0.5" - "@csstools/css-tokenizer": "npm:^3.0.4" - "@csstools/postcss-progressive-custom-properties": "npm:^4.2.1" - "@csstools/utilities": "npm:^2.0.0" - peerDependencies: - postcss: ^8.4 - checksum: 10c0/3e98a5118852083d1f87a3f842f78088192b1f9f08fdf1f3b3ef1e8969e18fdadc1e3bcac3d113a07c8917a7e8fa65fdec55a31df9a1b726c8d7ae89db86e8e5 - languageName: node - linkType: hard - -"@csstools/postcss-color-mix-variadic-function-arguments@npm:^1.0.2": - version: 1.0.2 - resolution: "@csstools/postcss-color-mix-variadic-function-arguments@npm:1.0.2" - dependencies: - "@csstools/css-color-parser": "npm:^3.1.0" - "@csstools/css-parser-algorithms": "npm:^3.0.5" - "@csstools/css-tokenizer": "npm:^3.0.4" - "@csstools/postcss-progressive-custom-properties": "npm:^4.2.1" - "@csstools/utilities": "npm:^2.0.0" - peerDependencies: - postcss: ^8.4 - checksum: 10c0/34073f0f0d33e4958f90763e692955a8e8c678b74284234497c4aa0d2143756e1b3616e0c09832caad498870e227ca0a681316afe3a71224fc40ade0ead1bdd9 - languageName: node - linkType: hard - -"@csstools/postcss-content-alt-text@npm:^2.0.8": - version: 2.0.8 - resolution: "@csstools/postcss-content-alt-text@npm:2.0.8" - dependencies: - "@csstools/css-parser-algorithms": "npm:^3.0.5" - "@csstools/css-tokenizer": "npm:^3.0.4" - "@csstools/postcss-progressive-custom-properties": "npm:^4.2.1" - "@csstools/utilities": "npm:^2.0.0" - peerDependencies: - postcss: ^8.4 - checksum: 10c0/4c330cc2a1e434688a62613ecceb1434cd725ce024c1ad8d4a4c76b9839d1f3ea8566a8c6494921e2b46ec7feef6af8ed6548c216dcb8f0feab4b1d52c96228e - languageName: node - linkType: hard - -"@csstools/postcss-contrast-color-function@npm:^2.0.12": - version: 2.0.12 - resolution: "@csstools/postcss-contrast-color-function@npm:2.0.12" - dependencies: - "@csstools/css-color-parser": "npm:^3.1.0" - "@csstools/css-parser-algorithms": "npm:^3.0.5" - "@csstools/css-tokenizer": "npm:^3.0.4" - "@csstools/postcss-progressive-custom-properties": "npm:^4.2.1" - "@csstools/utilities": "npm:^2.0.0" - peerDependencies: - postcss: ^8.4 - checksum: 10c0/b783ce948cdf1513ee238e9115b42881a8d3e5d13c16038601b1c470d661cfaeeece4eea29904fb9fcae878bad86f766810fa798a703ab9ad4b0cf276b173f8f - languageName: node - linkType: hard - -"@csstools/postcss-exponential-functions@npm:^2.0.9": - version: 2.0.9 - resolution: "@csstools/postcss-exponential-functions@npm:2.0.9" - dependencies: - "@csstools/css-calc": "npm:^2.1.4" - "@csstools/css-parser-algorithms": "npm:^3.0.5" - "@csstools/css-tokenizer": "npm:^3.0.4" - peerDependencies: - postcss: ^8.4 - checksum: 10c0/78ea627a87fb23e12616c4e54150363b0e8793064634983dbe0368a0aca1ff73206c2d1f29845773daaf42787e7d1f180ce1b57c43e2b0d10da450101f9f34b6 - languageName: node - linkType: hard - -"@csstools/postcss-font-format-keywords@npm:^4.0.0": - version: 4.0.0 - resolution: "@csstools/postcss-font-format-keywords@npm:4.0.0" - dependencies: - "@csstools/utilities": "npm:^2.0.0" - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.4 - checksum: 10c0/eb794fb95fefcac75e606d185255e601636af177866a317b0c6b6c375055e7240be53918229fd8d4bba00df01bedd2256bdac2b0ad4a4c2ec64f9d27cd6ff639 - languageName: node - linkType: hard - -"@csstools/postcss-gamut-mapping@npm:^2.0.11": - version: 2.0.11 - resolution: "@csstools/postcss-gamut-mapping@npm:2.0.11" - dependencies: - "@csstools/css-color-parser": "npm:^3.1.0" - "@csstools/css-parser-algorithms": "npm:^3.0.5" - "@csstools/css-tokenizer": "npm:^3.0.4" - peerDependencies: - postcss: ^8.4 - checksum: 10c0/490b8ccf10e30879a4415afbdd3646e1cdac3671586b7916855cf47a536f3be75eed014396056bde6528e0cb76d904e79bad78afc0b499e837264cf22519d145 - languageName: node - linkType: hard - -"@csstools/postcss-gradients-interpolation-method@npm:^5.0.12": - version: 5.0.12 - resolution: "@csstools/postcss-gradients-interpolation-method@npm:5.0.12" - dependencies: - "@csstools/css-color-parser": "npm:^3.1.0" - "@csstools/css-parser-algorithms": "npm:^3.0.5" - "@csstools/css-tokenizer": "npm:^3.0.4" - "@csstools/postcss-progressive-custom-properties": "npm:^4.2.1" - "@csstools/utilities": "npm:^2.0.0" - peerDependencies: - postcss: ^8.4 - checksum: 10c0/70b3d6c7050ce882ed2281e71eb4493531ae8d55d21899920eeeb6c205d90aaf430419a66235484ccce3a1a1891367dfc0ef772f3866ae3a9d8ec5ddd0cfe894 - languageName: node - linkType: hard - -"@csstools/postcss-hwb-function@npm:^4.0.12": - version: 4.0.12 - resolution: "@csstools/postcss-hwb-function@npm:4.0.12" - dependencies: - "@csstools/css-color-parser": "npm:^3.1.0" - "@csstools/css-parser-algorithms": "npm:^3.0.5" - "@csstools/css-tokenizer": "npm:^3.0.4" - "@csstools/postcss-progressive-custom-properties": "npm:^4.2.1" - "@csstools/utilities": "npm:^2.0.0" - peerDependencies: - postcss: ^8.4 - checksum: 10c0/d0dac34da9d7ac654060b6b27690a419718e990b21ff3e63266ea59934a865bc6aeae8eb8e1ca3e227a8b2a208657e3ab70ccdf0437f1f09d21ab848bbffcaa2 - languageName: node - linkType: hard - -"@csstools/postcss-ic-unit@npm:^4.0.4": - version: 4.0.4 - resolution: "@csstools/postcss-ic-unit@npm:4.0.4" - dependencies: - "@csstools/postcss-progressive-custom-properties": "npm:^4.2.1" - "@csstools/utilities": "npm:^2.0.0" - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.4 - checksum: 10c0/20168e70ecb4abf7a69e407d653b6c7c9c82f2c7b1da0920e1d035f62b5ef8552cc7f1b62e0dca318df13c348e79fba862e1a4bb0e9432119a82b10aeb511752 - languageName: node - linkType: hard - -"@csstools/postcss-initial@npm:^2.0.1": - version: 2.0.1 - resolution: "@csstools/postcss-initial@npm:2.0.1" - peerDependencies: - postcss: ^8.4 - checksum: 10c0/dbff7084ef4f1c4647efe2b147001daf172003c15b5e22689f0540d03c8d362f2a332cd9cf136e6c8dcda7564ee30492a4267ea188f72cb9c1000fb9bcfbfef8 - languageName: node - linkType: hard - -"@csstools/postcss-is-pseudo-class@npm:^5.0.3": - version: 5.0.3 - resolution: "@csstools/postcss-is-pseudo-class@npm:5.0.3" - dependencies: - "@csstools/selector-specificity": "npm:^5.0.0" - postcss-selector-parser: "npm:^7.0.0" - peerDependencies: - postcss: ^8.4 - checksum: 10c0/7980f1cabf32850bac72552e4e9de47412359e36e259a92b9b9af25dae4cce42bbcc5fdca8f384a589565bf383ecb23dec3af9f084d8df18b82552318b2841b6 - languageName: node - linkType: hard - -"@csstools/postcss-light-dark-function@npm:^2.0.11": - version: 2.0.11 - resolution: "@csstools/postcss-light-dark-function@npm:2.0.11" - dependencies: - "@csstools/css-parser-algorithms": "npm:^3.0.5" - "@csstools/css-tokenizer": "npm:^3.0.4" - "@csstools/postcss-progressive-custom-properties": "npm:^4.2.1" - "@csstools/utilities": "npm:^2.0.0" - peerDependencies: - postcss: ^8.4 - checksum: 10c0/0175be41bb0044a48bc98d5c55cce41ed6b9ada88253c5f20d0ca17287cba4b429742b458ac5744675b9a286109e13ac51d64e226ab16040d7b051ba64c0c77b - languageName: node - linkType: hard - -"@csstools/postcss-logical-float-and-clear@npm:^3.0.0": - version: 3.0.0 - resolution: "@csstools/postcss-logical-float-and-clear@npm:3.0.0" - peerDependencies: - postcss: ^8.4 - checksum: 10c0/71a20e8c37877bf68ae615d7bb93fc11b4f8da8be8b1dc1a6e0fc69e27f189712ed71436b8ed51fa69fdb98b8e6718df2b5f42f246c4d39badaf0e43020fcfd4 - languageName: node - linkType: hard - -"@csstools/postcss-logical-overflow@npm:^2.0.0": +"@csstools/postcss-alpha-function@npm:^2.0.0": version: 2.0.0 - resolution: "@csstools/postcss-logical-overflow@npm:2.0.0" + resolution: "@csstools/postcss-alpha-function@npm:2.0.0" + dependencies: + "@csstools/css-color-parser": "npm:^4.0.0" + "@csstools/css-parser-algorithms": "npm:^4.0.0" + "@csstools/css-tokenizer": "npm:^4.0.0" + "@csstools/postcss-progressive-custom-properties": "npm:^5.0.0" + "@csstools/utilities": "npm:^3.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/0e103343d3ff8b34eef01b02355c5e010d272fd12d149a242026bb13ab1577b7f3a11fd4514be9342d96f73d61dac1f093a9bd36ece591753ed09a84eb7fca0a + checksum: 10c0/b267a4d48c132a2e0a9160a17811bf6bda09e4ff4b393d6d7643cdd8c9335a2db37d956abe8960545139cf503ed5c1c57e433456a19d7361a0f206b96291b7f7 languageName: node linkType: hard -"@csstools/postcss-logical-overscroll-behavior@npm:^2.0.0": +"@csstools/postcss-cascade-layers@npm:^6.0.0": + version: 6.0.0 + resolution: "@csstools/postcss-cascade-layers@npm:6.0.0" + dependencies: + "@csstools/selector-specificity": "npm:^6.0.0" + postcss-selector-parser: "npm:^7.1.1" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/f9cf3fa52d0f2615a69ad52067cc2229573151525792272eb82a28f0feca64f9ca54e8459c0ae5c254807507e4630aa9866690a4b22e57250c353ee28db86a50 + languageName: node + linkType: hard + +"@csstools/postcss-color-function-display-p3-linear@npm:^2.0.0": version: 2.0.0 - resolution: "@csstools/postcss-logical-overscroll-behavior@npm:2.0.0" + resolution: "@csstools/postcss-color-function-display-p3-linear@npm:2.0.0" + dependencies: + "@csstools/css-color-parser": "npm:^4.0.0" + "@csstools/css-parser-algorithms": "npm:^4.0.0" + "@csstools/css-tokenizer": "npm:^4.0.0" + "@csstools/postcss-progressive-custom-properties": "npm:^5.0.0" + "@csstools/utilities": "npm:^3.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/1649601bb26f04d760fb5ebc42cdf414fa2a380b8ec22fe1c117f664c286665a786bd7bbda01b7e7567eaf3cc018a4f36a5c9805f6751cc497da223e0ffe9524 + checksum: 10c0/c2d007dfa7500b6b54bca3a43f92f272cbdd8acaa9d4924eafa320c448f1cee77e7c00a229d5a6ffcc5211664b1dcfd7d54bb6622f2e7956e21ac51ea883165c languageName: node linkType: hard -"@csstools/postcss-logical-resize@npm:^3.0.0": +"@csstools/postcss-color-function@npm:^5.0.0": + version: 5.0.0 + resolution: "@csstools/postcss-color-function@npm:5.0.0" + dependencies: + "@csstools/css-color-parser": "npm:^4.0.0" + "@csstools/css-parser-algorithms": "npm:^4.0.0" + "@csstools/css-tokenizer": "npm:^4.0.0" + "@csstools/postcss-progressive-custom-properties": "npm:^5.0.0" + "@csstools/utilities": "npm:^3.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/b01b0e86df5cca222b9859601a4da18ee7a3bade52d6c7fada739cc6c6a4741173f0dccce05f4b307776bc8c0e156923930ce869faae9231e59aa2abab522581 + languageName: node + linkType: hard + +"@csstools/postcss-color-mix-function@npm:^4.0.0": + version: 4.0.0 + resolution: "@csstools/postcss-color-mix-function@npm:4.0.0" + dependencies: + "@csstools/css-color-parser": "npm:^4.0.0" + "@csstools/css-parser-algorithms": "npm:^4.0.0" + "@csstools/css-tokenizer": "npm:^4.0.0" + "@csstools/postcss-progressive-custom-properties": "npm:^5.0.0" + "@csstools/utilities": "npm:^3.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/60fa7fbc5e97dc295fd01a90e866d3923bfe47a6e2e3317f01ec8ab0aca687901ef569cdda867780b3aa37a02efa44531bfa0d0d602b90803333baa4cfbf6063 + languageName: node + linkType: hard + +"@csstools/postcss-color-mix-variadic-function-arguments@npm:^2.0.0": + version: 2.0.0 + resolution: "@csstools/postcss-color-mix-variadic-function-arguments@npm:2.0.0" + dependencies: + "@csstools/css-color-parser": "npm:^4.0.0" + "@csstools/css-parser-algorithms": "npm:^4.0.0" + "@csstools/css-tokenizer": "npm:^4.0.0" + "@csstools/postcss-progressive-custom-properties": "npm:^5.0.0" + "@csstools/utilities": "npm:^3.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/1206543ec6472f9dd7b67d3311128b66e3be2c6f1bdf9da1b6e4b4f9d69e9388e2896128bb3d1834d825ae4de9455524d7749501a60be740c52c0f7b67287263 + languageName: node + linkType: hard + +"@csstools/postcss-content-alt-text@npm:^3.0.0": version: 3.0.0 - resolution: "@csstools/postcss-logical-resize@npm:3.0.0" + resolution: "@csstools/postcss-content-alt-text@npm:3.0.0" dependencies: + "@csstools/css-parser-algorithms": "npm:^4.0.0" + "@csstools/css-tokenizer": "npm:^4.0.0" + "@csstools/postcss-progressive-custom-properties": "npm:^5.0.0" + "@csstools/utilities": "npm:^3.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/88f62ade9fa8af8b3292d9437e4df2002d79c139fc63e3030a72276a56cc5a13904fb18d20f07b09de45904da1a37eee4b448cdad07487fc28f96a0e3209bb9d + languageName: node + linkType: hard + +"@csstools/postcss-contrast-color-function@npm:^3.0.0": + version: 3.0.0 + resolution: "@csstools/postcss-contrast-color-function@npm:3.0.0" + dependencies: + "@csstools/css-color-parser": "npm:^4.0.0" + "@csstools/css-parser-algorithms": "npm:^4.0.0" + "@csstools/css-tokenizer": "npm:^4.0.0" + "@csstools/postcss-progressive-custom-properties": "npm:^5.0.0" + "@csstools/utilities": "npm:^3.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/7dec6e3bac9d45ae22b5dfcaec9ce8894a1ad80d1e62eb58634eebaa4a02a4f43f5b795a65224442b90b2285c0a0e1d7e80d9528fc1480348ab9a03bf9be2fe0 + languageName: node + linkType: hard + +"@csstools/postcss-exponential-functions@npm:^3.0.0": + version: 3.0.0 + resolution: "@csstools/postcss-exponential-functions@npm:3.0.0" + dependencies: + "@csstools/css-calc": "npm:^3.0.0" + "@csstools/css-parser-algorithms": "npm:^4.0.0" + "@csstools/css-tokenizer": "npm:^4.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/911101ec98ac89f56cb7ea52ab2d836646b48e13163d46e1a1f70b680dcc903d314ddf80eeeecfa7b561a99fad2f4b6ce2b0702fbcaa6d379b2c047bde20d398 + languageName: node + linkType: hard + +"@csstools/postcss-font-format-keywords@npm:^5.0.0": + version: 5.0.0 + resolution: "@csstools/postcss-font-format-keywords@npm:5.0.0" + dependencies: + "@csstools/utilities": "npm:^3.0.0" postcss-value-parser: "npm:^4.2.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/4f12efcaf5468ff359bb3f32f0f66034b9acc9b3ac21fcd2f30a1c8998fc653ebac0091f35c8b7e8dbfe6ccf595aee67f9b06a67adf45a8844e49a82d98b4386 + checksum: 10c0/ae776eb164a4501549924a0b153c47cac31b4d288867c71775ff34941653bfe38d3d5a27888ab76fbef0289163e1687daae74e0b317547b7bd281e63b75afa98 languageName: node linkType: hard -"@csstools/postcss-logical-viewport-units@npm:^3.0.4": - version: 3.0.4 - resolution: "@csstools/postcss-logical-viewport-units@npm:3.0.4" +"@csstools/postcss-gamut-mapping@npm:^3.0.0": + version: 3.0.0 + resolution: "@csstools/postcss-gamut-mapping@npm:3.0.0" dependencies: - "@csstools/css-tokenizer": "npm:^3.0.4" - "@csstools/utilities": "npm:^2.0.0" + "@csstools/css-color-parser": "npm:^4.0.0" + "@csstools/css-parser-algorithms": "npm:^4.0.0" + "@csstools/css-tokenizer": "npm:^4.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/f0b5ba38acde3bf0ca880c6e0a883950c99fa9919b0e6290c894d5716569663590f26aa1170fd9483ce14544e46afac006ab3b02781410d5e7c8dd1467c674ce + checksum: 10c0/da138bee13c3af9e25962a425c70e242581722881fa52faa090dbb62d22adeced112d3589304651c759bae5fc0060eefb7eb62114798e96d3925bb01febc5a99 languageName: node linkType: hard -"@csstools/postcss-media-minmax@npm:^2.0.9": - version: 2.0.9 - resolution: "@csstools/postcss-media-minmax@npm:2.0.9" +"@csstools/postcss-gradients-interpolation-method@npm:^6.0.0": + version: 6.0.0 + resolution: "@csstools/postcss-gradients-interpolation-method@npm:6.0.0" dependencies: - "@csstools/css-calc": "npm:^2.1.4" - "@csstools/css-parser-algorithms": "npm:^3.0.5" - "@csstools/css-tokenizer": "npm:^3.0.4" - "@csstools/media-query-list-parser": "npm:^4.0.3" + "@csstools/css-color-parser": "npm:^4.0.0" + "@csstools/css-parser-algorithms": "npm:^4.0.0" + "@csstools/css-tokenizer": "npm:^4.0.0" + "@csstools/postcss-progressive-custom-properties": "npm:^5.0.0" + "@csstools/utilities": "npm:^3.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/d82622ee9de6eacba1abbf31718cd58759d158ed8a575f36f08e982d07a7d83e51fb184178b96c6f7b76cb333bb33cac04d06a750b6b9c5c43ae1c56232880f9 + checksum: 10c0/33da282f65480d1a4e8a2ce336bf5e0948d47e9fdab0847d3c9e839ae640cb4af96defdcf4cb3d59e43019dec83a5e48fcd0fb96be927c43c7369e8be316fc79 languageName: node linkType: hard -"@csstools/postcss-media-queries-aspect-ratio-number-values@npm:^3.0.5": - version: 3.0.5 - resolution: "@csstools/postcss-media-queries-aspect-ratio-number-values@npm:3.0.5" +"@csstools/postcss-hwb-function@npm:^5.0.0": + version: 5.0.0 + resolution: "@csstools/postcss-hwb-function@npm:5.0.0" dependencies: - "@csstools/css-parser-algorithms": "npm:^3.0.5" - "@csstools/css-tokenizer": "npm:^3.0.4" - "@csstools/media-query-list-parser": "npm:^4.0.3" + "@csstools/css-color-parser": "npm:^4.0.0" + "@csstools/css-parser-algorithms": "npm:^4.0.0" + "@csstools/css-tokenizer": "npm:^4.0.0" + "@csstools/postcss-progressive-custom-properties": "npm:^5.0.0" + "@csstools/utilities": "npm:^3.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/a47abdaa7f4b26596bd9d6bb77aed872a232fc12bd144d2c062d9da626e8dfd8336e2fff67617dba61a1666c2b8027145b390d70d5cd4d4f608604e077cfb04e + checksum: 10c0/7f3e6d46531334621cc2c525df5c76cf916a53d0d9c82008b97b4b6b42f1b07b5729b4c3a8e5ba7b77c51ca44bbd216f83549e978f1aaf75e060335f754aacb2 languageName: node linkType: hard -"@csstools/postcss-nested-calc@npm:^4.0.0": +"@csstools/postcss-ic-unit@npm:^5.0.0": + version: 5.0.0 + resolution: "@csstools/postcss-ic-unit@npm:5.0.0" + dependencies: + "@csstools/postcss-progressive-custom-properties": "npm:^5.0.0" + "@csstools/utilities": "npm:^3.0.0" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/04148390bcdd0722af7bab6e05dbc573d8d1b5a216ca1f1021ea0cec955a8c3489e4788b3649f3a7be4a9267e0b3a6012f5e9d80d6f3ac3f1f52e585e5ce0c6e + languageName: node + linkType: hard + +"@csstools/postcss-initial@npm:^3.0.0": + version: 3.0.0 + resolution: "@csstools/postcss-initial@npm:3.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/4c59994c1ff6443f69ba54d2177adf3441756f067876500f281bd3021da1d9a18ae36cf7264a7ef7ca720508cac936f1120dc872f57fb3f6f28ac523c111a890 + languageName: node + linkType: hard + +"@csstools/postcss-is-pseudo-class@npm:^6.0.0": + version: 6.0.0 + resolution: "@csstools/postcss-is-pseudo-class@npm:6.0.0" + dependencies: + "@csstools/selector-specificity": "npm:^6.0.0" + postcss-selector-parser: "npm:^7.1.1" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/55dfb215843258167426eecf7cb8dd2361c2502722469ffc4f3aa7bad6987a08c5ff819ef6bca427c59ee9ad7b3942b89b17bde1d0288ece03f8760c56df7542 + languageName: node + linkType: hard + +"@csstools/postcss-light-dark-function@npm:^3.0.0": + version: 3.0.0 + resolution: "@csstools/postcss-light-dark-function@npm:3.0.0" + dependencies: + "@csstools/css-parser-algorithms": "npm:^4.0.0" + "@csstools/css-tokenizer": "npm:^4.0.0" + "@csstools/postcss-progressive-custom-properties": "npm:^5.0.0" + "@csstools/utilities": "npm:^3.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/769324f8acda2ce759cad959f43d49ccbc578ccb326362260019a7f7a126408c925d49f437c85d28fb2696cfe1405740a271c250184d9f34ea5603a0b8220936 + languageName: node + linkType: hard + +"@csstools/postcss-logical-float-and-clear@npm:^4.0.0": version: 4.0.0 - resolution: "@csstools/postcss-nested-calc@npm:4.0.0" - dependencies: - "@csstools/utilities": "npm:^2.0.0" - postcss-value-parser: "npm:^4.2.0" + resolution: "@csstools/postcss-logical-float-and-clear@npm:4.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/fb61512fa4909bdf0ee32a23e771145086c445f2208a737b52093c8adfab7362c56d3aeaf2a6e33ffcec067e99a07219775465d2fbb1a3ac30cdcfb278b218b7 + checksum: 10c0/bbb2e69878965943fc9686c4827a2f363f7a42c051e6df288e68d68741b424fb3cbdc2aa3e2d2169bcf1a4cfd6a24f0aa06c3061ea02ac03e0ad0bfae8fdc999 languageName: node linkType: hard -"@csstools/postcss-normalize-display-values@npm:^4.0.1": - version: 4.0.1 - resolution: "@csstools/postcss-normalize-display-values@npm:4.0.1" - dependencies: - postcss-value-parser: "npm:^4.2.0" +"@csstools/postcss-logical-overflow@npm:^3.0.0": + version: 3.0.0 + resolution: "@csstools/postcss-logical-overflow@npm:3.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/5d19364bad8554b047cebd94ad7e203723ed76abaf690e4b92c74e6fc7c3642cb8858ade3263da61aff26d97bb258af567b1036e97865b7aa3b17522241fd1e1 + checksum: 10c0/cca3397de39eb858a216d0566598ff24a8c94d20c12630568437d8145d78c0d5f36533c72dab72f50702dabbcada87fd34b1129aa4d9c24b427aaa211df124c1 languageName: node linkType: hard -"@csstools/postcss-oklab-function@npm:^4.0.12": - version: 4.0.12 - resolution: "@csstools/postcss-oklab-function@npm:4.0.12" - dependencies: - "@csstools/css-color-parser": "npm:^3.1.0" - "@csstools/css-parser-algorithms": "npm:^3.0.5" - "@csstools/css-tokenizer": "npm:^3.0.4" - "@csstools/postcss-progressive-custom-properties": "npm:^4.2.1" - "@csstools/utilities": "npm:^2.0.0" +"@csstools/postcss-logical-overscroll-behavior@npm:^3.0.0": + version: 3.0.0 + resolution: "@csstools/postcss-logical-overscroll-behavior@npm:3.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/40d4f51b568c8299c054f8971d0e85fa7da609ba23ce6c84dc17e16bc3838640ed6da75c3886dc9a96a11005773c6e23cba13a5510c781b2d633d07ad7bda6b7 + checksum: 10c0/0138d89c739dae70b3496d68e08109d97c82d0038fe9bcc5b40f6efb136428def62e81c316f1902d2e4e5611c90c66f70e2008e99fdd0c7358dcfdffb4e326cc languageName: node linkType: hard -"@csstools/postcss-position-area-property@npm:^1.0.0": - version: 1.0.0 - resolution: "@csstools/postcss-position-area-property@npm:1.0.0" - peerDependencies: - postcss: ^8.4 - checksum: 10c0/38f770454d46bfed01d43a3f5e7ac07d3111399b374a7198ae6503cdb6288e410c7b4199f5a7af8f16aeb688216445ade97be417c084313d6c56f55e50d34559 - languageName: node - linkType: hard - -"@csstools/postcss-progressive-custom-properties@npm:^4.2.1": - version: 4.2.1 - resolution: "@csstools/postcss-progressive-custom-properties@npm:4.2.1" - dependencies: - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.4 - checksum: 10c0/56e9a147799719fd5c550c035437693dd50cdfef46d66a4f2ce8f196e1006a096aa47d412710a89c3dc9808068a0a101c7f607a507ed68e925580c6f921e84d5 - languageName: node - linkType: hard - -"@csstools/postcss-property-rule-prelude-list@npm:^1.0.0": - version: 1.0.0 - resolution: "@csstools/postcss-property-rule-prelude-list@npm:1.0.0" - dependencies: - "@csstools/css-parser-algorithms": "npm:^3.0.5" - "@csstools/css-tokenizer": "npm:^3.0.4" - peerDependencies: - postcss: ^8.4 - checksum: 10c0/ae8bbca3a77ca59c21c11899a904f9d9417a19a3359d01dee042e0489b7ddfe7cea13ae275b7e7936d9b0b99c0a13f7f685f962cd63ca3d3d2b6e5eacc293a0d - languageName: node - linkType: hard - -"@csstools/postcss-random-function@npm:^2.0.1": - version: 2.0.1 - resolution: "@csstools/postcss-random-function@npm:2.0.1" - dependencies: - "@csstools/css-calc": "npm:^2.1.4" - "@csstools/css-parser-algorithms": "npm:^3.0.5" - "@csstools/css-tokenizer": "npm:^3.0.4" - peerDependencies: - postcss: ^8.4 - checksum: 10c0/475bacf685b8bb82942d388e9e3b95f4156800f370299f19f5acc490475dc2813100de81a5a6bf48b696b4d83247622005b616af3166a668556b4b1aceded70d - languageName: node - linkType: hard - -"@csstools/postcss-relative-color-syntax@npm:^3.0.12": - version: 3.0.12 - resolution: "@csstools/postcss-relative-color-syntax@npm:3.0.12" - dependencies: - "@csstools/css-color-parser": "npm:^3.1.0" - "@csstools/css-parser-algorithms": "npm:^3.0.5" - "@csstools/css-tokenizer": "npm:^3.0.4" - "@csstools/postcss-progressive-custom-properties": "npm:^4.2.1" - "@csstools/utilities": "npm:^2.0.0" - peerDependencies: - postcss: ^8.4 - checksum: 10c0/11af386c8193e22c148ac034eee94c56da3060bdbde3196d2d641b088e12de35bef187bcd7d421f9e4d49c4f1cfc28b24e136e62107e02ed7007a3a28f635d06 - languageName: node - linkType: hard - -"@csstools/postcss-scope-pseudo-class@npm:^4.0.1": - version: 4.0.1 - resolution: "@csstools/postcss-scope-pseudo-class@npm:4.0.1" - dependencies: - postcss-selector-parser: "npm:^7.0.0" - peerDependencies: - postcss: ^8.4 - checksum: 10c0/6a0ca50fae655f4498200d1ce298ca794c85fbe2e3fd5d6419843254f055df5007a973e09b5f1e78e376c02b54278e411516c8d824300c68b265d3e5b311d7ee - languageName: node - linkType: hard - -"@csstools/postcss-sign-functions@npm:^1.1.4": - version: 1.1.4 - resolution: "@csstools/postcss-sign-functions@npm:1.1.4" - dependencies: - "@csstools/css-calc": "npm:^2.1.4" - "@csstools/css-parser-algorithms": "npm:^3.0.5" - "@csstools/css-tokenizer": "npm:^3.0.4" - peerDependencies: - postcss: ^8.4 - checksum: 10c0/ff58108b2527832a84c571a1f40224b5c8d2afa8db2fe3b1e3599ff6f3469d9f4c528a70eb3c25c5d7801e30474fabfec04e7c23bfdad8572ad492053cd4f899 - languageName: node - linkType: hard - -"@csstools/postcss-stepped-value-functions@npm:^4.0.9": - version: 4.0.9 - resolution: "@csstools/postcss-stepped-value-functions@npm:4.0.9" - dependencies: - "@csstools/css-calc": "npm:^2.1.4" - "@csstools/css-parser-algorithms": "npm:^3.0.5" - "@csstools/css-tokenizer": "npm:^3.0.4" - peerDependencies: - postcss: ^8.4 - checksum: 10c0/f143ca06338c30abb2aa37adc3d7e43a78f3b4493093160cb5babe3ec8cf6b86d83876746ee8e162db87b5e9af6e0066958d89fe8b4a503a29568e5c57c1bf8a - languageName: node - linkType: hard - -"@csstools/postcss-syntax-descriptor-syntax-production@npm:^1.0.1": - version: 1.0.1 - resolution: "@csstools/postcss-syntax-descriptor-syntax-production@npm:1.0.1" - dependencies: - "@csstools/css-tokenizer": "npm:^3.0.4" - peerDependencies: - postcss: ^8.4 - checksum: 10c0/b9b3d84a50b86b1af1b8b7e56a64d5eebc1c89c323a5263306c5c69ddb05a4d468d7072a7786b0ea6601629035df0089565e9d98d55d0f4eb7201cf7ed1bb3e9 - languageName: node - linkType: hard - -"@csstools/postcss-system-ui-font-family@npm:^1.0.0": - version: 1.0.0 - resolution: "@csstools/postcss-system-ui-font-family@npm:1.0.0" - dependencies: - "@csstools/css-parser-algorithms": "npm:^3.0.5" - "@csstools/css-tokenizer": "npm:^3.0.4" - peerDependencies: - postcss: ^8.4 - checksum: 10c0/6a81761ae3cae643659b1416a7a892cf1505474896193b8abc26cff319cb6b1a20b64c5330d64019fba458e058da3abc9407d0ebf0c102289c0b79ef99b4c6d6 - languageName: node - linkType: hard - -"@csstools/postcss-text-decoration-shorthand@npm:^4.0.3": - version: 4.0.3 - resolution: "@csstools/postcss-text-decoration-shorthand@npm:4.0.3" - dependencies: - "@csstools/color-helpers": "npm:^5.1.0" - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.4 - checksum: 10c0/f6af7d5dcf599edcf76c5e396ef2d372bbe1c1f3fbaaccd91e91049e64b6ff68b44f459277aef0a8110baca3eaa21275012adc52ccb8c0fc526a4c35577f8fce - languageName: node - linkType: hard - -"@csstools/postcss-trigonometric-functions@npm:^4.0.9": - version: 4.0.9 - resolution: "@csstools/postcss-trigonometric-functions@npm:4.0.9" - dependencies: - "@csstools/css-calc": "npm:^2.1.4" - "@csstools/css-parser-algorithms": "npm:^3.0.5" - "@csstools/css-tokenizer": "npm:^3.0.4" - peerDependencies: - postcss: ^8.4 - checksum: 10c0/6ba3d381c977c224f01d47a36f78c9b99d3b89d060a357a9f8840537fdf497d9587a28165dc74e96abdf02f8db0a277d3558646355085a74c8915ee73c6780d1 - languageName: node - linkType: hard - -"@csstools/postcss-unset-value@npm:^4.0.0": +"@csstools/postcss-logical-resize@npm:^4.0.0": version: 4.0.0 - resolution: "@csstools/postcss-unset-value@npm:4.0.0" + resolution: "@csstools/postcss-logical-resize@npm:4.0.0" + dependencies: + postcss-value-parser: "npm:^4.2.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/8424ac700ded5bf59d49310335896f10c069e2c3fc6a676b5d13ca5a6fb78689b948f50494df875da284c4c76651deb005eafba70d87e693274628c5a685abfa + checksum: 10c0/b9a7eb1ecb1637dac76c957e05f3579e390514d3e93245b5e0a3764542e7875c89811c3526548d466a2fdf76f1cd1a8fadb62c536b3d2521d4310a2f143e405e languageName: node linkType: hard -"@csstools/selector-resolve-nested@npm:^3.1.0": - version: 3.1.0 - resolution: "@csstools/selector-resolve-nested@npm:3.1.0" +"@csstools/postcss-logical-viewport-units@npm:^4.0.0": + version: 4.0.0 + resolution: "@csstools/postcss-logical-viewport-units@npm:4.0.0" + dependencies: + "@csstools/css-tokenizer": "npm:^4.0.0" + "@csstools/utilities": "npm:^3.0.0" peerDependencies: - postcss-selector-parser: ^7.0.0 - checksum: 10c0/c2b1a930ad03c1427ab90b28c4940424fb39e8175130148f16209be3a3937f7a146d5483ca1da1dfc100aa7ae86df713f0ee82d4bbaa9b986e7f47f35cb67cca + postcss: ^8.4 + checksum: 10c0/1213ee92b5d9aad68c65478d4243dbd1bd75b88090edec18e1ebaf0aa38459a53609b9aa0e8c48070d546a1c873b1de94a5449fa173a3440334a3ba366c14549 + languageName: node + linkType: hard + +"@csstools/postcss-media-minmax@npm:^3.0.0": + version: 3.0.0 + resolution: "@csstools/postcss-media-minmax@npm:3.0.0" + dependencies: + "@csstools/css-calc": "npm:^3.0.0" + "@csstools/css-parser-algorithms": "npm:^4.0.0" + "@csstools/css-tokenizer": "npm:^4.0.0" + "@csstools/media-query-list-parser": "npm:^5.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/0b03ab1ad162d53eef69470246025d01390cc84d2cb0983ffaf09c47bb3d27951e4794638430e778c737cf57c891f834adf3be08fcd5a84c4f6698a03ee9be4a + languageName: node + linkType: hard + +"@csstools/postcss-media-queries-aspect-ratio-number-values@npm:^4.0.0": + version: 4.0.0 + resolution: "@csstools/postcss-media-queries-aspect-ratio-number-values@npm:4.0.0" + dependencies: + "@csstools/css-parser-algorithms": "npm:^4.0.0" + "@csstools/css-tokenizer": "npm:^4.0.0" + "@csstools/media-query-list-parser": "npm:^5.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/80397e21d16f443445d03b79171c5c5444ef0e921a6eb1e0419eec24150bd9112469e2e9825aaf0612fa98d05fb0a50cf09f09c2b86d01a238229f205c15d2b2 + languageName: node + linkType: hard + +"@csstools/postcss-nested-calc@npm:^5.0.0": + version: 5.0.0 + resolution: "@csstools/postcss-nested-calc@npm:5.0.0" + dependencies: + "@csstools/utilities": "npm:^3.0.0" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/57764637a4855e941ab9360e1b4603e1fa0a29043148b67b80629d12ae4c93b4d2f156069826c4b8100ad3a90552744424b9a1e05710fe9b6958e1a817e6e07e + languageName: node + linkType: hard + +"@csstools/postcss-normalize-display-values@npm:^5.0.0": + version: 5.0.0 + resolution: "@csstools/postcss-normalize-display-values@npm:5.0.0" + dependencies: + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/d43a2658604bdd037ab1516bffadea4db3224390838f5096fccdfbae12a2db08e56ca576724a0279968e6af39419e5fe2963632754dd0956fda2d01b848cf97e + languageName: node + linkType: hard + +"@csstools/postcss-oklab-function@npm:^5.0.0": + version: 5.0.0 + resolution: "@csstools/postcss-oklab-function@npm:5.0.0" + dependencies: + "@csstools/css-color-parser": "npm:^4.0.0" + "@csstools/css-parser-algorithms": "npm:^4.0.0" + "@csstools/css-tokenizer": "npm:^4.0.0" + "@csstools/postcss-progressive-custom-properties": "npm:^5.0.0" + "@csstools/utilities": "npm:^3.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/af3413b1667be101f39b15b9528a57ff764e5abcf80578590b95c27c42a493ed9dcd2927834371d211b025c5d5df103cded6f2def98c9c79301f76ca379d7dbf + languageName: node + linkType: hard + +"@csstools/postcss-position-area-property@npm:^2.0.0": + version: 2.0.0 + resolution: "@csstools/postcss-position-area-property@npm:2.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/54b9a97a9ef636dfc8b62cdabb7d194438c6f510effdff4339073626446c078033d475dfec8c82fdbcf25745fb05caafffc9512e3be7ff53ced55f1d38d2da6a + languageName: node + linkType: hard + +"@csstools/postcss-progressive-custom-properties@npm:^5.0.0": + version: 5.0.0 + resolution: "@csstools/postcss-progressive-custom-properties@npm:5.0.0" + dependencies: + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/8476a58b777e7015f40fea53829d31429c8bab114b884b87c1706b5df095102232fb46b275a76c719f73399d3dbdfec2c172fb68c2fb362dbe68569446366a1a + languageName: node + linkType: hard + +"@csstools/postcss-property-rule-prelude-list@npm:^2.0.0": + version: 2.0.0 + resolution: "@csstools/postcss-property-rule-prelude-list@npm:2.0.0" + dependencies: + "@csstools/css-parser-algorithms": "npm:^4.0.0" + "@csstools/css-tokenizer": "npm:^4.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/6ce0c962391b27966fba1623bca2dacc61fb7b1c9916f08d17256a800b0f8476d34835d50cb2ed77bdc4e920e4be5dddc1569c7e5140895e7b0076694d769182 + languageName: node + linkType: hard + +"@csstools/postcss-random-function@npm:^3.0.0": + version: 3.0.0 + resolution: "@csstools/postcss-random-function@npm:3.0.0" + dependencies: + "@csstools/css-calc": "npm:^3.0.0" + "@csstools/css-parser-algorithms": "npm:^4.0.0" + "@csstools/css-tokenizer": "npm:^4.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/bf9b8836ce3eafd670bfb9fa16d3befde8827ad220edc80eb4301fa716c1a4ff444254ab7612a6f6f952d16d3ac6d6e594448dcdd860f6ca8b575ffe59946864 + languageName: node + linkType: hard + +"@csstools/postcss-relative-color-syntax@npm:^4.0.0": + version: 4.0.0 + resolution: "@csstools/postcss-relative-color-syntax@npm:4.0.0" + dependencies: + "@csstools/css-color-parser": "npm:^4.0.0" + "@csstools/css-parser-algorithms": "npm:^4.0.0" + "@csstools/css-tokenizer": "npm:^4.0.0" + "@csstools/postcss-progressive-custom-properties": "npm:^5.0.0" + "@csstools/utilities": "npm:^3.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/52f21acc66a0aa591d99173b9813f0b9f375de462bc657e909916ed176590b8d530a2eff83e71da488e2c8f476f0397d4a79bb7b7ef13664176d9e744a49510a + languageName: node + linkType: hard + +"@csstools/postcss-scope-pseudo-class@npm:^5.0.0": + version: 5.0.0 + resolution: "@csstools/postcss-scope-pseudo-class@npm:5.0.0" + dependencies: + postcss-selector-parser: "npm:^7.1.1" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/2b67bd6af9a1175ca47c6593ee73564d70cb39c1adc9ffc5099ba513b49055994786c60687b44d88beccd09f1a6196e5e9157fd439632ae34381a60adaef5246 + languageName: node + linkType: hard + +"@csstools/postcss-sign-functions@npm:^2.0.0": + version: 2.0.0 + resolution: "@csstools/postcss-sign-functions@npm:2.0.0" + dependencies: + "@csstools/css-calc": "npm:^3.0.0" + "@csstools/css-parser-algorithms": "npm:^4.0.0" + "@csstools/css-tokenizer": "npm:^4.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/e5239e012e78cfcb244e8599d93700bbbcd15fd78e4a71f8bd5296022bd1d1ead750689bdacc35a47d2061729dd727e2fb1a185bee0620a62b64e4ee3434861e + languageName: node + linkType: hard + +"@csstools/postcss-stepped-value-functions@npm:^5.0.0": + version: 5.0.0 + resolution: "@csstools/postcss-stepped-value-functions@npm:5.0.0" + dependencies: + "@csstools/css-calc": "npm:^3.0.0" + "@csstools/css-parser-algorithms": "npm:^4.0.0" + "@csstools/css-tokenizer": "npm:^4.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/a8354fa0f4b74def1c258bf267c00d029f65618ccebb9c14837522f11eeb6b673717b56720588d5fec7bd07036ed84826dea01c44e9a085ae7af78a2b4ea7ec0 + languageName: node + linkType: hard + +"@csstools/postcss-syntax-descriptor-syntax-production@npm:^2.0.0": + version: 2.0.0 + resolution: "@csstools/postcss-syntax-descriptor-syntax-production@npm:2.0.0" + dependencies: + "@csstools/css-tokenizer": "npm:^4.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/0c9ef2f5cd21079db1df497adf99a3d66c912f69c471dd89283a1b8ed3a9c4e7670bfa439b615ac27acd86ce2e1adf4a5eb7b551113ecf5e95ee77269446bbbe + languageName: node + linkType: hard + +"@csstools/postcss-system-ui-font-family@npm:^2.0.0": + version: 2.0.0 + resolution: "@csstools/postcss-system-ui-font-family@npm:2.0.0" + dependencies: + "@csstools/css-parser-algorithms": "npm:^4.0.0" + "@csstools/css-tokenizer": "npm:^4.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/e4f59c093565ed3753f3561a754fe3c0c8152a3b25f184cb370fa5cb1e9b54ad62fe53f7886ed840d445201120197ae6d42c6266ef4d5cfd063226f95c433c06 + languageName: node + linkType: hard + +"@csstools/postcss-text-decoration-shorthand@npm:^5.0.0": + version: 5.0.0 + resolution: "@csstools/postcss-text-decoration-shorthand@npm:5.0.0" + dependencies: + "@csstools/color-helpers": "npm:^6.0.0" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/0d1dc47da13adc1f0863017a3448f3a79774f00f1952fc2bfc09404b00b03d125b54dedce036e0e5c73a6f2a64cdabe702e9bc03dc6b88d3b71a6424cd0cec80 + languageName: node + linkType: hard + +"@csstools/postcss-trigonometric-functions@npm:^5.0.0": + version: 5.0.0 + resolution: "@csstools/postcss-trigonometric-functions@npm:5.0.0" + dependencies: + "@csstools/css-calc": "npm:^3.0.0" + "@csstools/css-parser-algorithms": "npm:^4.0.0" + "@csstools/css-tokenizer": "npm:^4.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/8b2e149f4fb8ac1bc7a642c99265df7f54729fbace29cde24f65078c0d97e9050e75576ef55b869ab78fbb94a2408adae2bc6f3ced759fca96519c6ceb92cc20 + languageName: node + linkType: hard + +"@csstools/postcss-unset-value@npm:^5.0.0": + version: 5.0.0 + resolution: "@csstools/postcss-unset-value@npm:5.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/21e26cccf7824e4366378a20bc043034105db654632b941f77a0cbbf4fe0de291d1ae94845280c08c8d851ae14ce6d07bc09a33c5fbbcb7ce1f21b10212df1f1 + languageName: node + linkType: hard + +"@csstools/selector-resolve-nested@npm:^4.0.0": + version: 4.0.0 + resolution: "@csstools/selector-resolve-nested@npm:4.0.0" + peerDependencies: + postcss-selector-parser: ^7.1.1 + checksum: 10c0/f6bccfe24a47c3e55710d421740550b868bbe7f0820f32d14d1eb737eefe7ec26261fb726cc5cfdf8236b3173d0a657ebdc9602e0c53824603f719b14a76bcaf languageName: node linkType: hard @@ -1849,6 +1905,15 @@ __metadata: languageName: node linkType: hard +"@csstools/selector-specificity@npm:^6.0.0": + version: 6.0.0 + resolution: "@csstools/selector-specificity@npm:6.0.0" + peerDependencies: + postcss-selector-parser: ^7.1.1 + checksum: 10c0/7a93973f9054f2e1f03c8543cde68e0b0c65e5e72da6e4e959974d28fe809e11bd2afa1ff2ca11a1690a4c9a2f2bbe00d00e2b07fb2108bf89c5e48fe441c432 + languageName: node + linkType: hard + "@csstools/stylelint-formatter-github@npm:^1.0.0": version: 1.0.0 resolution: "@csstools/stylelint-formatter-github@npm:1.0.0" @@ -1858,12 +1923,12 @@ __metadata: languageName: node linkType: hard -"@csstools/utilities@npm:^2.0.0": - version: 2.0.0 - resolution: "@csstools/utilities@npm:2.0.0" +"@csstools/utilities@npm:^3.0.0": + version: 3.0.0 + resolution: "@csstools/utilities@npm:3.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/be5c31437b726928f64cd4bb3e47f5b90bfd2e2a69a8eaabd8e89cc6c0977e4f0f7ee48de50c8ed8b07e04e3956a02293247e0da3236d521fb2e836f88f65822 + checksum: 10c0/65b6f6aa4ea899777bea710aab5f17028aa5e1aa41f7fe892c2e916b188da2b929c76be643d4a5d8d9ca5a7853df94f05c0247dd6b63540b360055d36db3104f languageName: node linkType: hard @@ -2883,7 +2948,7 @@ __metadata: msw-storybook-addon: "npm:^2.0.6" path-complete-extname: "npm:^1.0.0" playwright: "npm:^1.57.0" - postcss-preset-env: "npm:^10.1.5" + postcss-preset-env: "npm:^11.0.0" prettier: "npm:^3.3.3" prop-types: "npm:^15.8.1" punycode: "npm:^2.3.0" @@ -6228,14 +6293,14 @@ __metadata: languageName: node linkType: hard -"css-blank-pseudo@npm:^7.0.1": - version: 7.0.1 - resolution: "css-blank-pseudo@npm:7.0.1" +"css-blank-pseudo@npm:^8.0.1": + version: 8.0.1 + resolution: "css-blank-pseudo@npm:8.0.1" dependencies: - postcss-selector-parser: "npm:^7.0.0" + postcss-selector-parser: "npm:^7.1.1" peerDependencies: postcss: ^8.4 - checksum: 10c0/46c3d3a611972fdb0c264db7c0b34fe437bc4300961d11945145cf04962f52a545a6ef55bc8ff4afd82b605bd692b4970f2b54582616dea00441105e725d4618 + checksum: 10c0/851d38cb3e11a63db4a0f44751cde99d6825bb11adc78418e8e83f32f0a3dcc3245e6e4b5053e796635560a1224af8ae63dfe330f87175fcc7bf34a1af3ecddc languageName: node linkType: hard @@ -6246,25 +6311,25 @@ __metadata: languageName: node linkType: hard -"css-has-pseudo@npm:^7.0.3": - version: 7.0.3 - resolution: "css-has-pseudo@npm:7.0.3" +"css-has-pseudo@npm:^8.0.0": + version: 8.0.0 + resolution: "css-has-pseudo@npm:8.0.0" dependencies: - "@csstools/selector-specificity": "npm:^5.0.0" - postcss-selector-parser: "npm:^7.0.0" + "@csstools/selector-specificity": "npm:^6.0.0" + postcss-selector-parser: "npm:^7.1.1" postcss-value-parser: "npm:^4.2.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/c89f68e17bed229e9a3e98da5032e1360c83d45d974bc3fb8d6b5358399bca80cce7929e4a621a516a75536edb78678dc486eb41841eeed28cca79e3be4bdc27 + checksum: 10c0/fb623c09d3cb1d5ec029c61b5a24484ee712fbd20bffae37a20a2843917706cadb1c4d695585382e4839dde136922ffee6924ec83f633dde2e2afc6d77a26be8 languageName: node linkType: hard -"css-prefers-color-scheme@npm:^10.0.0": - version: 10.0.0 - resolution: "css-prefers-color-scheme@npm:10.0.0" +"css-prefers-color-scheme@npm:^11.0.0": + version: 11.0.0 + resolution: "css-prefers-color-scheme@npm:11.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/a66c727bb2455328b18862f720819fc98ff5c1486b69f758bdb5c66f46cc6d484f9fc0bfa4f00f2693c5da6707ad136ca789496982f713ade693f08af624930e + checksum: 10c0/dea9f17cc33b5bedb660ed3925a53c9034bd5f4f94222d3b6df1dffd011061c124800dfc3bbeb1136fd69e84be577c63ac3da9220e175ea10b49275d7d0ada40 languageName: node linkType: hard @@ -10689,14 +10754,14 @@ __metadata: languageName: node linkType: hard -"postcss-attribute-case-insensitive@npm:^7.0.1": - version: 7.0.1 - resolution: "postcss-attribute-case-insensitive@npm:7.0.1" +"postcss-attribute-case-insensitive@npm:^8.0.0": + version: 8.0.0 + resolution: "postcss-attribute-case-insensitive@npm:8.0.0" dependencies: - postcss-selector-parser: "npm:^7.0.0" + postcss-selector-parser: "npm:^7.1.1" peerDependencies: postcss: ^8.4 - checksum: 10c0/48945abe2024e2d2e4c37d30b8c1aaf37af720f24f6a996f7ea7e7ed33621f5c22cf247ed22028c0c922de040c58c0802729bc39b903cb1693f4b63c0b49da34 + checksum: 10c0/d6442d1580a3ec5083ff41435e8423dfe9c5b3b65b610e082769d27f11b98e0699d5361f7e9a9e499805c0a78d83a8aec3dd9f9d9280636cca82ec1aea79e928 languageName: node linkType: hard @@ -10711,131 +10776,131 @@ __metadata: languageName: node linkType: hard -"postcss-color-functional-notation@npm:^7.0.12": - version: 7.0.12 - resolution: "postcss-color-functional-notation@npm:7.0.12" +"postcss-color-functional-notation@npm:^8.0.0": + version: 8.0.0 + resolution: "postcss-color-functional-notation@npm:8.0.0" dependencies: - "@csstools/css-color-parser": "npm:^3.1.0" - "@csstools/css-parser-algorithms": "npm:^3.0.5" - "@csstools/css-tokenizer": "npm:^3.0.4" - "@csstools/postcss-progressive-custom-properties": "npm:^4.2.1" - "@csstools/utilities": "npm:^2.0.0" + "@csstools/css-color-parser": "npm:^4.0.0" + "@csstools/css-parser-algorithms": "npm:^4.0.0" + "@csstools/css-tokenizer": "npm:^4.0.0" + "@csstools/postcss-progressive-custom-properties": "npm:^5.0.0" + "@csstools/utilities": "npm:^3.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/dc80ba1a956ae9b396596bda72d9bdb92de96874378a38ba4e2177ffa35339dc76d894920bb013b6f10c9b75cfb41778e09956a438c2e9ea41b684f766c55f4a + checksum: 10c0/4b23633475b57f5d0076340ab4f434506891b5a25254d077215c08d08bbdab369484488bbc249595618730afea3546329e5633cc9e119f31c756b1c224dd0300 languageName: node linkType: hard -"postcss-color-hex-alpha@npm:^10.0.0": +"postcss-color-hex-alpha@npm:^11.0.0": + version: 11.0.0 + resolution: "postcss-color-hex-alpha@npm:11.0.0" + dependencies: + "@csstools/utilities": "npm:^3.0.0" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/375509c404b0ac496f66bf0910d12e5aabca058c0d9de9d10719e9a0729013d5f4fafd06d8c8073b2d68613b3346e8ff79ef223a5ce4ddf0d4c4f645fd7a5436 + languageName: node + linkType: hard + +"postcss-color-rebeccapurple@npm:^11.0.0": + version: 11.0.0 + resolution: "postcss-color-rebeccapurple@npm:11.0.0" + dependencies: + "@csstools/utilities": "npm:^3.0.0" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/9f22fff4ce2f0d7ce07be2ba2d07697e24f7db83a6252f02f36aa3a556cf69e1346a3cbab3908264e267306cc5a79b5d95c21e6fa4257a68c13c7411224543b9 + languageName: node + linkType: hard + +"postcss-custom-media@npm:^12.0.0": + version: 12.0.0 + resolution: "postcss-custom-media@npm:12.0.0" + dependencies: + "@csstools/cascade-layer-name-parser": "npm:^3.0.0" + "@csstools/css-parser-algorithms": "npm:^4.0.0" + "@csstools/css-tokenizer": "npm:^4.0.0" + "@csstools/media-query-list-parser": "npm:^5.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/bf1f3939d83a24eb7ef86f9fc2cb799026d4dc4620d3769eef9234d23fd528c73e907c2b88cb239290d169e5ddf8f0624cf8b22084874953c224e6000d55bf50 + languageName: node + linkType: hard + +"postcss-custom-properties@npm:^15.0.0": + version: 15.0.0 + resolution: "postcss-custom-properties@npm:15.0.0" + dependencies: + "@csstools/cascade-layer-name-parser": "npm:^3.0.0" + "@csstools/css-parser-algorithms": "npm:^4.0.0" + "@csstools/css-tokenizer": "npm:^4.0.0" + "@csstools/utilities": "npm:^3.0.0" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/d766f1632075f8db2cd5075967cc4397c46b59699dd7a70762d9bd3e1ff91d3ada167b4f79e7e254518cdaae8d71645cd92faeb89559175ed50337c0acf5b0b4 + languageName: node + linkType: hard + +"postcss-custom-selectors@npm:^9.0.0": + version: 9.0.0 + resolution: "postcss-custom-selectors@npm:9.0.0" + dependencies: + "@csstools/cascade-layer-name-parser": "npm:^3.0.0" + "@csstools/css-parser-algorithms": "npm:^4.0.0" + "@csstools/css-tokenizer": "npm:^4.0.0" + postcss-selector-parser: "npm:^7.1.1" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/a99d87639e8bca0a3eebd910356cecd67a4153789a77e15604db68caee415e64bc90d3e58a8322ed3d37addb80574a1180e58d603ac6541364b373b322e7de9f + languageName: node + linkType: hard + +"postcss-dir-pseudo-class@npm:^10.0.0": version: 10.0.0 - resolution: "postcss-color-hex-alpha@npm:10.0.0" + resolution: "postcss-dir-pseudo-class@npm:10.0.0" dependencies: - "@csstools/utilities": "npm:^2.0.0" - postcss-value-parser: "npm:^4.2.0" + postcss-selector-parser: "npm:^7.1.1" peerDependencies: postcss: ^8.4 - checksum: 10c0/8a6dcb27403d04b55d6de88bf3074622bcea537fc4436bbcb346e92289c4d17059444e2e6c3554c325e7a777bb4cdc711e764a83123b4000aec211052e957d5b + checksum: 10c0/c7cae0b4e96bf0e51845c20b6fae7eec7b428b569b4fbae639b4f1f3b16a0ced4f5610ffb0209484ba4dfc8858abc64a9577cc8d2e3f1dbf3154f4ed0eb07669 languageName: node linkType: hard -"postcss-color-rebeccapurple@npm:^10.0.0": +"postcss-double-position-gradients@npm:^7.0.0": + version: 7.0.0 + resolution: "postcss-double-position-gradients@npm:7.0.0" + dependencies: + "@csstools/postcss-progressive-custom-properties": "npm:^5.0.0" + "@csstools/utilities": "npm:^3.0.0" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/0a9a1c567c79ddbe7bbeafe9770f2393d4d0eb344a79a2823dc5944690d74c311841ff6fd533b823d282029eff07418eeb671fabc85db6414ace48cce37223e8 + languageName: node + linkType: hard + +"postcss-focus-visible@npm:^11.0.0": + version: 11.0.0 + resolution: "postcss-focus-visible@npm:11.0.0" + dependencies: + postcss-selector-parser: "npm:^7.1.1" + peerDependencies: + postcss: ^8.4 + checksum: 10c0/001cdfb200fe83b25a0fdbb7315b70fcf91c71d0134e16d48334fc7eab3d41c7cd3b8fe7bb8201a0ef9f242afb10f71aed238715a1d6923f68a02e6dc4219916 + languageName: node + linkType: hard + +"postcss-focus-within@npm:^10.0.0": version: 10.0.0 - resolution: "postcss-color-rebeccapurple@npm:10.0.0" + resolution: "postcss-focus-within@npm:10.0.0" dependencies: - "@csstools/utilities": "npm:^2.0.0" - postcss-value-parser: "npm:^4.2.0" + postcss-selector-parser: "npm:^7.1.1" peerDependencies: postcss: ^8.4 - checksum: 10c0/308e33f76f2b48c1c2121d4502fc053e869f3415898de7d30314353df680e79b37497e7b628e3447edc1049091da3672f7d891e45604f238598e846e06b893ed - languageName: node - linkType: hard - -"postcss-custom-media@npm:^11.0.6": - version: 11.0.6 - resolution: "postcss-custom-media@npm:11.0.6" - dependencies: - "@csstools/cascade-layer-name-parser": "npm:^2.0.5" - "@csstools/css-parser-algorithms": "npm:^3.0.5" - "@csstools/css-tokenizer": "npm:^3.0.4" - "@csstools/media-query-list-parser": "npm:^4.0.3" - peerDependencies: - postcss: ^8.4 - checksum: 10c0/62dcb2858fd490d90aab32062621d58892a7b2a54948ee63af81a2cd61807a11815d28d4ef6bc800c5e142ac73098f7e56822c7cc63192eb20d5b16071543a73 - languageName: node - linkType: hard - -"postcss-custom-properties@npm:^14.0.6": - version: 14.0.6 - resolution: "postcss-custom-properties@npm:14.0.6" - dependencies: - "@csstools/cascade-layer-name-parser": "npm:^2.0.5" - "@csstools/css-parser-algorithms": "npm:^3.0.5" - "@csstools/css-tokenizer": "npm:^3.0.4" - "@csstools/utilities": "npm:^2.0.0" - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.4 - checksum: 10c0/0eeef77bc713551f5cb8fa5982d24da4e854075f3af020f1c94366c47a23a4cc225ebfecc978bdb17f00ee0bdee9d2c784e0d01adc64a447321e408abbe2c83b - languageName: node - linkType: hard - -"postcss-custom-selectors@npm:^8.0.5": - version: 8.0.5 - resolution: "postcss-custom-selectors@npm:8.0.5" - dependencies: - "@csstools/cascade-layer-name-parser": "npm:^2.0.5" - "@csstools/css-parser-algorithms": "npm:^3.0.5" - "@csstools/css-tokenizer": "npm:^3.0.4" - postcss-selector-parser: "npm:^7.0.0" - peerDependencies: - postcss: ^8.4 - checksum: 10c0/bd8f2f85bbec4bd56ff408cb699d9fe649e2af0db82d5752eee05481ae522f06f5a47950ca22fcb4c8601071c03346df67cf20b0b0bcade32ce58d07ebaf9b32 - languageName: node - linkType: hard - -"postcss-dir-pseudo-class@npm:^9.0.1": - version: 9.0.1 - resolution: "postcss-dir-pseudo-class@npm:9.0.1" - dependencies: - postcss-selector-parser: "npm:^7.0.0" - peerDependencies: - postcss: ^8.4 - checksum: 10c0/da9d3387648c5c3161a653d354c8f3e70a299108df3977e8aa65cf10793e4dd58a2711b3426cd63716245b13584ca8d95adcd6e10e3c9adbc61d08743e2d8690 - languageName: node - linkType: hard - -"postcss-double-position-gradients@npm:^6.0.4": - version: 6.0.4 - resolution: "postcss-double-position-gradients@npm:6.0.4" - dependencies: - "@csstools/postcss-progressive-custom-properties": "npm:^4.2.1" - "@csstools/utilities": "npm:^2.0.0" - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.4 - checksum: 10c0/6dbbe7a3855e84a9319df434e210225f6dfa7262e5959611355f1769c2c9d30d37a19737712f20eac6354876fff4ba556d8d0b12a90c78d8ab97c9a8da534a7c - languageName: node - linkType: hard - -"postcss-focus-visible@npm:^10.0.1": - version: 10.0.1 - resolution: "postcss-focus-visible@npm:10.0.1" - dependencies: - postcss-selector-parser: "npm:^7.0.0" - peerDependencies: - postcss: ^8.4 - checksum: 10c0/c5ecc8536a708a49a99d0abd68a88a160664e6c832c808db8edd9f0221e7017a258daa87e49daf2cb098cb037005d46cf492403c8c9c92ad8835d30adaccf665 - languageName: node - linkType: hard - -"postcss-focus-within@npm:^9.0.1": - version: 9.0.1 - resolution: "postcss-focus-within@npm:9.0.1" - dependencies: - postcss-selector-parser: "npm:^7.0.0" - peerDependencies: - postcss: ^8.4 - checksum: 10c0/d6ab49d2a7f33485a9e137dc77ec92c5619a3ec92e1e672734fc604853ff1f3c0c189085c12461614be4fcb03ea0347d91791a45986a18d50b5228d161eda57a + checksum: 10c0/297ba52c07ba9284e7bf862e23ce90312bc2068d005a3c95833d832462691fac276850dd5508228fc808ec5f2963cb61a8b510645e08b78a74a9aaff9a79b02b languageName: node linkType: hard @@ -10848,39 +10913,39 @@ __metadata: languageName: node linkType: hard -"postcss-gap-properties@npm:^6.0.0": - version: 6.0.0 - resolution: "postcss-gap-properties@npm:6.0.0" +"postcss-gap-properties@npm:^7.0.0": + version: 7.0.0 + resolution: "postcss-gap-properties@npm:7.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/4e07e0d3927d0e65d67eaf047ac39e08d39cb1bf74e16e10c7df7f0d01b184a77ea59f63fd5691b5ed6df159970b972db28cb784d883e26e981137696460897d + checksum: 10c0/c93a0d15d40a7ae474a1bf05bd8f77410c6a353c7ea3bbad3aa61c38f6471d9bf23bac738aa1b3ca58805a33a730a4e6d15b7d03e0d2f1a29ef70969c14b483d languageName: node linkType: hard -"postcss-image-set-function@npm:^7.0.0": - version: 7.0.0 - resolution: "postcss-image-set-function@npm:7.0.0" +"postcss-image-set-function@npm:^8.0.0": + version: 8.0.0 + resolution: "postcss-image-set-function@npm:8.0.0" dependencies: - "@csstools/utilities": "npm:^2.0.0" + "@csstools/utilities": "npm:^3.0.0" postcss-value-parser: "npm:^4.2.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/913fd9492f00122aa0c2550fb0d72130428cbe1e6465bc65e8fe71e9deb10ac0c01d7caceb68b560da759139e8cbc6c90ed22dfe6cf34949af49bb86bcbf4d3a + checksum: 10c0/b2c527d8731c97f09e79ab477069138eba994a656473f57e1afd2480b18cd54cdb6600888e44d208b11efae01c123bc81629ecb77d8ed19397bc2a4b8da6da52 languageName: node linkType: hard -"postcss-lab-function@npm:^7.0.12": - version: 7.0.12 - resolution: "postcss-lab-function@npm:7.0.12" +"postcss-lab-function@npm:^8.0.0": + version: 8.0.0 + resolution: "postcss-lab-function@npm:8.0.0" dependencies: - "@csstools/css-color-parser": "npm:^3.1.0" - "@csstools/css-parser-algorithms": "npm:^3.0.5" - "@csstools/css-tokenizer": "npm:^3.0.4" - "@csstools/postcss-progressive-custom-properties": "npm:^4.2.1" - "@csstools/utilities": "npm:^2.0.0" + "@csstools/css-color-parser": "npm:^4.0.0" + "@csstools/css-parser-algorithms": "npm:^4.0.0" + "@csstools/css-tokenizer": "npm:^4.0.0" + "@csstools/postcss-progressive-custom-properties": "npm:^5.0.0" + "@csstools/utilities": "npm:^3.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/de39b59da3b97c18d055d81fba68993e93253184ed76f103c888273584f868c551d047814dd54445980a1bdc5987e8f8af141383d84ecc641e5a6ee7bd901095 + checksum: 10c0/8805a853016c5919afd95f7cbee9ba624f398d25c81a2a7987edc0d0031fee08732b02f64cb51f537f364b0de07fc837bb4bd375e0ea96a489860c59a94c0590 languageName: node linkType: hard @@ -10902,14 +10967,14 @@ __metadata: languageName: node linkType: hard -"postcss-logical@npm:^8.1.0": - version: 8.1.0 - resolution: "postcss-logical@npm:8.1.0" +"postcss-logical@npm:^9.0.0": + version: 9.0.0 + resolution: "postcss-logical@npm:9.0.0" dependencies: postcss-value-parser: "npm:^4.2.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/0e2e9e901d8a550db7f682d46b1f7e4f363c1ada061dc8e4548e2b563c5e39f3684a2d7c3f11fe061188782bca37874e34967fc6179fa6d98a49ff66a0076d27 + checksum: 10c0/058394f2234464b043249317b2c0a2271fa5194ada0f39afdb0f5b7e2ad172b1f24da7ae2641dfbd44d1ee98f5438844bc85d6005b881f691630381673707c32 languageName: node linkType: hard @@ -10953,16 +11018,16 @@ __metadata: languageName: node linkType: hard -"postcss-nesting@npm:^13.0.2": - version: 13.0.2 - resolution: "postcss-nesting@npm:13.0.2" +"postcss-nesting@npm:^14.0.0": + version: 14.0.0 + resolution: "postcss-nesting@npm:14.0.0" dependencies: - "@csstools/selector-resolve-nested": "npm:^3.1.0" - "@csstools/selector-specificity": "npm:^5.0.0" - postcss-selector-parser: "npm:^7.0.0" + "@csstools/selector-resolve-nested": "npm:^4.0.0" + "@csstools/selector-specificity": "npm:^6.0.0" + postcss-selector-parser: "npm:^7.1.1" peerDependencies: postcss: ^8.4 - checksum: 10c0/bfa0578b3b686c6374f5a7b2f6ef955cb7e13400de95a919975a982ae43c1e25db37385618f210715ff15393dc7ff8c26c7b156f06b8fb3118a426099cf7f1f2 + checksum: 10c0/ffa1799ed49759be7f09940614a8cfd06f15bd13e01a7eaabf788939c23a6b617ef281ae383f5b3b3078ddd6d78fd90624af164ea5a421698a1b0972cf14253c languageName: node linkType: hard @@ -10975,14 +11040,14 @@ __metadata: languageName: node linkType: hard -"postcss-overflow-shorthand@npm:^6.0.0": - version: 6.0.0 - resolution: "postcss-overflow-shorthand@npm:6.0.0" +"postcss-overflow-shorthand@npm:^7.0.0": + version: 7.0.0 + resolution: "postcss-overflow-shorthand@npm:7.0.0" dependencies: postcss-value-parser: "npm:^4.2.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/6598321b2ed0b68461135395bba9c7f76a4672617770df1e8487f459bc975f4ded6c3d37b6f72a44f4f77f7b6789e0c6f927e66dbbf1bcde1537167dbea39968 + checksum: 10c0/706430a2b1c28f361aad1d90e618c04c7ad7861971f2447fbd0e34c1d095bec0e5f4ed2857c98e05f5a7bcc694b7b763d08d5f515d5d45dd942f4b046593d638 languageName: node linkType: hard @@ -10995,106 +11060,106 @@ __metadata: languageName: node linkType: hard -"postcss-place@npm:^10.0.0": - version: 10.0.0 - resolution: "postcss-place@npm:10.0.0" +"postcss-place@npm:^11.0.0": + version: 11.0.0 + resolution: "postcss-place@npm:11.0.0" dependencies: postcss-value-parser: "npm:^4.2.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/ebb13deaac7648ba6042622375a31f78fbcc5209b7d196e478debbdf94525963fe621c932f4737a5b6b3d487af3b5ed6d059ed6193fdcbff6d3d5b150886ccc1 + checksum: 10c0/0b6b27426b198507583388a0e4f27552a136e5b9ccd1fc356dbd9a04c91e2bf6dcd680c3ad540ffc5aa1a63779467b9c7dc43d2164f83a0658505ca2408d79a9 languageName: node linkType: hard -"postcss-preset-env@npm:^10.1.5": - version: 10.6.1 - resolution: "postcss-preset-env@npm:10.6.1" +"postcss-preset-env@npm:^11.0.0": + version: 11.0.1 + resolution: "postcss-preset-env@npm:11.0.1" dependencies: - "@csstools/postcss-alpha-function": "npm:^1.0.1" - "@csstools/postcss-cascade-layers": "npm:^5.0.2" - "@csstools/postcss-color-function": "npm:^4.0.12" - "@csstools/postcss-color-function-display-p3-linear": "npm:^1.0.1" - "@csstools/postcss-color-mix-function": "npm:^3.0.12" - "@csstools/postcss-color-mix-variadic-function-arguments": "npm:^1.0.2" - "@csstools/postcss-content-alt-text": "npm:^2.0.8" - "@csstools/postcss-contrast-color-function": "npm:^2.0.12" - "@csstools/postcss-exponential-functions": "npm:^2.0.9" - "@csstools/postcss-font-format-keywords": "npm:^4.0.0" - "@csstools/postcss-gamut-mapping": "npm:^2.0.11" - "@csstools/postcss-gradients-interpolation-method": "npm:^5.0.12" - "@csstools/postcss-hwb-function": "npm:^4.0.12" - "@csstools/postcss-ic-unit": "npm:^4.0.4" - "@csstools/postcss-initial": "npm:^2.0.1" - "@csstools/postcss-is-pseudo-class": "npm:^5.0.3" - "@csstools/postcss-light-dark-function": "npm:^2.0.11" - "@csstools/postcss-logical-float-and-clear": "npm:^3.0.0" - "@csstools/postcss-logical-overflow": "npm:^2.0.0" - "@csstools/postcss-logical-overscroll-behavior": "npm:^2.0.0" - "@csstools/postcss-logical-resize": "npm:^3.0.0" - "@csstools/postcss-logical-viewport-units": "npm:^3.0.4" - "@csstools/postcss-media-minmax": "npm:^2.0.9" - "@csstools/postcss-media-queries-aspect-ratio-number-values": "npm:^3.0.5" - "@csstools/postcss-nested-calc": "npm:^4.0.0" - "@csstools/postcss-normalize-display-values": "npm:^4.0.1" - "@csstools/postcss-oklab-function": "npm:^4.0.12" - "@csstools/postcss-position-area-property": "npm:^1.0.0" - "@csstools/postcss-progressive-custom-properties": "npm:^4.2.1" - "@csstools/postcss-property-rule-prelude-list": "npm:^1.0.0" - "@csstools/postcss-random-function": "npm:^2.0.1" - "@csstools/postcss-relative-color-syntax": "npm:^3.0.12" - "@csstools/postcss-scope-pseudo-class": "npm:^4.0.1" - "@csstools/postcss-sign-functions": "npm:^1.1.4" - "@csstools/postcss-stepped-value-functions": "npm:^4.0.9" - "@csstools/postcss-syntax-descriptor-syntax-production": "npm:^1.0.1" - "@csstools/postcss-system-ui-font-family": "npm:^1.0.0" - "@csstools/postcss-text-decoration-shorthand": "npm:^4.0.3" - "@csstools/postcss-trigonometric-functions": "npm:^4.0.9" - "@csstools/postcss-unset-value": "npm:^4.0.0" + "@csstools/postcss-alpha-function": "npm:^2.0.0" + "@csstools/postcss-cascade-layers": "npm:^6.0.0" + "@csstools/postcss-color-function": "npm:^5.0.0" + "@csstools/postcss-color-function-display-p3-linear": "npm:^2.0.0" + "@csstools/postcss-color-mix-function": "npm:^4.0.0" + "@csstools/postcss-color-mix-variadic-function-arguments": "npm:^2.0.0" + "@csstools/postcss-content-alt-text": "npm:^3.0.0" + "@csstools/postcss-contrast-color-function": "npm:^3.0.0" + "@csstools/postcss-exponential-functions": "npm:^3.0.0" + "@csstools/postcss-font-format-keywords": "npm:^5.0.0" + "@csstools/postcss-gamut-mapping": "npm:^3.0.0" + "@csstools/postcss-gradients-interpolation-method": "npm:^6.0.0" + "@csstools/postcss-hwb-function": "npm:^5.0.0" + "@csstools/postcss-ic-unit": "npm:^5.0.0" + "@csstools/postcss-initial": "npm:^3.0.0" + "@csstools/postcss-is-pseudo-class": "npm:^6.0.0" + "@csstools/postcss-light-dark-function": "npm:^3.0.0" + "@csstools/postcss-logical-float-and-clear": "npm:^4.0.0" + "@csstools/postcss-logical-overflow": "npm:^3.0.0" + "@csstools/postcss-logical-overscroll-behavior": "npm:^3.0.0" + "@csstools/postcss-logical-resize": "npm:^4.0.0" + "@csstools/postcss-logical-viewport-units": "npm:^4.0.0" + "@csstools/postcss-media-minmax": "npm:^3.0.0" + "@csstools/postcss-media-queries-aspect-ratio-number-values": "npm:^4.0.0" + "@csstools/postcss-nested-calc": "npm:^5.0.0" + "@csstools/postcss-normalize-display-values": "npm:^5.0.0" + "@csstools/postcss-oklab-function": "npm:^5.0.0" + "@csstools/postcss-position-area-property": "npm:^2.0.0" + "@csstools/postcss-progressive-custom-properties": "npm:^5.0.0" + "@csstools/postcss-property-rule-prelude-list": "npm:^2.0.0" + "@csstools/postcss-random-function": "npm:^3.0.0" + "@csstools/postcss-relative-color-syntax": "npm:^4.0.0" + "@csstools/postcss-scope-pseudo-class": "npm:^5.0.0" + "@csstools/postcss-sign-functions": "npm:^2.0.0" + "@csstools/postcss-stepped-value-functions": "npm:^5.0.0" + "@csstools/postcss-syntax-descriptor-syntax-production": "npm:^2.0.0" + "@csstools/postcss-system-ui-font-family": "npm:^2.0.0" + "@csstools/postcss-text-decoration-shorthand": "npm:^5.0.0" + "@csstools/postcss-trigonometric-functions": "npm:^5.0.0" + "@csstools/postcss-unset-value": "npm:^5.0.0" autoprefixer: "npm:^10.4.23" browserslist: "npm:^4.28.1" - css-blank-pseudo: "npm:^7.0.1" - css-has-pseudo: "npm:^7.0.3" - css-prefers-color-scheme: "npm:^10.0.0" + css-blank-pseudo: "npm:^8.0.1" + css-has-pseudo: "npm:^8.0.0" + css-prefers-color-scheme: "npm:^11.0.0" cssdb: "npm:^8.6.0" - postcss-attribute-case-insensitive: "npm:^7.0.1" + postcss-attribute-case-insensitive: "npm:^8.0.0" postcss-clamp: "npm:^4.1.0" - postcss-color-functional-notation: "npm:^7.0.12" - postcss-color-hex-alpha: "npm:^10.0.0" - postcss-color-rebeccapurple: "npm:^10.0.0" - postcss-custom-media: "npm:^11.0.6" - postcss-custom-properties: "npm:^14.0.6" - postcss-custom-selectors: "npm:^8.0.5" - postcss-dir-pseudo-class: "npm:^9.0.1" - postcss-double-position-gradients: "npm:^6.0.4" - postcss-focus-visible: "npm:^10.0.1" - postcss-focus-within: "npm:^9.0.1" + postcss-color-functional-notation: "npm:^8.0.0" + postcss-color-hex-alpha: "npm:^11.0.0" + postcss-color-rebeccapurple: "npm:^11.0.0" + postcss-custom-media: "npm:^12.0.0" + postcss-custom-properties: "npm:^15.0.0" + postcss-custom-selectors: "npm:^9.0.0" + postcss-dir-pseudo-class: "npm:^10.0.0" + postcss-double-position-gradients: "npm:^7.0.0" + postcss-focus-visible: "npm:^11.0.0" + postcss-focus-within: "npm:^10.0.0" postcss-font-variant: "npm:^5.0.0" - postcss-gap-properties: "npm:^6.0.0" - postcss-image-set-function: "npm:^7.0.0" - postcss-lab-function: "npm:^7.0.12" - postcss-logical: "npm:^8.1.0" - postcss-nesting: "npm:^13.0.2" + postcss-gap-properties: "npm:^7.0.0" + postcss-image-set-function: "npm:^8.0.0" + postcss-lab-function: "npm:^8.0.0" + postcss-logical: "npm:^9.0.0" + postcss-nesting: "npm:^14.0.0" postcss-opacity-percentage: "npm:^3.0.0" - postcss-overflow-shorthand: "npm:^6.0.0" + postcss-overflow-shorthand: "npm:^7.0.0" postcss-page-break: "npm:^3.0.4" - postcss-place: "npm:^10.0.0" - postcss-pseudo-class-any-link: "npm:^10.0.1" + postcss-place: "npm:^11.0.0" + postcss-pseudo-class-any-link: "npm:^11.0.0" postcss-replace-overflow-wrap: "npm:^4.0.0" - postcss-selector-not: "npm:^8.0.1" + postcss-selector-not: "npm:^9.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/e8da96f208918ebc0dc9acc8ba8961a92569f1d130b29abe25adaf7dbd56ef29fc6f778b75964c80fe7f3469012c763ea9447e5c2f559a002a155bc0462cce35 + checksum: 10c0/f4f3a01b1e20fd784c9e4233ed84718293adbf040db78f6af6f703fce0c320c921bd4131657df01099e37bd7082a815b9387ca92c4406dccd4808ceb0c7ab9ca languageName: node linkType: hard -"postcss-pseudo-class-any-link@npm:^10.0.1": - version: 10.0.1 - resolution: "postcss-pseudo-class-any-link@npm:10.0.1" +"postcss-pseudo-class-any-link@npm:^11.0.0": + version: 11.0.0 + resolution: "postcss-pseudo-class-any-link@npm:11.0.0" dependencies: - postcss-selector-parser: "npm:^7.0.0" + postcss-selector-parser: "npm:^7.1.1" peerDependencies: postcss: ^8.4 - checksum: 10c0/95e883996e87baf14fc09d25f9a763a2e9d599eb3b9c6b736e83a8c3d0b55841bcb886bccdf51b5b7fefc128cbd0187ad8841f59878f85bd1613642e592d7673 + checksum: 10c0/bd7e1daa582bc19fe0e30c3ab8b13f8cf75ae2f116124960e9d28092255ede77455cd982bef8010d7ea64fdffc66a14624e63fe438e6d957415f5a4bc16b59a4 languageName: node linkType: hard @@ -11132,24 +11197,24 @@ __metadata: languageName: node linkType: hard -"postcss-selector-not@npm:^8.0.1": - version: 8.0.1 - resolution: "postcss-selector-not@npm:8.0.1" +"postcss-selector-not@npm:^9.0.0": + version: 9.0.0 + resolution: "postcss-selector-not@npm:9.0.0" dependencies: - postcss-selector-parser: "npm:^7.0.0" + postcss-selector-parser: "npm:^7.1.1" peerDependencies: postcss: ^8.4 - checksum: 10c0/491ea3dcc421cd90135be786078521605e2062fb93624ea8813cfd5ba0d35143f931e2e608d5f20effd5ea7d3f4786d2afea2afa42d117779a0288e135f132b6 + checksum: 10c0/090ce6d65667b8b6b9c1c26b7bd7740a31f3e7f36c29574e622d5fac5ab2ce291ac11622914745f22dda531d75e36fcdd395339fbe8fac0fc04fa7d750bb5248 languageName: node linkType: hard -"postcss-selector-parser@npm:^7.0.0, postcss-selector-parser@npm:^7.1.0": - version: 7.1.0 - resolution: "postcss-selector-parser@npm:7.1.0" +"postcss-selector-parser@npm:^7.0.0, postcss-selector-parser@npm:^7.1.0, postcss-selector-parser@npm:^7.1.1": + version: 7.1.1 + resolution: "postcss-selector-parser@npm:7.1.1" dependencies: cssesc: "npm:^3.0.0" util-deprecate: "npm:^1.0.2" - checksum: 10c0/0fef257cfd1c0fe93c18a3f8a6e739b4438b527054fd77e9a62730a89b2d0ded1b59314a7e4aaa55bc256204f40830fecd2eb50f20f8cb7ab3a10b52aa06c8aa + checksum: 10c0/02d3b1589ddcddceed4b583b098b95a7266dacd5135f041e5d913ebb48e874fd333a36e564cc9a2ec426a464cb18db11cb192ac76247aced5eba8c951bf59507 languageName: node linkType: hard