feat: Improve accessibility contrast checks and add mroe padding to HSL color detection, b=no-bug, c=common, workspaces

This commit is contained in:
Mr. M
2025-07-10 02:30:51 +02:00
parent 1f4f88ac13
commit aabde4fb05
7 changed files with 41 additions and 22 deletions

View File

@@ -5,4 +5,8 @@
# Mica # Mica
pref("widget.windows.mica", true); pref("widget.windows.mica", true);
pref("widget.windows.mica.popups", true); pref("widget.windows.mica.popups", true);
# 1. DWMSBT_MAINWINDOW
# 2. DWMSBT_TRANSIENTWINDOW (default, also used for popups)
# 3(default). DWMSBT_TABBEDWINDOW
pref("widget.windows.mica.toplevel-backdrop", 2); pref("widget.windows.mica.toplevel-backdrop", 2);

View File

@@ -100,7 +100,13 @@
</defs> </defs>
</svg> </svg>
</box> </box>
<html:input type="range" min="0.3" max="0.9" value="0.4" step="0.001" id="PanelUI-zen-gradient-generator-opacity" /> <html:input type="range" max="0.9" value="0.4" step="0.001" id="PanelUI-zen-gradient-generator-opacity"
#ifdef XP_MACOSX
min="0.3"
#else
min="0.25"
#endif
/>
</vbox> </vbox>
<vbox id="PanelUI-zen-gradient-generator-texture-wrapper"> <vbox id="PanelUI-zen-gradient-generator-texture-wrapper">
</vbox> </vbox>

View File

@@ -121,6 +121,11 @@
color-mix(in oklch, var(--toolbox-textcolor) 15%, transparent) color-mix(in oklch, var(--toolbox-textcolor) 15%, transparent)
); );
--zen-toolbar-element-bg-hover: light-dark(
color-mix(in srgb, var(--zen-toolbar-element-bg) 75%, transparent),
color-mix(in srgb, var(--zen-toolbar-element-bg) 60%, transparent)
);
/* Toolbar */ /* Toolbar */
--tab-selected-color-scheme: inherit; --tab-selected-color-scheme: inherit;
@@ -130,7 +135,7 @@
--toolbarbutton-inner-padding: 5px !important; --toolbarbutton-inner-padding: 5px !important;
--toolbarbutton-hover-background: var(--zen-toolbar-element-bg) !important; --toolbarbutton-hover-background: var(--zen-toolbar-element-bg-hover) !important;
--toolbarbutton-active-background: color-mix( --toolbarbutton-active-background: color-mix(
in srgb, in srgb,
@@ -172,11 +177,7 @@
--toolbar-field-color: var(--toolbox-textcolor) !important; --toolbar-field-color: var(--toolbox-textcolor) !important;
&[zen-private-window='true'] { &[zen-private-window='true'] {
--zen-main-browser-background: linear-gradient( --zen-main-browser-background: linear-gradient(130deg, rgb(10, 6, 11) 0%, rgb(19, 7, 22) 100%);
130deg,
light-dark(rgb(247, 217, 255), rgb(10, 6, 11)) 0%,
light-dark(rgb(242, 198, 255), rgb(19, 7, 22)) 100%
);
--zen-main-browser-background-toolbar: var(--zen-main-browser-background); --zen-main-browser-background-toolbar: var(--zen-main-browser-background);
--zen-primary-color: light-dark(rgb(93, 42, 107), rgb(110, 48, 125)) !important; --zen-primary-color: light-dark(rgb(93, 42, 107), rgb(110, 48, 125)) !important;
--toolbox-textcolor: currentColor !important; --toolbox-textcolor: currentColor !important;

View File

@@ -41,7 +41,7 @@
} }
const MAX_OPACITY = 0.9; const MAX_OPACITY = 0.9;
const MIN_OPACITY = 0.3; const MIN_OPACITY = AppConstants.platform === 'macosx' ? 0.3 : 0.25;
const EXPLICIT_LIGHTNESS_TYPE = 'explicit-lightness'; const EXPLICIT_LIGHTNESS_TYPE = 'explicit-lightness';
@@ -425,7 +425,7 @@
calculateInitialPosition([r, g, b]) { calculateInitialPosition([r, g, b]) {
// This function is called before the picker is even rendered, so we hard code the dimensions // This function is called before the picker is even rendered, so we hard code the dimensions
// important: If any sort of sizing is changed, make sure changes are reflected here // important: If any sort of sizing is changed, make sure changes are reflected here
const padding = 20; const padding = 30;
const rect = { const rect = {
width: 338, width: 338,
height: 338, height: 338,
@@ -445,7 +445,7 @@
// Return a color as hsl based on the position in the gradient // Return a color as hsl based on the position in the gradient
const gradient = this.panel.querySelector('.zen-theme-picker-gradient'); const gradient = this.panel.querySelector('.zen-theme-picker-gradient');
const rect = gradient.getBoundingClientRect(); const rect = gradient.getBoundingClientRect();
const padding = 20; // each side const padding = 30; // each side
const dotHalfSize = 36 / 2; // half the size of the dot const dotHalfSize = 36 / 2; // half the size of the dot
x += dotHalfSize; x += dotHalfSize;
y += dotHalfSize; y += dotHalfSize;
@@ -691,7 +691,7 @@
const dotPad = this.panel.querySelector('.zen-theme-picker-gradient'); const dotPad = this.panel.querySelector('.zen-theme-picker-gradient');
const rect = dotPad.getBoundingClientRect(); const rect = dotPad.getBoundingClientRect();
const padding = 20; const padding = 30;
let updatedDots = [...dots]; let updatedDots = [...dots];
const centerPosition = { x: rect.width / 2, y: rect.height / 2 }; const centerPosition = { x: rect.width / 2, y: rect.height / 2 };
@@ -840,7 +840,7 @@
const gradient = this.panel.querySelector('.zen-theme-picker-gradient'); const gradient = this.panel.querySelector('.zen-theme-picker-gradient');
const rect = gradient.getBoundingClientRect(); const rect = gradient.getBoundingClientRect();
const padding = 20; const padding = 30;
const centerX = rect.left + rect.width / 2; const centerX = rect.left + rect.width / 2;
const centerY = rect.top + rect.height / 2; const centerY = rect.top + rect.height / 2;
@@ -973,7 +973,7 @@
if (this.dragging) { if (this.dragging) {
event.preventDefault(); event.preventDefault();
const rect = this.panel.querySelector('.zen-theme-picker-gradient').getBoundingClientRect(); const rect = this.panel.querySelector('.zen-theme-picker-gradient').getBoundingClientRect();
const padding = 20; // each side const padding = 30; // each side
// do NOT let the ball be draged outside of an imaginary circle. You can drag it anywhere inside the circle // do NOT let the ball be draged outside of an imaginary circle. You can drag it anywhere inside the circle
// if the distance between the center of the circle and the dragged ball is bigger than the radius, then the ball // if the distance between the center of the circle and the dragged ball is bigger than the radius, then the ball
// should be placed on the edge of the circle. If it's inside the circle, then the ball just follows the mouse // should be placed on the edge of the circle. If it's inside the circle, then the ball just follows the mouse
@@ -1074,7 +1074,13 @@
} }
luminance([r, g, b]) { luminance([r, g, b]) {
return 0.2126 * (r / 255) + 0.7152 * (g / 255) + 0.0722 * (b / 255); // These magic numbers are extracted from the wikipedia article on relative luminance
// https://en.wikipedia.org/wiki/Relative_luminance
var a = [r, g, b].map((v) => {
v /= 255;
return v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);
});
return a[0] * 0.2126 + a[1] * 0.7152 + a[2] * 0.0722;
} }
contrastRatio(rgb1, rgb2) { contrastRatio(rgb1, rgb2) {
@@ -1163,7 +1169,9 @@
let darkText = this.getToolbarColor(true); // e.g. [r, g, b, a] let darkText = this.getToolbarColor(true); // e.g. [r, g, b, a]
let lightText = this.getToolbarColor(false); // e.g. [r, g, b, a] let lightText = this.getToolbarColor(false); // e.g. [r, g, b, a]
lightText[3] -= 0.4; // Reduce alpha for light text if (this.canBeTransparent) {
lightText[3] -= 0.15; // Reduce alpha for light text
}
// Composite text color over background // Composite text color over background
darkText = this.blendColors(bg, darkText.slice(0, 3), (1 - darkText[3]) * 100); darkText = this.blendColors(bg, darkText.slice(0, 3), (1 - darkText[3]) * 100);
@@ -1315,7 +1323,7 @@
let workspaceTheme = theme || workspace.theme; let workspaceTheme = theme || workspace.theme;
await this.foreachWindowAsActive(async (browser) => { await this.foreachWindowAsActive(async (browser) => {
if (!browser.gZenThemePicker.promiseInitialized) { if (!browser.gZenThemePicker?.promiseInitialized) {
return; return;
} }
@@ -1505,7 +1513,7 @@
} }
if (!skipUpdate) { if (!skipUpdate) {
this.dots = []; browser.gZenThemePicker.dots = [];
browser.gZenThemePicker.recalculateDots(workspaceTheme.gradientColors); browser.gZenThemePicker.recalculateDots(workspaceTheme.gradientColors);
} }
}); });
@@ -1599,7 +1607,7 @@
currentWorkspace = await gZenWorkspaces.getActiveWorkspace(); currentWorkspace = await gZenWorkspaces.getActiveWorkspace();
} }
await this.onWorkspaceChange(currentWorkspace, true, skipSave ? gradient : null); await this.onWorkspaceChange(currentWorkspace, skipSave, skipSave ? gradient : null);
} }
async handlePanelClose() { async handlePanelClose() {

View File

@@ -889,6 +889,7 @@ var gZenWorkspaces = new (class extends ZenMultiWindowFeature {
async initializeWorkspaces() { async initializeWorkspaces() {
let activeWorkspace = await this.getActiveWorkspace(); let activeWorkspace = await this.getActiveWorkspace();
this.activeWorkspace = activeWorkspace?.uuid; this.activeWorkspace = activeWorkspace?.uuid;
await gZenSessionStore.promiseInitialized;
try { try {
if (activeWorkspace) { if (activeWorkspace) {
window.gZenThemePicker = new nsZenThemePicker(); window.gZenThemePicker = new nsZenThemePicker();
@@ -897,7 +898,6 @@ var gZenWorkspaces = new (class extends ZenMultiWindowFeature {
} catch (e) { } catch (e) {
console.error('gZenWorkspaces: Error initializing theme picker', e); console.error('gZenWorkspaces: Error initializing theme picker', e);
} }
await gZenSessionStore.promiseInitialized;
await this.workspaceBookmarks(); await this.workspaceBookmarks();
await this.initializeTabsStripSections(); await this.initializeTabsStripSections();
this._initializeEmptyTab(); this._initializeEmptyTab();

View File

@@ -69,7 +69,7 @@
&:hover, &:hover,
&[dragged='true']{ &[dragged='true']{
background-color: var(--zen-toolbar-element-bg); background-color: var(--toolbarbutton-hover-background);
} }
& label { & label {
@@ -215,7 +215,7 @@
transition: opacity 0.1s; transition: opacity 0.1s;
order: 5; order: 5;
--toolbarbutton-inner-padding: 6px; --toolbarbutton-inner-padding: 6px;
--tab-border-radius: 8px; --tab-border-radius: 6px;
:root[zen-renaming-tab='true'] & { :root[zen-renaming-tab='true'] & {
display: none; display: none;

View File

@@ -19,7 +19,7 @@
"brandShortName": "Zen", "brandShortName": "Zen",
"brandFullName": "Zen Browser", "brandFullName": "Zen Browser",
"release": { "release": {
"displayVersion": "1.14.3b", "displayVersion": "1.14.4b",
"github": { "github": {
"repo": "zen-browser/desktop" "repo": "zen-browser/desktop"
}, },