123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374 |
- import type {Theme} from '@emotion/react';
- import {css, Global} from '@emotion/react';
- import {space} from 'sentry/styles/space';
- const prismStyles = (theme: Theme) => css`
- :root {
- ${theme.prismVariables};
- }
- /* Use dark Prism theme for code snippets imported from Sentry Docs */
- .gatsby-highlight,
- .prism-dark {
- ${theme.prismDarkVariables};
- }
- pre[class*='language-'] {
- overflow-x: auto;
- padding: ${space(1)} ${space(2)};
- border-radius: ${theme.borderRadius};
- box-shadow: none;
- code {
- background: unset;
- }
- }
- pre[class*='language-'],
- code[class*='language-'] {
- color: var(--prism-base);
- background: var(--prism-block-background);
- font-size: ${theme.codeFontSize};
- text-shadow: none;
- font-family: ${theme.text.familyMono};
- direction: ltr;
- text-align: left;
- white-space: pre;
- word-spacing: normal;
- word-break: normal;
- -moz-tab-size: 4;
- -o-tab-size: 4;
- tab-size: 4;
- -webkit-hyphens: none;
- -moz-hyphens: none;
- -ms-hyphens: none;
- hyphens: none;
- .namespace {
- opacity: 0.7;
- }
- .token.comment,
- .token.prolog,
- .token.doctype,
- .token.cdata {
- color: var(--prism-comment);
- }
- .token.punctuation {
- color: var(--prism-punctuation);
- }
- .token.property,
- .token.tag,
- .token.boolean,
- .token.number,
- .token.constant,
- .token.symbol,
- .token.deleted {
- color: var(--prism-property);
- }
- .token.selector,
- .token.attr-name,
- .token.string,
- .token.char,
- .token.builtin,
- .token.inserted {
- color: var(--prism-selector);
- }
- .token.operator,
- .token.entity,
- .token.url,
- .language-css .token.string,
- .style .token.string {
- color: var(--prism-operator);
- background: none;
- }
- .token.atrule,
- .token.attr-value,
- .token.keyword {
- color: var(--prism-keyword);
- }
- .token.function {
- color: var(--prism-function);
- }
- .token.regex,
- .token.important,
- .token.variable {
- color: var(--prism-variable);
- }
- .token.important,
- .token.bold {
- font-weight: ${theme.fontWeightBold};
- }
- .token.italic {
- font-style: italic;
- }
- .token.entity {
- cursor: help;
- }
- .line-highlight {
- position: absolute;
- left: -${space(2)};
- right: 0;
- background: var(--prism-highlight-background);
- box-shadow: inset 5px 0 0 var(--prism-highlight-accent);
- z-index: 0;
- pointer-events: none;
- line-height: inherit;
- white-space: pre;
- }
- }
- pre[data-line] {
- position: relative;
- }
- pre[class*='language-'] > code[class*='language-'] {
- position: relative;
- z-index: 1;
- }
- `;
- const styles = (theme: Theme, isDark: boolean) => css`
- body {
- .sentry-error-embed-wrapper {
- z-index: ${theme.zIndex.sentryErrorEmbed};
- }
- color: ${theme.textColor};
- background: ${theme.backgroundSecondary};
- }
- abbr {
- ${theme.tooltipUnderline()};
- }
- a {
- color: ${theme.linkColor};
- &:focus-visible,
- &:hover {
- color: ${theme.linkHoverColor};
- }
- }
- .group-detail:before {
- background: ${theme.border};
- }
- .form-actions {
- border-top-color: ${theme.border};
- }
- pre,
- code {
- color: ${theme.textColor};
- }
- pre {
- background-color: ${theme.backgroundSecondary};
- white-space: pre-wrap;
- overflow-x: auto;
- }
- code {
- background-color: transparent;
- }
- ${prismStyles(theme)}
- /**
- * See https://web.dev/prefers-reduced-motion/
- */
- @media (prefers-reduced-motion) {
- *,
- ::before,
- ::after {
- animation-delay: -1ms !important;
- animation-duration: 0ms !important;
- animation-iteration-count: 1 !important;
- background-attachment: initial !important;
- scroll-behavior: auto !important;
- transition-duration: 0s !important;
- transition-delay: 0s !important;
- }
- }
- .ReactVirtualized__Grid:focus-visible,
- .ReactVirtualized__List:focus-visible {
- outline: ${theme.focusBorder} auto 1px;
- }
- /* Override css in LESS files here as we want to manually control dark mode for now */
- ${isDark
- ? css`
- .box,
- .box.box-modal {
- background: ${theme.background};
- border-color: ${theme.border};
- .box-content,
- .box-header {
- background: ${theme.background};
- h1,
- h2,
- h3,
- h4,
- h5,
- h6 {
- color: ${theme.headingColor};
- }
- a {
- color: ${theme.textColor};
- }
- }
- .box-header {
- border-bottom-color: ${theme.border};
- }
- }
- .loading .loading-indicator {
- border-color: ${theme.backgroundSecondary};
- border-left-color: ${theme.purple300};
- }
- .pattern-bg {
- opacity: 1;
- filter: invert(1) brightness(0.6);
- }
- .nav-tabs {
- & > li {
- &.active {
- a {
- color: ${theme.textColor} !important;
- border-bottom-color: ${theme.active} !important;
- }
- }
- a:hover {
- color: ${theme.textColor} !important;
- }
- }
- &.border-bottom {
- border-color: ${theme.border};
- }
- }
- ul.crumbs li .table.key-value pre {
- color: ${theme.subText};
- }
- .exception {
- border-color: ${theme.innerBorder};
- }
- .traceback {
- border-color: ${theme.border};
- &.in-app-traceback {
- .frame {
- &.leads-to-app {
- &.collapsed {
- .title {
- border-color: ${theme.border};
- background: ${theme.background};
- }
- }
- }
- }
- }
- .frame,
- .frame.system-frame {
- border-top-color: ${theme.border};
- &.is-expandable .title:hover {
- background-color: ${theme.background};
- }
- .btn-toggle {
- color: ${theme.textColor};
- background: transparent;
- }
- .title {
- background-color: ${theme.backgroundSecondary};
- }
- &.is-expandable .title {
- background-color: ${theme.backgroundSecondary};
- }
- .context {
- background: ${theme.background};
- table.key-value {
- border-color: ${theme.border};
- td {
- border-color: ${theme.border} !important;
- }
- }
- }
- }
- }
- .exc-message {
- color: ${theme.subText};
- }
- .group-detail h3 em {
- color: ${theme.subText};
- }
- .event-details-container {
- background-color: ${theme.background};
- .secondary {
- border-left-color: ${theme.border};
- }
- }
- /* Group Details - User context */
- .user-widget .avatar {
- box-shadow: 0 0 0 5px ${theme.background};
- background: ${theme.background};
- }
- .nav-header a.help-link,
- .nav-header span.help-link a {
- color: ${theme.subText};
- }
- /* Global Selection header date picker */
- .rdrCalendarWrapper {
- background: ${theme.background};
- color: ${theme.textColor};
- }
- .rdrDayDisabled {
- background-color: ${theme.backgroundSecondary};
- color: ${theme.disabled};
- }
- .rdrMonthAndYearPickers select {
- color: ${theme.textColor};
- }
- .dropdown-menu {
- color: ${theme.textColor};
- background-color: ${theme.background} !important;
- border: 1px solid ${theme.border};
- &:before {
- border-bottom-color: ${theme.border};
- }
- &:after {
- border-bottom-color: ${theme.background};
- }
- &.inverted:before {
- border-top-color: ${theme.border};
- }
- &.inverted:after {
- border-top-color: ${theme.background};
- }
- }
- `
- : ''}
- `;
- /**
- * Renders an emotion global styles injection component
- */
- function GlobalStyles({theme, isDark}: {isDark: boolean; theme: Theme}) {
- return <Global styles={styles(theme, isDark)} />;
- }
- export default GlobalStyles;
|