/** * Group Detail * ============================================================================ */ .group-detail { position: relative; margin: 0 0 20px; clear: both; h3 { font-size: 22px; margin: 0 0 8px; text-overflow: ellipsis; white-space: nowrap; overflow: hidden; line-height: 1.1; em { font-style: normal; font-weight: 400; color: @70; font-size: 90%; } } .count { &.short-id-box { min-width: 0; span:not(.help-link) { font-size: 18px; line-height: 1.45; display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; direction: rtl; } } span:not(.help-link) { font-size: 22px; display: inline-block; line-height: 1.2; } } .assigned-to { text-align: right; position: relative; } .meta { margin: 0 0 15px; color: #949ea4; } .id-label { background: #fff; max-width: 200px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .severity { display: inline-block; position: relative; top: -7px; padding: 0 10px; } .nav-tabs { margin-top: 20px; margin-bottom: 0; } &:before { position: absolute; display: block; content: ''; bottom: -1px; left: -40px; right: -40px; height: 1px; background: @trim; } } /** * Commit Activity * TODO(billy): Move this to relevant components * (This used to be nested under `.activity-item` which is now a styled component) * ============================================================================ */ .inline-commit { color: @60; padding-left: 3px; &:hover { color: @80; } } /** * Event Details * ============================================================================ */ .event-details-container { display: flex; margin: -20px -40px; background: #fff; flex-direction: column; flex: 1; @media (min-width: 1200px) { flex-direction: row; } .primary { flex: 1; .user-report { border-radius: 0; box-shadow: none; padding: 20px 30px 0 40px; border: 0; border-top: 1px solid lighten(@trim, 4); margin: 0; padding-bottom: 0; } @media (min-width: 1200px) { // TODO(dcramer): whatever flex is doing here is causing this to extend to // whatever it pleases (e.g. 4k pixels on my 1280 screen) max-width: ~'calc(100% - 365px)'; } } .secondary { width: 100%; padding: 30px 40px 30px 30px; border-left: 1px solid @trim; @media (min-width: 1200px) { width: 365px; } } } /* * Context callout * ============================================================================ */ .context-summary { .context-item { .context-item-icon { position: absolute; left: 0; width: 36px; height: 36px; background-repeat: no-repeat; background-position: center 2px; background-image: url(~sentry-logos/logo-unknown.svg); background-size: 30px 32px; // magic number here because some logos are slightly cut off when at 32 x 32 } &:first-child { border: 0; } h3 { .truncate; font-size: 16px; line-height: 1.2; margin-bottom: 0; } p { font-size: 13px; line-height: 1.4; &:last-child { margin: 0; } } &.arm .context-item-icon { background-image: url(~sentry-logos/logo-arm.svg); background-size: contain; } &.amd .context-item-icon, &[class*='amd-'] .context-item-icon { background-image: url(~sentry-logos/logo-amd.svg); background-size: contain; } &.nvidia .context-item-icon, &[class*='nvidia-'] .context-item-icon { background-image: url(~sentry-logos/logo-nvidia.svg); background-size: contain; } &.electron .context-item-icon { background-image: url(~sentry-logos/logo-electron.svg); } &.crystal .context-item-icon { background-image: url(~sentry-logos/logo-crystal.svg); } &.net-framework .context-item-icon { background-image: url(~sentry-logos/logo-netframework.svg); } &.net-core .context-item-icon { background-image: url(~sentry-logos/logo-netcore.svg); } &.net .context-item-icon { background-image: url(~sentry-logos/logo-dotnet.svg); } &.mono .context-item-icon { background-image: url(~sentry-logos/logo-monogorilla.svg); } &.php .context-item-icon { background-image: url(~sentry-logos/logo-php.svg); } &.ipad .context-item-icon { background-image: url(~sentry-logos/logo-apple-tablet.svg); } &.ipod, &.iphone { .context-item-icon { background-image: url(~sentry-logos/logo-apple-phone.svg); } } &.appletv .context-item-icon { background-image: url(~sentry-logos/logo-apple-tv.svg); } &.watch .context-item-icon { background-image: url(~sentry-logos/logo-apple-watch.svg); } &.android-phone { .context-item-icon { background-image: url(~sentry-logos/logo-android-phone.svg); } } &.android-tablet { .context-item-icon { background-image: url(~sentry-logos/logo-android-tablet.svg); } } &.darwin, &.ios, &.macos, &.tvos, &.mac-os-x, &.mac, &.apple, &.watchos { .context-item-icon { background-image: url(~sentry-logos/logo-apple.svg); background-position: center 0; } } &.android .context-item-icon { background-image: url(~sentry-logos/logo-android.svg); } &.windows .context-item-icon { background-image: url(~sentry-logos/logo-windows.svg); } &.linux .context-item-icon { background-image: url(~sentry-logos/logo-linux.svg); } &.ubuntu .context-item-icon { background-image: url(~sentry-logos/logo-ubuntu.svg); } &.amazon .context-item-icon { background-image: url(~sentry-logos/logo-amazon.svg); } &.firefox .context-item-icon { background-image: url(~sentry-logos/logo-firefox.svg); } &.chrome, &.chrome-mobile, &.chrome-mobile-ios { .context-item-icon { background-image: url(~sentry-logos/logo-chrome.svg); } } &.chromium .context-item-icon { background-image: url(~sentry-logos/logo-chromium.svg); } &.edge .context-item-icon { background-image: url(~sentry-logos/logo-edge-new.svg); } &.legacy-edge .context-item-icon { background-image: url(~sentry-logos/logo-edge-old.svg); } &.internet-explorer .context-item-icon { background-image: url(~sentry-logos/logo-ie.svg); } &.opera .context-item-icon { background-image: url(~sentry-logos/logo-opera.svg); } &.playstation .context-item-icon { background-image: url(~sentry-logos/logo-playstation.svg); } &.qq-browser .context-item-icon { background-image: url(~sentry-logos/logo-qq.svg); } &.safari, &.mobile-safari { .context-item-icon { background-image: url(~sentry-logos/logo-safari.svg); } } &.samsung .context-item-icon { background-image: url(~sentry-logos/logo-samsung.svg); } &.motorola .context-item-icon { background-image: url(~sentry-logos/logo-motorola.svg); } &.google .context-item-icon { background-image: url(~sentry-logos/logo-google.svg); } &.ruby .context-item-icon { background-image: url(~sentry-logos/logo-ruby.svg); } &.python, &.cpython { .context-item-icon { background-image: url(~sentry-logos/logo-python.svg); } } } } .module-user .avatar { width: 64px; height: 64px; img { height: 100%; width: 100%; } } .event-stats { padding-top: 84px; margin-top: -84px; } .event-stats { h6 { font-size: 14px; margin-bottom: 15px; position: relative; > span { background: @white-dark; padding-right: 7px; } &:before { display: block; position: absolute; content: ''; border-top: 1px solid lighten(@trim, 9); left: 0; right: 0; top: 50%; z-index: -1; } } } .user-widget { position: relative; margin-bottom: 20px; .avatar { width: 48px; height: 48px; position: absolute; top: 0; right: 0; box-shadow: 0 0 0 5px #fff; background: #fff; border-radius: 50% 0 50% 50%; } .table { margin-bottom: 0; } } /** * Traceback * ============================================================================ */ .traceback { list-style-type: none; padding-left: 0; border: 1px solid @trim-dark; border-radius: 0 3px 3px 3px; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04); margin-bottom: 20px; } // TODO(dcramer): we probably shouldn't overload these pre.traceback { margin: 0 0 20px; } div.traceback > ul { padding: 0; margin-bottom: 0; li { &:first-child { border-top: none; .title { border-top: none; border-top-right-radius: 3px; border-top-left-radius: 3px; } } &:last-child .title { border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; } } } .raw-toggle { input { margin-right: 6px; position: relative; top: -1px; } } /** * Frame * ============================================================================ */ .exc-message { margin: 15px 0 0; word-wrap: break-word; white-space: pre-wrap; color: @gray-darker; padding: 0; background: none; } .frames-omitted, .exc-omitted { color: @gray-dark; font-size: 14px; font-weight: 600; border-left: 3px solid @red; border-right: 1px solid lighten(@red, 30%); background: lighten(@red, 35%); padding: 10px 20px; margin-bottom: 10px !important; margin-left: -21px; margin-right: -21px; } .exception { border-bottom: 1px solid @trim; margin: 0 0 20px; &:last-child { border-bottom: 0; margin-bottom: 0; } h5 { line-height: 1.2; } .traceback { margin-top: 15px; } } .traceback { &.no-exception .frame:first-child { border-top: 0; } .frame { list-style-type: none; position: relative; margin: 0; border-top: 1px solid @trim; h3 { font-size: 22px; } &.is-expandable .title { cursor: pointer; &:hover { background: lighten(@blue-light, 36); } } &.system-frame.is-expandable .title:hover { background: darken(@white-dark, 5); } .title { padding: 8px 20px; font-size: 13px; margin: 0; line-height: 16px; background: lighten(@blue-light, 35); word-break: break-all; /* for firefox */ word-break: break-word; /* for chrome */ code { font-family: inherit; } .informal { font-style: italic; } } &.system-frame .title { background: @white-dark; } .title.as-table { width: 100%; padding-left: 15px; .package { font-size: 13px; font-weight: bold; .truncate; flex-basis: 120px; flex-grow: 0; flex-shrink: 0; } .address { font-family: @font-family-code; font-size: 11px; color: @gray-dark; letter-spacing: -0.25px; width: 100px; flex-grow: 0; flex-shrink: 0; } .symbol { word-break: break-word; flex: 1; code { background: transparent; color: @blue-dark; padding-right: 5px; a { color: inherit; &:hover { text-decoration: underline; } } } span.offset { font-weight: bold; padding-right: 10px; } span.filename { color: @purple; margin-right: 3px; &:before { content: '('; } &:after { content: ')'; } } } } .original-src { font-size: 12px; padding-left: 3px; position: relative; top: 1px; } .icon-open { font-size: 12px; margin-right: 3px; margin-left: 3px; position: relative; top: 1px; } .in-at { opacity: 0.6; margin: 0 2px; } .blame { color: lighten(@gray, 5); a { color: @gray; } .icon-mark-github { position: relative; top: 1px; } } .tooltip-inner { word-wrap: break-word; text-align: left; max-width: 300px; } .divider { border-left: 1px solid @trim; display: inline-block; width: 1px; height: 10px; margin: 0 6px; position: relative; top: 1px; } code { padding: 0; background: inherit; font-size: inherit; color: inherit; } .empty-context { padding: 20px; color: @gray; p { display: inline-block; margin-bottom: 0; } .icon { opacity: 0.45; margin-right: 10px; font-size: 0.85em; } } .context { display: none; background: #fff; margin: 0; padding: 8px 0; > li { background: inherit; } table.key-value { border-top: 1px solid @trim; padding: 0; margin: 0 0 -8px; td { border-bottom: 1px solid @trim !important; &.key { width: 125px; max-width: 125px; } &.value pre { background: inherit; } } tr:last-child { td { border-bottom: 0 !important; } } } &.expanded { display: block; } } .tag-app { color: #aaa; font-size: 0.9em; margin-left: 10px; } > div > table.key-value { margin-bottom: 5px; > tbody > tr > th { color: @gray-dark; text-align: right; padding-right: 12px !important; } } .btn-toggle { display: block; float: right; width: 16px; height: 16px; padding: 0; line-height: 16px; font-size: 9px; text-align: center; flex-shrink: 0; } .expand-button:hover { cursor: pointer; } &.expanded { .expandable { height: auto; } } &:last-child { .context { margin-bottom: 0; } .toggle-expand .btn { margin-bottom: -13px; } } } &.in-app-traceback .frame.leads-to-app { .leads-to-app-hint { display: none; } &.collapsed { .title { opacity: 0.7; font-size: 12px; padding: 4px 20px 4px 20px; background: lighten(@blue-light, 33); &.is-expandable:hover { opacity: 1; } .package { width: auto; } } .title.as-table { padding-left: 15px; } .in-at-line, .lineno, .btn-toggle, .address { display: none; } .leads-to-app-hint { display: inline; } } } &.full-traceback { .leads-to-app-hint { display: none !important; } } .expandable { height: 0; position: relative; .icon-plus { position: absolute; left: 8px; top: 6px; opacity: 0.25; transition: 0.1s opacity linear; } &.key-value { display: none; } .ws { display: none; overflow: hidden; } &:hover { .icon-plus { opacity: 0.5; } } } .expanded { .expandable { height: auto; } .ws { display: inline; overflow: none; } } ol.context { margin: 0; list-style-position: inside; list-style-type: decimal-leading-zero; border-radius: 3px; padding-left: 0; .key-value { display: none; pre { overflow: auto; } } > li { font-family: @font-family-code; color: #222; background-color: #f6f7f8; line-height: 24px; font-size: 12px; white-space: pre; white-space: pre-wrap; word-wrap: break-word; min-height: 24px; } > li.active { background-color: #f6f7f8; list-style-type: none; border-radius: 2px; &:first-child:last-child { background-color: inherit; color: inherit; border-radius: 0; } pre { color: @gray-dark; } } > li:first-child { border-radius: 2px 2px 0 0; } > li:last-of-type { border-radius: 0 0 2px 2px; } li.closed { border-radius: 2px; } &.expanded { .key-value { display: table; } > li.active { background-color: @purple; color: #fff; list-style-type: inherit; border-radius: 0; } } } ol.context-line { > li { > span { float: right; } } } } #full-message { line-height: 1.5em; &#full-message { background: none; padding: 0; } } &.expanded div.commands, div.commands:hover { opacity: 1; a { color: @state-info-text; } } div.commands { position: absolute; right: 10px; top: 6px; font-size: 0.9em; opacity: 0.3; a { color: #666; text-decoration: none; span { font-size: 9px; margin-right: 5px; } } } // Request .request { .path { font-weight: normal; float: left; strong { margin-right: 4px; } } } /* message details */ .server-list, .url-list, .logger-list, .level-list { list-style: none; margin-left: 0; margin-bottom: 0; } .server-list li, .url-list li { padding-bottom: 10px; } .url-list li a { line-height: 18px; } pre.val, span.val { span { display: inline; } } .val-string { border-radius: 3px; padding: 2px 4px; } .val-string-multiline { display: block; overflow: auto; } .val-stripped { color: darken(@red, 10); background: transparent; } .val-bool, .val-null { color: darken(@blue, 10); font-weight: bold; } .val-dict { display: inline; .val-dict-items { display: block; padding: 0 0 0 15px; .val-dict-pair { display: block; } } .val-dict-key, .val-dict-key .val-string { color: darken(@red, 5); background: transparent; border-radius: none; } } .val-array { .val-array-items { display: block; padding: 0 0 0 15px; .val-array-item { display: block; } } } /** * Exceptions and Threads * ============================================================================ */ .box .thread { .exception { margin-top: 10px; } .traceback.no-exception { margin-top: 0; } } /** * Shared Group Detail * ============================================================================ */ .shared-group { padding: 40px 0; background: none; .app > .container { max-width: 960px; > .box { > .box-header { padding: 15px 30px 13px; display: flex; align-items: center; a { &.logo { font-size: 20px; flex: 1; } &:hover { color: @gray-dark; } } .back-to, .pull-right a { font-size: 16px; } .back-to { border-left: 1px solid @trim; padding: 2px 10px; display: inline-block; margin-left: 7px; position: relative; top: -3px; } } } } .container { padding-left: 0; padding-right: 0; } .group-detail { padding: 0 30px; border-bottom: 1px solid darken(@trim, 5); box-shadow: 0 2px 0 rgba(0, 0, 0, 0.03); &:before { display: none; } .details { max-width: 960px; margin: 0 auto; padding: 20px 0 0; } } .event-details-container { display: block; margin: 0; .primary { max-width: 100%; .box { padding: 0 30px; &:first-child { border-top: 0; } } .box-header, .box-content { max-width: 960px; margin: 0 auto; } .box-header { margin-top: 15px; } .exception { padding: 20px 0; margin: 0; &:first-child { padding-top: 0; } } .traceback.no-exception { margin-bottom: 25px; margin-top: -5px; } } } } /** * Breadcrumbs / Timeline * ============================================================================ */ ul.crumbs { li { .table.key-value { margin-bottom: 0; background: none; thead td:first-child { font-weight: bold; } td { padding: 2px 0 !important; font-weight: normal; } .key { width: 122px; max-width: 122px; color: @gray-dark; line-height: 1.6 !important; } pre { display: inline-block; padding: 0; margin-top: 1px; background: none; word-break: break-all; } } div.summary { overflow: hidden; &.can-expand { cursor: pointer; position: relative; &:after { position: absolute; bottom: 0; left: 0; right: 0; content: ' '; display: block; width: 100%; height: 15px; background-image: linear-gradient( to bottom, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 1) 100% ); background-repeat: repeat-x; z-index: 1; } &:hover { &:before { position: absolute; bottom: 4px; right: 0; font-family: 'sentry-simple'; content: '\e617'; background: @white-dark; border: 1px solid darken(@trim, 5); border-radius: 3px; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); z-index: 2; padding: 0 5px; margin-left: -14px; } } } &.expanded { max-height: none; &:after, &:before { display: none; } } pre { display: inline-block; } } } } /** * Responsive medium screen * ============================================================================ */ @media (max-width: 991px) { .group-stats-column { float: none; } } /** * Responsive small screen * ============================================================================ */ @media (max-width: 767px) { .group-detail { h3 { white-space: normal; font-size: 20px; line-height: 1.2; } .meta { font-size: 13px; } .short-id-box { text-align: left; } .is-assigned { padding-top: 0; } .seen-by { display: none; } } // Event detail columns .event-details-container { flex-direction: column; margin: 0; .primary { max-width: 100%; .box { padding: 15px 0; .box-header { h3 { margin: 0 0 10px; small { margin-left: 0 !important; display: block; } } .permalink { display: none; } } } .user-report { padding: 15px 0; } .exception { margin: 0; padding: 15px 0; } .traceback { &.no-exception { margin: 0; } .btn-toggle { width: 17px; } } } .secondary { width: auto; padding: 0; border: 0; margin-bottom: 20px; } .detailed-error { border-top: 1px solid @trim; } } // Context callout .context-summary { flex-direction: column; margin-top: 0; padding: 0; margin-bottom: 20px; } .context { overflow: auto; li { width: 800px; } } }