1261 lines
35 KiB
CSS
1261 lines
35 KiB
CSS
/* 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/. */
|
|
|
|
@namespace html url("http://www.w3.org/1999/xhtml");
|
|
|
|
:root {
|
|
--urlbar-container-padding: 1px;
|
|
--urlbar-margin-inline: 5px;
|
|
--urlbar-padding-block: 4px;
|
|
}
|
|
|
|
#urlbar[actiontype="switchtab"][action-override] > .urlbar-input-container > #urlbar-label-box,
|
|
#urlbar:not([actiontype="switchtab"], [actiontype="extension"], [searchmode]) > .urlbar-input-container > #urlbar-label-box,
|
|
#urlbar:not([actiontype="switchtab"]) > .urlbar-input-container > #urlbar-label-box > #urlbar-label-switchtab,
|
|
#urlbar:not([actiontype="extension"]) > .urlbar-input-container > #urlbar-label-box > #urlbar-label-extension,
|
|
#urlbar[searchmode][breakout-extend] > .urlbar-input-container > #urlbar-label-box,
|
|
#urlbar:not([searchmode]) > .urlbar-input-container > #urlbar-label-box > #urlbar-label-search-mode,
|
|
#urlbar[breakout-extend] > .urlbar-input-container > #urlbar-label-box > #urlbar-label-search-mode,
|
|
.urlbar-input-container[pageproxystate=invalid] > #page-action-buttons > .urlbar-page-action,
|
|
#identity-box.chromeUI ~ #page-action-buttons > .urlbar-page-action:not(#star-button-box),
|
|
#urlbar[usertyping] > .urlbar-input-container > #page-action-buttons > #urlbar-zoom-button,
|
|
#urlbar:not([usertyping]) > .urlbar-input-container > .urlbar-go-button,
|
|
#urlbar:not([focused]) > .urlbar-input-container > .urlbar-go-button,
|
|
#urlbar-revert-button-container {
|
|
display: none;
|
|
}
|
|
|
|
/* When rich suggestions are enabled the urlbar identity icon is given extra padding to
|
|
* align the results and urlbar text */
|
|
/* stylelint-disable-next-line media-query-no-invalid */
|
|
@media -moz-pref("browser.urlbar.richSuggestions.featureGate") {
|
|
#identity-box[pageproxystate="invalid"] > .identity-box-button {
|
|
padding-inline: calc(6px + var(--urlbar-icon-padding));
|
|
}
|
|
}
|
|
|
|
#urlbar-container,
|
|
#search-container {
|
|
padding-block: var(--urlbar-padding-block);
|
|
margin-inline: var(--urlbar-margin-inline);
|
|
|
|
:root[uidensity=touch] & {
|
|
padding-block: 5px;
|
|
}
|
|
}
|
|
|
|
#urlbar {
|
|
display: flex;
|
|
flex-direction: row;
|
|
flex: 1;
|
|
box-sizing: border-box;
|
|
will-change: translate;
|
|
|
|
/* Reset UA popover rules */
|
|
width: initial;
|
|
height: initial;
|
|
inset: auto;
|
|
border: none;
|
|
padding: initial;
|
|
overflow: initial;
|
|
color: initial;
|
|
background-color: initial;
|
|
}
|
|
|
|
#urlbar,
|
|
#searchbar {
|
|
/* Setting a min-width to let the location & search bars maintain a constant
|
|
* width in case they haven't been resized manually. (bug 965772) */
|
|
min-width: 1px;
|
|
min-height: var(--urlbar-min-height);
|
|
text-shadow: none;
|
|
color: var(--toolbar-field-color);
|
|
|
|
/**
|
|
* System colors and widgets are set based on toolbar color. Since toolbar
|
|
* fields can be styled differently from the toolbar, we need to use the
|
|
* correct color scheme in toolbar fields.
|
|
*/
|
|
:root[lwt-toolbar-field="light"] & {
|
|
color-scheme: light;
|
|
}
|
|
:root[lwt-toolbar-field="dark"] & {
|
|
color-scheme: dark;
|
|
}
|
|
}
|
|
|
|
#urlbar[focused],
|
|
#searchbar:focus-within {
|
|
:root[lwt-toolbar-field-focus="light"] & {
|
|
color-scheme: light;
|
|
}
|
|
:root[lwt-toolbar-field-focus="dark"] & {
|
|
color-scheme: dark;
|
|
}
|
|
}
|
|
|
|
#urlbar-background,
|
|
#searchbar {
|
|
background-color: var(--toolbar-field-background-color);
|
|
background-clip: border-box;
|
|
border: 1px solid var(--toolbar-field-border-color);
|
|
border-radius: var(--toolbarbutton-border-radius);
|
|
}
|
|
|
|
.urlbar-input-container,
|
|
#searchbar {
|
|
border-radius: var(--toolbarbutton-border-radius);
|
|
overflow: clip;
|
|
}
|
|
|
|
.urlbar-input,
|
|
#urlbar-scheme,
|
|
.searchbar-textbox {
|
|
flex: 1;
|
|
background-color: transparent;
|
|
color: inherit;
|
|
border: none;
|
|
margin: 0;
|
|
padding: 0;
|
|
outline: none;
|
|
}
|
|
|
|
.urlbar-input {
|
|
mask-repeat: no-repeat;
|
|
unicode-bidi: plaintext;
|
|
text-align: match-parent;
|
|
|
|
/* Align URLs to the right in RTL mode. */
|
|
&:-moz-locale-dir(rtl) {
|
|
text-align: right !important;
|
|
}
|
|
|
|
/* Make sure that the location bar's alignment changes according
|
|
to the input box direction if the user switches the text direction using
|
|
cmd_switchTextDirection (which applies a dir attribute to the <input>). */
|
|
&[dir=ltr]:-moz-locale-dir(rtl) {
|
|
text-align: left !important;
|
|
}
|
|
|
|
&[dir=rtl]:-moz-locale-dir(ltr) {
|
|
text-align: right !important;
|
|
}
|
|
|
|
#urlbar:not([focused])[domaindir="ltr"]> .urlbar-input-container > .urlbar-input-box > & {
|
|
direction: ltr;
|
|
unicode-bidi: embed;
|
|
}
|
|
|
|
/* The following rules apply overflow masks to the unfocused urlbar
|
|
This mask may be overriden when a Contextual Feature Recommendation is shown. */
|
|
#urlbar:not([focused])[textoverflow="both"] > .urlbar-input-container > .urlbar-input-box > & {
|
|
mask-image: linear-gradient(to right, transparent, black 3ch, black calc(100% - 3ch), transparent);
|
|
}
|
|
#urlbar:not([focused])[textoverflow="right"] > .urlbar-input-container > .urlbar-input-box > & {
|
|
mask-image: linear-gradient(to left, transparent, black 3ch);
|
|
}
|
|
#urlbar:not([focused])[textoverflow="left"] > .urlbar-input-container > .urlbar-input-box > & {
|
|
mask-image: linear-gradient(to right, transparent, black 3ch);
|
|
}
|
|
#urlbar:not([focused])[textoverflow="left"][domaindir="rtl"] > .urlbar-input-container > .urlbar-input-box > & {
|
|
mask-image: linear-gradient(to right, transparent var(--urlbar-scheme-size), black calc(var(--urlbar-scheme-size) + 3ch));
|
|
}
|
|
}
|
|
|
|
#urlbar-scheme {
|
|
position: absolute;
|
|
height: 100%;
|
|
visibility: hidden;
|
|
direction: ltr;
|
|
pointer-events: none;
|
|
|
|
/* The protocol is visible if there is an RTL domain and we overflow to the left.
|
|
Uses the required-valid trick to check if it contains a value */
|
|
#urlbar:not([focused])[textoverflow="left"][domaindir="rtl"] > .urlbar-input-container > .urlbar-input-box > &:valid {
|
|
visibility: visible;
|
|
}
|
|
}
|
|
|
|
#urlbar[focused]:not([suppress-focus-border]) > #urlbar-background,
|
|
#searchbar:focus-within {
|
|
outline: var(--focus-outline);
|
|
outline-offset: var(--focus-outline-inset);
|
|
|
|
/* We used --focus-outline above to inherit its width and style properties,
|
|
but we still want to use the theme's border-color.
|
|
--toolbar-field-focus-border-color is set equal to --focus-outline-color
|
|
on :root, but LWT themes can override this value. */
|
|
outline-color: var(--toolbar-field-focus-border-color);
|
|
border-color: transparent;
|
|
}
|
|
|
|
#urlbar[focused] > #urlbar-background,
|
|
#searchbar:focus-within {
|
|
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.23);
|
|
}
|
|
|
|
#urlbar[open] > #urlbar-background {
|
|
border-color: var(--arrowpanel-border-color);
|
|
box-shadow: 0 2px 14px rgba(0, 0, 0, 0.13);
|
|
}
|
|
|
|
#urlbar:is([focused], [open]),
|
|
#searchbar:focus-within {
|
|
color: var(--toolbar-field-focus-color);
|
|
}
|
|
|
|
#urlbar:is([focused], [open]) > #urlbar-background,
|
|
#searchbar:focus-within {
|
|
background-color: var(--toolbar-field-focus-background-color);
|
|
}
|
|
|
|
.urlbar-input::placeholder,
|
|
.searchbar-textbox::placeholder {
|
|
opacity: 0.69;
|
|
}
|
|
|
|
#TabsToolbar #searchbar:not(:focus-within) {
|
|
/* The tabs toolbar is usually a different color than the other toolbars, and
|
|
we can't predict it, to avoid a transparent field we enforce a border. */
|
|
border-color: color-mix(in srgb, currentColor 20%, transparent);
|
|
}
|
|
|
|
:root[lwtheme] {
|
|
.urlbar-input::selection,
|
|
.searchbar-textbox::selection {
|
|
background-color: var(--lwt-toolbar-field-highlight, Highlight);
|
|
color: var(--lwt-toolbar-field-highlight-text, HighlightText);
|
|
}
|
|
|
|
.urlbar-input:not(:focus)::selection,
|
|
.searchbar-textbox:not(:focus-within)::selection {
|
|
background-color: var(--lwt-toolbar-field-highlight, text-select-disabled-background);
|
|
}
|
|
}
|
|
|
|
#urlbar:not([focused]) {
|
|
caret-color: transparent;
|
|
}
|
|
|
|
/**
|
|
* The urlbar background is a separate element so we can animate it
|
|
* independently from the content. It's positioned absolutely and stretched to
|
|
* the bounds of the urlbar.
|
|
*/
|
|
|
|
#urlbar,
|
|
.urlbar-input-container,
|
|
.urlbarView {
|
|
position: relative;
|
|
}
|
|
|
|
#urlbar-background {
|
|
display: block;
|
|
position: absolute;
|
|
inset: 0;
|
|
}
|
|
|
|
.urlbar-input-container {
|
|
/* Match urlbar-background's border. */
|
|
border: 1px solid transparent;
|
|
padding: var(--urlbar-container-padding);
|
|
min-width: 0;
|
|
}
|
|
|
|
#urlbar-container[breakout] {
|
|
min-height: var(--urlbar-container-height);
|
|
}
|
|
|
|
#urlbar[breakout] {
|
|
display: block;
|
|
/* This is technically not needed, because popover takes care of it, but
|
|
* helps for clarity. */
|
|
position: absolute;
|
|
height: var(--urlbar-height);
|
|
width: var(--urlbar-width);
|
|
|
|
> .urlbar-input-container {
|
|
width: 100%;
|
|
height: 100%;
|
|
}
|
|
}
|
|
|
|
#urlbar:not([open]) > .urlbarView,
|
|
#urlbar:not([breakout]) > .urlbarView {
|
|
display: none;
|
|
}
|
|
|
|
#urlbar[breakout][breakout-extend] {
|
|
height: auto;
|
|
margin-left: calc(-1 * var(--urlbar-margin-inline));
|
|
width: calc(var(--urlbar-width) + 2 * var(--urlbar-margin-inline));
|
|
|
|
> .urlbar-input-container {
|
|
height: var(--urlbar-container-height);
|
|
padding-block: calc((var(--urlbar-container-height) - var(--urlbar-height)) / 2 + var(--urlbar-container-padding));
|
|
padding-inline: calc(var(--urlbar-margin-inline) + var(--urlbar-container-padding));
|
|
}
|
|
}
|
|
|
|
@keyframes urlbar-grow {
|
|
0% {
|
|
transform: scaleX(.99) scaleY(.98);
|
|
}
|
|
100% {
|
|
transform: scale(1.0);
|
|
}
|
|
}
|
|
|
|
#urlbar[breakout][breakout-extend] > #urlbar-background {
|
|
animation-name: urlbar-grow;
|
|
animation-duration: 0s;
|
|
animation-timing-function: var(--animation-easing-function);
|
|
}
|
|
|
|
@media (prefers-reduced-motion: no-preference) {
|
|
#urlbar[breakout][breakout-extend][breakout-extend-animate] > #urlbar-background {
|
|
animation-duration: 150ms;
|
|
}
|
|
}
|
|
|
|
:root[chromehidden~="toolbar"] #urlbar-container {
|
|
/* Remove excess space between the address bar and the menu button in popups. */
|
|
padding-inline-end: 0;
|
|
}
|
|
|
|
|
|
.urlbar-input-box {
|
|
/* Show the url scheme in a static box when overflowing to the left */
|
|
position: relative;
|
|
direction: ltr;
|
|
|
|
:root[customizing] & {
|
|
visibility: hidden;
|
|
}
|
|
}
|
|
|
|
#urlbar-container {
|
|
align-items: center;
|
|
/* We leave 310px plus whatever space the download and unified extensions
|
|
* buttons will need when they *both* appear. Normally, for each button, this
|
|
* should be 16px for the icon, plus 2 * 2px padding plus the
|
|
* toolbarbutton-inner-padding. We're adding 4px to ensure things like rounding
|
|
* on hidpi don't accidentally result in the buttons going into overflow.
|
|
*/
|
|
width: calc(310px + 2 * (24px + 2 * var(--toolbarbutton-inner-padding)));
|
|
|
|
/* When the download button OR the unified extensions button is shown, we leave
|
|
* 310px plus the space needed for a single button as described above. */
|
|
#nav-bar:is([downloadsbuttonshown], [unifiedextensionsbuttonshown]) & {
|
|
width: calc(310px + 24px + 2 * var(--toolbarbutton-inner-padding));
|
|
}
|
|
|
|
/* When both the download and unified extensions buttons are visible, we use
|
|
* the base min-width value. */
|
|
#nav-bar[downloadsbuttonshown][unifiedextensionsbuttonshown] & {
|
|
width: 310px;
|
|
}
|
|
|
|
/* Customize mode is difficult to use at moderate window width if the Urlbar
|
|
* remains 310px wide. */
|
|
:root[customizing] & {
|
|
width: 280px;
|
|
}
|
|
}
|
|
|
|
#urlbar-container,
|
|
#wrapper-urlbar-container {
|
|
flex: 400 0 auto;
|
|
}
|
|
|
|
#nav-bar:not([keyNav=true]) #identity-box,
|
|
#nav-bar:not([keyNav=true]) #tracking-protection-icon-container {
|
|
-moz-user-focus: normal;
|
|
}
|
|
|
|
#identity-icon-box {
|
|
max-width: calc(30px + 13em);
|
|
}
|
|
|
|
@media (max-width: 770px) {
|
|
#urlbar-container {
|
|
width: calc(240px + 2 * (24px + 2 * var(--toolbarbutton-inner-padding)));
|
|
}
|
|
#nav-bar:is([downloadsbuttonshown], [unifiedextensionsbuttonshown]) #urlbar-container {
|
|
width: calc(240px + 24px + 2 * var(--toolbarbutton-inner-padding));
|
|
}
|
|
#nav-bar[downloadsbuttonshown][unifiedextensionsbuttonshown] #urlbar-container {
|
|
width: 240px;
|
|
}
|
|
:root[customizing] #urlbar-container {
|
|
width: 245px;
|
|
}
|
|
#identity-icon-box {
|
|
max-width: 80px;
|
|
}
|
|
/* This label expresses the non secure status. However, as the padlock icon is
|
|
enough to tell the status to user, hide the label when window gets small.
|
|
Except this usage, #identity-icon-label is used to show additional
|
|
information that could not tell by only icons. */
|
|
#identity-box[pageproxystate="valid"].notSecureText #identity-icon-label {
|
|
display: none;
|
|
}
|
|
/* Contenxtual identity labels are user-customizable and can be very long,
|
|
so we only show the colored icon when the window gets small. */
|
|
#userContext-label {
|
|
display: none;
|
|
}
|
|
}
|
|
|
|
/* The page actions menu is hidden by default, it is only shown in small
|
|
windows as the overflow target of multiple page action buttons */
|
|
#pageActionButton {
|
|
visibility: collapse;
|
|
}
|
|
|
|
/* 680px is just below half of popular 1366px wide screens, so when putting two
|
|
browser windows next to each other on such a screen, they'll be above this
|
|
threshold. */
|
|
@media (max-width: 680px) {
|
|
/* Page action buttons are duplicated in the page action menu so we can
|
|
safely hide them in small windows. */
|
|
#pageActionSeparator,
|
|
#pageActionButton[multiple-children] ~ .urlbar-page-action {
|
|
display: none;
|
|
}
|
|
#pageActionButton[multiple-children] {
|
|
visibility: visible;
|
|
}
|
|
}
|
|
|
|
@media (max-width: 550px) {
|
|
#urlbar-container {
|
|
width: calc(176px + 2 * (24px + 2 * var(--toolbarbutton-inner-padding)));
|
|
}
|
|
#nav-bar[downloadsbuttonshown] #urlbar-container,
|
|
#nav-bar[unifiedextensionsbuttonshown] #urlbar-container {
|
|
width: calc(176px + 24px + 2 * var(--toolbarbutton-inner-padding));
|
|
}
|
|
#nav-bar[downloadsbuttonshown][unifiedextensionsbuttonshown] #urlbar-container {
|
|
width: 176px;
|
|
}
|
|
#identity-icon-box {
|
|
max-width: 70px;
|
|
}
|
|
#urlbar-zoom-button {
|
|
display: none;
|
|
}
|
|
}
|
|
|
|
/* Allow shrinking the urlbar on popup windows */
|
|
:root[chromehidden~="toolbar"] :is(#urlbar-container, #wrapper-urlbar-container) {
|
|
flex-shrink: 1;
|
|
min-width: 0;
|
|
}
|
|
|
|
#urlbar-search-splitter {
|
|
/* The splitter width should equal the location and search bars' combined
|
|
neighboring margin and border width. */
|
|
min-width: 12px;
|
|
margin: 0 -6px;
|
|
position: relative;
|
|
border: none;
|
|
background: transparent;
|
|
appearance: none;
|
|
}
|
|
|
|
/* Urlbar search mode indicator */
|
|
#urlbar-search-mode-indicator {
|
|
display: none;
|
|
background-color: var(--urlbar-box-bgcolor);
|
|
color: var(--urlbar-box-text-color);
|
|
margin-inline-end: 8px;
|
|
align-items: center;
|
|
border-radius: var(--urlbar-icon-border-radius);
|
|
padding-inline: 8px 6px;
|
|
|
|
#urlbar[focused] > .urlbar-input-container > & {
|
|
background-color: var(--urlbar-box-focus-bgcolor);
|
|
}
|
|
|
|
#urlbar[searchmode] > .urlbar-input-container > & {
|
|
display: inline-flex;
|
|
}
|
|
}
|
|
|
|
#urlbar[searchmode] > .urlbar-input-container > #urlbar-label-box {
|
|
display: none;
|
|
}
|
|
|
|
#urlbar-search-mode-indicator-close,
|
|
#searchmode-switcher-close {
|
|
background: url(chrome://global/skin/icons/close.svg) no-repeat center;
|
|
background-size: round(62.5%, 2px);
|
|
width: round(max(16px, 1em), 2px);
|
|
height: round(max(16px, 1em), 2px);
|
|
-moz-context-properties: fill, fill-opacity;
|
|
fill-opacity: 0.6;
|
|
fill: currentColor;
|
|
border-radius: var(--urlbar-icon-border-radius);
|
|
|
|
@media (prefers-contrast) {
|
|
fill-opacity: 1.0;
|
|
}
|
|
|
|
&:hover {
|
|
background-color: var(--urlbar-box-hover-bgcolor);
|
|
color: var(--urlbar-box-hover-text-color);
|
|
|
|
&:active {
|
|
background-color: var(--urlbar-box-active-bgcolor);
|
|
color: var(--urlbar-box-hover-text-color);
|
|
}
|
|
}
|
|
}
|
|
|
|
#urlbar-search-mode-indicator-title {
|
|
padding-inline: 0 3px;
|
|
}
|
|
|
|
/* Page action panel */
|
|
.pageAction-panel-button > .toolbarbutton-icon {
|
|
list-style-image: var(--pageAction-image, inherit);
|
|
width: 16px;
|
|
height: 16px;
|
|
}
|
|
|
|
#pageAction-panel-bookmark,
|
|
#star-button {
|
|
list-style-image: url("chrome://browser/skin/bookmark-hollow.svg");
|
|
|
|
&[starred] {
|
|
list-style-image: url("chrome://browser/skin/bookmark.svg");
|
|
}
|
|
}
|
|
|
|
#star-button[starred] {
|
|
fill-opacity: 1;
|
|
fill: var(--toolbarbutton-icon-fill-attention);
|
|
}
|
|
|
|
/* URL bar and page action buttons */
|
|
|
|
/*
|
|
* The background can be very dark and if the add-on uses a black-ish svg it
|
|
* will be barely visible. For now we try to make them more visible through
|
|
* some filtering tricks.
|
|
*
|
|
* TODO(emilio): Evaluate removing this. SVGs can use prefers-color-scheme to
|
|
* determine the right color-scheme to use, see bug 1779457.
|
|
*/
|
|
.urlbar-addon-page-action[style*=".svg"] > .urlbar-icon {
|
|
:root[lwt-toolbar-field="dark"] #urlbar:not([focused]) &,
|
|
:root[lwt-toolbar-field-focus="dark"] #urlbar[focused] & {
|
|
filter: grayscale(100%) brightness(20%) invert();
|
|
}
|
|
|
|
/* As above, but for the default theme in dark mode, which suffers from the same issue */
|
|
@media (prefers-color-scheme: dark) {
|
|
:root:not([lwtheme]) & {
|
|
filter: grayscale(100%) brightness(20%) invert();
|
|
}
|
|
}
|
|
}
|
|
|
|
#userContext-icons,
|
|
#urlbar-zoom-button {
|
|
margin-inline: 6px;
|
|
}
|
|
|
|
.urlbar-icon {
|
|
width: 16px;
|
|
height: 16px;
|
|
-moz-context-properties: fill, fill-opacity;
|
|
fill: currentColor;
|
|
fill-opacity: var(--urlbar-icon-fill-opacity);
|
|
}
|
|
|
|
.urlbar-page-action,
|
|
.urlbar-revert-button,
|
|
.urlbar-go-button,
|
|
.search-go-button {
|
|
width: calc(var(--urlbar-min-height) - 2px /* border */ - 2 * var(--urlbar-container-padding));
|
|
height: calc(var(--urlbar-min-height) - 2px /* border */ - 2 * var(--urlbar-container-padding));
|
|
border-radius: var(--urlbar-icon-border-radius);
|
|
padding: var(--urlbar-icon-padding);
|
|
color: inherit;
|
|
outline: var(--toolbarbutton-outline);
|
|
outline-offset: var(--toolbarbutton-outline-offset);
|
|
|
|
&:not([disabled]):hover {
|
|
background-color: var(--urlbar-box-hover-bgcolor);
|
|
color: var(--urlbar-box-hover-text-color);
|
|
outline-color: var(--toolbarbutton-hover-outline-color);
|
|
}
|
|
|
|
&:not([disabled])[open],
|
|
&:not([disabled]):hover:active {
|
|
background-color: var(--urlbar-box-active-bgcolor);
|
|
color: var(--urlbar-box-hover-text-color);
|
|
outline-color: var(--toolbarbutton-active-outline-color);
|
|
}
|
|
}
|
|
|
|
.urlbar-page-action {
|
|
list-style-image: var(--pageAction-image, inherit);
|
|
|
|
&:focus-visible {
|
|
outline: var(--focus-outline);
|
|
outline-offset: var(--focus-outline-inset);
|
|
}
|
|
}
|
|
|
|
.urlbar-go-button,
|
|
.search-go-button {
|
|
list-style-image: url("chrome://browser/skin/forward.svg");
|
|
|
|
&:-moz-locale-dir(rtl) {
|
|
transform: scaleX(-1);
|
|
}
|
|
}
|
|
|
|
#pageActionButton,
|
|
.share-more-button {
|
|
list-style-image: url("chrome://global/skin/icons/more.svg");
|
|
}
|
|
|
|
/*
|
|
* Display visual cue that browser is under remote control.
|
|
* This is to help users visually distinguish a user agent session that
|
|
* is under remote control from those used for normal browsing sessions.
|
|
*
|
|
* Attribute is controlled by browser.js:/gRemoteControl.
|
|
*/
|
|
:root[remotecontrol] {
|
|
#remote-control-box {
|
|
visibility: visible;
|
|
padding-inline: var(--urlbar-icon-padding);
|
|
}
|
|
|
|
#remote-control-icon {
|
|
list-style-image: url(chrome://browser/content/static-robot.png);
|
|
width: 16px;
|
|
height: 16px;
|
|
}
|
|
|
|
#urlbar-background {
|
|
background-image: repeating-linear-gradient(
|
|
-45deg,
|
|
rgba(255, 60, 60, 0.25) 0 25px,
|
|
rgba(175, 0, 0, 0.25) 25px 50px
|
|
);
|
|
|
|
background-attachment: fixed;
|
|
/* Override the usual breakout animation so the gradient doesn't shift around
|
|
when the panel opens. */
|
|
animation: none !important;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Contextual Feature Recommendation
|
|
*
|
|
* Animate the recommendation icon to expand outwards and display a text label.
|
|
* Fake the effect of a smoothly expanding width without animating any widths
|
|
* by (continuously) animating only `mask-position-x` and `transform`.
|
|
*
|
|
* In a few places, transition a property using the timing-function `step-start`
|
|
* while collapsed and `step-end` while expanded in order to (discretely) modify
|
|
* the value while expanded and while transitioning in either direction.
|
|
*
|
|
* This UI is part of an experiment launching in LTR locales only. Fixing the
|
|
* RTL issues is tracked by Bug 1485725.
|
|
*/
|
|
|
|
:root {
|
|
--cfr-animation-duration: 0.35s;
|
|
--cfr-button-addons-icon: url(chrome://activity-stream/content/data/content/assets/glyph-webextension-16.svg);
|
|
--cfr-button-features-icon: url(chrome://browser/content/asrouter/assets/glyph-cfr-feature-16.svg);
|
|
--cfr-button-highlights-icon: url(chrome://global/skin/icons/highlights.svg);
|
|
--cfr-active-color: #0060df;
|
|
--cfr-active-text-color: white;
|
|
}
|
|
|
|
#contextual-feature-recommendation {
|
|
width: 28px;
|
|
margin-inline-start: 0;
|
|
transition: margin-inline-start step-end var(--cfr-animation-duration);
|
|
|
|
#urlbar[cfr-recommendation-state="expanded"] & {
|
|
margin-inline-start: calc(var(--cfr-label-width) * -1);
|
|
transition: margin-inline-start step-start var(--cfr-animation-duration);
|
|
}
|
|
|
|
&[data-cfr-icon="recommendations-icon"] {
|
|
width: auto;
|
|
|
|
#cfr-button {
|
|
list-style-image: var(--cfr-button-features-icon);
|
|
height: auto;
|
|
align-items: center;
|
|
}
|
|
}
|
|
|
|
&[data-cfr-icon="highlights-icon"] {
|
|
width: auto;
|
|
|
|
#cfr-button {
|
|
list-style-image: var(--cfr-button-highlights-icon);
|
|
height: auto;
|
|
align-items: center;
|
|
}
|
|
}
|
|
|
|
&[data-cfr-icon="webextensions-icon"] #cfr-button {
|
|
list-style-image: var(--cfr-button-addons-icon);
|
|
}
|
|
}
|
|
|
|
#cfr-button {
|
|
transition-property: fill, fill-opacity, transform;
|
|
transition-timing-function: ease-in-out;
|
|
transition-duration: var(--cfr-animation-duration);
|
|
|
|
#urlbar[cfr-recommendation-state="expanded"] & {
|
|
background-color: transparent;
|
|
transform: translateX(calc(var(--cfr-label-width) * -1));
|
|
|
|
&:-moz-locale-dir(rtl) {
|
|
transform: translateX(calc(var(--cfr-label-width)));
|
|
}
|
|
|
|
&,
|
|
.urlbar-icon {
|
|
fill: var(--cfr-active-text-color);
|
|
fill-opacity: 1;
|
|
}
|
|
}
|
|
|
|
#urlbar[cfr-recommendation-state="collapsed"] & {
|
|
animation: cfr-button-fade-through-active-color calc(3 * var(--cfr-animation-duration));
|
|
}
|
|
}
|
|
|
|
@keyframes cfr-button-fade-through-active-color {
|
|
33% {
|
|
fill-opacity: 1;
|
|
fill: var(--cfr-active-color);
|
|
}
|
|
67% {
|
|
fill-opacity: 1;
|
|
fill: var(--cfr-active-color);
|
|
}
|
|
}
|
|
|
|
#cfr-label-container {
|
|
width: 0;
|
|
overflow: hidden;
|
|
border-radius: var(--urlbar-icon-border-radius);
|
|
padding-inline-start: 28px;
|
|
mask-image: linear-gradient(to right, transparent 0, black 0);
|
|
mask-position-x: var(--cfr-label-width);
|
|
mask-repeat: no-repeat;
|
|
transition-property: background-color, mask-position-x, width, margin-inline-end;
|
|
transition-timing-function: ease-in-out, ease-in-out, step-end, step-end;
|
|
transition-duration: var(--cfr-animation-duration);
|
|
align-items: center;
|
|
margin-block: calc((var(--urlbar-min-height) - var(--urlbar-container-padding) - 2px /* border */ - 24px) / 2);
|
|
|
|
&:-moz-locale-dir(rtl) {
|
|
mask-position-x: calc(var(--cfr-label-width) * -1);
|
|
}
|
|
|
|
#urlbar[cfr-recommendation-state="expanded"] & {
|
|
width: calc(var(--cfr-label-width) + 28px);
|
|
background-color: var(--cfr-active-color);
|
|
margin-inline-end: -28px;
|
|
mask-position-x: 0;
|
|
transition-timing-function: ease-in-out, ease-in-out, step-start, step-start;
|
|
}
|
|
}
|
|
|
|
#cfr-label {
|
|
margin: 0;
|
|
padding: 3px 5px;
|
|
padding-inline-start: 0;
|
|
color: white;
|
|
mask-image: linear-gradient(to right, transparent 0, black 0);
|
|
mask-position-x: var(--cfr-label-width);
|
|
mask-repeat: no-repeat;
|
|
transition: mask-position-x ease-in-out var(--cfr-animation-duration);
|
|
|
|
&:-moz-locale-dir(rtl) {
|
|
mask-position-x: calc(var(--cfr-label-width) * -1);
|
|
}
|
|
|
|
#urlbar[cfr-recommendation-state="expanded"] & {
|
|
mask-position-x: 0;
|
|
}
|
|
}
|
|
|
|
/* Shift the url-bar text fading to stop the recommendation overlapping */
|
|
#urlbar[cfr-recommendation-state] .urlbar-input {
|
|
/* A mask-image is usually only defined for the url bar when text overflows.
|
|
We need to re-define the mask image here so that it shows up correctly when
|
|
we transition to or from an `expanded` state (in which the right end of the
|
|
url bar may be obscured without overflow). */
|
|
mask-image: linear-gradient(to left, transparent, black 3ch);
|
|
transition: mask-position-x ease-in-out var(--cfr-animation-duration);
|
|
|
|
&:-moz-locale-dir(rtl) {
|
|
mask-image: linear-gradient(to right, transparent, black 3ch);
|
|
}
|
|
}
|
|
#urlbar[cfr-recommendation-state="expanded"] .urlbar-input {
|
|
mask-position-x: calc(var(--cfr-label-width) * -1);
|
|
|
|
&:-moz-locale-dir(rtl) {
|
|
mask-position-x: calc(var(--cfr-label-width));
|
|
}
|
|
}
|
|
|
|
/* Persisted Search revert button */
|
|
|
|
.urlbar-revert-button {
|
|
list-style-image: url(chrome://global/skin/icons/defaultFavicon.svg);
|
|
fill: var(--toolbarbutton-icon-fill-attention);
|
|
|
|
&:focus-visible {
|
|
outline: var(--focus-outline);
|
|
}
|
|
}
|
|
|
|
#urlbar[persistsearchterms] {
|
|
#urlbar-revert-button-container {
|
|
display: inherit;
|
|
}
|
|
|
|
.urlbar-go-button {
|
|
display: none;
|
|
}
|
|
}
|
|
|
|
/* Reader mode icon */
|
|
|
|
#reader-mode-button > .urlbar-icon {
|
|
list-style-image: url(chrome://browser/skin/reader-mode.svg);
|
|
}
|
|
|
|
#reader-mode-button[readeractive] > .urlbar-icon {
|
|
fill: var(--toolbarbutton-icon-fill-attention);
|
|
fill-opacity: 1;
|
|
}
|
|
|
|
/* Picture-in-Picture icon */
|
|
#picture-in-picture-button > .urlbar-icon {
|
|
list-style-image: url("chrome://global/skin/media/picture-in-picture-open.svg");
|
|
}
|
|
|
|
#picture-in-picture-button[pipactive] > .urlbar-icon {
|
|
list-style-image: url("chrome://global/skin/media/picture-in-picture-closed.svg");
|
|
}
|
|
|
|
#picture-in-picture-button:-moz-locale-dir(rtl) > .urlbar-icon {
|
|
transform: scaleX(-1);
|
|
}
|
|
|
|
/* Taskbar Tabs icon */
|
|
|
|
#taskbar-tabs-button > .urlbar-icon {
|
|
list-style-image: url(chrome://browser/skin/taskbar-tabs-add-tab.svg);
|
|
:root[taskbartab] & {
|
|
list-style-image: url(chrome://browser/skin/taskbar-tabs-move-tab.svg);
|
|
}
|
|
}
|
|
|
|
|
|
/* Translations button */
|
|
|
|
#translations-button-icon {
|
|
list-style-image: url(chrome://browser/skin/translations.svg);
|
|
/* The translation icon's right letter is 1px too long, so account for that here.
|
|
Don't use margin-inline-end as this is adjusting the art of the icon. */
|
|
margin-right: -1px;
|
|
|
|
#translations-button[translationsactive] > & {
|
|
fill: var(--toolbarbutton-icon-fill-attention);
|
|
fill-opacity: 1;
|
|
}
|
|
}
|
|
|
|
#translations-button-circle-arrows {
|
|
height: 16px;
|
|
width: 16px;
|
|
list-style-image: url("chrome://global/skin/icons/loading.svg");
|
|
fill: var(--toolbarbutton-icon-fill-attention);
|
|
fill-opacity: 1;
|
|
margin-inline: 1px;
|
|
}
|
|
|
|
#translations-button-locale {
|
|
background-color: var(--toolbarbutton-icon-fill-attention);
|
|
color: var(--toolbarbutton-icon-fill-attention-text);
|
|
border-radius: 4px;
|
|
font-size: 0.8em;
|
|
height: 20px;
|
|
min-width: 20px;
|
|
text-align: center;
|
|
padding-top: 3px;
|
|
padding-inline: 1px;
|
|
box-sizing: border-box;
|
|
margin-inline: 2px -2px;
|
|
margin-block: -2px;
|
|
}
|
|
|
|
#translations-button[translationsactive="true"] {
|
|
width: auto;
|
|
}
|
|
|
|
@media (prefers-contrast) and (-moz-platform: windows) {
|
|
#translations-button-locale {
|
|
font-weight: bold;
|
|
}
|
|
|
|
#translations-button[translationsactive]:is(:hover, [open]) > #translations-button-icon {
|
|
fill: currentColor;
|
|
}
|
|
|
|
#translations-button:is(:hover, [open]) > #translations-button-locale {
|
|
background-color: var(--toolbar-field-background-color);
|
|
color: var(--toolbarbutton-icon-fill-attention);
|
|
}
|
|
|
|
#translations-button:is(:hover, [open]) > #translations-button-circle-arrows {
|
|
fill: currentColor;
|
|
}
|
|
}
|
|
|
|
/* Zoom button */
|
|
|
|
#urlbar-zoom-button {
|
|
appearance: none;
|
|
font-size: .8em;
|
|
padding: 3px 7px;
|
|
border-radius: var(--urlbar-icon-border-radius);
|
|
background-color: var(--urlbar-box-bgcolor);
|
|
color: var(--urlbar-box-text-color);
|
|
margin-block: calc((var(--urlbar-min-height) - 20px) / 2 - 1px /* border */ - var(--urlbar-container-padding));
|
|
overflow: hidden;
|
|
|
|
:where(#urlbar[focused]) & {
|
|
background-color: var(--urlbar-box-focus-bgcolor);
|
|
}
|
|
|
|
&:hover {
|
|
background-color: var(--urlbar-box-hover-bgcolor);
|
|
color: var(--urlbar-box-hover-text-color);
|
|
|
|
&:active {
|
|
background-color: var(--urlbar-box-active-bgcolor);
|
|
color: var(--urlbar-box-hover-text-color);
|
|
}
|
|
}
|
|
|
|
&[animate="true"] {
|
|
animation-name: urlbar-zoom-reset-pulse;
|
|
animation-duration: 250ms;
|
|
}
|
|
|
|
&:focus-visible {
|
|
outline: var(--focus-outline);
|
|
outline-offset: var(--focus-outline-inset);
|
|
}
|
|
|
|
> .toolbarbutton-text {
|
|
display: flex;
|
|
}
|
|
|
|
> .toolbarbutton-icon {
|
|
display: none;
|
|
}
|
|
}
|
|
|
|
@keyframes urlbar-zoom-reset-pulse {
|
|
0% {
|
|
transform: scale(0);
|
|
}
|
|
75% {
|
|
transform: scale(1.5);
|
|
}
|
|
100% {
|
|
transform: scale(1.0);
|
|
}
|
|
}
|
|
|
|
/* Search bar */
|
|
|
|
#search-container,
|
|
#wrapper-search-container:not([place="panel"]) {
|
|
flex: 175 175 auto;
|
|
}
|
|
|
|
#search-container {
|
|
min-width: 125px;
|
|
width: 125px;
|
|
|
|
&[width] {
|
|
/* Take something closer to the explicit width when requested. Also important
|
|
* to use flex-basis auto so that the width is actually honored. */
|
|
flex: 1 auto;
|
|
}
|
|
|
|
.widget-overflow-list > & {
|
|
margin: var(--arrowpanel-menuitem-margin);
|
|
width: auto;
|
|
|
|
:root[lwtheme] & > #searchbar {
|
|
/* Theme authors usually only consider contrast against the toolbar when
|
|
picking a border color for the search bar. Since the search bar can be
|
|
dragged into the overflow panel, we need to show a high-contrast border
|
|
around the searchbar in case the searchbar and panel background are the
|
|
same color. */
|
|
border-color: var(--panel-separator-color);
|
|
}
|
|
}
|
|
}
|
|
|
|
.search-go-button {
|
|
margin-inline: 1px;
|
|
}
|
|
|
|
.searchbar-search-button {
|
|
align-items: center;
|
|
fill: currentColor;
|
|
}
|
|
|
|
.searchbar-search-icon {
|
|
list-style-image: url(chrome://global/skin/icons/search-glass.svg);
|
|
-moz-context-properties: fill, fill-opacity;
|
|
fill-opacity: var(--urlbar-icon-fill-opacity);
|
|
pointer-events: none;
|
|
margin-inline: 8px 6px;
|
|
width: 16px;
|
|
}
|
|
|
|
.searchbar-search-icon-overlay {
|
|
pointer-events: none;
|
|
|
|
.searchbar-search-button[addengines=true] > & {
|
|
list-style-image: url(chrome://browser/skin/search-indicator-badge-add.svg);
|
|
margin-inline: -15px 4px;
|
|
margin-top: -10px;
|
|
width: 11px;
|
|
height: 11px;
|
|
|
|
&:-moz-locale-dir(rtl) {
|
|
margin-inline: -25px 14px;
|
|
}
|
|
}
|
|
|
|
.searchbar-search-button:hover:not([addengines=true]) > & {
|
|
list-style-image: url(chrome://global/skin/icons/arrow-down-12.svg);
|
|
-moz-context-properties: fill;
|
|
margin-inline: -8px 2px;
|
|
width: 6px;
|
|
height: 6px;
|
|
|
|
&:-moz-locale-dir(rtl) {
|
|
margin-inline: -26px 20px;
|
|
}
|
|
}
|
|
}
|
|
|
|
.searchbar-engine-one-off-add-engine:not([image]),
|
|
.context-menu-add-engine:not([image]) {
|
|
list-style-image: image-set(url("chrome://browser/skin/search-engine-placeholder.png"), url("chrome://browser/skin/search-engine-placeholder@2x.png") 2x);
|
|
}
|
|
|
|
.searchbar-engine-one-off-add-engine > .button-box,
|
|
.context-menu-add-engine {
|
|
position: relative;
|
|
|
|
&::before {
|
|
content: "";
|
|
position: absolute;
|
|
display: block;
|
|
background: url(chrome://browser/skin/search-indicator-badge-add.svg) no-repeat center;
|
|
height: 11px;
|
|
width: 11px;
|
|
margin-inline-start: 9px;
|
|
margin-top: -8px;
|
|
/* Needed so it paints after the icon when it is a stacking context (with
|
|
* opacity, below) */
|
|
z-index: 1;
|
|
}
|
|
}
|
|
|
|
/* Fade a little the icon so that the + badge is more evident and the button
|
|
is less likely to be visually confused with a normal search shortcut */
|
|
.searchbar-engine-one-off-add-engine[image]:not(:hover) > .button-box > .button-icon {
|
|
opacity: 0.7;
|
|
}
|
|
|
|
#urlbar-searchmode-switcher {
|
|
appearance: none;
|
|
border-radius: var(--urlbar-icon-border-radius);
|
|
margin: 0;
|
|
margin-inline-end: var(--urlbar-searchmodeswitcher-margin-inline-end);
|
|
padding-inline: var(--urlbar-searchmodeswitcher-inline-padding);
|
|
|
|
&:focus-visible {
|
|
outline: var(--focus-outline);
|
|
outline-offset: var(--focus-outline-inset);
|
|
}
|
|
|
|
&[open] {
|
|
background-color: var(--urlbar-box-focus-bgcolor);
|
|
}
|
|
|
|
/* No need space if page information icons such as lock and shield is shown */
|
|
#urlbar[pageproxystate=valid] & {
|
|
margin-inline-end: 0;
|
|
}
|
|
|
|
#urlbar[searchmode] & {
|
|
background-color: var(--urlbar-box-bgcolor);
|
|
margin-inline-end: 0;
|
|
border-start-end-radius: 0;
|
|
border-end-end-radius: 0;
|
|
}
|
|
|
|
/* The background rule should match to #searchmode-switcher-chicklet */
|
|
#urlbar[focused] & {
|
|
background-color: var(--urlbar-box-focus-bgcolor);
|
|
}
|
|
|
|
/* stylelint-disable media-query-no-invalid */
|
|
@media (not -moz-pref("browser.urlbar.searchModeSwitcher.featureGate")) and
|
|
(not -moz-pref("browser.urlbar.scotchBonnet.enableOverride")) {
|
|
display: none;
|
|
}
|
|
/* stylelint-enable media-query-no-invalid */
|
|
}
|
|
|
|
#searchmode-switcher-icon {
|
|
width: 16px;
|
|
height: 16px;
|
|
border-radius: var(--urlbar-icon-border-radius);
|
|
-moz-context-properties: fill;
|
|
fill: currentColor;
|
|
list-style-image: url("chrome://global/skin/icons/search-glass.svg");
|
|
}
|
|
|
|
#searchmode-switcher-chicklet {
|
|
background-color: var(--urlbar-box-bgcolor);
|
|
border-start-end-radius: var(--toolbarbutton-border-radius);
|
|
border-end-end-radius: var(--urlbar-icon-border-radius);
|
|
align-items: center;
|
|
height: 100%;
|
|
margin-inline-end: var(--urlbar-searchmodeswitcher-margin-inline-end);
|
|
display: none;
|
|
|
|
/* stylelint-disable-next-line media-query-no-invalid */
|
|
@media -moz-pref("browser.urlbar.searchModeSwitcher.featureGate") or -moz-pref("browser.urlbar.scotchBonnet.enableOverride") {
|
|
#urlbar[searchmode] & {
|
|
display: inline-flex;
|
|
}
|
|
}
|
|
|
|
#urlbar[focused] & {
|
|
background-color: var(--urlbar-box-focus-bgcolor);
|
|
}
|
|
}
|
|
|
|
#searchmode-switcher-title {
|
|
margin: 0;
|
|
align-items: center;
|
|
|
|
&:empty {
|
|
display: none;
|
|
}
|
|
}
|
|
|
|
#searchmode-switcher-close {
|
|
appearance: none;
|
|
pointer-events: all;
|
|
margin-inline: var(--urlbar-searchmodeswitcher-inline-padding);
|
|
|
|
#urlbar[searchmode] & {
|
|
display: inline-flex;
|
|
}
|
|
}
|
|
|
|
#searchmode-switcher-dropmarker {
|
|
#urlbar[searchmode] & {
|
|
display: none;
|
|
}
|
|
#urlbar-searchmode-switcher[open] & {
|
|
transform: rotate(180deg);
|
|
}
|
|
}
|
|
|
|
#searchmode-switcher-popup {
|
|
--panel-padding: 4px 0;
|
|
|
|
> menuitem {
|
|
margin-inline: 4px;
|
|
|
|
&.searchmode-switcher-addEngine::before {
|
|
content: "";
|
|
position: relative;
|
|
display: flex;
|
|
background: url(chrome://browser/skin/search-indicator-badge-add.svg) no-repeat center;
|
|
height: 11px;
|
|
width: 11px;
|
|
margin-inline: 10px -21px;
|
|
margin-top: -13px;
|
|
}
|
|
}
|
|
}
|
|
|
|
#searchmode-switcher-popup-description {
|
|
margin-inline: 4px;
|
|
padding: var(--arrowpanel-menuitem-padding);
|
|
}
|
|
|
|
#searchmode-switcher-popup-search-settings-button,
|
|
.searchmode-switcher-local {
|
|
-moz-context-properties: fill;
|
|
fill: currentColor;
|
|
}
|
|
|
|
/* stylelint-disable-next-line media-query-no-invalid */
|
|
@media -moz-pref("browser.urlbar.searchModeSwitcher.featureGate") or -moz-pref("browser.urlbar.scotchBonnet.enableOverride") {
|
|
#urlbar[searchmode] > .urlbar-input-container > #urlbar-search-mode-indicator {
|
|
display: none;
|
|
}
|
|
|
|
/* stylelint-disable-next-line media-query-no-invalid */
|
|
@media not -moz-pref("browser.urlbar.unifiedSearchButton.always") {
|
|
#urlbar-searchmode-switcher {
|
|
background-color: var(--urlbar-box-bgcolor);
|
|
#urlbar:not([unifiedsearchbutton-available]) > .urlbar-input-container > & {
|
|
/* Display as off-screen to get focus */
|
|
position: fixed;
|
|
top: -999px;
|
|
}
|
|
}
|
|
|
|
#searchmode-switcher-dropmarker {
|
|
margin-inline-start: var(--urlbar-searchmodeswitcher-inline-padding);
|
|
}
|
|
|
|
#urlbar[pageproxystate=invalid] {
|
|
#identity-box,
|
|
#tracking-protection-icon-container {
|
|
display: none;
|
|
}
|
|
}
|
|
}
|
|
}
|