/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ /* Animation-inspector specific theme variables */ :root { --animation-item-hover-color: rgba(215, 215, 219, 0.4); --animation-item-selected-color: rgba(215, 215, 219, 0.9); --cssanimation-color: var(--purple-50); --csstransition-color: var(--blue-55); --fast-track-image: url("images/animation-fast-track.svg"); --graph-height: 30px; --graph-right-offset: 10px; --keyframe-marker-shadow-color: #c4c4c4; --pause-image: url(chrome://devtools/skin/images/pause.svg); --progress-bar-color: var(--grey-40); --resume-image: url(chrome://devtools/skin/images/play.svg); --rewind-image: url(chrome://devtools/skin/images/rewind.svg); --scriptanimation-color: var(--green-60); --scrubber-color: var(--magenta-65); --sidebar-width: 200px; --tick-line-style: 0.5px solid var(--theme-splitter-color); } :root.theme-dark { --animation-item-hover-color: rgba(74, 74, 79, 0.5); --animation-item-selected-color: var(--grey-60); --csstransition-color: var(--blue-50); --keyframe-marker-shadow-color: #818181; --progress-bar-color: var(--grey-50); --scrubber-color: var(--magenta-50); } #animationinspector-panel { overflow-x: auto; } /* Root element of animation inspector */ #animation-container { cursor: default; display: flex; flex-direction: column; height: 100%; outline: none; min-width: var(--min-container-width); } #animation-container .uncontrolled { overflow: hidden; } #animation-container:not(.animation-detail-visible) .controlled { display: none; } #animation-container .animation-container-splitter { overflow: hidden; } /* Animation Toolbar */ .animation-toolbar { display: flex; } .pause-resume-button::before { background-image: var(--pause-image); } .pause-resume-button.paused::before { background-image: var(--resume-image); } select.playback-rate-selector.devtools-button { background-image: url("chrome://devtools/skin/images/dropmarker.svg"); background-position: calc(100% - 4px) center; background-repeat: no-repeat; padding-inline-end: 1em; text-align: center; } select.playback-rate-selector.devtools-button:not(:empty, :disabled, .checked):hover { background: none; background-color: var(--toolbarbutton-background); background-image: url("chrome://devtools/skin/images/dropmarker.svg"); background-position: calc(100% - 4px) center; background-repeat: no-repeat; border-color: var(--toolbarbutton-hover-border-color); } .rewind-button::before { background-image: var(--rewind-image); } /* Animation List Container */ .animation-list-container { overflow: hidden; width: 100%; user-select: none; } .animation-list-container.active-scrubber, .animation-list-container.active-scrubber .animation-summary-graph { cursor: col-resize; } /* Current Time Scrubber */ .current-time-scrubber-area { grid-column: 2 / 3; position: relative; z-index: 2; } .current-time-scrubber-area::before { content: ""; cursor: col-resize; height: var(--theme-toolbar-height); pointer-events: auto; position: absolute; /* In order to click on edge of current-time-scrubber-controller element */ width: calc(100% + 1px); } .current-time-scrubber-area:dir(rtl)::before { /* In order to click on the start edge of current-time-scrubber-area element on RTL */ margin-inline-start: -1px; } .indication-bar.current-time-scrubber { cursor: col-resize; pointer-events: auto; } .indication-bar.current-time-scrubber:dir(rtl)::before { transform: translateX(6px); } .indication-bar.current-time-scrubber:dir(rtl)::after { transform: translateX(1px); } .indication-bar.current-time-scrubber::before { border-top-color: var(--scrubber-color); } .indication-bar.current-time-scrubber::after { background-color: var(--scrubber-color); } /* Animation Item */ .animation-item.cssanimation { --graph-color: var(--cssanimation-color); --graph-opacity: 0.7; } .animation-item.csstransition { --graph-color: var(--csstransition-color); --graph-opacity: 0.8; } .animation-item.scriptanimation { --graph-color: var(--scriptanimation-color); --graph-opacity: 0.5; } .animation-item:hover { background-color: var(--animation-item-hover-color); } .animation-item.selected { background-color: var(--animation-item-selected-color); } /* Animation Target */ .animation-target { align-items: center; display: flex; grid-column: 1 / 2; height: inherit; padding-inline-start: 4px; /* animation-target is tech term, so it should be displayed as ltr. */ direction: ltr; } .animation-item:dir(rtl).animation-target { right:0; } /* Reps component */ .animation-target .objectBox { display: flex; max-width: 100%; } .animation-target .objectBox .attrName { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .animation-target .objectBox .highlight-node { fill: var(--theme-icon-dimmed-color); flex: none; } .animation-target .objectBox .highlight-node:hover{ fill: var(--theme-icon-color); } .animation-target .objectBox .highlight-node:active, .animation-target.highlighting .objectBox .highlight-node { fill: var(--theme-icon-checked-color); /* Since the icon is quite thin, it can be hard to differentiate it from its regular state. Adding some background helps make it pop a bit */ background-color: var(--dimmed-highlighter-box-content-color); } /* Summary Graph */ .animation-summary-graph { cursor: pointer; grid-column: 2 / 3; height: inherit; padding-bottom: 3px; padding-top: 3px; position: relative; } .animation-summary-graph.compositor::after { background-image: var(--fast-track-image); background-repeat: no-repeat; content: ""; display: block; fill: var(--theme-icon-dimmed-color); height: 100%; position: absolute; right: 0; top: 5px; width: 15px; -moz-context-properties: fill; } .animation-summary-graph.compositor:dir(rtl)::after { right: unset; left: 0; } .animation-summary-graph-path { height: 100%; width: 100%; } .animation-summary-graph:dir(rtl) .animation-summary-graph-path { transform: scaleX(-1.0); } .animation-computed-timing-path path { fill: var(--graph-color); fill-opacity: var(--graph-opacity); stroke: var(--graph-color); vector-effect: non-scaling-stroke; transform: scale(1, -1); } .animation-computed-timing-path path.infinity:nth-child(n+2) { opacity: 0.3; } .animation-effect-timing-path path { fill: none; stroke: var(--graph-color); stroke-dasharray: 2px 2px; transform: scale(1, -1); vector-effect: non-scaling-stroke; } .animation-effect-timing-path path.infinity:nth-child(n+2) { opacity: 0.3; } .animation-computed-timing-path path.infinity-duration, .animation-effect-timing-path path.infinity-duration { mask-clip: stroke-box; mask-image: linear-gradient(90deg, black, transparent); mask-origin: stroke-box; } .animation-negative-delay-path path, .animation-negative-end-delay-path path { fill: none; stroke: var(--theme-graphs-grey); stroke-dasharray: 2px 2px; transform: scale(1, -1); vector-effect: non-scaling-stroke; } .animation-delay-sign, .animation-end-delay-sign { background-color: var(--theme-graphs-grey); height: 3px; position: absolute; bottom: 2px; } .animation-delay-sign::before, .animation-end-delay-sign::before { background-color: inherit; border-radius: 50%; content: ""; height: 6px; position: absolute; top: -1.5px; width: 6px; } .animation-delay-sign.fill, .animation-end-delay-sign.fill { background-color: var(--graph-color); } /* These are delay sign directions. Basically, we can't use the transform due to pseudo element, So we use the left/right align. */ .animation-delay-sign:dir(ltr)::before { left: -3px; right: unset; } .animation-delay-sign:dir(rtl)::before { left: unset; right: -3px; } .animation-delay-sign.negative:dir(ltr)::before { left: unset; right: -3px; } .animation-delay-sign.negative:dir(rtl)::before { left: -3px; right: unset; } .animation-end-delay-sign:dir(ltr)::before { left: unset; right: -3px; } .animation-end-delay-sign:dir(rtl)::before { left: -3px; right: unset; } .animation-end-delay-sign.negative:dir(ltr)::before { left: -3px; right: unset; } .animation-end-delay-sign.negative:dir(rtl)::before { left: unset; right: -3px; } .animation-name { height: 100%; left: 0; pointer-events: none; position: absolute; top: 0; width: calc(100% - 20px); } .animation-name text { dominant-baseline: middle; fill: var(--theme-focus-outline-color); paint-order: stroke; stroke: var(--theme-body-background); stroke-linejoin: round; stroke-opacity: .5; stroke-width: 4; text-anchor: end; } .animation-summary-graph:dir(rtl) .animation-name text { transform: translateX(-100%); } .animation-summary-graph:dir(rtl) .animation-name { right:0; } /* Animation Detail */ .animation-detail-container { background-color: var(--theme-sidebar-background); display: flex; flex-direction: column; height: 100%; overflow: hidden; width: 100%; z-index: 2; } .animation-detail-header { display: flex; padding-inline-end: 0; } /* On OSX the cursor turns into a window-resizing cursor at the edges of the * window, so bring the end of the close button in. */ :root[platform="mac"] .animation-detail-header { padding-inline-end: 2px; } .animation-detail-title { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .animation-detail-close-button { margin: 0; } .animation-detail-close-button::before { background-image: url(chrome://devtools/skin/images/close.svg); } /* Animated Property List Container */ .animated-property-list-container { flex: 1; overflow: hidden; user-select: none; } /* Keyframes Progress Bar */ .keyframes-progress-bar-area { background: none; grid-column: 2 / 3; pointer-events: none; position: relative; z-index: 2; } .indication-bar.keyframes-progress-bar::before { border-top-color: var(--progress-bar-color); } .indication-bar.keyframes-progress-bar::after { background-color: var(--progress-bar-color); } /* Animated Property Item */ .animated-property-item.unchanged { opacity: 0.6; } /* Animated Property Name */ .animated-property-name { align-items: center; display: flex; height: inherit; justify-content: flex-end; padding-inline-end: 10px; } .animated-property-name.compositor span { padding-inline-start: 15px; position: relative; } .animated-property-list-container.cssanimation .animated-property-name.compositor { --fast-track-color: var(--cssanimation-color); } .animated-property-list-container.csstransition .animated-property-name.compositor { --fast-track-color: var(--csstransition-color); } .animated-property-list-container.scriptanimation .animated-property-name.compositor { --fast-track-color: var(--scriptanimation-color); } .animated-property-name.compositor span:dir(ltr)::before, .animated-property-name.compositor span:dir(rtl)::after { background-image: var(--fast-track-image); background-repeat: no-repeat; background-size: contain; content: ""; fill: var(--fast-track-color); height: 100%; position: absolute; /* In order to support RTL/LTR both of environment, set the left and right to zero */ left: 0; right: 0; width: 15px; -moz-context-properties: fill; } .animated-property-name.warning span { text-decoration: underline dotted; } /* Keyframes Graph */ .keyframes-graph { grid-column: 2 / 3; height: inherit; padding-top: 5px; position: relative; } .keyframes-graph:dir(rtl) .keyframes-graph-path { transform: scaleX(-1.0); } .keyframes-graph-path { height: 100%; width: 100%; } .keyframes-graph-path path { fill: var(--teal-60); fill-opacity: 0.5; stroke: var(--teal-70); vector-effect: non-scaling-stroke; transform: scale(1, -1); } .keyframes-graph.opacity .keyframes-graph-path path { fill: var(--magenta-50); stroke: var(--magenta-70); } .keyframes-graph.transform .keyframes-graph-path path { fill: var(--yellow-50); stroke: var(--yellow-60); } .keyframes-graph-path .color-path path { fill-opacity: 1; stroke: none; } .keyframes-graph .keyframes-graph-path .hint path { fill: none; stroke-linecap: round; stroke-opacity: 0; } .keyframes-graph-path .hint path:hover { stroke-opacity: 1; } .keyframes-graph-path .hint rect { fill-opacity: 0.1; } .keyframes-graph-path .hint line { stroke: #00b0bd; stroke-opacity: 0; vector-effect: non-scaling-stroke; } .keyframes-graph-path .hint:hover line { stroke-opacity: 1; } /* Keyframe Marker List */ .keyframe-marker-list { pointer-events: none; position: absolute; height: 100%; list-style-type: none; top: 0%; width: 100%; padding-inline-start: 0; } .keyframe-marker-item { box-shadow: 0 0 0 1px var(--keyframe-marker-shadow-color); border-radius: 100%; pointer-events: auto; position: absolute; top: 50%; height: 10px; transform: translate(-5px, -3px); width: 10px; } .keyframe-marker-item:dir(rtl) { transform: translate(5px, -3px); } .animated-property-list-container.cssanimation .keyframe-marker-item { background-color: var(--cssanimation-color); } .animated-property-list-container.csstransition .keyframe-marker-item { background-color: var(--csstransition-color); } .animated-property-list-container.scriptanimation .keyframe-marker-item { background-color: var(--scriptanimation-color); } /* Common Components */ /* Progress Inspection Panel */ .progress-inspection-panel { height: 100%; overflow-y: auto; overflow-x: hidden; display: grid; grid-template-columns: var(--sidebar-width) 1fr var(--graph-right-offset); grid-template-rows: var(--theme-toolbar-height) calc(100% - var(--theme-toolbar-height)); } .progress-inspection-panel > .background { grid-column: 1 / -1; grid-row: 1 / -1; position: sticky; top: 0; /* Correspond to the bug 1462235 */ height: calc(100% - 1px); pointer-events: none; display: grid; grid-template-columns: subgrid; } .progress-inspection-panel > .header { grid-column: 1 / -1; grid-row: 1 / 2; position: sticky; top: 0; padding: 0; z-index: 1; display: grid; grid-template-columns: subgrid; } .progress-inspection-panel > .indicator { grid-column: 1 / -1; grid-row: 1 / -1; position: sticky; top: 0; /* Correspond to the bug 1462235 */ height: calc(100% - 1px); pointer-events: none; z-index: 2; display: grid; grid-template-columns: subgrid; } .progress-inspection-panel > ul { grid-column: 1 / -1; grid-row: 2 / -1; list-style-type: none; margin: 0; padding: 0; display: grid; grid-template-columns: subgrid; grid-auto-rows: min-content; } .progress-inspection-panel > ul > li { grid-column: 1 / -1; height: var(--graph-height); display: grid; grid-template-columns: subgrid; } /* Tick Lines */ .tick-lines { grid-column: 2 / 3; position: relative; } .tick-line { position: absolute; height: 100%; border-inline-start: var(--tick-line-style); } /* Tick Labels */ .tick-labels { grid-column: 2 / 3; height: 100%; position: relative; } .tick-label { border-inline-start: var(--tick-line-style); height: 100%; position: absolute; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .animated-property-list-container .tick-label:last-child { border-inline-start: unset; border-inline-end: var(--tick-line-style); transform: translateX(calc(-100% + 0.5px)); } .animated-property-list-container .tick-label:dir(rtl):last-child { transform: translateX(calc(100% - 0.6px)); } /* Indication Bar */ .indication-bar { position: absolute; height: 100%; } .indication-bar::before { border-inline-start: 5px solid transparent; border-inline-end: 5px solid transparent; border-top: 5px solid; content: ""; height: calc(100% - 5px); position: absolute; transform: translateX(-6px); width: 1px; } .indication-bar::after { content: ""; height: 100%; position: absolute; transform: translateX(-1px); width: 1px; } /* No Animation Panel */ .animation-error-message > p { white-space: pre-wrap; } .animation-element-picker::before { background-image: url("chrome://devtools/content/shared/images/command-pick.svg"); }