Merge pull request #21665 from calixteman/sync_firefox_css

Sync the viewer chrome with the Firefox design system
This commit is contained in:
calixteman 2026-07-31 09:48:01 +02:00 committed by GitHub
commit 40f6492997
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
17 changed files with 759 additions and 656 deletions

View File

@ -21,15 +21,18 @@
:root { :root {
--editor-toolbar-vert-offset: 6px; --editor-toolbar-vert-offset: 6px;
--outline-width: 2px; --outline-width: 2px;
--outline-color: #0060df; /* Palette primitives, not the semantic light-dark tokens: these are drawn on
the always-light PDF page, where --color-accent-primary and friends would
resolve to their dark value. */
--outline-color: var(--color-blue-60, #0060df);
--outline-around-width: 1px; --outline-around-width: 1px;
--outline-around-color: #f0f0f4; --outline-around-color: var(--color-gray-20, #f0f0f4);
--hover-outline-around-color: var(--outline-around-color); --hover-outline-around-color: var(--outline-around-color);
--focus-outline: solid var(--outline-width) var(--outline-color); --editor-selection-outline: solid var(--outline-width) var(--outline-color);
--unfocus-outline: solid var(--outline-width) transparent; --unfocus-outline: solid var(--outline-width) transparent;
--focus-outline-around: solid var(--outline-around-width) --focus-outline-around: solid var(--outline-around-width)
var(--outline-around-color); var(--outline-around-color);
--hover-outline-color: #8f8f9d; --hover-outline-color: var(--color-gray-60, #8f8f9d);
--hover-outline: solid var(--outline-width) var(--hover-outline-color); --hover-outline: solid var(--outline-width) var(--hover-outline-color);
--hover-outline-around: solid var(--outline-around-width) --hover-outline-around: solid var(--outline-around-width)
var(--hover-outline-around-color); var(--hover-outline-around-color);
@ -95,7 +98,7 @@
--outline-color: CanvasText; --outline-color: CanvasText;
--outline-around-color: ButtonFace; --outline-around-color: ButtonFace;
--resizer-bg-color: ButtonText; --resizer-bg-color: ButtonText;
--hover-outline-color: Highlight; --hover-outline-color: var(--color-accent-primary-hover, Highlight);
--hover-outline-around-color: SelectedItemText; --hover-outline-around-color: SelectedItemText;
} }
} }
@ -188,7 +191,7 @@
} }
&.selectedEditor { &.selectedEditor {
border: var(--focus-outline); border: var(--editor-selection-outline);
outline: var(--focus-outline-around); outline: var(--focus-outline-around);
&::before { &::before {
@ -244,30 +247,51 @@
--editor-toolbar-bg-color: light-dark(#f0f0f4, #2b2a33); --editor-toolbar-bg-color: light-dark(#f0f0f4, #2b2a33);
--editor-toolbar-highlight-image: url(images/toolbarButton-editorHighlight.svg); --editor-toolbar-highlight-image: url(images/toolbarButton-editorHighlight.svg);
--editor-toolbar-fg-color: light-dark(#2e2e56, #fbfbfe); --editor-toolbar-fg-color: light-dark(#2e2e56, #fbfbfe);
--editor-toolbar-border-color: #8f8f9d; --editor-toolbar-border-color: var(--border-color-interactive, #8f8f9d);
--editor-toolbar-hover-border-color: var(--editor-toolbar-border-color); --editor-toolbar-hover-border-color: var(--editor-toolbar-border-color);
--editor-toolbar-hover-bg-color: light-dark(#e0e0e6, #52525e); --editor-toolbar-hover-bg-color: light-dark(#e0e0e6, #52525e);
--editor-toolbar-hover-fg-color: var(--editor-toolbar-fg-color); --editor-toolbar-hover-fg-color: var(--editor-toolbar-fg-color);
--editor-toolbar-hover-outline: none; --editor-toolbar-hover-outline: none;
--editor-toolbar-focus-outline-color: light-dark(#0060df, #0df); --editor-toolbar-focus-outline-color: var(
--focus-outline-color,
light-dark(#0060df, #0df)
);
--editor-toolbar-shadow: 0 2px 6px 0 rgb(58 57 68 / 0.2); --editor-toolbar-shadow: 0 2px 6px 0 rgb(58 57 68 / 0.2);
--editor-toolbar-height: 28px; --editor-toolbar-height: 28px;
--editor-toolbar-padding: 2px; --editor-toolbar-padding: 2px;
--alt-text-done-color: light-dark(#2ac3a2, #54ffbd); --alt-text-done-color: var(
--color-accent-attention,
light-dark(#2ac3a2, #54ffbd)
);
--alt-text-warning-color: light-dark(#0090ed, #80ebff); --alt-text-warning-color: light-dark(#0090ed, #80ebff);
--alt-text-hover-done-color: var(--alt-text-done-color); --alt-text-hover-done-color: var(--alt-text-done-color);
--alt-text-hover-warning-color: var(--alt-text-warning-color); --alt-text-hover-warning-color: var(--alt-text-warning-color);
@media screen and (forced-colors: active) { @media screen and (forced-colors: active) {
--editor-toolbar-bg-color: ButtonFace; --editor-toolbar-bg-color: var(--button-background-color, ButtonFace);
--editor-toolbar-fg-color: ButtonText; --editor-toolbar-fg-color: var(--button-text-color, ButtonText);
--editor-toolbar-border-color: ButtonText; --editor-toolbar-border-color: var(--button-border-color, ButtonText);
--editor-toolbar-hover-border-color: AccentColor; --editor-toolbar-hover-border-color: var(
--editor-toolbar-hover-bg-color: ButtonFace; --button-border-color-hover,
--editor-toolbar-hover-fg-color: AccentColor; AccentColor
);
--editor-toolbar-hover-bg-color: var(
--button-background-color-hover,
ButtonFace
);
--editor-toolbar-hover-fg-color: var(
--button-text-color-hover,
AccentColor
);
--editor-toolbar-hover-outline: 2px solid --editor-toolbar-hover-outline: 2px solid
var(--editor-toolbar-hover-border-color); var(--editor-toolbar-hover-border-color);
--editor-toolbar-focus-outline-color: ButtonBorder; /* --button-border-color, not --focus-outline-color: the ring is painted
on the toolbar's own ButtonFace surface, and --focus-outline-color is
CanvasText in Firefox HCM. */
--editor-toolbar-focus-outline-color: var(
--button-border-color,
ButtonBorder
);
--editor-toolbar-shadow: none; --editor-toolbar-shadow: none;
--alt-text-done-color: var(--editor-toolbar-fg-color); --alt-text-done-color: var(--editor-toolbar-fg-color);
--alt-text-warning-color: var(--editor-toolbar-fg-color); --alt-text-warning-color: var(--editor-toolbar-fg-color);
@ -461,15 +485,18 @@
&.show { &.show {
--alt-text-tooltip-bg: light-dark(#f0f0f4, #1c1b22); --alt-text-tooltip-bg: light-dark(#f0f0f4, #1c1b22);
--alt-text-tooltip-fg: light-dark(#15141a, #fbfbfe); --alt-text-tooltip-fg: var(
--alt-text-tooltip-border: #8f8f9d; --text-color,
light-dark(#15141a, #fbfbfe)
);
--alt-text-tooltip-border: var(--border-color-interactive, #8f8f9d);
--alt-text-tooltip-shadow: 0 2px 6px 0 --alt-text-tooltip-shadow: 0 2px 6px 0
light-dark(rgb(58 57 68 / 0.2), #15141a); light-dark(rgb(58 57 68 / 0.2), #15141a);
@media screen and (forced-colors: active) { @media screen and (forced-colors: active) {
--alt-text-tooltip-bg: Canvas; --alt-text-tooltip-bg: Canvas;
--alt-text-tooltip-fg: CanvasText; --alt-text-tooltip-fg: var(--text-color, CanvasText);
--alt-text-tooltip-border: CanvasText; --alt-text-tooltip-border: var(--border-color, CanvasText);
--alt-text-tooltip-shadow: none; --alt-text-tooltip-shadow: none;
} }
@ -1055,7 +1082,10 @@
} }
.colorPicker { .colorPicker {
--hover-outline-color: light-dark(#0250bb, #80ebff); --hover-outline-color: var(
--color-accent-primary-hover,
light-dark(#0250bb, #80ebff)
);
--selected-outline-color: light-dark(#0060df, #aaf2ff); --selected-outline-color: light-dark(#0060df, #aaf2ff);
--swatch-border-color: light-dark(#cfcfd8, #52525e); --swatch-border-color: light-dark(#cfcfd8, #52525e);

View File

@ -416,6 +416,18 @@ const defaultOptions = new Map([
kind: OptionKind.VIEWER + OptionKind.PREFERENCE, kind: OptionKind.VIEWER + OptionKind.PREFERENCE,
}, },
], ],
[
// Whether the viewer follows the Firefox design system (see the pref-gated
// @import of tokens-brand.css in viewer.css). Read from CSS via
// -moz-pref(), not from JS, so it is Firefox-only and has no effect
// elsewhere.
"enableNova",
{
/** @type {boolean} */
value: true,
kind: OptionKind.VIEWER + OptionKind.PREFERENCE,
},
],
[ [
"enableOptimizedPartialRendering", "enableOptimizedPartialRendering",
{ {

247
web/buttons.css Normal file
View File

@ -0,0 +1,247 @@
/* Copyright 2026 Mozilla Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
* Shared button primitive: .primaryButton / .secondaryButton, for any button in
* the viewer and not only those inside a .dialog. The colors consume Firefox
* design tokens with the shipped literal as a fallback (see pdf_viewer.css).
*/
:root {
--button-primary-bg-color: var(
--button-background-color-primary,
light-dark(#0060df, #0df)
);
--button-primary-fg-color: var(
--button-text-color-primary,
light-dark(#fbfbfe, #15141a)
);
--button-primary-border-color: var(--button-primary-bg-color);
--button-primary-active-bg-color: var(
--button-background-color-primary-active,
light-dark(#054096, #aaf2ff)
);
--button-primary-active-fg-color: var(--button-primary-fg-color);
--button-primary-active-border-color: var(--button-primary-active-bg-color);
--button-primary-hover-bg-color: var(
--button-background-color-primary-hover,
light-dark(#0250bb, #80ebff)
);
--button-primary-hover-fg-color: var(--button-primary-fg-color);
--button-primary-hover-border-color: var(--button-primary-hover-bg-color);
--button-primary-disabled-bg-color: var(--button-primary-bg-color);
--button-primary-disabled-border-color: var(--button-primary-border-color);
--button-primary-disabled-fg-color: var(--button-primary-fg-color);
--button-secondary-bg-color: var(
--button-background-color,
light-dark(rgb(21 20 26 / 0.07), rgb(251 251 254 / 0.07))
);
--button-secondary-fg-color: var(--text-color, light-dark(#15141a, #fbfbfe));
/* Firefox's outline-style secondary button has a transparent fill and carries
the edge on --button-border-color; the fallback matches the fill instead,
since the shipped one is a translucent overlay. */
--button-secondary-border-color: var(
--button-border-color,
var(--button-secondary-bg-color)
);
--button-secondary-active-bg-color: var(
--button-background-color-active,
light-dark(rgb(21 20 26 / 0.21), rgb(251 251 254 / 0.21))
);
--button-secondary-active-fg-color: var(--button-secondary-fg-color);
--button-secondary-active-border-color: var(--button-secondary-bg-color);
--button-secondary-hover-bg-color: var(
--button-background-color-hover,
light-dark(rgb(21 20 26 / 0.14), rgb(251 251 254 / 0.14))
);
--button-secondary-hover-fg-color: var(--button-secondary-fg-color);
--button-secondary-hover-border-color: var(--button-secondary-hover-bg-color);
--button-secondary-disabled-bg-color: var(--button-secondary-bg-color);
--button-secondary-disabled-border-color: var(
--button-secondary-border-color
);
--button-secondary-disabled-fg-color: var(--button-secondary-fg-color);
--button-disabled-opacity: 0.4;
--hover-filter: brightness(0.9);
@media (prefers-color-scheme: dark) {
--button-disabled-opacity: 0.6;
--hover-filter: brightness(1.4);
}
@media screen and (forced-colors: active) {
--button-primary-bg-color: var(
--button-background-color-primary,
ButtonText
);
--button-primary-fg-color: var(--button-text-color-primary, ButtonFace);
--button-primary-border-color: var(
--button-border-color-primary,
ButtonText
);
--button-primary-active-bg-color: var(
--button-background-color-primary-active,
SelectedItem
);
--button-primary-active-fg-color: var(
--button-text-color-primary-active,
HighlightText
);
--button-primary-active-border-color: var(
--button-border-color-primary-active,
ButtonText
);
--button-primary-hover-bg-color: var(
--button-background-color-primary-hover,
SelectedItem
);
--button-primary-hover-fg-color: var(
--button-text-color-primary-hover,
HighlightText
);
--button-primary-hover-border-color: var(
--button-border-color-primary-hover,
SelectedItem
);
--button-primary-disabled-bg-color: var(
--button-background-color-primary-disabled,
GrayText
);
--button-primary-disabled-fg-color: var(
--button-text-color-primary-disabled,
ButtonFace
);
--button-primary-disabled-border-color: var(
--button-border-color-primary-disabled,
GrayText
);
--button-secondary-bg-color: var(--button-background-color, ButtonFace);
--button-secondary-fg-color: var(--button-text-color, ButtonText);
--button-secondary-border-color: var(--button-border-color, ButtonText);
--button-secondary-active-bg-color: var(
--button-background-color-active,
HighlightText
);
--button-secondary-active-fg-color: var(
--button-text-color-active,
SelectedItem
);
--button-secondary-active-border-color: var(
--button-border-color-active,
ButtonText
);
--button-secondary-hover-bg-color: var(
--button-background-color-hover,
HighlightText
);
--button-secondary-hover-fg-color: var(
--button-text-color-hover,
SelectedItem
);
--button-secondary-hover-border-color: var(
--button-border-color-hover,
SelectedItem
);
--button-secondary-disabled-fg-color: var(
--button-text-color-disabled,
GrayText
);
--button-secondary-disabled-border-color: var(
--button-border-color-disabled,
GrayText
);
--button-disabled-opacity: 1;
--hover-filter: none;
}
}
.primaryButton,
.secondaryButton {
border-radius: var(--button-border-radius, 4px);
border: 1px solid;
font: menu;
font-weight: var(--button-font-weight, 590);
font-size: var(--button-font-size, 13px);
padding: var(--button-padding, 4px 16px);
width: auto;
min-height: var(--button-min-height, 32px);
&:hover {
cursor: pointer;
filter: var(--hover-filter);
}
> span {
color: inherit;
font: inherit;
}
&:disabled {
pointer-events: none;
}
}
.primaryButton {
color: var(--button-primary-fg-color);
background-color: var(--button-primary-bg-color);
border-color: var(--button-primary-border-color);
opacity: 1;
&:hover {
color: var(--button-primary-hover-fg-color);
background-color: var(--button-primary-hover-bg-color);
border-color: var(--button-primary-hover-border-color);
}
&:active {
color: var(--button-primary-active-fg-color);
background-color: var(--button-primary-active-bg-color);
border-color: var(--button-primary-active-border-color);
}
&:disabled {
background-color: var(--button-primary-disabled-bg-color);
border-color: var(--button-primary-disabled-border-color);
color: var(--button-primary-disabled-fg-color);
opacity: var(--button-disabled-opacity);
}
}
.secondaryButton {
color: var(--button-secondary-fg-color);
background-color: var(--button-secondary-bg-color);
border-color: var(--button-secondary-border-color);
&:hover {
color: var(--button-secondary-hover-fg-color);
background-color: var(--button-secondary-hover-bg-color);
border-color: var(--button-secondary-hover-border-color);
}
&:active {
color: var(--button-secondary-active-fg-color);
background-color: var(--button-secondary-active-bg-color);
border-color: var(--button-secondary-active-border-color);
}
&:disabled {
background-color: var(--button-secondary-disabled-bg-color);
border-color: var(--button-secondary-disabled-border-color);
color: var(--button-secondary-disabled-fg-color);
opacity: var(--button-disabled-opacity);
}
}

View File

@ -65,39 +65,86 @@
:is(.annotationLayer, .annotationEditorLayer) { :is(.annotationLayer, .annotationEditorLayer) {
.annotationCommentButton { .annotationCommentButton {
color-scheme: light dark; color-scheme: light dark;
--comment-button-bg: light-dark(white, #1c1b22); --comment-button-bg: var(
--background-color-canvas,
light-dark(white, #1c1b22)
);
--comment-button-fg: light-dark(#5b5b66, #fbfbfe); --comment-button-fg: light-dark(#5b5b66, #fbfbfe);
--comment-button-active-bg: light-dark(#0041a4, #a6ecf4); --comment-button-active-bg: light-dark(#0041a4, #a6ecf4);
--comment-button-active-fg: light-dark(white, #15141a); --comment-button-active-fg: var(
--comment-button-hover-bg: light-dark(#0053cb, #61dce9); --button-text-color-primary,
--comment-button-hover-fg: light-dark(white, #15141a); light-dark(white, #15141a)
--comment-button-selected-bg: light-dark(#0062fa, #00cadb); );
--comment-button-border-color: light-dark(#8f8f9d, #bfbfc9); --comment-button-hover-bg: var(
--color-accent-primary-hover,
light-dark(#0053cb, #61dce9)
);
--comment-button-hover-fg: var(
--button-text-color-primary,
light-dark(white, #15141a)
);
--comment-button-selected-bg: var(
--color-accent-primary,
light-dark(#0062fa, #00cadb)
);
--comment-button-border-color: var(
--border-color-interactive,
light-dark(#8f8f9d, #bfbfc9)
);
--comment-button-active-border-color: var(--comment-button-active-bg); --comment-button-active-border-color: var(--comment-button-active-bg);
--comment-button-focus-border-color: light-dark(#cfcfd8, #3a3944); --comment-button-focus-border-color: light-dark(#cfcfd8, #3a3944);
--comment-button-hover-border-color: var(--comment-button-hover-bg); --comment-button-hover-border-color: var(--comment-button-hover-bg);
--comment-button-selected-border-color: var(--comment-button-selected-bg); --comment-button-selected-border-color: var(--comment-button-selected-bg);
--comment-button-selected-fg: light-dark(white, #15141a); --comment-button-selected-fg: var(
--button-text-color-primary,
light-dark(white, #15141a)
);
--comment-button-dim: 24px; --comment-button-dim: 24px;
--comment-button-box-shadow: --comment-button-box-shadow:
0 0.25px 0.75px 0 light-dark(rgb(0 0 0 / 0.05), rgb(0 0 0 / 0.2)), 0 0.25px 0.75px 0 light-dark(rgb(0 0 0 / 0.05), rgb(0 0 0 / 0.2)),
0 2px 6px 0 light-dark(rgb(0 0 0 / 0.1), rgb(0 0 0 / 0.4)); 0 2px 6px 0 light-dark(rgb(0 0 0 / 0.1), rgb(0 0 0 / 0.4));
--comment-button-focus-outline-color: light-dark(#0062fa, #00cadb); --comment-button-focus-outline-color: var(
--focus-outline-color,
light-dark(#0062fa, #00cadb)
);
/* Each state reads the *matching* pair of Firefox button tokens, so the
background and the icon can never resolve to the same system colour. */
@media screen and (forced-colors: active) { @media screen and (forced-colors: active) {
--comment-button-bg: ButtonFace; --comment-button-bg: var(--button-background-color, ButtonFace);
--comment-button-fg: ButtonText; --comment-button-fg: var(--button-text-color, ButtonText);
--comment-button-hover-bg: SelectedItemText; --comment-button-hover-bg: var(
--comment-button-hover-fg: SelectedItem; --button-background-color-hover,
--comment-button-active-bg: SelectedItemText; SelectedItemText
--comment-button-active-fg: SelectedItem; );
--comment-button-border-color: ButtonBorder; --comment-button-hover-fg: var(--button-text-color-hover, SelectedItem);
--comment-button-active-border-color: ButtonBorder; --comment-button-active-bg: var(
--comment-button-hover-border-color: SelectedItem; --button-background-color-active,
SelectedItemText
);
--comment-button-active-fg: var(--button-text-color-active, SelectedItem);
--comment-button-border-color: var(--button-border-color, ButtonBorder);
--comment-button-active-border-color: var(
--button-border-color-active,
ButtonBorder
);
--comment-button-hover-border-color: var(
--button-border-color-hover,
SelectedItem
);
--comment-button-box-shadow: none; --comment-button-box-shadow: none;
--comment-button-focus-outline-color: CanvasText; --comment-button-focus-outline-color: var(
--comment-button-selected-bg: ButtonBorder; --focus-outline-color,
--comment-button-selected-fg: ButtonFace; CanvasText
);
--comment-button-selected-bg: var(
--button-background-color-primary,
ButtonBorder
);
--comment-button-selected-fg: var(
--button-text-color-primary,
ButtonFace
);
} }
position: absolute; position: absolute;
@ -185,19 +232,28 @@
--comment-active-brightness: 0.825; --comment-active-brightness: 0.825;
--comment-active-filter: brightness(var(--comment-active-brightness)); --comment-active-filter: brightness(var(--comment-active-brightness));
--comment-border-color: light-dark(#f0f0f4, #52525e); --comment-border-color: light-dark(#f0f0f4, #52525e);
--comment-focus-outline-color: light-dark(#0062fa, #00cadb); --comment-focus-outline-color: var(
--comment-fg-color: light-dark(#15141a, #fbfbfe); --focus-outline-color,
light-dark(#0062fa, #00cadb)
);
--comment-fg-color: var(--text-color, light-dark(#15141a, #fbfbfe));
--comment-count-bg-color: light-dark(#e2f7ff, #00317e); --comment-count-bg-color: light-dark(#e2f7ff, #00317e);
--comment-indicator-active-fg-color: light-dark(#0041a4, #a6ecf4); --comment-indicator-active-fg-color: light-dark(#0041a4, #a6ecf4);
--comment-indicator-active-filter: brightness( --comment-indicator-active-filter: brightness(
calc(1 / var(--comment-active-brightness)) calc(1 / var(--comment-active-brightness))
); );
--comment-indicator-focus-fg-color: light-dark(#5b5b66, #fbfbfe); --comment-indicator-focus-fg-color: light-dark(#5b5b66, #fbfbfe);
--comment-indicator-hover-fg-color: light-dark(#0053cb, #61dce9); --comment-indicator-hover-fg-color: var(
--color-accent-primary-hover,
light-dark(#0053cb, #61dce9)
);
--comment-indicator-hover-filter: brightness( --comment-indicator-hover-filter: brightness(
calc(1 / var(--comment-hover-brightness)) calc(1 / var(--comment-hover-brightness))
); );
--comment-indicator-selected-fg-color: light-dark(#0062fa, #00cadb); --comment-indicator-selected-fg-color: var(
--color-accent-primary,
light-dark(#0062fa, #00cadb)
);
--button-comment-bg: transparent; --button-comment-bg: transparent;
--button-comment-color: var(--main-color); --button-comment-color: var(--main-color);
@ -208,9 +264,6 @@
--button-comment-hover-bg: light-dark(#e0e0e6, #52525e); --button-comment-hover-bg: light-dark(#e0e0e6, #52525e);
--button-comment-hover-color: var(--button-comment-color); --button-comment-hover-color: var(--button-comment-color);
--link-fg-color: light-dark(#0060df, #0df);
--link-hover-fg-color: light-dark(#0250bb, #80ebff);
@media screen and (forced-colors: active) { @media screen and (forced-colors: active) {
--comment-date-fg-color: CanvasText; --comment-date-fg-color: CanvasText;
--comment-bg-color: Canvas; --comment-bg-color: Canvas;
@ -219,11 +272,13 @@
--comment-active-bg-color: Canvas; --comment-active-bg-color: Canvas;
--comment-active-filter: none; --comment-active-filter: none;
--comment-border-color: CanvasText; --comment-border-color: CanvasText;
--comment-fg-color: CanvasText; --comment-fg-color: var(--text-color, CanvasText);
--comment-count-bg-color: Canvas; --comment-count-bg-color: Canvas;
--comment-indicator-active-fg-color: SelectedItem; --comment-indicator-active-fg-color: SelectedItem;
--comment-indicator-focus-fg-color: CanvasText; --comment-indicator-focus-fg-color: var(--text-color, CanvasText);
--comment-indicator-hover-fg-color: CanvasText; /* On the Canvas comment surface, so paired with --text-color rather than a
button/accent token. */
--comment-indicator-hover-fg-color: var(--text-color, CanvasText);
--comment-indicator-selected-fg-color: SelectedItem; --comment-indicator-selected-fg-color: SelectedItem;
--button-comment-bg: ButtonFace; --button-comment-bg: ButtonFace;
--button-comment-color: ButtonText; --button-comment-color: ButtonText;
@ -232,8 +287,6 @@
--button-comment-border: 1px solid ButtonText; --button-comment-border: 1px solid ButtonText;
--button-comment-hover-bg: Highlight; --button-comment-hover-bg: Highlight;
--button-comment-hover-color: HighlightText; --button-comment-hover-color: HighlightText;
--link-fg-color: LinkText;
--link-hover-fg-color: LinkText;
} }
} }

View File

@ -14,117 +14,42 @@
*/ */
.dialog { .dialog {
--dialog-bg-color: light-dark(white, #1c1b22); --dialog-bg-color: var(--background-color-canvas, light-dark(white, #1c1b22));
--dialog-border-color: light-dark(white, #1c1b22); --dialog-border-color: var(
--background-color-canvas,
light-dark(white, #1c1b22)
);
--dialog-shadow: 0 2px 14px 0 light-dark(rgb(58 57 68 / 0.2), #15141a); --dialog-shadow: 0 2px 14px 0 light-dark(rgb(58 57 68 / 0.2), #15141a);
--text-primary-color: light-dark(#15141a, #fbfbfe);
--text-secondary-color: light-dark(#5b5b66, #cfcfd8); --text-secondary-color: light-dark(#5b5b66, #cfcfd8);
--hover-filter: brightness(0.9);
--link-fg-color: light-dark(#0060df, #0df);
--link-hover-fg-color: light-dark(#0250bb, #80ebff);
--separator-color: light-dark(#f0f0f4, #52525e); --separator-color: light-dark(#f0f0f4, #52525e);
--textarea-border-color: #8f8f9d; /* A textarea is an interactive control, so it takes the interactive border
token (whose light value is the shipped literal) and not --border-color,
which is the low-contrast decorative one. */
--textarea-border-color: var(--border-color-interactive, #8f8f9d);
--textarea-bg-color: light-dark(white, #42414d); --textarea-bg-color: light-dark(white, #42414d);
--textarea-fg-color: var(--text-secondary-color); --textarea-fg-color: var(--text-secondary-color);
--radio-bg-color: light-dark(#f0f0f4, #2b2a33); /* .primaryButton / .secondaryButton button tokens are defined once, at :root
--radio-checked-bg-color: light-dark(#fbfbfe, #15141a); in buttons.css (the shared primitive), and inherit into dialogs. */
--radio-border-color: #8f8f9d;
--radio-checked-border-color: light-dark(#0060df, #0df);
--button-secondary-bg-color: light-dark(
rgb(21 20 26 / 0.07),
rgb(251 251 254 / 0.07)
);
--button-secondary-fg-color: var(--text-primary-color);
--button-secondary-border-color: var(--button-secondary-bg-color);
--button-secondary-active-bg-color: light-dark(
rgb(21 20 26 / 0.21),
rgb(251 251 254 / 0.21)
);
--button-secondary-active-fg-color: var(--button-secondary-fg-color);
--button-secondary-active-border-color: var(--button-secondary-bg-color);
--button-secondary-hover-bg-color: light-dark(
rgb(21 20 26 / 0.14),
rgb(251 251 254 / 0.14)
);
--button-secondary-hover-fg-color: var(--button-secondary-fg-color);
--button-secondary-hover-border-color: var(--button-secondary-hover-bg-color);
--button-secondary-disabled-bg-color: var(--button-secondary-bg-color);
--button-secondary-disabled-border-color: var(
--button-secondary-border-color
);
--button-secondary-disabled-fg-color: var(--button-secondary-fg-color);
--button-primary-bg-color: light-dark(#0060df, #0df);
--button-primary-fg-color: light-dark(#fbfbfe, #15141a);
--button-primary-border-color: var(--button-primary-bg-color);
--button-primary-active-bg-color: light-dark(#054096, #aaf2ff);
--button-primary-active-fg-color: var(--button-primary-fg-color);
--button-primary-active-border-color: var(--button-primary-active-bg-color);
--button-primary-hover-bg-color: light-dark(#0250bb, #80ebff);
--button-primary-hover-fg-color: var(--button-primary-fg-color);
--button-primary-hover-border-color: var(--button-primary-hover-bg-color);
--button-primary-disabled-bg-color: var(--button-primary-bg-color);
--button-primary-disabled-border-color: var(--button-primary-border-color);
--button-primary-disabled-fg-color: var(--button-primary-fg-color);
--button-disabled-opacity: 0.4;
--input-text-bg-color: light-dark(white, #42414d); --input-text-bg-color: light-dark(white, #42414d);
--input-text-fg-color: var(--text-primary-color); --input-text-fg-color: var(--text-primary-color);
@media (prefers-color-scheme: dark) {
--hover-filter: brightness(1.4);
--button-disabled-opacity: 0.6;
}
@media screen and (forced-colors: active) { @media screen and (forced-colors: active) {
--dialog-bg-color: Canvas; --dialog-bg-color: var(--background-color-canvas, Canvas);
--dialog-border-color: CanvasText; /* border-only: --background-color-canvas would resolve to Canvas in FF HCM
(= the dialog bg) and the shadow is none here, leaving no boundary; route
through --border-color (CanvasText in HCM) to keep a visible border. */
--dialog-border-color: var(--border-color, CanvasText);
--dialog-shadow: none; --dialog-shadow: none;
--text-primary-color: CanvasText;
--text-secondary-color: CanvasText; --text-secondary-color: CanvasText;
--hover-filter: none;
--link-fg-color: LinkText;
--link-hover-fg-color: LinkText;
--separator-color: CanvasText; --separator-color: CanvasText;
--textarea-border-color: ButtonBorder; --textarea-border-color: ButtonBorder;
--textarea-bg-color: Field; --textarea-bg-color: Field;
--textarea-fg-color: ButtonText; --textarea-fg-color: ButtonText;
--radio-bg-color: ButtonFace;
--radio-checked-bg-color: ButtonFace;
--radio-border-color: ButtonText;
--radio-checked-border-color: ButtonText;
--button-secondary-bg-color: ButtonFace;
--button-secondary-fg-color: ButtonText;
--button-secondary-border-color: ButtonText;
--button-secondary-active-bg-color: HighlightText;
--button-secondary-active-fg-color: SelectedItem;
--button-secondary-active-border-color: ButtonText;
--button-secondary-hover-bg-color: HighlightText;
--button-secondary-hover-fg-color: SelectedItem;
--button-secondary-hover-border-color: SelectedItem;
--button-secondary-disabled-fg-color: GrayText;
--button-secondary-disabled-border-color: GrayText;
--button-primary-bg-color: ButtonText;
--button-primary-fg-color: ButtonFace;
--button-primary-border-color: ButtonText;
--button-primary-active-bg-color: SelectedItem;
--button-primary-active-fg-color: HighlightText;
--button-primary-active-border-color: ButtonText;
--button-primary-hover-bg-color: SelectedItem;
--button-primary-hover-fg-color: HighlightText;
--button-primary-hover-border-color: SelectedItem;
--button-primary-disabled-bg-color: GrayText;
--button-primary-disabled-fg-color: ButtonFace;
--button-primary-disabled-border-color: GrayText;
--button-disabled-opacity: 1;
--input-text-bg-color: Field; --input-text-bg-color: Field;
--input-text-fg-color: FieldText; --input-text-fg-color: FieldText;
} }
@ -133,7 +58,7 @@
font-size: 13px; font-size: 13px;
font-weight: 400; font-weight: 400;
line-height: 150%; line-height: 150%;
border-radius: 4px; border-radius: var(--border-radius-medium, 4px);
padding: 12px 16px; padding: 12px 16px;
border: 1px solid var(--dialog-border-color); border: 1px solid var(--dialog-border-color);
background: var(--dialog-bg-color); background: var(--dialog-bg-color);
@ -176,6 +101,15 @@
align-self: flex-end; align-self: flex-end;
} }
/* Native checkbox/radio tinted with the accent at Firefox's control size,
matching Firefox's default form controls (the custom appearance is
Nova-only in Firefox, so the default look is native + accent-color). */
input:is([type="checkbox"], [type="radio"]) {
accent-color: var(--color-accent-primary, light-dark(#0060df, #0df));
width: var(--checkbox-size, 16px);
height: var(--checkbox-size, 16px);
}
.radio { .radio {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
@ -187,25 +121,6 @@
gap: 8px; gap: 8px;
align-self: stretch; align-self: stretch;
align-items: center; align-items: center;
input {
appearance: none;
box-sizing: border-box;
width: 16px;
height: 16px;
border-radius: 50%;
background-color: var(--radio-bg-color);
border: 1px solid var(--radio-border-color);
&:hover {
filter: var(--hover-filter);
}
&:checked {
background-color: var(--radio-checked-bg-color);
border: 4px solid var(--radio-checked-border-color);
}
}
} }
> .radioLabel { > .radioLabel {
@ -224,14 +139,15 @@
} }
button:not(:is(.toggle-button, .closeButton, .clearInputButton)) { button:not(:is(.toggle-button, .closeButton, .clearInputButton)) {
border-radius: 4px; border-radius: var(--button-border-radius, 4px);
border: 1px solid; border-width: 1px;
border-style: solid;
font: menu; font: menu;
font-weight: 590; font-weight: var(--button-font-weight, 590);
font-size: 13px; font-size: var(--button-font-size, 13px);
padding: 4px 16px; padding: var(--button-padding, 4px 16px);
width: auto; width: auto;
height: 32px; min-height: var(--button-min-height, 32px);
&:hover { &:hover {
cursor: pointer; cursor: pointer;
@ -243,57 +159,9 @@
font: inherit; font: inherit;
} }
&.secondaryButton { /* .primaryButton / .secondaryButton colours and states come from the
color: var(--button-secondary-fg-color); shared buttons.css primitive; only the dialog-specific base geometry
background-color: var(--button-secondary-bg-color); (above) lives here, so it also covers unclassed dialog buttons. */
border-color: var(--button-secondary-border-color);
&:hover {
color: var(--button-secondary-hover-fg-color);
background-color: var(--button-secondary-hover-bg-color);
border-color: var(--button-secondary-hover-border-color);
}
&:active {
color: var(--button-secondary-active-fg-color);
background-color: var(--button-secondary-active-bg-color);
border-color: var(--button-secondary-active-border-color);
}
&:disabled {
background-color: var(--button-secondary-disabled-bg-color);
border-color: var(--button-secondary-disabled-border-color);
color: var(--button-secondary-disabled-fg-color);
opacity: var(--button-disabled-opacity);
}
}
&.primaryButton {
color: var(--button-primary-fg-color);
background-color: var(--button-primary-bg-color);
border-color: var(--button-primary-border-color);
opacity: 1;
&:hover {
color: var(--button-primary-hover-fg-color);
background-color: var(--button-primary-hover-bg-color);
border-color: var(--button-primary-hover-border-color);
}
&:active {
color: var(--button-primary-active-fg-color);
background-color: var(--button-primary-active-bg-color);
border-color: var(--button-primary-active-border-color);
}
&:disabled {
background-color: var(--button-primary-disabled-bg-color);
border-color: var(--button-primary-disabled-border-color);
color: var(--button-primary-disabled-fg-color);
opacity: var(--button-disabled-opacity);
}
}
&:disabled { &:disabled {
pointer-events: none; pointer-events: none;
} }
@ -313,7 +181,7 @@
resize: none; resize: none;
margin: 0; margin: 0;
box-sizing: border-box; box-sizing: border-box;
border-radius: 4px; border-radius: var(--border-radius-small, 4px);
border: 1px solid var(--textarea-border-color); border: 1px solid var(--textarea-border-color);
background: var(--textarea-bg-color); background: var(--textarea-bg-color);
color: var(--textarea-fg-color); color: var(--textarea-fg-color);

View File

@ -28,16 +28,28 @@
--sig-detail-color: light-dark(rgb(96 96 96), rgb(180 180 184)); --sig-detail-color: light-dark(rgb(96 96 96), rgb(180 180 184));
--sig-divider-color: light-dark(rgb(228 228 232), rgb(82 82 86)); --sig-divider-color: light-dark(rgb(228 228 232), rgb(82 82 86));
--sig-summary-hover-color: light-dark(rgb(28 67 138), rgb(126 169 255)); --sig-summary-hover-color: light-dark(rgb(28 67 138), rgb(126 169 255));
--sig-link-color: light-dark(rgb(28 113 216), rgb(126 169 255)); --sig-link-color: var(
--link-color,
light-dark(rgb(28 113 216), rgb(126 169 255))
);
--sig-link-hover-bg: light-dark( --sig-link-hover-bg: light-dark(
rgb(28 113 216 / 0.1), rgb(28 113 216 / 0.1),
rgb(126 169 255 / 0.15) rgb(126 169 255 / 0.15)
); );
--sig-banner-verified-bg: light-dark(rgb(228 247 235), rgb(28 84 49)); --sig-banner-verified-bg: var(
--background-color-success,
light-dark(rgb(228 247 235), rgb(28 84 49))
);
--sig-banner-verified-color: light-dark(rgb(16 92 47), rgb(176 232 196)); --sig-banner-verified-color: light-dark(rgb(16 92 47), rgb(176 232 196));
--sig-banner-warn-bg: light-dark(rgb(255 247 217), rgb(95 67 9)); --sig-banner-warn-bg: var(
--background-color-warning,
light-dark(rgb(255 247 217), rgb(95 67 9))
);
--sig-banner-warn-color: light-dark(rgb(124 84 9), rgb(255 222 153)); --sig-banner-warn-color: light-dark(rgb(124 84 9), rgb(255 222 153));
--sig-banner-error-bg: light-dark(rgb(254 226 235), rgb(122 21 51)); --sig-banner-error-bg: var(
--background-color-critical,
light-dark(rgb(254 226 235), rgb(122 21 51))
);
--sig-banner-error-color: light-dark(rgb(167 26 70), rgb(255 188 207)); --sig-banner-error-color: light-dark(rgb(167 26 70), rgb(255 188 207));
/* Tint colours for the row / toolbar icons. These are paired with /* Tint colours for the row / toolbar icons. These are paired with
@ -48,9 +60,18 @@
* verified = green (only used for the top-level "everything fine" * verified = green (only used for the top-level "everything fine"
* row and the toolbar's verified badge). */ * row and the toolbar's verified badge). */
--sig-icon-default: light-dark(rgb(150 150 150), rgb(180 180 184)); --sig-icon-default: light-dark(rgb(150 150 150), rgb(180 180 184));
--sig-icon-warn: light-dark(rgb(217 142 27), rgb(255 178 77)); --sig-icon-warn: var(
--sig-icon-error: light-dark(rgb(196 31 71), rgb(255 117 145)); --icon-color-warning,
--sig-icon-verified: light-dark(rgb(29 142 61), rgb(106 210 126)); light-dark(rgb(217 142 27), rgb(255 178 77))
);
--sig-icon-error: var(
--icon-color-critical,
light-dark(rgb(196 31 71), rgb(255 117 145))
);
--sig-icon-verified: var(
--icon-color-success,
light-dark(rgb(29 142 61), rgb(106 210 126))
);
@media screen and (forced-colors: active) { @media screen and (forced-colors: active) {
/* HCM keywords are picked by *semantic role*, not by hue the /* HCM keywords are picked by *semantic role*, not by hue the
@ -77,23 +98,26 @@
--sig-detail-color: GrayText; --sig-detail-color: GrayText;
--sig-divider-color: GrayText; --sig-divider-color: GrayText;
--sig-summary-hover-color: AccentColor; --sig-summary-hover-color: AccentColor;
--sig-link-color: LinkText; --sig-link-color: var(--link-color, LinkText);
--sig-link-hover-bg: transparent; --sig-link-hover-bg: transparent;
--sig-banner-verified-bg: ButtonFace; /* Firefox collapses the status backgrounds onto --background-color-canvas
--sig-banner-verified-color: ButtonText; in HCM, so the foregrounds have to follow --text-color to stay a pair
--sig-banner-warn-bg: ButtonFace; (ButtonText over that Canvas surface is not guaranteed to contrast). */
--sig-banner-warn-color: ButtonText; --sig-banner-verified-bg: var(--background-color-success, ButtonFace);
--sig-banner-error-bg: ButtonFace; --sig-banner-verified-color: var(--text-color, ButtonText);
--sig-banner-error-color: ButtonText; --sig-banner-warn-bg: var(--background-color-warning, ButtonFace);
--sig-banner-warn-color: var(--text-color, ButtonText);
--sig-banner-error-bg: var(--background-color-critical, ButtonFace);
--sig-banner-error-color: var(--text-color, ButtonText);
/* Severities collapse to the same emphasis keyword (AccentColor) /* Severities collapse to the same emphasis keyword (AccentColor)
* in HCM same trick as alt-text where `done` and `warning` * in HCM same trick as alt-text where `done` and `warning`
* share their hover colour. The glyph shape (check vs `!` vs ``) * share their hover colour. The glyph shape (check vs `!` vs ``)
* carries the remaining distinction. The neutral "row crypto * carries the remaining distinction. The neutral "row crypto
* verified" check stays muted (GrayText). */ * verified" check stays muted (GrayText). */
--sig-icon-default: GrayText; --sig-icon-default: GrayText;
--sig-icon-warn: AccentColor; --sig-icon-warn: var(--icon-color-warning, AccentColor);
--sig-icon-error: AccentColor; --sig-icon-error: var(--icon-color-critical, AccentColor);
--sig-icon-verified: AccentColor; --sig-icon-verified: var(--icon-color-success, AccentColor);
} }
} }

View File

@ -41,10 +41,13 @@ button.hasPopupMenu {
var(--menu-text-color), var(--menu-text-color),
transparent 93% transparent 93%
); );
--menuitem-focus-outline-color: light-dark(#0062fa, #00cadb); --menuitem-focus-outline-color: var(
--focus-outline-color,
light-dark(#0062fa, #00cadb)
);
--menuitem-focus-border-color: light-dark(white, black); --menuitem-focus-border-color: light-dark(white, black);
--menu-bg: light-dark(white, #23222b); --menu-bg: var(--background-color-box, light-dark(white, #23222b));
--menu-background-blend-mode: normal; --menu-background-blend-mode: normal;
--menu-box-shadow: --menu-box-shadow:
0 0.375px 1.5px 0 light-dark(rgb(0 0 0 / 0.05), rgb(0 0 0 / 0.2)), 0 0.375px 1.5px 0 light-dark(rgb(0 0 0 / 0.05), rgb(0 0 0 / 0.2)),
@ -52,7 +55,7 @@ button.hasPopupMenu {
--menu-border-color: light-dark(rgb(21 20 26 / 0.1), rgb(251 251 254 / 0.1)); --menu-border-color: light-dark(rgb(21 20 26 / 0.1), rgb(251 251 254 / 0.1));
--menuitem-border-radius: 8px; --menuitem-border-radius: 8px;
--menu-backdrop-filter: none; --menu-backdrop-filter: none;
--menu-text-color: light-dark(#15141a, #fbfbfe); --menu-text-color: var(--text-color, light-dark(#15141a, #fbfbfe));
--menu-text-disabled-color: var(--menu-text-color); --menu-text-disabled-color: var(--menu-text-color);
--menuitem-text-hover-fg: var(--menu-text-color); --menuitem-text-hover-fg: var(--menu-text-color);
--menuitem-hover-bg: color-mix( --menuitem-hover-bg: color-mix(
@ -64,11 +67,11 @@ button.hasPopupMenu {
--disabled-opacity: 0.62; --disabled-opacity: 0.62;
@media screen and (forced-colors: active) { @media screen and (forced-colors: active) {
--menu-bg: Canvas; --menu-bg: var(--background-color-box, Canvas);
--menu-background-blend-mode: normal; --menu-background-blend-mode: normal;
--menu-box-shadow: none; --menu-box-shadow: none;
--menu-backdrop-filter: none; --menu-backdrop-filter: none;
--menu-text-color: ButtonText; --menu-text-color: var(--text-color, ButtonText);
--menu-text-disabled-color: GrayText; --menu-text-disabled-color: GrayText;
--menu-border-color: CanvasText; --menu-border-color: CanvasText;
--menuitem-border-color: none; --menuitem-border-color: none;
@ -78,7 +81,7 @@ button.hasPopupMenu {
--menuitem-active-border-color: ButtonText; --menuitem-active-border-color: ButtonText;
--menuitem-text-active-fg: SelectedItem; --menuitem-text-active-fg: SelectedItem;
--menuitem-focus-bg: ButtonFace; --menuitem-focus-bg: ButtonFace;
--menuitem-focus-outline-color: CanvasText; --menuitem-focus-outline-color: var(--focus-outline-color, CanvasText);
--menuitem-focus-border-color: none; --menuitem-focus-border-color: none;
--disabled-opacity: 1; --disabled-opacity: 1;
} }

View File

@ -17,28 +17,46 @@
--closing-button-icon: url(images/messageBar_closingButton.svg); --closing-button-icon: url(images/messageBar_closingButton.svg);
--message-bar-close-button-color: var(--text-primary-color); --message-bar-close-button-color: var(--text-primary-color);
--message-bar-close-button-color-hover: var(--text-primary-color); --message-bar-close-button-color-hover: var(--text-primary-color);
--message-bar-close-button-border-radius: 4px; --message-bar-close-button-border-radius: var(--border-radius-small, 4px);
--message-bar-close-button-border: none; --message-bar-close-button-border: none;
--message-bar-close-button-hover-bg-color: light-dark( --message-bar-close-button-hover-bg-color: var(
rgb(21 20 26 / 0.14), --button-background-color-hover,
rgb(251 251 254 / 0.14) light-dark(rgb(21 20 26 / 0.14), rgb(251 251 254 / 0.14))
); );
--message-bar-close-button-active-bg-color: light-dark( --message-bar-close-button-active-bg-color: var(
rgb(21 20 26 / 0.21), --button-background-color-active,
rgb(251 251 254 / 0.21) light-dark(rgb(21 20 26 / 0.21), rgb(251 251 254 / 0.21))
); );
--message-bar-close-button-focus-bg-color: light-dark( --message-bar-close-button-focus-bg-color: var(
rgb(21 20 26 / 0.07), --button-background-color,
rgb(251 251 254 / 0.07) light-dark(rgb(21 20 26 / 0.07), rgb(251 251 254 / 0.07))
); );
@media screen and (forced-colors: active) { @media screen and (forced-colors: active) {
--message-bar-close-button-color: ButtonText; --message-bar-close-button-color: var(--button-text-color, ButtonText);
--message-bar-close-button-border: 1px solid ButtonText; --message-bar-close-button-border: 1px solid
--message-bar-close-button-hover-bg-color: ButtonText; var(--button-border-color, ButtonText);
--message-bar-close-button-active-bg-color: ButtonText; /* One icon colour is shared by hover/active/focus, so all three backgrounds
--message-bar-close-button-focus-bg-color: ButtonText; read the -hover token and pair with --button-text-color-hover. The
--message-bar-close-button-color-hover: HighlightText; fallbacks are SelectedItemText/SelectedItem for the same reason: the
previous ButtonText-behind-HighlightText hid the icon outright in any
theme whose button ink and highlight text are both light. */
--message-bar-close-button-hover-bg-color: var(
--button-background-color-hover,
SelectedItemText
);
--message-bar-close-button-active-bg-color: var(
--button-background-color-hover,
SelectedItemText
);
--message-bar-close-button-focus-bg-color: var(
--button-background-color-hover,
SelectedItemText
);
--message-bar-close-button-color-hover: var(
--button-text-color-hover,
SelectedItem
);
} }
display: flex; display: flex;
@ -50,7 +68,9 @@
gap: 8px; gap: 8px;
user-select: none; user-select: none;
border-radius: 4px; /* Nests inside .dialog, whose radius is --border-radius-medium, so it has to
scale with it to keep the inner corner tighter than the outer one. */
border-radius: var(--border-radius-small, 4px);
border: 1px solid var(--message-bar-border-color); border: 1px solid var(--message-bar-border-color);
background: var(--message-bar-bg-color); background: var(--message-bar-bg-color);
@ -130,8 +150,6 @@
} }
#editorUndoBar { #editorUndoBar {
--text-primary-color: light-dark(#15141a, #fbfbfe);
--message-bar-icon: url(images/messageBar_info.svg); --message-bar-icon: url(images/messageBar_info.svg);
--message-bar-icon-color: light-dark(#0060df, #73a7f3); --message-bar-icon-color: light-dark(#0060df, #73a7f3);
--message-bar-bg-color: light-dark(#deeafc, #003070); --message-bar-bg-color: light-dark(#deeafc, #003070);
@ -141,41 +159,10 @@
rgb(255 255 255 / 0.08) rgb(255 255 255 / 0.08)
); );
--undo-button-bg-color: light-dark(
rgb(21 20 26 / 0.07),
rgb(255 255 255 / 0.08)
);
--undo-button-bg-color-hover: light-dark(
rgb(21 20 26 / 0.14),
rgb(255 255 255 / 0.14)
);
--undo-button-bg-color-active: light-dark(
rgb(21 20 26 / 0.21),
rgb(255 255 255 / 0.21)
);
--undo-button-border: 1px solid light-dark(#0060df, #0df);
--undo-button-fg-color: var(--message-bar-fg-color);
--undo-button-fg-color-hover: var(--undo-button-fg-color);
--undo-button-fg-color-active: var(--undo-button-fg-color);
@media screen and (forced-colors: active) { @media screen and (forced-colors: active) {
--text-primary-color: CanvasText;
--message-bar-icon-color: CanvasText; --message-bar-icon-color: CanvasText;
--message-bar-bg-color: Canvas; --message-bar-bg-color: Canvas;
--message-bar-border-color: CanvasText; --message-bar-border-color: CanvasText;
--undo-button-bg-color: ButtonText;
--undo-button-bg-color-hover: SelectedItem;
--undo-button-bg-color-active: SelectedItem;
--undo-button-fg-color: ButtonFace;
--undo-button-fg-color-hover: SelectedItemText;
--undo-button-fg-color-active: SelectedItemText;
--undo-button-border: none;
} }
position: fixed; position: fixed;
@ -197,26 +184,10 @@
} }
#editorUndoBarUndoButton { #editorUndoBarUndoButton {
border-radius: 4px;
font-weight: 590;
line-height: 19.5px;
color: var(--undo-button-fg-color);
border: var(--undo-button-border);
padding: 4px 16px;
margin-inline-start: 8px; margin-inline-start: 8px;
height: 32px; /* The generic secondary border is the same translucent wash as its fill,
which disappears on the tinted bar, so keep an explicit accent edge. */
background-color: var(--undo-button-bg-color); border-color: var(--color-accent-primary, light-dark(#0060df, #0df));
&:hover {
background-color: var(--undo-button-bg-color-hover);
color: var(--undo-button-fg-color-hover);
}
&:active {
background-color: var(--undo-button-bg-color-active);
color: var(--undo-button-fg-color-active);
}
} }
> div { > div {

View File

@ -12,6 +12,22 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
/*
* Firefox design-system bridge.
*
* The viewer chrome is authored against Firefox design-token names with the
* shipped literal as the fallback: `var(--fx-token, <literal>)`. GENERIC and
* the components build resolve the fallback and stay self-contained; the
* MOZCENTRAL build imports tokens-brand.css when pdfjs.enableNova is set (see
* viewer.css), so those names resolve to live Firefox values and the theme
* never has to be re-synced by hand.
*
* Firefox declares its tokens inside `@layer tokens-foundation-brand`, so any
* unlayered declaration wins over them. To *consume* a Firefox value,
* reference it through var() (with a fallback) and do NOT redeclare the same
* name: that would shadow Firefox's for the whole subtree.
*/
@import url(buttons.css);
@import url(message_bar.css); @import url(message_bar.css);
@import url(dialog.css); @import url(dialog.css);
@import url(text_layer_builder.css); @import url(text_layer_builder.css);
@ -34,8 +50,12 @@
--page-border: 9px solid transparent; --page-border: 9px solid transparent;
--spreadHorizontalWrapped-margin-LR: -3.5px; --spreadHorizontalWrapped-margin-LR: -3.5px;
--loading-icon-delay: 400ms; --loading-icon-delay: 400ms;
--focus-ring-color: light-dark(#0060df, #0df); --focus-ring-color: var(--focus-outline-color, light-dark(#0060df, #0df));
--focus-ring-outline: 2px solid var(--focus-ring-color); --focus-ring-outline: var(--focus-outline-width, 2px) solid
var(--focus-ring-color);
--text-primary-color: var(--text-color, light-dark(#15141a, #fbfbfe));
--link-fg-color: var(--link-color, light-dark(#0060df, #0df));
--link-hover-fg-color: var(--link-color-hover, light-dark(#0250bb, #80ebff));
--new-badge-bg: light-dark(#070, #37b847); --new-badge-bg: light-dark(#070, #37b847);
--new-badge-color: light-dark(#fff, #15141a); --new-badge-color: light-dark(#fff, #15141a);
--new-badge-border-color: light-dark(#fbfbfe / 40%, #15141a / 40%); --new-badge-border-color: light-dark(#fbfbfe / 40%, #15141a / 40%);
@ -45,7 +65,10 @@
--page-margin: 8px auto -1px; --page-margin: 8px auto -1px;
--page-border: 1px solid CanvasText; --page-border: 1px solid CanvasText;
--spreadHorizontalWrapped-margin-LR: 3.5px; --spreadHorizontalWrapped-margin-LR: 3.5px;
--focus-ring-color: CanvasText; --focus-ring-color: var(--focus-outline-color, CanvasText);
--text-primary-color: var(--text-color, CanvasText);
--link-fg-color: var(--link-color, LinkText);
--link-hover-fg-color: var(--link-color-hover, LinkText);
--new-badge-bg: AccentColor; --new-badge-bg: AccentColor;
--new-badge-color: ButtonFace; --new-badge-color: ButtonFace;
--new-badge-border-color: CanvasText; --new-badge-border-color: CanvasText;

View File

@ -14,7 +14,7 @@
*/ */
.sidebar { .sidebar {
--sidebar-bg-color: light-dark(#fff, #23222b); --sidebar-bg-color: var(--background-color-box, light-dark(#fff, #23222b));
--sidebar-border-color: light-dark( --sidebar-border-color: light-dark(
rgb(21 20 26 / 0.1), rgb(21 20 26 / 0.1),
rgb(251 251 254 / 0.1) rgb(251 251 254 / 0.1)
@ -30,13 +30,18 @@
--sidebar-width: 239px; --sidebar-width: 239px;
--resizer-width: 4px; --resizer-width: 4px;
--resizer-shift: calc(0px - var(--resizer-width) - 2px); --resizer-shift: calc(0px - var(--resizer-width) - 2px);
--resizer-hover-bg-color: light-dark(#0062fa, #00cadb); --resizer-hover-bg-color: var(
--color-accent-primary,
light-dark(#0062fa, #00cadb)
);
@media screen and (forced-colors: active) { @media screen and (forced-colors: active) {
--sidebar-bg-color: Canvas; --sidebar-bg-color: var(--background-color-box, Canvas);
--sidebar-border-color: CanvasText; --sidebar-border-color: CanvasText;
--sidebar-box-shadow: none; --sidebar-box-shadow: none;
--resizer-hover-bg-color: CanvasText; /* Painted on the Canvas sidebar, so --text-color rather than the accent
(which is ButtonText in Firefox HCM). */
--resizer-hover-bg-color: var(--text-color, CanvasText);
} }
border-radius: var(--sidebar-border-radius); border-radius: var(--sidebar-border-radius);

View File

@ -15,8 +15,16 @@
:root { :root {
--clear-signature-button-icon: url(images/editor-toolbar-delete.svg); --clear-signature-button-icon: url(images/editor-toolbar-delete.svg);
--signature-bg: light-dark(#f9f9fb, #2b2a33); /* The signature wells are boxes nested in the dialog, i.e. Firefox's
--signature-hover-bg: light-dark(#f0f0f4, var(--signature-bg)); .info-box-container pattern. */
--signature-bg: var(
--background-color-box-info,
light-dark(#f9f9fb, #2b2a33)
);
--signature-hover-bg: var(
--button-background-color-hover,
light-dark(#f0f0f4, var(--signature-bg))
);
--button-signature-bg: transparent; --button-signature-bg: transparent;
--button-signature-color: var(--main-color); --button-signature-color: var(--main-color);
--button-signature-active-bg: light-dark(#cfcfd8, #5b5b66); --button-signature-active-bg: light-dark(#cfcfd8, #5b5b66);
@ -41,13 +49,13 @@
.signatureDialog { .signatureDialog {
--primary-color: var(--text-primary-color); --primary-color: var(--text-primary-color);
--border-color: #8f8f9d; --signature-border-color: var(--border-color-interactive, #8f8f9d);
--open-link-fg: var(--link-fg-color); --open-link-fg: var(--link-fg-color);
--open-link-hover-fg: var(--link-hover-fg-color); --open-link-hover-fg: var(--link-hover-fg-color);
@media screen and (forced-colors: active) { @media screen and (forced-colors: active) {
--primary-color: ButtonText; --primary-color: ButtonText;
--border-color: ButtonText; --signature-border-color: var(--border-color-interactive, ButtonText);
--open-link-fg: ButtonText; --open-link-fg: ButtonText;
--open-link-hover-fg: ButtonText; --open-link-hover-fg: ButtonText;
} }
@ -88,11 +96,11 @@
> input { > input {
width: 100%; width: 100%;
height: 32px; height: var(--size-item-large, 32px);
padding-inline: 8px calc(4px + var(--button-dimension)); padding-inline: 8px calc(4px + var(--button-dimension));
box-sizing: border-box; box-sizing: border-box;
border-radius: 4px; border-radius: var(--border-radius-small, 4px);
border: 1px solid var(--border-color); border: 1px solid var(--signature-border-color);
} }
.clearInputButton { .clearInputButton {
@ -113,11 +121,17 @@
#addSignatureDialog { #addSignatureDialog {
--secondary-color: var(--text-secondary-color); --secondary-color: var(--text-secondary-color);
--bg-hover: #e0e0e6; --bg-hover: var(
--tab-top-line-active-color: #0060df; --button-background-color-hover,
light-dark(#e0e0e6, #52525e)
);
--tab-top-line-active-color: var(
--color-accent-primary,
light-dark(#0060df, #0df)
);
--tab-top-line-active-hover-color: var(--tab-text-hover-color); --tab-top-line-active-hover-color: var(--tab-text-hover-color);
--tab-top-line-hover-color: #8f8f9d; --tab-top-line-hover-color: var(--border-color-interactive, #8f8f9d);
--tab-top-line-inactive-color: #cfcfd8; --tab-top-line-inactive-color: light-dark(#cfcfd8, #8f8f9d);
--tab-bottom-line-active-color: var(--tab-top-line-inactive-color); --tab-bottom-line-active-color: var(--tab-top-line-inactive-color);
--tab-bottom-line-hover-color: var(--tab-top-line-inactive-color); --tab-bottom-line-hover-color: var(--tab-top-line-inactive-color);
--tab-bottom-line-inactive-color: var(--tab-top-line-inactive-color); --tab-bottom-line-inactive-color: var(--tab-top-line-inactive-color);
@ -126,7 +140,7 @@
--tab-bg-active-hover-color: var(--bg-hover); --tab-bg-active-hover-color: var(--bg-hover);
--tab-bg-hover: var(--bg-hover); --tab-bg-hover: var(--bg-hover);
--tab-panel-border: none; --tab-panel-border: none;
--tab-panel-border-radius: 4px; --tab-panel-border-radius: var(--border-radius-small, 4px);
--tab-text-color: var(--primary-color); --tab-text-color: var(--primary-color);
--tab-text-active-color: var(--tab-top-line-active-color); --tab-text-active-color: var(--tab-top-line-active-color);
--tab-text-active-hover-color: var(--tab-text-hover-color); --tab-text-active-hover-color: var(--tab-text-hover-color);
@ -134,24 +148,6 @@
--signature-placeholder-color: var(--secondary-color); --signature-placeholder-color: var(--secondary-color);
--signature-draw-placeholder-color: var(--primary-color); --signature-draw-placeholder-color: var(--primary-color);
--signature-color: var(--primary-color); --signature-color: var(--primary-color);
--clear-signature-button-border-width: 0;
--clear-signature-button-border-style: solid;
--clear-signature-button-border-color: transparent;
--clear-signature-button-border-disabled-color: transparent;
--clear-signature-button-color: var(--primary-color);
--clear-signature-button-hover-color: var(--clear-signature-button-color);
--clear-signature-button-active-color: var(--clear-signature-button-color);
--clear-signature-button-disabled-color: var(--clear-signature-button-color);
--clear-signature-button-focus-color: var(--clear-signature-button-color);
--clear-signature-button-bg: var(--dialog-bg-color);
--clear-signature-button-bg-hover: var(--bg-hover);
--clear-signature-button-bg-active: #cfcfd8;
--clear-signature-button-bg-focus: #f0f0f4;
--clear-signature-button-bg-disabled: color-mix(
in srgb,
#f0f0f4,
transparent 40%
);
--save-warning-color: var(--secondary-color); --save-warning-color: var(--secondary-color);
--thickness-bg: var(--dialog-bg-color); --thickness-bg: var(--dialog-bg-color);
--thickness-label-color: var(--primary-color); --thickness-label-color: var(--primary-color);
@ -159,30 +155,13 @@
--thickness-border: none; --thickness-border: none;
--draw-cursor: url(images/cursor-editorInk.svg) 0 16, pointer; --draw-cursor: url(images/cursor-editorInk.svg) 0 16, pointer;
@media (prefers-color-scheme: dark) {
/* TODO: Update the dialog colors for dark mode but in dialog.css */
--dialog-bg-color: #42414d;
--bg-hover: #52525e;
--primary-color: #fbfbfe;
--secondary-color: #cfcfd8;
--tab-top-line-active-color: #0df;
--tab-top-line-inactive-color: #8f8f9d;
--clear-signature-button-bg-active: #5b5b66;
--clear-signature-button-bg-focus: #2b2a33;
--clear-signature-button-bg-disabled: color-mix(
in srgb,
#2b2a33,
transparent 40%
);
}
@media screen and (forced-colors: active) { @media screen and (forced-colors: active) {
--secondary-color: ButtonText; --secondary-color: ButtonText;
--bg: HighlightText; --bg: HighlightText;
--bg-hover: var(--bg); --bg-hover: var(--bg);
--tab-top-line-active-color: ButtonText; --tab-top-line-active-color: var(--color-accent-primary, ButtonText);
--tab-top-line-active-hover-color: HighlightText; --tab-top-line-active-hover-color: HighlightText;
--tab-top-line-hover-color: SelectedItem; --tab-top-line-hover-color: var(--border-color-interactive, SelectedItem);
--tab-top-line-inactive-color: ButtonText; --tab-top-line-inactive-color: ButtonText;
--tab-bottom-line-active-color: var(--tab-top-line-active-color); --tab-bottom-line-active-color: var(--tab-top-line-active-color);
--tab-bottom-line-hover-color: var(--tab-top-line-hover-color); --tab-bottom-line-hover-color: var(--tab-top-line-hover-color);
@ -196,24 +175,10 @@
--tab-text-active-hover-color: HighlightText; --tab-text-active-hover-color: HighlightText;
--tab-text-hover-color: SelectedItem; --tab-text-hover-color: SelectedItem;
--signature-color: ButtonText; --signature-color: ButtonText;
--clear-signature-button-border-width: 1px;
--clear-signature-button-border-style: solid;
--clear-signature-button-border-color: ButtonText;
--clear-signature-button-border-disabled-color: GrayText;
--clear-signature-button-color: ButtonText;
--clear-signature-button-hover-color: HighlightText;
--clear-signature-button-active-color: SelectedItem;
--clear-signature-button-focus-color: CanvasText;
--clear-signature-button-disabled-color: GrayText;
--clear-signature-button-bg: var(--bg);
--clear-signature-button-bg-hover: SelectedItem;
--clear-signature-button-bg-active: var(--bg);
--clear-signature-button-bg-focus: var(--bg);
--clear-signature-button-bg-disabled: var(--bg);
--thickness-bg: Canvas; --thickness-bg: Canvas;
--thickness-label-color: CanvasText; --thickness-label-color: CanvasText;
--thickness-slider-color: ButtonText; --thickness-slider-color: ButtonText;
--thickness-border: 1px solid var(--border-color); --thickness-border: 1px solid var(--signature-border-color);
} }
#addSignatureDialogLabel { #addSignatureDialogLabel {
@ -533,14 +498,7 @@
#clearSignatureButton { #clearSignatureButton {
display: flex; display: flex;
height: 32px;
padding: 4px 8px;
align-items: center; align-items: center;
background-color: var(--clear-signature-button-bg);
border-width: var(--clear-signature-button-border-width);
border-style: var(--clear-signature-button-border-style);
border-color: var(--clear-signature-button-border-color);
border-radius: 4px;
> span { > span {
display: flex; display: flex;
@ -549,8 +507,6 @@
gap: 4px; gap: 4px;
flex-shrink: 0; flex-shrink: 0;
color: var(--clear-signature-button-color);
&::after { &::after {
content: ""; content: "";
display: inline-block; display: inline-block;
@ -558,57 +514,10 @@
height: 16px; height: 16px;
mask-image: var(--clear-signature-button-icon); mask-image: var(--clear-signature-button-icon);
mask-size: cover; mask-size: cover;
background-color: var(--clear-signature-button-color); background-color: currentColor;
flex-shrink: 0; flex-shrink: 0;
} }
} }
&:hover {
background-color: var(--clear-signature-button-bg-hover);
> span {
color: var(--clear-signature-button-hover-color);
&::after {
background-color: var(--clear-signature-button-hover-color);
}
}
}
&:active {
background-color: var(--clear-signature-button-bg-active);
> span {
color: var(--clear-signature-button-active-color);
&::after {
background-color: var(--clear-signature-button-active-color);
}
}
}
&:focus-visible {
background-color: var(--clear-signature-button-bg-focus);
> span {
color: var(--clear-signature-button-focus-color);
&::after {
background-color: var(--clear-signature-button-focus-color);
}
}
}
&:disabled {
background-color: var(--clear-signature-button-bg-disabled);
border-color: var(--clear-signature-button-border-disabled-color);
> span {
color: var(--clear-signature-button-disabled-color);
&::after {
background-color: var(
--clear-signature-button-disabled-color
);
}
}
}
} }
} }

View File

@ -2,44 +2,13 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this * 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/. */ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
.toggle-button { /* The Firefox foundation tokens below are read with the shipped literal as the
--button-background-color: color-mix(in srgb, currentColor 7%, transparent); fallback, so MOZCENTRAL tracks the design system (tokens-brand.css, linked
--button-background-color-hover: color-mix( from viewer.html) while every other build keeps this self-contained
in srgb, moz-toggle copy. Declaring those token names here instead would shadow
currentColor 14%, Firefox's (unlayered beats @layer), and a bare var() would both trip
transparent stylelint's no-unknown-custom-properties and collapse the toggle to a
); zero-size transparent element if the chrome sheet ever failed to load. */
--button-background-color-active: color-mix(
in srgb,
currentColor 21%,
transparent
);
--color-accent-primary: light-dark(#0060df, #0df);
--color-accent-primary-hover: light-dark(#0250bb, #80ebff);
--color-accent-primary-active: light-dark(#054096, #aaf2ff);
--border-radius-circle: 9999px;
--border-width: 1px;
--size-item-small: 16px;
--size-item-large: 32px;
--color-canvas: light-dark(white, #1c1b22);
--background-color-canvas: var(--color-canvas);
--border-color-interactive: light-dark(#8f8f9d, #f9f9fa);
--border-color-interactive-hover: var(--border-color-interactive);
--border-color-interactive-active: var(--border-color-interactive);
--focus-outline-offset: 2px;
@media (forced-colors: active) {
--color-accent-primary: ButtonText;
--color-accent-primary-hover: SelectedItem;
--color-accent-primary-active: SelectedItem;
--button-background-color: ButtonFace;
--border-color-interactive: ButtonText;
--border-color-interactive-hover: SelectedItem;
--border-color-interactive-active: ButtonText;
--color-canvas: ButtonText;
--background-color-canvas: Canvas;
}
}
/* /*
The original file is located at: The original file is located at:
@ -55,23 +24,47 @@
*/ */
.toggle-button { .toggle-button {
--toggle-background-color: var(--button-background-color); --toggle-background-color: var(
--toggle-background-color-hover: var(--button-background-color-hover); --button-background-color,
--toggle-background-color-active: var(--button-background-color-active); color-mix(in srgb, currentColor 7%, transparent)
--toggle-background-color-pressed: var(--color-accent-primary); );
--toggle-background-color-pressed-hover: var(--color-accent-primary-hover); --toggle-background-color-hover: var(
--toggle-background-color-pressed-active: var(--color-accent-primary-active); --button-background-color-hover,
--toggle-border-color: var(--border-color-interactive); color-mix(in srgb, currentColor 14%, transparent)
);
--toggle-background-color-active: var(
--button-background-color-active,
color-mix(in srgb, currentColor 21%, transparent)
);
--toggle-background-color-pressed: var(
--color-accent-primary,
light-dark(#0060df, #0df)
);
--toggle-background-color-pressed-hover: var(
--color-accent-primary-hover,
light-dark(#0250bb, #80ebff)
);
--toggle-background-color-pressed-active: var(
--color-accent-primary-active,
light-dark(#054096, #aaf2ff)
);
--toggle-border-color: var(
--border-color-interactive,
light-dark(#8f8f9d, #f9f9fa)
);
--toggle-border-color-hover: var(--toggle-border-color); --toggle-border-color-hover: var(--toggle-border-color);
--toggle-border-color-active: var(--toggle-border-color); --toggle-border-color-active: var(--toggle-border-color);
--toggle-border-radius: var(--border-radius-circle); --toggle-border-radius: var(--border-radius-circle, 9999px);
--toggle-border-width: var(--border-width); --toggle-border-width: var(--border-width, 1px);
--toggle-height: var(--size-item-small); --toggle-height: var(--size-item-small, 16px);
--toggle-width: var(--size-item-large); --toggle-width: var(--size-item-large, 32px);
--toggle-dot-background-color: var(--toggle-border-color); --toggle-dot-background-color: var(--toggle-border-color);
--toggle-dot-background-color-hover: var(--toggle-dot-background-color); --toggle-dot-background-color-hover: var(--toggle-dot-background-color);
--toggle-dot-background-color-active: var(--toggle-dot-background-color); --toggle-dot-background-color-active: var(--toggle-dot-background-color);
--toggle-dot-background-color-on-pressed: var(--background-color-canvas); --toggle-dot-background-color-on-pressed: var(
--background-color-canvas,
light-dark(white, #1c1b22)
);
--toggle-dot-margin: 1px; --toggle-dot-margin: 1px;
--toggle-dot-height: calc( --toggle-dot-height: calc(
var(--toggle-height) - 2 * var(--toggle-dot-margin) - 2 * var(--toggle-height) - 2 * var(--toggle-dot-margin) - 2 *
@ -93,8 +86,8 @@
box-sizing: border-box; box-sizing: border-box;
&:focus-visible { &:focus-visible {
outline: var(--focus-outline); outline: var(--focus-ring-outline);
outline-offset: var(--focus-outline-offset); outline-offset: var(--focus-outline-offset, 2px);
} }
&:enabled:hover { &:enabled:hover {
@ -186,16 +179,42 @@
@media (forced-colors) { @media (forced-colors) {
.toggle-button { .toggle-button {
--toggle-dot-background-color: var(--color-accent-primary); --toggle-background-color: var(--button-background-color, ButtonFace);
--toggle-dot-background-color-hover: var(--color-accent-primary-hover); --toggle-background-color-pressed: var(--color-accent-primary, ButtonText);
--toggle-dot-background-color-active: var(--color-accent-primary-active); --toggle-background-color-pressed-hover: var(
--toggle-dot-background-color-on-pressed: var(--button-background-color); --color-accent-primary-hover,
--toggle-border-color-hover: var(--border-color-interactive-hover); SelectedItem
--toggle-border-color-active: var(--border-color-interactive-active); );
--toggle-background-color-pressed-active: var(
--color-accent-primary-active,
SelectedItem
);
--toggle-border-color: var(--border-color-interactive, ButtonText);
--toggle-dot-background-color: var(--color-accent-primary, ButtonText);
--toggle-dot-background-color-hover: var(
--color-accent-primary-hover,
SelectedItem
);
--toggle-dot-background-color-active: var(
--color-accent-primary-active,
SelectedItem
);
--toggle-dot-background-color-on-pressed: var(
--button-background-color,
ButtonFace
);
--toggle-border-color-hover: var(
--border-color-interactive-hover,
SelectedItem
);
--toggle-border-color-active: var(
--border-color-interactive-active,
ButtonText
);
} }
.toggle-button[aria-pressed="true"]:enabled::after { .toggle-button[aria-pressed="true"]:enabled::after {
border: 1px solid var(--button-background-color); border: 1px solid var(--button-background-color, ButtonFace);
content: ""; content: "";
position: absolute; position: absolute;
height: var(--toggle-height); height: var(--toggle-height);

View File

@ -24,12 +24,6 @@
--field-bg-color: light-dark(rgb(255 255 255), rgb(64 64 68)); --field-bg-color: light-dark(rgb(255 255 255), rgb(64 64 68));
--field-border-color: light-dark(rgb(187 187 188), rgb(115 115 115)); --field-border-color: light-dark(rgb(187 187 188), rgb(115 115 115));
--doorhanger-bg-color: light-dark(rgb(255 255 255), rgb(74 74 79)); --doorhanger-bg-color: light-dark(rgb(255 255 255), rgb(74 74 79));
--dialog-button-border: none;
--dialog-button-bg-color: light-dark(rgb(12 12 13 / 0.1), rgb(92 92 97));
--dialog-button-hover-bg-color: light-dark(
rgb(12 12 13 / 0.3),
rgb(115 115 115)
);
--toolbar-bg-color: light-dark(#f9f9fb, #2b2a33); --toolbar-bg-color: light-dark(#f9f9fb, #2b2a33);
--toolbar-divider-color: light-dark(#e0e0e6, #5b5b66); --toolbar-divider-color: light-dark(#e0e0e6, #5b5b66);
@ -42,9 +36,6 @@
@media screen and (forced-colors: active) { @media screen and (forced-colors: active) {
:root { :root {
--dialog-button-border: 1px solid Highlight;
--dialog-button-hover-bg-color: Highlight;
--dialog-button-hover-color: ButtonFace;
--field-border-color: ButtonText; --field-border-color: ButtonText;
--main-color: CanvasText; --main-color: CanvasText;
} }
@ -94,40 +85,6 @@ body {
inset-block-start: 0; inset-block-start: 0;
} }
.dialogButton {
border: none;
background: none;
width: 28px;
height: 28px;
outline: none;
}
.dialogButton:is(:hover, :focus-visible) {
background-color: var(--dialog-button-hover-bg-color);
}
.dialogButton:is(:hover, :focus-visible) > span {
color: var(--dialog-button-hover-color);
}
.dialogButton[disabled] {
opacity: 0.5;
}
.dialogButton {
min-width: 16px;
margin: 2px 1px;
padding: 2px 6px 0;
border: none;
border-radius: 2px;
color: var(--main-color);
font-size: 12px;
line-height: 14px;
user-select: none;
cursor: default;
box-sizing: border-box;
}
.toolbarField { .toolbarField {
padding: 4px 7px; padding: 4px 7px;
margin: 3px 0; margin: 3px 0;
@ -204,19 +161,6 @@ body {
} }
} }
:is(.toolbarButton .dialogButton)[disabled] {
opacity: 0.5;
}
.dialogButton {
width: auto;
margin: 3px 4px 2px !important;
padding: 2px 11px;
color: var(--main-color);
background-color: var(--dialog-button-bg-color);
border: var(--dialog-button-border) !important;
}
dialog { dialog {
margin: auto; margin: auto;
padding: 15px; padding: 15px;

View File

@ -124,10 +124,10 @@ See https://github.com/adobe-type-tools/cmap-resources
<input type="password" id="password" class="toolbarField" /> <input type="password" id="password" class="toolbarField" />
</div> </div>
<div class="buttonRow"> <div class="buttonRow">
<button id="passwordCancel" class="dialogButton" type="button"> <button id="passwordCancel" class="secondaryButton" type="button">
<span data-l10n-id="pdfjs-password-cancel-button"></span> <span data-l10n-id="pdfjs-password-cancel-button"></span>
</button> </button>
<button id="passwordSubmit" class="dialogButton" type="button"> <button id="passwordSubmit" class="primaryButton" type="button">
<span data-l10n-id="pdfjs-password-ok-button"></span> <span data-l10n-id="pdfjs-password-ok-button"></span>
</button> </button>
</div> </div>

View File

@ -13,6 +13,16 @@
* limitations under the License. * limitations under the License.
*/ */
/* Pref-gated, so the Firefox tokens are opt-in (and with them the Nova theme,
which tokens-brand.css gates on browser.nova.enabled): with the pref off
every var() falls back to its shipped literal. -moz-pref() works here
because chrome rules are enabled for a resource:// stylesheet, and it only
sees pdfjs.* prefs. */
/*#if MOZCENTRAL*/
@import url(chrome://global/skin/design-system/tokens-brand.css) -moz-pref(
"pdfjs.enableNova"
);
/*#endif*/
@import url(pdf_viewer.css); @import url(pdf_viewer.css);
@import url(digital_signature_properties.css); @import url(digital_signature_properties.css);
@ -55,7 +65,10 @@
inset calc(-1px * var(--dir-factor)) 0 0 rgb(0 0 0 / 0.25), inset calc(-1px * var(--dir-factor)) 0 0 rgb(0 0 0 / 0.25),
0 1px 0 rgb(0 0 0 / 0.15), 0 0 1px rgb(0 0 0 / 0.1); 0 1px 0 rgb(0 0 0 / 0.15), 0 0 1px rgb(0 0 0 / 0.1);
--toolbarSidebar-border-bottom: none; --toolbarSidebar-border-bottom: none;
--button-hover-color: color-mix(in srgb, currentColor 17%, transparent); --button-hover-color: var(
--button-background-color-toolbar-hover,
color-mix(in srgb, currentColor 17%, transparent)
);
--toggled-btn-color: light-dark(rgb(0 0 0), rgb(255 255 255)); --toggled-btn-color: light-dark(rgb(0 0 0), rgb(255 255 255));
--toggled-btn-bg-color: rgb(0 0 0 / 0.3); --toggled-btn-bg-color: rgb(0 0 0 / 0.3);
--toggled-hover-active-btn-color: rgb(0 0 0 / 0.4); --toggled-hover-active-btn-color: rgb(0 0 0 / 0.4);
@ -70,12 +83,6 @@
--doorhanger-border-color: light-dark(rgb(12 12 13 / 0.2), rgb(39 39 43)); --doorhanger-border-color: light-dark(rgb(12 12 13 / 0.2), rgb(39 39 43));
--doorhanger-hover-color: light-dark(rgb(12 12 13), rgb(249 249 250)); --doorhanger-hover-color: light-dark(rgb(12 12 13), rgb(249 249 250));
--doorhanger-separator-color: light-dark(rgb(222 222 222), rgb(92 92 97)); --doorhanger-separator-color: light-dark(rgb(222 222 222), rgb(92 92 97));
--dialog-button-border: none;
--dialog-button-bg-color: light-dark(rgb(12 12 13 / 0.1), rgb(92 92 97));
--dialog-button-hover-bg-color: light-dark(
rgb(12 12 13 / 0.3),
rgb(115 115 115)
);
--loading-icon: url(images/loading.svg); --loading-icon: url(images/loading.svg);
--toolbarButton-editorComment-icon: url(images/comment-editButton.svg); --toolbarButton-editorComment-icon: url(images/comment-editButton.svg);
@ -136,6 +143,10 @@
@media screen and (forced-colors: active) { @media screen and (forced-colors: active) {
:root { :root {
/* Must stay a system color in HCM: --button-background-color-toolbar-hover
is NOT overridden in the dist's forced-colors layer (it stays a
color-mix(currentColor 17%, transparent)), which would make the hover
background a faint translucent overlay and hide the ButtonFace icon. */
--button-hover-color: Highlight; --button-hover-color: Highlight;
--toolbar-icon-opacity: 1; --toolbar-icon-opacity: 1;
--toolbar-icon-bg-color: ButtonText; --toolbar-icon-bg-color: ButtonText;
@ -150,9 +161,6 @@
--doorhanger-hover-color: ButtonFace; --doorhanger-hover-color: ButtonFace;
--doorhanger-border-color-whcm: 1px solid ButtonText; --doorhanger-border-color-whcm: 1px solid ButtonText;
--doorhanger-triangle-opacity-whcm: 0; --doorhanger-triangle-opacity-whcm: 0;
--dialog-button-border: 1px solid Highlight;
--dialog-button-hover-bg-color: Highlight;
--dialog-button-hover-color: ButtonFace;
--dropdown-btn-border: 1px solid ButtonText; --dropdown-btn-border: 1px solid ButtonText;
--field-border-color: ButtonText; --field-border-color: ButtonText;
--main-color: CanvasText; --main-color: CanvasText;
@ -413,22 +421,6 @@ body {
} }
} }
.dialogButton {
border: none;
background: none;
width: 28px;
height: 28px;
outline: none;
}
.dialogButton:is(:hover, :focus-visible) {
background-color: var(--dialog-button-hover-bg-color);
}
.dialogButton:is(:hover, :focus-visible) > span {
color: var(--dialog-button-hover-color);
}
.splitToolbarButtonSeparator { .splitToolbarButtonSeparator {
float: inline-start; float: inline-start;
width: 0; width: 0;
@ -437,20 +429,6 @@ body {
border-right: none; border-right: none;
} }
.dialogButton {
min-width: 16px;
margin: 2px 1px;
padding: 2px 6px 0;
border: none;
border-radius: 2px;
color: var(--main-color);
font-size: 12px;
line-height: 14px;
user-select: none;
cursor: default;
box-sizing: border-box;
}
#viewsManagerToggleButton::before { #viewsManagerToggleButton::before {
mask-image: var(--toolbarButton-viewsManagerToggle-icon); mask-image: var(--toolbarButton-viewsManagerToggle-icon);
transform: scaleX(var(--dir-factor)); transform: scaleX(var(--dir-factor));
@ -646,15 +624,6 @@ body {
} }
} }
.dialogButton {
width: auto;
margin: 3px 4px 2px !important;
padding: 2px 11px;
color: var(--main-color);
background-color: var(--dialog-button-bg-color);
border: var(--dialog-button-border) !important;
}
dialog { dialog {
margin: auto; margin: auto;
padding: 15px; padding: 15px;
@ -665,7 +634,7 @@ dialog {
line-height: 14px; line-height: 14px;
background-color: var(--doorhanger-bg-color); background-color: var(--doorhanger-bg-color);
border: 1px solid rgb(0 0 0 / 0.5); border: 1px solid rgb(0 0 0 / 0.5);
border-radius: 4px; border-radius: var(--border-radius-medium, 4px);
box-shadow: 0 1px 4px rgb(0 0 0 / 0.3); box-shadow: 0 1px 4px rgb(0 0 0 / 0.3);
} }
@ -695,8 +664,10 @@ dialog .separator {
} }
dialog .buttonRow { dialog .buttonRow {
text-align: center; display: flex;
vertical-align: middle; justify-content: center;
align-items: center;
gap: 8px;
} }
dialog :link { dialog :link {

View File

@ -33,7 +33,7 @@ See https://github.com/adobe-type-tools/cmap-resources
<!--<link rel="icon" type="image/svg+xml" href="chrome://global/skin/icons/pdf.svg" />--> <!--<link rel="icon" type="image/svg+xml" href="chrome://global/skin/icons/pdf.svg" />-->
<!--<meta <!--<meta
http-equiv="Content-Security-Policy" http-equiv="Content-Security-Policy"
content="default-src 'none'; script-src resource: 'wasm-unsafe-eval'; worker-src resource:; style-src resource:; img-src resource: blob: data:; media-src blob:; font-src resource:; connect-src resource:; base-uri 'none'; form-action 'none';" content="default-src 'none'; script-src resource: 'wasm-unsafe-eval'; worker-src resource:; style-src resource: chrome:; img-src resource: blob: data:; media-src blob:; font-src resource:; connect-src resource:; base-uri 'none'; form-action 'none';"
/>--> />-->
<!--#elif TESTING--> <!--#elif TESTING-->
<!--<meta <!--<meta
@ -901,8 +901,8 @@ See https://github.com/adobe-type-tools/cmap-resources
<input type="password" id="password" class="toolbarField" /> <input type="password" id="password" class="toolbarField" />
</div> </div>
<div class="buttonRow"> <div class="buttonRow">
<button id="passwordCancel" class="dialogButton" type="button"><span data-l10n-id="pdfjs-password-cancel-button"></span></button> <button id="passwordCancel" class="secondaryButton" type="button"><span data-l10n-id="pdfjs-password-cancel-button"></span></button>
<button id="passwordSubmit" class="dialogButton" type="button"><span data-l10n-id="pdfjs-password-ok-button"></span></button> <button id="passwordSubmit" class="primaryButton" type="button"><span data-l10n-id="pdfjs-password-ok-button"></span></button>
</div> </div>
</dialog> </dialog>
<dialog id="documentPropertiesDialog"> <dialog id="documentPropertiesDialog">
@ -966,7 +966,9 @@ See https://github.com/adobe-type-tools/cmap-resources
<p id="linearizedField" aria-labelledby="linearizedLabel">-</p> <p id="linearizedField" aria-labelledby="linearizedLabel">-</p>
</div> </div>
<div class="buttonRow"> <div class="buttonRow">
<button id="documentPropertiesClose" class="dialogButton" type="button"><span data-l10n-id="pdfjs-document-properties-close-button"></span></button> <button id="documentPropertiesClose" class="secondaryButton" type="button">
<span data-l10n-id="pdfjs-document-properties-close-button"></span>
</button>
</div> </div>
</dialog> </dialog>
<dialog class="dialog altText" id="altTextDialog" aria-labelledby="dialogLabel" aria-describedby="dialogDescription"> <dialog class="dialog altText" id="altTextDialog" aria-labelledby="dialogLabel" aria-describedby="dialogDescription">
@ -1210,7 +1212,7 @@ See https://github.com/adobe-type-tools/cmap-resources
<button class="clearInputButton" type="button" tabindex="0" aria-hidden="true"></button> <button class="clearInputButton" type="button" tabindex="0" aria-hidden="true"></button>
</span> </span>
</div> </div>
<button id="clearSignatureButton" type="button" data-l10n-id="pdfjs-editor-add-signature-clear-button" tabindex="0"> <button id="clearSignatureButton" class="secondaryButton" type="button" data-l10n-id="pdfjs-editor-add-signature-clear-button" tabindex="0">
<span data-l10n-id="pdfjs-editor-add-signature-clear-button-label"></span> <span data-l10n-id="pdfjs-editor-add-signature-clear-button-label"></span>
</button> </button>
</div> </div>
@ -1297,7 +1299,7 @@ See https://github.com/adobe-type-tools/cmap-resources
<span data-l10n-id="pdfjs-print-progress-percent" data-l10n-args='{ "progress": 0 }' class="relative-progress">0%</span> <span data-l10n-id="pdfjs-print-progress-percent" data-l10n-args='{ "progress": 0 }' class="relative-progress">0%</span>
</div> </div>
<div class="buttonRow"> <div class="buttonRow">
<button id="printCancel" class="dialogButton" type="button"><span data-l10n-id="pdfjs-print-progress-close-button"></span></button> <button id="printCancel" class="secondaryButton" type="button"><span data-l10n-id="pdfjs-print-progress-close-button"></span></button>
</div> </div>
</dialog> </dialog>
<!--#endif--> <!--#endif-->
@ -1312,7 +1314,7 @@ See https://github.com/adobe-type-tools/cmap-resources
<div> <div>
<span id="editorUndoBarMessage" class="description"></span> <span id="editorUndoBarMessage" class="description"></span>
</div> </div>
<button id="editorUndoBarUndoButton" class="undoButton" type="button" tabindex="0" data-l10n-id="pdfjs-editor-undo-bar-undo-button"> <button id="editorUndoBarUndoButton" class="secondaryButton" type="button" tabindex="0" data-l10n-id="pdfjs-editor-undo-bar-undo-button">
<span data-l10n-id="pdfjs-editor-undo-bar-undo-button-label"></span> <span data-l10n-id="pdfjs-editor-undo-bar-undo-button-label"></span>
</button> </button>
<button id="editorUndoBarCloseButton" class="closeButton" type="button" tabindex="0" data-l10n-id="pdfjs-editor-undo-bar-close-button"> <button id="editorUndoBarCloseButton" class="closeButton" type="button" tabindex="0" data-l10n-id="pdfjs-editor-undo-bar-close-button">

View File

@ -60,19 +60,35 @@
--sidebar-max-width: 50vw; --sidebar-max-width: 50vw;
--sidebar-block-padding: 8px; --sidebar-block-padding: 8px;
--text-color: light-dark(#15141a, #fbfbfe); --views-text-color: var(--text-color, light-dark(#15141a, #fbfbfe));
--button-fg: var(--text-color); --button-fg: var(--views-text-color);
--button-no-bg: transparent; --button-no-bg: var(--button-background-color-toolbar, transparent);
--button-bg: light-dark(rgb(21 20 26 / 0.07), rgb(251 251 254 / 0.07)); --button-bg: var(
--button-border-color: transparent; --button-background-color,
--button-hover-bg: light-dark(rgb(21 20 26 / 0.14), rgb(251 251 254 / 0.14)); light-dark(rgb(21 20 26 / 0.07), rgb(251 251 254 / 0.07))
--button-hover-fg: var(--text-color); );
--button-hover-border-color: var(--button-border-color); --views-button-border-color: var(--button-border-color, transparent);
--button-active-bg: light-dark(rgb(21 20 26 / 0.21), rgb(251 251 254 / 0.21)); --button-hover-bg: var(
--button-active-fg: var(--text-color); --button-background-color-hover,
--button-active-border-color: var(--button-border-color); light-dark(rgb(21 20 26 / 0.14), rgb(251 251 254 / 0.14))
--button-focus-no-bg: color-mix(in srgb, var(--text-color), transparent 93%); );
--button-focus-outline-color: light-dark(#0062fa, #00cadb); --button-hover-fg: var(--views-text-color);
--button-hover-border-color: var(--views-button-border-color);
--button-active-bg: var(
--button-background-color-active,
light-dark(rgb(21 20 26 / 0.21), rgb(251 251 254 / 0.21))
);
--button-active-fg: var(--views-text-color);
--button-active-border-color: var(--views-button-border-color);
--button-focus-no-bg: color-mix(
in srgb,
var(--views-text-color),
transparent 93%
);
--button-focus-outline-color: var(
--focus-outline-color,
light-dark(#0062fa, #00cadb)
);
--button-focus-border-color: light-dark(white, black); --button-focus-border-color: light-dark(white, black);
--status-border-color: transparent; --status-border-color: transparent;
--status-actions-bg: light-dark( --status-actions-bg: light-dark(
@ -81,7 +97,7 @@
); );
--status-undo-bg: light-dark(rgb(0 98 250 / 0.08), rgb(0 202 219 / 0.08)); --status-undo-bg: light-dark(rgb(0 98 250 / 0.08), rgb(0 202 219 / 0.08));
--status-waiting-bg: var(--status-undo-bg); --status-waiting-bg: var(--status-undo-bg);
--indicator-color: light-dark(#0062fa, #00cadb); --indicator-color: var(--color-accent-primary, light-dark(#0062fa, #00cadb));
--status-warning-bg: light-dark(#ffe8ea, #6e001f); --status-warning-bg: light-dark(#ffe8ea, #6e001f);
--indicator-warning-color: light-dark(#b20037, #ffa0aa); --indicator-warning-color: light-dark(#b20037, #ffa0aa);
--header-shadow: --header-shadow:
@ -95,7 +111,7 @@
--image-current-border-color: var(--button-focus-outline-color); --image-current-border-color: var(--button-focus-outline-color);
--image-current-focused-outline-color: var(--image-hover-border-color); --image-current-focused-outline-color: var(--image-hover-border-color);
--image-page-number-bg: light-dark(#f0f0f4, #42414d); --image-page-number-bg: light-dark(#f0f0f4, #42414d);
--image-page-number-fg: var(--text-color); --image-page-number-fg: var(--views-text-color);
--image-page-number-border-color: transparent; --image-page-number-border-color: transparent;
--image-hover-page-number-bg: var(--image-page-number-bg); --image-hover-page-number-bg: var(--image-page-number-bg);
--image-hover-page-number-fg: var(--image-page-number-fg); --image-hover-page-number-fg: var(--image-page-number-fg);
@ -134,23 +150,25 @@
--multiple-dragging-text-color: light-dark(#fbfbfe, #15141a); --multiple-dragging-text-color: light-dark(#fbfbfe, #15141a);
@media screen and (forced-colors: active) { @media screen and (forced-colors: active) {
--text-color: CanvasText; --views-text-color: var(--text-color, CanvasText);
--button-fg: ButtonText; --button-fg: var(--button-text-color, ButtonText);
--button-bg: ButtonFace; --button-bg: var(--button-background-color, ButtonFace);
--button-no-bg: ButtonFace; --button-no-bg: var(--button-background-color, ButtonFace);
--button-border-color: ButtonText; --views-button-border-color: var(--button-border-color, ButtonText);
--button-hover-bg: SelectedItemText; --button-hover-bg: var(--button-background-color-hover, SelectedItemText);
--button-hover-fg: SelectedItem; --button-hover-fg: var(--button-text-color-hover, SelectedItem);
--button-hover-border-color: SelectedItem; --button-hover-border-color: var(--button-border-color-hover, SelectedItem);
--button-active-bg: SelectedItemText; --button-active-bg: var(--button-background-color-active, SelectedItemText);
--button-active-fg: SelectedItem; --button-active-fg: var(--button-text-color-active, SelectedItem);
--button-active-border-color: ButtonText; --button-active-border-color: var(--button-border-color-active, ButtonText);
--button-focus-no-bg: ButtonFace; --button-focus-no-bg: var(--button-background-color, ButtonFace);
--button-focus-outline-color: CanvasText; --button-focus-outline-color: var(--focus-outline-color, CanvasText);
--button-focus-border-color: none; --button-focus-border-color: none;
--status-border-color: CanvasText; --status-border-color: CanvasText;
--status-undo-bg: none; --status-undo-bg: none;
--indicator-color: CanvasText; /* Painted on Canvas panels, so --text-color rather than the accent (which
is ButtonText in Firefox HCM). */
--indicator-color: var(--text-color, CanvasText);
--status-warning-bg: none; --status-warning-bg: none;
--indicator-warning-color: CanvasText; --indicator-warning-color: CanvasText;
--header-shadow: none; --header-shadow: none;
@ -162,7 +180,7 @@
--image-hover-page-number-fg: SelectedItem; --image-hover-page-number-fg: SelectedItem;
--image-current-page-number-bg: ButtonText; --image-current-page-number-bg: ButtonText;
--image-current-page-number-fg: ButtonFace; --image-current-page-number-fg: ButtonFace;
--image-current-border-color: ButtonText; --image-current-border-color: var(--border-color, ButtonText);
--image-current-focused-outline-color: var(--image-hover-border-color); --image-current-focused-outline-color: var(--image-hover-border-color);
--image-current-hover-page-number-bg: SelectedItem; --image-current-hover-page-number-bg: SelectedItem;
--image-current-hover-page-number-fg: SelectedItemText; --image-current-hover-page-number-fg: SelectedItemText;
@ -170,7 +188,7 @@
--image-page-number-fg: ButtonText; --image-page-number-fg: ButtonText;
--image-page-number-border-color: var(--image-page-number-fg); --image-page-number-border-color: var(--image-page-number-fg);
--multiple-dragging-bg: Canvas; --multiple-dragging-bg: Canvas;
--multiple-dragging-indicator-bg: ButtonBorder; --multiple-dragging-indicator-bg: var(--text-color, ButtonBorder);
--multiple-dragging-text-color: Canvas; --multiple-dragging-text-color: Canvas;
--image-dragging-placeholder-bg: Canvas; --image-dragging-placeholder-bg: Canvas;
--image-dragging-placeholder-border: 1px GrayText solid; --image-dragging-placeholder-border: 1px GrayText solid;
@ -200,8 +218,8 @@
.viewsManagerButton { .viewsManagerButton {
width: auto; width: auto;
color: var(--button-fg); color: var(--button-fg);
border-radius: 8px; border-radius: var(--button-border-radius, 8px);
border: 1px solid var(--button-border-color); border: 1px solid var(--views-button-border-color);
background: var(--button-bg); background: var(--button-bg);
&:hover { &:hover {
@ -229,13 +247,17 @@
} }
&.viewsCloseButton { &.viewsCloseButton {
width: 26px; width: var(--size-item-large, 26px);
height: 26px; height: var(--size-item-large, 26px);
padding: 4px; border-radius: var(--button-border-radius, 8px);
border-radius: 8px;
background: none; background: none;
display: flex;
align-items: center;
justify-content: center;
&::before { &::before {
width: 16px;
height: 16px;
mask-image: var(--close-button-icon); mask-image: var(--close-button-icon);
} }
} }
@ -253,7 +275,7 @@
.viewsManagerLabel { .viewsManagerLabel {
flex: 1 1 auto; flex: 1 1 auto;
color: var(--text-color); color: var(--views-text-color);
text-align: center; text-align: center;
height: fit-content; height: fit-content;
width: fit-content; width: fit-content;