From ed19b0a8250f5539dc2a7466f96a8590aa071731 Mon Sep 17 00:00:00 2001 From: Evan Purkhiser Date: Thu, 20 Nov 2025 20:21:21 -0500 Subject: [PATCH] ref(ui): Refactor EmptyMessage to use core components and simplify API Modernizes the EmptyMessage component and removes redundant description prop: - Refactors EmptyMessage from styled-components to core layout primitives (Flex, Container, Text) - Removes redundant `description` prop - all content now uses `children` - Automatically applies text-wrap: balance to all empty state messages for better readability - Migrates 22 usage sites to use `children` instead of `description` prop - Simplifies component API by having a single way to pass content This reduces the component's surface area and makes it more consistent with the design system's layout and typography primitives. --- static/app/components/emptyMessage.mdx | 146 ++++++++++++++++++ static/app/components/emptyMessage.tsx | 107 +++++-------- .../crashContent/exception/stackTrace.tsx | 2 +- .../feedback/details/feedbackEmptyDetails.tsx | 7 +- static/app/components/platformPicker.tsx | 2 +- .../projects/missingProjectMembership.tsx | 11 +- .../pages/platform/nextjs/serverTree.tsx | 2 +- .../pages/platform/shared/table/index.tsx | 2 +- .../views/organizationStats/usageTable.tsx | 7 +- .../detail/commitsAndFiles/emptyState.tsx | 18 ++- .../releases/drawer/releasesDrawerTable.tsx | 25 +-- .../views/releases/list/releaseListInner.tsx | 14 +- .../components/dataScrubbing/index.tsx | 7 +- .../sentryApplicationDashboard/requestLog.tsx | 2 +- .../sentryApplicationDetails.tsx | 4 +- .../detailedView/integrationLayout.tsx | 10 +- .../integrationAlertRules.tsx | 2 +- .../integrationRepos.tsx | 9 +- .../list/waitingActivity.tsx | 15 +- .../organizationRepositories.tsx | 11 +- .../organizationTeams/teamMembers.tsx | 2 +- .../organizationTeams/teamProjects.tsx | 2 +- .../projectFilters/projectFiltersChart.tsx | 9 +- .../project/projectKeys/details/keyStats.tsx | 7 +- .../project/projectKeys/list/index.tsx | 7 +- .../project/projectServiceHookDetails.tsx | 7 +- .../settings/projectDataForwarding/index.tsx | 7 +- .../projectSourceMaps/sourceMapsList.tsx | 43 +++--- .../features/disabledDataForwarding.tsx | 37 +++-- .../features/disabledDiscardGroup.tsx | 35 ++--- .../hooks/disabledCustomSymbolSources.tsx | 19 +-- static/gsApp/views/contactBillingMembers.tsx | 16 +- static/gsApp/views/spendAllocations/index.tsx | 31 ++-- 33 files changed, 356 insertions(+), 269 deletions(-) create mode 100644 static/app/components/emptyMessage.mdx diff --git a/static/app/components/emptyMessage.mdx b/static/app/components/emptyMessage.mdx new file mode 100644 index 00000000000000..323b42c74b433e --- /dev/null +++ b/static/app/components/emptyMessage.mdx @@ -0,0 +1,146 @@ +--- +title: EmptyMessage +description: A component for displaying empty states with optional icon, title, description, and action buttons. All text content uses balanced text wrapping for better readability. +source: 'sentry/components/emptyMessage' +resources: + js: https://github.com/getsentry/sentry/blob/master/static/app/components/emptyMessage.tsx +--- + +import {Button} from 'sentry/components/core/button'; +import EmptyMessage from 'sentry/components/emptyMessage'; +import Panel from 'sentry/components/panels/panel'; +import {IconSearch} from 'sentry/icons'; +import * as Storybook from 'sentry/stories'; + +To create a basic empty message, wrap your message in an `` component. + +```jsx + + + This is a simple empty message with default styling and balanced text wrapping for + better readability. + + +``` + +## Props + +- **title** (`React.ReactNode`) - The title of the empty message +- **icon** (`React.ReactNode`) - Optional icon element +- **action** (`React.ReactElement`) - Optional action button +- **size** (`"md" | "lg"`) - Size of the text (default: md) +- **children** (`React.ReactNode`) - Main content text (automatically uses balanced text wrapping) + +## Examples + +### With Title + +Add a title to provide context for the empty state. + + + + + We couldn't find any results matching your search criteria. Try adjusting your + filters or search terms. + + + +```jsx + + We couldn't find any results matching your search criteria. Try adjusting your filters + or search terms. + +``` + +### With Icon + +Add an icon to make the empty state more visually distinctive. Icons are defaulted to `lg` size, so there is typically no need to specify an icon size. + + + + } title="No Results"> + We couldn't find any results matching your search criteria. + + + +```jsx +} title="No Results"> + We couldn't find any results matching your search criteria. + +``` + +### With Action + +Add action buttons to guide users toward resolving the empty state. + + + + } + title="No Results Found" + action={} + > + We couldn't find any results matching your search criteria. Try adjusting your + filters or search terms. + + + +```jsx +} + title="No Results Found" + action={} +> + We couldn't find any results matching your search criteria. Try adjusting your filters + or search terms. + +``` + +### Sizes + +EmptyMessage supports two sizes: `md` (default) and `lg`. + + +
+ + } title="Medium Size"> + This is the default medium size empty message. + + + + } title="Large Size"> + This is a large size empty message with bigger text. + + +
+
+```jsx +} title="Medium Size"> + This is the default medium size empty message. + + +} title="Large Size"> + This is a large size empty message with bigger text. + +``` + +### Text Wrapping + +All text content automatically uses CSS text-wrap balance mode for better readability, especially with longer messages. + + + + } title="Text Wrapping"> + Sure you haven't misspelled? If you're using a lesser-known platform, consider + choosing a more generic SDK like Browser JavaScript, Python, Node, .NET & Java or + create a generic project. + + + +```jsx +} title="Text Wrapping"> + Sure you haven't misspelled? If you're using a lesser-known platform, consider choosing + a more generic SDK like Browser JavaScript, Python, Node, .NET & Java or create a + generic project. + +``` diff --git a/static/app/components/emptyMessage.tsx b/static/app/components/emptyMessage.tsx index dbe097fc2d5344..9d4221048bca0f 100644 --- a/static/app/components/emptyMessage.tsx +++ b/static/app/components/emptyMessage.tsx @@ -1,74 +1,51 @@ -import {css} from '@emotion/react'; -import styled from '@emotion/styled'; +import {useTheme} from '@emotion/react'; +import {mergeProps} from '@react-aria/utils'; -import {space} from 'sentry/styles/space'; -import TextBlock from 'sentry/views/settings/components/text/textBlock'; +import {Container, Flex} from 'sentry/components/core/layout'; +import {Text} from 'sentry/components/core/text'; +import {IconDefaultsProvider} from 'sentry/icons/useIconDefaults'; interface Props extends Omit, 'title'> { - action?: React.ReactElement; - description?: React.ReactNode; + action?: React.ReactNode; icon?: React.ReactNode; - leftAligned?: boolean; - size?: 'large' | 'medium'; + size?: 'lg' | 'md'; title?: React.ReactNode; } -type WrapperProps = Pick; - -const EmptyMessage = styled( - ({ - title, - description, - icon, - children, - action, - leftAligned: _leftAligned, - ...props - }: Props) => ( -
- {icon && {icon}} - {title && {title}} - {description && {description}} - {children && {children}} - {action && {action}} -
- ) -)` - display: flex; - ${p => - p.leftAligned - ? css` - max-width: 70%; - align-items: flex-start; - padding: ${space(4)}; - ` - : css` - text-align: center; - align-items: center; - padding: ${space(4)} 15%; - `}; - flex-direction: column; - color: ${p => p.theme.textColor}; - font-size: ${p => - p.size && p.size === 'large' ? p.theme.fontSize.xl : p.theme.fontSize.md}; -`; - -const IconWrapper = styled('div')` - color: ${p => (p.theme.isChonk ? p.theme.gray400 : p.theme.gray200)}; - margin-bottom: ${space(1)}; -`; - -const Title = styled('strong')<{noMargin: boolean}>` - font-size: ${p => p.theme.fontSize.xl}; - ${p => !p.noMargin && `margin-bottom: ${space(1)};`} -`; - -const Description = styled(TextBlock)` - margin: 0; -`; - -const Action = styled('div')` - margin-top: ${space(2)}; -`; +function EmptyMessage({title, icon, children, action, size, ...props}: Props) { + const theme = useTheme(); + + return ( + + {stackProps => ( + + {icon && ( + + + {icon} + + + )} + {title && ( + + {title} + + )} + {children && ( + + {children} + + )} + {action && {action}} + + )} + + ); +} export default EmptyMessage; diff --git a/static/app/components/events/interfaces/crashContent/exception/stackTrace.tsx b/static/app/components/events/interfaces/crashContent/exception/stackTrace.tsx index ec2446061e329b..b0d982fd8baa64 100644 --- a/static/app/components/events/interfaces/crashContent/exception/stackTrace.tsx +++ b/static/app/components/events/interfaces/crashContent/exception/stackTrace.tsx @@ -57,7 +57,7 @@ function StackTrace({ return ( } + icon={} title={t('No app only stack trace has been found!')} /> diff --git a/static/app/components/feedback/details/feedbackEmptyDetails.tsx b/static/app/components/feedback/details/feedbackEmptyDetails.tsx index 74f9158d0e4a5f..7b8aea6995cc06 100644 --- a/static/app/components/feedback/details/feedbackEmptyDetails.tsx +++ b/static/app/components/feedback/details/feedbackEmptyDetails.tsx @@ -7,10 +7,9 @@ import FluidHeight from 'sentry/views/replays/detail/layout/fluidHeight'; const FeedbackEmptyDetails = styled((props: any) => ( - } - description={t('No feedback selected')} - /> + }> + {t('No feedback selected')} + ))` display: grid; diff --git a/static/app/components/platformPicker.tsx b/static/app/components/platformPicker.tsx index 5329af73c6082b..6e4dabb3a673e8 100644 --- a/static/app/components/platformPicker.tsx +++ b/static/app/components/platformPicker.tsx @@ -262,7 +262,7 @@ function PlatformPicker({ {platformList.length === 0 && ( } + icon={} title={t("We don't have an SDK for that yet!")} > {tct( diff --git a/static/app/components/projects/missingProjectMembership.tsx b/static/app/components/projects/missingProjectMembership.tsx index 915cd9bcc22e2f..b31a9d7fc0358b 100644 --- a/static/app/components/projects/missingProjectMembership.tsx +++ b/static/app/components/projects/missingProjectMembership.tsx @@ -147,11 +147,8 @@ class MissingProjectMembership extends Component { {teams.length ? ( } + icon={} title={t("You're not a member of this project.")} - description={t( - `You'll need to join a team with access before you can view this data.` - )} action={ { )} } - /> + > + {t(`You'll need to join a team with access before you can view this data.`)} + ) : ( - }> + }> {t( 'No teams have access to this project yet. Ask an admin to add your team to this project.' )} diff --git a/static/app/views/insights/pages/platform/nextjs/serverTree.tsx b/static/app/views/insights/pages/platform/nextjs/serverTree.tsx index 5c0911c2e7ee19..aad3f9e0e0a362 100644 --- a/static/app/views/insights/pages/platform/nextjs/serverTree.tsx +++ b/static/app/views/insights/pages/platform/nextjs/serverTree.tsx @@ -200,7 +200,7 @@ export function ServerTree() { {treeRequest.isLoading ? ( ) : hasData ? null : ( - }> + }> {t('No results found')} )} diff --git a/static/app/views/insights/pages/platform/shared/table/index.tsx b/static/app/views/insights/pages/platform/shared/table/index.tsx index f0127fc9fe2abb..8f077ad3b44321 100644 --- a/static/app/views/insights/pages/platform/shared/table/index.tsx +++ b/static/app/views/insights/pages/platform/shared/table/index.tsx @@ -58,7 +58,7 @@ export function PlatformInsightsTable>({ columnSortBy={[]} minimumColWidth={COL_WIDTH_MINIMUM} emptyMessage={ - }> + }> {t('No results found')} } diff --git a/static/app/views/organizationStats/usageTable.tsx b/static/app/views/organizationStats/usageTable.tsx index d5a8715de8d32a..6b624ee976a354 100644 --- a/static/app/views/organizationStats/usageTable.tsx +++ b/static/app/views/organizationStats/usageTable.tsx @@ -52,14 +52,15 @@ class UsageTable extends Component { if (errorMessage.projectStats.responseJSON.detail === 'No projects available') { return ( } + icon={} title={t( "You don't have access to any projects, or your organization has no projects." )} - description={tct('Learn more about [link:Project Access]', { + > + {tct('Learn more about [link:Project Access]', { link: , })} - /> + ); } return ; diff --git a/static/app/views/releases/detail/commitsAndFiles/emptyState.tsx b/static/app/views/releases/detail/commitsAndFiles/emptyState.tsx index 67168ec9814f0d..e9c567649e99de 100644 --- a/static/app/views/releases/detail/commitsAndFiles/emptyState.tsx +++ b/static/app/views/releases/detail/commitsAndFiles/emptyState.tsx @@ -29,10 +29,11 @@ export function NoReleaseRepos() {
} + icon={} title={t('Releases are better with commit data!')} - description={t('No commits associated with this release have been found.')} - /> + > + {t('No commits associated with this release have been found.')} +
@@ -45,17 +46,18 @@ export function NoRepositories({orgSlug}: {orgSlug: string}) {
} + icon={} title={t('Releases are better with commit data!')} - description={t( - 'Connect a repository to see commit info, files changed, and authors involved in future releases.' - )} action={ {t('Connect a repository')} } - /> + > + {t( + 'Connect a repository to see commit info, files changed, and authors involved in future releases.' + )} +
diff --git a/static/app/views/releases/drawer/releasesDrawerTable.tsx b/static/app/views/releases/drawer/releasesDrawerTable.tsx index e8457b30cc4201..75c9358f758c01 100644 --- a/static/app/views/releases/drawer/releasesDrawerTable.tsx +++ b/static/app/views/releases/drawer/releasesDrawerTable.tsx @@ -5,6 +5,7 @@ import styled from '@emotion/styled'; import {Link} from 'sentry/components/core/link'; import {Tooltip} from 'sentry/components/core/tooltip'; import Count from 'sentry/components/count'; +import EmptyMessage from 'sentry/components/emptyMessage'; import GlobalSelectionLink from 'sentry/components/globalSelectionLink'; import ProjectBadge from 'sentry/components/idBadge/projectBadge'; import {normalizeDateTimeParams} from 'sentry/components/organizations/pageFilters/parse'; @@ -190,10 +191,9 @@ export function ReleasesDrawerTable({ ); const tableEmptyMessage = ( - - {t('No releases')} - {t('There are no releases within this timeframe')} - + + {t('There are no releases within this timeframe')} + ); return ( @@ -225,23 +225,6 @@ export function ReleasesDrawerTable({ ); } -const Subtitle = styled('div')` - font-size: ${p => p.theme.fontSize.md}; -`; - -const Title = styled('div')` - font-size: 24px; -`; - -const MessageContainer = styled('div')` - display: grid; - grid-auto-flow: row; - gap: ${space(1)}; - justify-items: center; - text-align: center; - padding: ${space(4)}; -`; - const CellWrapper = styled('div')` & div { text-align: left; diff --git a/static/app/views/releases/list/releaseListInner.tsx b/static/app/views/releases/list/releaseListInner.tsx index c68f29c1a42338..729fc8ae9a8a6b 100644 --- a/static/app/views/releases/list/releaseListInner.tsx +++ b/static/app/views/releases/list/releaseListInner.tsx @@ -198,7 +198,7 @@ function EmptyReleaseMessage({ if (searchQuery?.length) { return ( - } size="large">{`${t( + } size="lg">{`${t( 'There are no releases that match' )}: '${searchQuery}'.`} @@ -208,7 +208,7 @@ function EmptyReleaseMessage({ if (activeSort === ReleasesSortOption.USERS_24_HOURS) { return ( - } size="large"> + } size="lg"> {t('There are no releases with active user data (users in the last 24 hours).')} @@ -218,7 +218,7 @@ function EmptyReleaseMessage({ if (activeSort === ReleasesSortOption.SESSIONS_24_HOURS) { return ( - } size="large"> + } size="lg"> {t( 'There are no releases with active session data (sessions in the last 24 hours).' )} @@ -233,7 +233,7 @@ function EmptyReleaseMessage({ ) { return ( - } size="large"> + } size="lg"> {t('There are no releases with semantic versioning.')} @@ -243,7 +243,7 @@ function EmptyReleaseMessage({ if (activeSort !== ReleasesSortOption.DATE) { return ( - } size="large"> + } size="lg"> {`${t('There are no releases with data in the')} ${selectedPeriod}.`} @@ -253,7 +253,7 @@ function EmptyReleaseMessage({ if (activeStatus === ReleasesStatusOption.ARCHIVED) { return ( - } size="large"> + } size="lg"> {t('There are no archived releases.')} @@ -262,7 +262,7 @@ function EmptyReleaseMessage({ return ( - } size="large"> + } size="lg"> {`${t('There are no releases with data in the')} ${selectedPeriod}.`} diff --git a/static/app/views/settings/components/dataScrubbing/index.tsx b/static/app/views/settings/components/dataScrubbing/index.tsx index 34263bcb4f267f..dab7f03ef13378 100644 --- a/static/app/views/settings/components/dataScrubbing/index.tsx +++ b/static/app/views/settings/components/dataScrubbing/index.tsx @@ -211,10 +211,9 @@ export function DataScrubbing({ disabled={disabled} /> ) : ( - } - description={t('You have no data scrubbing rules')} - /> + }> + {t('You have no data scrubbing rules')} + )} diff --git a/static/app/views/settings/organizationDeveloperSettings/sentryApplicationDashboard/requestLog.tsx b/static/app/views/settings/organizationDeveloperSettings/sentryApplicationDashboard/requestLog.tsx index 8c7b7a802ea938..1c15df88316ed1 100644 --- a/static/app/views/settings/organizationDeveloperSettings/sentryApplicationDashboard/requestLog.tsx +++ b/static/app/views/settings/organizationDeveloperSettings/sentryApplicationDashboard/requestLog.tsx @@ -240,7 +240,7 @@ export default function RequestLog({app}: RequestLogProps) { )) ) : ( - }> + }> {t('No requests found in the last 30 days.')} )} diff --git a/static/app/views/settings/organizationDeveloperSettings/sentryApplicationDetails.tsx b/static/app/views/settings/organizationDeveloperSettings/sentryApplicationDetails.tsx index 5243c83d7697a1..9afdb18cc46d52 100644 --- a/static/app/views/settings/organizationDeveloperSettings/sentryApplicationDetails.tsx +++ b/static/app/views/settings/organizationDeveloperSettings/sentryApplicationDetails.tsx @@ -283,11 +283,11 @@ export default function SentryApplicationDetails() { const renderTokens = () => { if (!hasTokenAccess) { return ( - + {t('You do not have access to view these tokens.')} ); } if (tokens.length < 1 && newTokens.length < 1) { - return ; + return {t('No tokens created yet.')}; } const tokensToDisplay = tokens.map(token => ( - + {t( + "But that doesn't have to be the case for long! Add an installation to get started." )} - action={action} - /> + ); } diff --git a/static/app/views/settings/organizationIntegrations/integrationAlertRules.tsx b/static/app/views/settings/organizationIntegrations/integrationAlertRules.tsx index 40b7d00a5321d8..db4045489cfb3f 100644 --- a/static/app/views/settings/organizationIntegrations/integrationAlertRules.tsx +++ b/static/app/views/settings/organizationIntegrations/integrationAlertRules.tsx @@ -20,7 +20,7 @@ export default function IntegrationAlertRules() { {t('Project Configuration')} {projects.length === 0 && ( - + {t('You have no projects to add Alert Rules to')} )} diff --git a/static/app/views/settings/organizationIntegrations/integrationRepos.tsx b/static/app/views/settings/organizationIntegrations/integrationRepos.tsx index 2ff4609f999915..28b538ae566238 100644 --- a/static/app/views/settings/organizationIntegrations/integrationRepos.tsx +++ b/static/app/views/settings/organizationIntegrations/integrationRepos.tsx @@ -116,15 +116,16 @@ function IntegrationRepos(props: Props) { } title={t('Sentry is better with commit data')} - description={t( - 'Add a repository to begin tracking its commit data. Then, set up release tracking to unlock features like suspect commits, suggested issue owners, and deploy emails.' - )} action={ {t('Learn More')} } - /> + > + {t( + 'Add a repository to begin tracking its commit data. Then, set up release tracking to unlock features like suspect commits, suggested issue owners, and deploy emails.' + )} + )} {itemList.map(repo => ( {'relay run'}, - }) - } action={ } - /> + > + {disabled + ? undefined + : tct('Run relay in your terminal with [commandLine]', { + commandLine: {'relay run'}, + })} + ); } diff --git a/static/app/views/settings/organizationRepositories/organizationRepositories.tsx b/static/app/views/settings/organizationRepositories/organizationRepositories.tsx index 1d806472a5dd95..dcf1a3446d11ec 100644 --- a/static/app/views/settings/organizationRepositories/organizationRepositories.tsx +++ b/static/app/views/settings/organizationRepositories/organizationRepositories.tsx @@ -66,17 +66,18 @@ function OrganizationRepositories({itemList, onRepositoryChange, organization}: ) : ( } + icon={} title={t('Sentry is better with commit data')} - description={t( - 'Adding one or more repositories will enable enhanced releases and the ability to resolve Sentry Issues via git message.' - )} action={ {t('Learn more')} } - /> + > + {t( + 'Adding one or more repositories will enable enhanced releases and the ability to resolve Sentry Issues via git message.' + )} + )} diff --git a/static/app/views/settings/organizationTeams/teamMembers.tsx b/static/app/views/settings/organizationTeams/teamMembers.tsx index f4e811f5a158e5..2e94975028bb60 100644 --- a/static/app/views/settings/organizationTeams/teamMembers.tsx +++ b/static/app/views/settings/organizationTeams/teamMembers.tsx @@ -346,7 +346,7 @@ export default function TeamMembers() { }); } return ( - } size="large"> + } size="lg"> {t('This team has no members')} ); diff --git a/static/app/views/settings/organizationTeams/teamProjects.tsx b/static/app/views/settings/organizationTeams/teamProjects.tsx index 3325c56f8dcd6e..9855a839e346f8 100644 --- a/static/app/views/settings/organizationTeams/teamProjects.tsx +++ b/static/app/views/settings/organizationTeams/teamProjects.tsx @@ -165,7 +165,7 @@ export default function TeamProjects() { )) ) : linkedProjectsLoading ? null : ( - }> + }> {t("This team doesn't have access to any projects.")} )} diff --git a/static/app/views/settings/project/projectFilters/projectFiltersChart.tsx b/static/app/views/settings/project/projectFilters/projectFiltersChart.tsx index e0448eedbd4167..d53a6f2de5e351 100644 --- a/static/app/views/settings/project/projectFilters/projectFiltersChart.tsx +++ b/static/app/views/settings/project/projectFilters/projectFiltersChart.tsx @@ -91,12 +91,9 @@ export function ProjectFiltersChart({project}: Props) { /> )} {hasLoaded && blankStats && ( - + + {t('Issues filtered as a result of your settings below will be shown here.')} + )} diff --git a/static/app/views/settings/project/projectKeys/details/keyStats.tsx b/static/app/views/settings/project/projectKeys/details/keyStats.tsx index 7c3f2b91a13b0a..da78c0b1097235 100644 --- a/static/app/views/settings/project/projectKeys/details/keyStats.tsx +++ b/static/app/views/settings/project/projectKeys/details/keyStats.tsx @@ -112,10 +112,9 @@ class KeyStats extends Component { {this.state.loading ? ( ) : this.state.emptyStats ? ( - + + {t('Total events captured using these credentials.')} + ) : ( { return ( - } - description={t('There are no keys active for this project.')} - /> + }> + {t('There are no keys active for this project.')} + ); }; diff --git a/static/app/views/settings/project/projectServiceHookDetails.tsx b/static/app/views/settings/project/projectServiceHookDetails.tsx index bd540ead2b05ae..cf5a4b98d1c057 100644 --- a/static/app/views/settings/project/projectServiceHookDetails.tsx +++ b/static/app/views/settings/project/projectServiceHookDetails.tsx @@ -85,10 +85,9 @@ function HookStats() { {t('Events in the last 30 days (by day)')} {emptyStats ? ( - + + {t('Total webhooks fired for this configuration.')} + ) : ( ) : ( - + + {t('Total events forwarded to third party integrations.')} + )} diff --git a/static/app/views/settings/projectSourceMaps/sourceMapsList.tsx b/static/app/views/settings/projectSourceMaps/sourceMapsList.tsx index 1d276cff40f4d3..564fc246dc98e0 100644 --- a/static/app/views/settings/projectSourceMaps/sourceMapsList.tsx +++ b/static/app/views/settings/projectSourceMaps/sourceMapsList.tsx @@ -296,29 +296,28 @@ function SourceMapsEmptyState({ ? t('No source maps uploads matching your search') : t('No source maps uploaded') } - description={ - query - ? tct( - 'Try to modify or [clear:clear] your search to see all source maps uploads.', - { - clear: ( -