Merge branch 'dev' into new-color-picker

This commit is contained in:
mr. m
2025-02-17 22:03:52 +01:00
committed by GitHub
304 changed files with 3084 additions and 1424 deletions

View File

@@ -75,15 +75,13 @@ pref("app.update.checkInstallTime.days", 6);
// CUSTOM ZEN PREFS
pref('zen.welcome-screen.enabled', true, sticky);
pref('zen.welcome-screen.seen', false);
pref('zen.welcome-screen.seen', false, sticky);
pref('zen.tabs.vertical', true);
pref('zen.tabs.vertical.right-side', false);
pref('zen.tabs.rename-tabs', true);
pref('zen.theme.accent-color', "#ffb787");
pref('zen.theme.content-element-separation', 6); // In pixels
pref('zen.theme.pill-button', false);
pref('zen.theme.gradient', true);
pref('zen.theme.gradient.show-custom-colors', false);
pref('zen.theme.essentials-favicon-bg', true);

View File

@@ -36,6 +36,8 @@
gZenVerticalTabsManager.init();
gZenUIManager.init();
this._checkForWelcomePage();
document.l10n.setAttributes(document.getElementById('tabs-newtab-button'), 'tabs-toolbar-new-tab');
} catch (e) {
console.error('ZenThemeModifier: Error initializing browser layout', e);
@@ -117,6 +119,13 @@
gURLBar._initPasteAndGo();
gURLBar._initStripOnShare();
},
_checkForWelcomePage() {
if (!Services.prefs.getBoolPref('zen.welcome-screen.seen', false)) {
Services.prefs.setBoolPref('zen.welcome-screen.seen', true);
Services.scriptloader.loadSubScript('chrome://browser/content/zen-components/ZenWelcome.mjs', window);
}
},
};
ZenStartup.init();

View File

@@ -246,7 +246,7 @@ var gZenUIManager = {
const toast = this._createToastElement(messageId, options);
this._toastContainer.removeAttribute('hidden');
this._toastContainer.appendChild(toast);
await this.motion.animate(toast, { opacity: [0, 1], scale: [0.8, 1] }, { type: 'spring', bounce: 0.4 });
await this.motion.animate(toast, { opacity: [0, 1], scale: [0.8, 1] }, { type: 'spring', bounce: 0.5, duration: 0.5 });
await new Promise((resolve) => setTimeout(resolve, 3000));
await this.motion.animate(toast, { opacity: [1, 0], scale: [1, 0.9] }, { duration: 0.2, bounce: 0 });
const toastHeight = toast.getBoundingClientRect().height;
@@ -665,7 +665,7 @@ var gZenVerticalTabsManager = {
target.appendChild(child);
},
renameTabKeydown(event) {
async renameTabKeydown(event) {
if (event.key === 'Enter') {
let label = this._tabEdited.querySelector('.tab-label-container-editing');
let input = this._tabEdited.querySelector('#tab-label-input');
@@ -681,6 +681,10 @@ var gZenVerticalTabsManager = {
} else {
gBrowser.setTabTitle(this._tabEdited);
}
if (this._tabEdited.getAttribute('zen-pin-id')) {
// Update pin title in storage
await gZenPinnedTabManager.updatePinTitle(this._tabEdited, this._tabEdited.label, !!newName);
}
// Maybe add some confetti here?!?
gZenUIManager.motion.animate(

View File

@@ -1,5 +1,5 @@
diff --git a/browser/base/content/browser.js b/browser/base/content/browser.js
index 019b168c1aeae7e1c97a3ae58c99a48a27f54134..1f051e8a1e8a58e8bb721196deecfa36f4089dd6 100644
index 019b168c1aeae7e1c97a3ae58c99a48a27f54134..5225d0539aa7dabf81a8fd60af3e839f203d296c 100644
--- a/browser/base/content/browser.js
+++ b/browser/base/content/browser.js
@@ -32,6 +32,7 @@ ChromeUtils.defineESModuleGetters(this, {
@@ -10,23 +10,7 @@ index 019b168c1aeae7e1c97a3ae58c99a48a27f54134..1f051e8a1e8a58e8bb721196deecfa36
DevToolsSocketStatus:
"resource://devtools/shared/security/DevToolsSocketStatus.sys.mjs",
DownloadUtils: "resource://gre/modules/DownloadUtils.sys.mjs",
@@ -632,6 +633,15 @@ XPCOMUtils.defineLazyPreferenceGetter(
false
);
+const ZEN_WELCOME_PATH = "zen-welcome";
+const ZEN_WELCOME_ELEMENT_ATTR = "zen-dialog-welcome-element";
+XPCOMUtils.defineLazyServiceGetter(
+ this,
+ "ProfileService",
+ "@mozilla.org/toolkit/profile-service;1",
+ "nsIToolkitProfileService"
+);
+
customElements.setElementCreationCallback("screenshots-buttons", () => {
Services.scriptloader.loadSubScript(
"chrome://browser/content/screenshots/screenshots-buttons.js",
@@ -3440,6 +3450,10 @@ var XULBrowserWindow = {
@@ -3440,6 +3441,10 @@ var XULBrowserWindow = {
AboutReaderParent.updateReaderButton(gBrowser.selectedBrowser);
TranslationsParent.onLocationChange(gBrowser.selectedBrowser);
@@ -37,7 +21,7 @@ index 019b168c1aeae7e1c97a3ae58c99a48a27f54134..1f051e8a1e8a58e8bb721196deecfa36
PictureInPicture.updateUrlbarToggle(gBrowser.selectedBrowser);
if (!gMultiProcessBrowser) {
@@ -4435,7 +4449,7 @@ nsBrowserAccess.prototype = {
@@ -4435,7 +4440,7 @@ nsBrowserAccess.prototype = {
// Passing a null-URI to only create the content window,
// and pass true for aSkipLoad to prevent loading of
// about:blank
@@ -46,7 +30,7 @@ index 019b168c1aeae7e1c97a3ae58c99a48a27f54134..1f051e8a1e8a58e8bb721196deecfa36
null,
aParams,
aWhere,
@@ -4443,6 +4457,10 @@ nsBrowserAccess.prototype = {
@@ -4443,6 +4448,10 @@ nsBrowserAccess.prototype = {
aName,
true
);
@@ -57,16 +41,3 @@ index 019b168c1aeae7e1c97a3ae58c99a48a27f54134..1f051e8a1e8a58e8bb721196deecfa36
},
openURIInFrame: function browser_openURIInFrame(
@@ -7285,6 +7303,12 @@ var gDialogBox = {
parentElement.showModal();
this._didOpenHTMLDialog = true;
+ if (uri.includes(ZEN_WELCOME_PATH)) {
+ parentElement.setAttribute(ZEN_WELCOME_ELEMENT_ATTR, true);
+ } else if (parentElement.hasAttribute(ZEN_WELCOME_ELEMENT_ATTR)) {
+ parentElement.removeAttribute(ZEN_WELCOME_ELEMENT_ATTR);
+ }
+
// Disable menus and shortcuts.
this._updateMenuAndCommandState(false /* to disable */);

View File

@@ -1,5 +1,5 @@
diff --git a/browser/base/content/navigator-toolbox.inc.xhtml b/browser/base/content/navigator-toolbox.inc.xhtml
index a0a382643a2f74b6d789f3641ef300eed202d5e9..7a2be5fe6cdecb771ce3326008085ae402a465de 100644
index a0a382643a2f74b6d789f3641ef300eed202d5e9..a962e155f1452362a2a35df89c8f56e1c0d9968c 100644
--- a/browser/base/content/navigator-toolbox.inc.xhtml
+++ b/browser/base/content/navigator-toolbox.inc.xhtml
@@ -2,7 +2,7 @@
@@ -11,16 +11,20 @@ index a0a382643a2f74b6d789f3641ef300eed202d5e9..7a2be5fe6cdecb771ce3326008085ae4
<script src="chrome://browser/content/navigator-toolbox.js" />
<!-- Menu -->
@@ -19,7 +19,7 @@
@@ -17,9 +17,11 @@
#include browser-menubar.inc
</toolbaritem>
<spacer flex="1" skipintoolbarset="true" style="order: 1000;"/>
+#if 0
#include titlebar-items.inc.xhtml
+#endif
</toolbar>
-
+<hbox id="titlebar">
<toolbar id="TabsToolbar"
class="browser-toolbar browser-titlebar"
fullscreentoolbar="true"
@@ -32,7 +32,7 @@
@@ -32,7 +34,7 @@
<hbox class="titlebar-spacer" type="pre-tabs"/>
@@ -29,7 +33,7 @@ index a0a382643a2f74b6d789f3641ef300eed202d5e9..7a2be5fe6cdecb771ce3326008085ae4
<toolbartabstop/>
<hbox id="TabsToolbar-customization-target" flex="1">
<toolbarbutton id="firefox-view-button"
@@ -40,9 +40,9 @@
@@ -40,9 +42,9 @@
data-l10n-id="toolbar-button-firefox-view-2"
role="button"
aria-pressed="false"
@@ -40,7 +44,7 @@ index a0a382643a2f74b6d789f3641ef300eed202d5e9..7a2be5fe6cdecb771ce3326008085ae4
<tabs id="tabbrowser-tabs"
is="tabbrowser-tabs"
aria-multiselectable="true"
@@ -50,6 +50,10 @@
@@ -50,6 +52,10 @@
tooltip="tabbrowser-tab-tooltip"
orient="horizontal"
stopwatchid="FX_TAB_CLICK_MS">
@@ -51,7 +55,7 @@ index a0a382643a2f74b6d789f3641ef300eed202d5e9..7a2be5fe6cdecb771ce3326008085ae4
<hbox class="tab-drop-indicator" hidden="true"/>
# If the name (tabbrowser-arrowscrollbox) or structure of this changes
# significantly, there is an optimization in
@@ -57,7 +61,7 @@
@@ -57,7 +63,7 @@
# the current structure that we may want to revisit.
<html:div id="vertical-pinned-tabs-container" tabindex="-1"></html:div>
<html:div id="vertical-pinned-tabs-container-separator"></html:div>
@@ -60,7 +64,7 @@ index a0a382643a2f74b6d789f3641ef300eed202d5e9..7a2be5fe6cdecb771ce3326008085ae4
<tab is="tabbrowser-tab" class="tabbrowser-tab" selected="true" visuallyselected="" fadein=""/>
<hbox id="tabbrowser-arrowscrollbox-periphery">
<toolbartabstop/>
@@ -75,6 +79,8 @@
@@ -75,6 +81,8 @@
tooltip="dynamic-shortcut-tooltip"
data-l10n-id="tabs-toolbar-new-tab"/>
<html:span id="tabbrowser-tab-a11y-desc" hidden="true"/>
@@ -69,12 +73,12 @@ index a0a382643a2f74b6d789f3641ef300eed202d5e9..7a2be5fe6cdecb771ce3326008085ae4
</tabs>
<toolbarbutton id="new-tab-button"
@@ -100,11 +106,12 @@
@@ -100,11 +108,12 @@
#include private-browsing-indicator.inc.xhtml
<toolbarbutton id="content-analysis-indicator"
class="toolbarbutton-1 content-analysis-indicator-icon"/>
-
+ #if 0
+#if 0
#include titlebar-items.inc.xhtml
-
+#endif
@@ -85,7 +89,7 @@ index a0a382643a2f74b6d789f3641ef300eed202d5e9..7a2be5fe6cdecb771ce3326008085ae4
<toolbar id="nav-bar"
class="browser-toolbar chromeclass-location"
data-l10n-id="navbar-accessible"
@@ -490,10 +497,12 @@
@@ -490,10 +499,12 @@
consumeanchor="PanelUI-button"
data-l10n-id="appmenu-menu-button-closed2"/>
</toolbaritem>

View File

@@ -24,6 +24,8 @@
<link rel="stylesheet" type="text/css" href="chrome://browser/content/zen-styles/zen-compact-mode.css" />
<link rel="stylesheet" type="text/css" href="chrome://browser/skin/zen-icons/icons.css" />
<link rel="stylesheet" type="text/css" href="chrome://browser/content/zen-styles/zen-branding.css" />
<link rel="stylesheet" type="text/css" href="chrome://browser/content/zen-styles/zen-welcome.css" />
</linkset>
# Scripts used all over the browser

View File

@@ -24,6 +24,7 @@
content/browser/zen-components/ZenActorsManager.mjs (zen-components/ZenActorsManager.mjs)
content/browser/zen-components/ZenRices.mjs (zen-components/ZenRices.mjs)
content/browser/zen-components/ZenEmojies.mjs (zen-components/ZenEmojies.mjs)
content/browser/zen-components/ZenWelcome.mjs (zen-components/ZenWelcome.mjs)
content/browser/zen-styles/zen-theme.css (content/zen-styles/zen-theme.css)
content/browser/zen-styles/zen-buttons.css (content/zen-styles/zen-buttons.css)
@@ -47,11 +48,12 @@
content/browser/zen-styles/zen-gradient-generator.css (content/zen-styles/zen-gradient-generator.css)
content/browser/zen-styles/zen-rices.css (content/zen-styles/zen-rices.css)
content/browser/zen-styles/zen-branding.css (content/zen-styles/zen-branding.css)
content/browser/zen-styles/zen-welcome.css (content/zen-styles/zen-welcome.css)
content/browser/zen-styles/zen-panels/bookmarks.css (content/zen-styles/zen-panels/bookmarks.css)
content/browser/zen-styles/zen-panels/extensions.css (content/zen-styles/zen-panels/extensions.css)
content/browser/zen-styles/zen-panels/print.css (content/zen-styles/zen-panels/print.css)
content/browser/zen-styles/zen-panels/welcome.css (content/zen-styles/zen-panels/welcome.css)
content/browser/zen-styles/zen-panels/dialog.css (content/zen-styles/zen-panels/dialog.css)
* content/browser/zen-styles/zen-compact-mode.css (content/zen-styles/zen-compact-mode.css)
@@ -62,6 +64,7 @@
content/browser/zen-images/layouts/collapsed.png (content/zen-images/layouts/collapsed.png)
content/browser/zen-images/layouts/multiple-toolbar.png (content/zen-images/layouts/multiple-toolbar.png)
content/browser/zen-images/layouts/single-toolbar.png (content/zen-images/layouts/single-toolbar.png)
content/browser/zen-images/grain-bg.png (content/zen-images/grain-bg.png)
# Actors
content/browser/zen-components/actors/ZenThemeMarketplaceParent.sys.mjs (zen-components/actors/ZenThemeMarketplaceParent.sys.mjs)

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

File diff suppressed because one or more lines are too long

View File

@@ -31,9 +31,9 @@ xul|button:is(.expander-down) {
border-radius: 6px !important;
}
@media (-moz-bool-pref: 'zen.theme.pill-button') {
:host(:is(.anonymous-content-host, notification-message)),
:root {
--zen-button-border-radius: 20px;
.footer-button {
transition: scale 0.2s;
&:active {
scale: 0.98;
}
}

View File

@@ -120,6 +120,20 @@
opacity: 1;
}
}
&::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-image: url(chrome://browser/content/zen-images/grain-bg.png);
pointer-events: none;
z-index: 0;
opacity: var(--zen-grainy-background-opacity, 0);
mix-blend-mode: overlay;
}
}
#navigator-toolbox:hover,

View File

@@ -7,7 +7,7 @@ panel[type='arrow'][animate][animate='open']::part(content) {
animation: zen-jello-animation 0.35s ease;
@media (-moz-platform: macos) {
animation: zen-jello-animation-alt 0.35s ease;
animation: zen-jello-animation-alt 0.2s ease-out;
}
}

View File

@@ -0,0 +1,11 @@
/*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
/* Zen Welcome idalog override */
@media (prefers-color-scheme: dark) {
.dialogBox:not(.spotlightBox) {
border: 1px solid var(--zen-colors-border);
}
}

View File

@@ -1,33 +0,0 @@
/*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
/* Zen Welcome idalog override */
@media (prefers-color-scheme: dark) {
.dialogBox:not(.spotlightBox) {
border: 1px solid var(--zen-colors-border);
}
}
#window-modal-dialog[zen-dialog-welcome-element='true'] .dialogBox:not(.spotlightBox) {
margin: 0 !important;
}
#window-modal-dialog[zen-dialog-welcome-element='true'],
#window-modal-dialog[zen-dialog-welcome-element='true'] .dialogOverlay,
#window-modal-dialog[zen-dialog-welcome-element='true'] .dialogFrame,
#window-modal-dialog[zen-dialog-welcome-element='true'] .dialogBox {
width: 100% !important;
height: 100% !important;
max-height: none !important;
max-width: none !important;
}
#window-modal-dialog[zen-dialog-welcome-element='true'] {
--zen-welcome-dialog-space: 7px;
margin: 0 auto !important;
max-width: calc(100% - calc(var(--zen-welcome-dialog-space) * 2)) !important;
max-height: calc(100% - calc(var(--zen-welcome-dialog-space) * 2)) !important;
margin-top: var(--zen-welcome-dialog-space) !important;
}

View File

@@ -6,7 +6,7 @@
@import url('chrome://browser/content/zen-styles/zen-panels/bookmarks.css');
@import url('chrome://browser/content/zen-styles/zen-panels/extensions.css');
@import url('chrome://browser/content/zen-styles/zen-panels/print.css');
@import url('chrome://browser/content/zen-styles/zen-panels/welcome.css');
@import url('chrome://browser/content/zen-styles/zen-panels/dialog.css');
:root {
--panel-subview-body-padding: 2px 0;
@@ -358,6 +358,8 @@ menuitem {
right: calc(var(--zen-element-separation) * 2);
z-index: 1000;
gap: 1rem;
display: flex;
align-items: end;
& .zen-toast {
padding: 0.9rem 0.8rem;
@@ -366,6 +368,7 @@ menuitem {
color: var(--button-primary-color);
box-shadow: var(--zen-big-shadow);
display: flex;
font-weight: 600;
gap: 5px;
flex-direction: column;
gap: 2px;

View File

@@ -69,3 +69,8 @@
body > #confetti {
z-index: 1;
}
/* Bookmarks */
#PersonalToolbar:not([collapsed='true']) {
min-height: 30px;
}

View File

@@ -428,7 +428,7 @@
:root[zen-single-toolbar='true'] & {
& #urlbar:not([breakout-extend='true']) .urlbar-input-container {
padding-left: 4px;
padding-left: 8px;
padding-right: 4px;
}
}
@@ -955,7 +955,8 @@
padding: 0;
}
#zen-essentials-container > .tabbrowser-tab {
#zen-essentials-container > .tabbrowser-tab,
#zen-welcome-initial-essentials-browser-sidebar-essentials .tabbrowser-tab {
--toolbarbutton-inner-padding: 0;
max-width: unset;
width: 100% !important;
@@ -1010,11 +1011,12 @@
background: transparent;
overflow: hidden;
position: relative;
--zen-essential-bg-margin: 2px;
&::before {
background: light-dark(rgba(255, 255, 255, 0.85), rgba(68, 64, 64, 0.85));
margin: 2px;
border-radius: calc(var(--border-radius-medium) - 2px);
margin: var(--zen-essential-bg-margin);
border-radius: calc(var(--border-radius-medium) - var(--zen-essential-bg-margin));
position: absolute;
inset: 0;
z-index: 0;

View File

@@ -104,7 +104,7 @@
--zen-button-border-radius: 5px;
--zen-button-padding: 0.6rem 1.2rem;
--zen-toolbar-element-bg: light-dark(rgba(0, 0, 0, 0.07), rgba(255, 255, 255, 0.11));
--zen-toolbar-element-bg: light-dark(rgba(89, 89, 89, 0.1), rgba(255, 255, 255, 0.125));
/* Toolbar */
--zen-toolbar-height: 38px;
@@ -163,7 +163,7 @@
background: transparent;
--zen-themed-toolbar-bg-transparent: transparent;
@media (-moz-bool-pref: 'zen.widget.windows.acrylic') {
--zen-themed-toolbar-bg-transparent: color-mix(in srgb, var(--zen-themed-toolbar-bg) 85%, transparent 15%);
--zen-themed-toolbar-bg-transparent: color-mix(in srgb, var(--zen-themed-toolbar-bg) 80%, transparent 20%);
}
}

View File

@@ -71,10 +71,6 @@
padding-inline-start: 8px !important;
}
#identity-box.chromeUI:not([pageproxystate='invalid']) #identity-icon-box {
margin-right: 0 !important;
}
#urlbar:not([extend='true']) #identity-box #identity-icon-box {
position: relative;
}
@@ -132,8 +128,11 @@
:root[zen-single-toolbar='true'] {
.urlbar-page-action:not([open]),
.identity-box-button:not([open]),
#tracking-protection-icon-container {
display: none;
}
#identity-icon-box:not([open]) {
margin-inline-end: calc(-8px - 2 * var(--urlbar-icon-padding)) !important;
opacity: 0;
transition: all 0.1s ease;
@@ -143,32 +142,30 @@
visibility: collapse;
}
#urlbar[open] :is(#tracking-protection-icon-container, .urlbar-page-action, .identity-box-button),
#urlbar:hover :is(#tracking-protection-icon-container, .urlbar-page-action, .identity-box-button),
.urlbar-page-action[open],
.identity-box-button[open],
#tracking-protection-icon-container[open] {
#urlbar[open] :is(#tracking-protection-icon-container, .urlbar-page-action, .identity-box-button):not([hidden='true']),
#urlbar:hover #identity-icon-box {
opacity: 1;
margin-inline-end: 0 !important;
display: flex;
transition: 0;
}
#urlbar:not([open]):hover #identity-box {
margin-inline-end: 0 !important;
}
#urlbar:not([open]) {
#identity-box {
order: 9;
}
}
#identity-permission-box:not([open]),
#notification-popup-box:not([open]) {
margin-inline-start: calc(-10px - 2 * var(--urlbar-icon-padding));
opacity: 0;
transition: all 0.2s;
}
#urlbar[open] #identity-permission-box,
#urlbar[open] #notification-popup-box,
#urlbar:hover #identity-permission-box,
#urlbar:hover #notification-popup-box,
#identity-permission-box[open],
#notification-popup-box[open] {
opacity: 1;
margin-inline-start: 0 !important;
}
#notification-popup-box {
align-items: center;
justify-content: center;

View File

@@ -0,0 +1,238 @@
#zen-welcome,
#zen-welcome-start,
#zen-welcome-pages {
width: 100%;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
-moz-window-dragging: drag;
}
:root[zen-welcome-stage] #zen-sidebar-splitter {
display: none;
}
#zen-welcome-start {
flex-direction: column;
-moz-window-dragging: drag;
--zen-primary-color: light-dark(black, white);
#zen-welcome-start-button {
opacity: 0;
list-style-image: url(chrome://browser/skin/zen-icons/forward.svg);
position: absolute;
bottom: 10%;
.button-icon {
filter: invert(1);
}
}
#zen-welcome-title {
text-align: center;
font-size: 5rem;
line-height: 1.1;
max-width: 50%;
font-weight: 500;
white-space: nowrap;
& > span {
display: block;
opacity: 0;
}
}
}
#zen-welcome-pages {
opacity: 0;
justify-content: start;
align-items: start;
display: none;
background: var(--zen-branding-bg);
border-radius: 1em;
overflow: hidden;
position: relative;
width: 60%;
height: 60%;
box-shadow: var(--zen-big-shadow);
#zen-welcome-page-sidebar {
flex-direction: column;
justify-content: space-between;
padding: 3.8rem;
width: 40%;
height: 100%;
overflow: hidden;
& #zen-welcome-heart {
width: 100%;
height: 100%;
opacity: 0;
color: var(--zen-primary-color);
fill: var(--zen-primary-color);
background-image: url(chrome://browser/skin/zen-icons/essential-add.svg);
background-size: 15%;
background-repeat: no-repeat;
background-position: center;
}
}
#zen-welcome-page-sidebar-buttons {
flex-direction: column;
gap: 10px;
}
#zen-welcome-page-sidebar-content {
& h1 {
font-size: xx-large;
font-weight: 600;
margin-bottom: 1rem;
}
& p {
margin: 0 0 1.1rem 0;
color: light-dark(rgba(0, 0, 0, 0.6), rgba(255, 255, 255, 0.6));
}
& > * {
transform: translate(300%);
}
}
& button {
justify-content: center;
align-items: center;
transform: translate(300%);
}
#zen-welcome-page-content {
background: light-dark(rgba(0, 0, 0, 0.1), rgba(255, 255, 255, 0.1));
width: 60%;
height: 100%;
position: relative;
overflow: hidden;
justify-content: center;
align-items: center;
display: flex;
flex-direction: column;
gap: 1.6rem;
& label {
opacity: 0;
transition:
scale 0.1s,
box-shadow 0.1s;
padding: 1.5rem 1.1rem;
border-radius: 0.6rem;
width: 50%;
gap: 0.8rem;
display: flex;
border: 2px solid var(--zen-colors-border);
background: light-dark(rgba(255, 255, 255, 0.7), rgba(0, 0, 0, 0.4));
align-items: center;
&:hover {
box-shadow: var(--zen-big-shadow);
}
&:has(:checked) {
box-shadow: var(--zen-big-shadow);
border: 2px solid var(--zen-primary-color);
scale: 1.03;
}
}
#zen-welcome-initial-essentials-browser {
width: 70%;
height: 80%;
display: flex;
margin-left: auto;
margin-top: auto;
border-top-left-radius: 1.2em;
box-shadow: var(--zen-big-shadow);
background: light-dark(rgba(255, 255, 255, 0.5), rgba(0, 0, 0, 0.2));
padding-right: 20%;
overflow: hidden;
opacity: 0;
border: 1px solid var(--zen-colors-border);
border-bottom-width: 0;
border-right-width: 0;
#zen-welcome-initial-essentials-browser-sidebar {
width: 100%;
padding: 1.4rem;
gap: 1.2rem;
background: light-dark(rgba(255, 255, 255, 0.7), rgba(0, 0, 0, 0.4));
#zen-welcome-initial-essentials-browser-sidebar-win-buttons {
gap: 0.5rem;
align-items: center;
& > div {
width: 15px;
height: 15px;
border-radius: 50%;
background: var(--zen-toolbar-element-bg);
}
}
#zen-welcome-initial-essentials-browser-sidebar-essentials {
display: flex;
flex-wrap: wrap;
gap: 0.8rem;
visibility: visible;
& * {
visibility: visible;
}
& .extra-tab {
width: 100%;
height: 3rem;
border-radius: 0.8rem;
margin-top: 0.5rem;
background: var(--zen-toolbar-element-bg);
}
& .tabbrowser-tab {
--tab-min-height: 5rem !important;
min-width: 5rem !important;
transition: transform 0.1s;
position: relative;
&::after {
position: absolute;
content: '';
width: 1.6rem;
height: 1.6rem;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
background: var(--zen-tab-icon);
background-position: center;
background-size: cover;
background-repeat: no-repeat;
}
--border-radius-medium: 1rem;
&[visuallyselected] {
transform: scale(1.04);
& .tab-background {
--zen-essential-bg-margin: 3px;
box-shadow: var(--zen-big-shadow);
}
}
& .tab-background::after {
filter: blur(30px) !important;
}
}
}
}
}
}
}

View File

@@ -455,12 +455,12 @@
}
.zen-current-workspace-indicator {
padding: 15px calc(4px + var(--tab-inline-padding));
padding: 15px calc(6px + var(--tab-inline-padding));
font-weight: 600;
position: absolute;
max-height: var(--zen-workspace-indicator-height);
min-height: var(--zen-workspace-indicator-height);
gap: 12px;
gap: 10px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;

View File

@@ -462,7 +462,7 @@
let owner = tab.owner;
return (
owner &&
owner.getAttribute('zen-essential') === 'true' &&
owner.pinned &&
this._lazyPref.SHOULD_OPEN_EXTERNAL_TABS_IN_GLANCE &&
owner.linkedBrowser?.docShellIsActive &&
owner.linkedBrowser?.browsingContext?.isAppTab &&
@@ -485,7 +485,16 @@
}
}
fullyOpenGlance() {
finishOpeningGlance() {
this.browserWrapper.removeAttribute('animate-full');
this.overlay.classList.remove('zen-glance-overlay');
this.browserWrapper.removeAttribute('style');
this.animatingFullOpen = false;
this.closeGlance({ noAnimation: true });
this.#glances.delete(this.#currentGlanceID);
}
async fullyOpenGlance() {
this.animatingFullOpen = true;
gBrowser._insertTabAtIndex(this.#currentTab, {
index: this.getTabPosition(this.#currentTab),
@@ -501,26 +510,22 @@
this.#currentParentTab.linkedBrowser.closest('.browserSidebarContainer').classList.remove('zen-glance-background');
this.#currentParentTab._visuallySelected = false;
this.hideSidebarButtons();
gZenUIManager.motion
.animate(
this.browserWrapper,
{
width: ['85%', '100%'],
height: ['100%', '100%'],
},
{
duration: 0.4,
type: 'spring',
}
)
.then(() => {
this.browserWrapper.removeAttribute('animate-full');
this.overlay.classList.remove('zen-glance-overlay');
this.browserWrapper.removeAttribute('style');
this.animatingFullOpen = false;
this.closeGlance({ noAnimation: true });
this.#glances.delete(this.#currentGlanceID);
});
if (gReduceMotion) {
this.finishOpeningGlance();
return;
}
await gZenUIManager.motion.animate(
this.browserWrapper,
{
width: ['85%', '100%'],
height: ['100%', '100%'],
},
{
duration: 0.4,
type: 'spring',
}
);
this.finishOpeningGlance();
}
openGlanceForBookmark(event) {

View File

@@ -802,7 +802,7 @@
// Reactivate the transition after the animation
appWrapper.removeAttribute('post-animating');
}, 100);
}, 200);
}, 300);
});
}

View File

@@ -70,7 +70,7 @@
}
if (onInit) {
await this._refreshPinnedTabs(newWorkspace, { init: onInit });
await this._refreshPinnedTabs({ init: onInit });
}
}
@@ -98,9 +98,9 @@
return this._enabled;
}
async _refreshPinnedTabs(currentWorkspace, { init = false } = {}) {
async _refreshPinnedTabs({ init = false } = {}) {
await this._initializePinsCache();
await this._initializePinnedTabs(init, currentWorkspace);
await this._initializePinnedTabs(init);
}
async _initializePinsCache() {
@@ -141,14 +141,12 @@
return this._pinsCache;
}
async _initializePinnedTabs(init = false, currentWorkspace) {
async _initializePinnedTabs(init = false) {
const pins = this._pinsCache;
if (!pins?.length) {
return;
}
const workspaces = await ZenWorkspaces._workspaces();
const activeTab = gBrowser.selectedTab;
const pinnedTabsByUUID = new Map();
const pinsToCreate = new Set(pins.map((p) => p.uuid));
@@ -174,7 +172,21 @@
}
}
// Second pass: create new tabs for pins that don't have tabs
// Second pass: For every existing tab, update its label
// and set 'zen-has-static-label' attribute if it's been edited
for (let pin of pins) {
const tab = pinnedTabsByUUID.get(pin.uuid);
if (!tab) {
continue;
}
if (pin.title && pin.editedTitle) {
gBrowser._setTabLabel(tab, pin.title);
tab.setAttribute('zen-has-static-label', 'true');
}
}
// Third pass: create new tabs for pins that don't have tabs
for (let pin of pins) {
if (!pinsToCreate.has(pin.uuid)) {
continue; // Skip pins that already have tabs
@@ -213,6 +225,10 @@
newTab.setAttribute('zen-essential', 'true');
}
if (pin.editedTitle) {
newTab.setAttribute('zen-has-static-label', 'true');
}
// Initialize browser state if needed
if (!newTab.linkedBrowser._remoteAutoRemoved) {
let state = {
@@ -349,7 +365,7 @@
await ZenPinnedTabsStorage.savePin(pin);
const currentWorkspace = await ZenWorkspaces.getActiveWorkspace();
await this._refreshPinnedTabs(currentWorkspace);
await this._refreshPinnedTabs();
}
async _setPinnedAttributes(tab) {
@@ -386,7 +402,7 @@
return;
}
const currentWorkspace = await ZenWorkspaces.getActiveWorkspace();
await this._refreshPinnedTabs(currentWorkspace);
await this._refreshPinnedTabs();
}
async _removePinnedAttributes(tab, isClosing = false) {
@@ -411,7 +427,7 @@
}
}
const currentWorkspace = await ZenWorkspaces.getActiveWorkspace();
await this._refreshPinnedTabs(currentWorkspace);
await this._refreshPinnedTabs();
}
_initClosePinnedTabShortcut() {
@@ -707,6 +723,33 @@
return document.documentElement.getAttribute('zen-sidebar-expanded') === 'true';
}
async updatePinTitle(tab, newTitle, isEdited = true, notifyObservers = true) {
const uuid = tab.getAttribute('zen-pin-id');
await ZenPinnedTabsStorage.updatePinTitle(uuid, newTitle, isEdited, notifyObservers);
await this._refreshPinnedTabs();
const browsers = Services.wm.getEnumerator('navigator:browser');
// update the label for the same pin across all windows
for (const browser of browsers) {
const tabs = browser.gBrowser.tabs;
for (let i = 0; i < tabs.length; i++) {
const tabToEdit = tabs[i];
if (tabToEdit.getAttribute('zen-pin-id') === uuid && tabToEdit !== tab) {
tabToEdit.removeAttribute('zen-has-static-label');
if (isEdited) {
gBrowser._setTabLabel(tabToEdit, newTitle);
tabToEdit.setAttribute('zen-has-static-label', 'true');
} else {
gBrowser.setTabTitle(tabToEdit);
}
break;
}
}
}
}
applyDragoverClass(event, draggedTab) {
const pinnedTabsTarget = event.target.closest('#vertical-pinned-tabs-container');
const essentialTabsTarget = event.target.closest('#zen-essentials-container');

View File

@@ -24,6 +24,19 @@ var ZenPinnedTabsStorage = {
)
`);
const columns = await db.execute(`PRAGMA table_info(zen_pins)`);
const columnNames = columns.map((row) => row.getResultByName('name'));
// Helper function to add column if it doesn't exist
const addColumnIfNotExists = async (columnName, definition) => {
if (!columnNames.includes(columnName)) {
await db.execute(`ALTER TABLE zen_pins ADD COLUMN ${columnName} ${definition}`);
}
};
// Add edited_title column if it doesn't exist
await addColumnIfNotExists('edited_title', 'BOOLEAN NOT NULL DEFAULT 0');
// Create indices
await db.execute(`
CREATE INDEX IF NOT EXISTS idx_zen_pins_uuid ON zen_pins(uuid)
@@ -152,6 +165,7 @@ var ZenPinnedTabsStorage = {
isEssential: Boolean(row.getResultByName('is_essential')),
isGroup: Boolean(row.getResultByName('is_group')),
parentUuid: row.getResultByName('parent_uuid'),
editedTitle: Boolean(row.getResultByName('edited_title')),
}));
},
@@ -176,6 +190,7 @@ var ZenPinnedTabsStorage = {
isEssential: Boolean(row.getResultByName('is_essential')),
isGroup: Boolean(row.getResultByName('is_group')),
parentUuid: row.getResultByName('parent_uuid'),
editedTitle: Boolean(row.getResultByName('edited_title')),
}));
},
@@ -351,6 +366,60 @@ var ZenPinnedTabsStorage = {
this._notifyPinsChanged('zen-pin-updated', Array.from(changedUUIDs));
},
async updatePinTitle(uuid, newTitle, isEdited = true, notifyObservers = true) {
if (!uuid || typeof newTitle !== 'string') {
throw new Error('Invalid parameters: uuid and newTitle are required');
}
const changedUUIDs = new Set();
await PlacesUtils.withConnectionWrapper('ZenPinnedTabsStorage.updatePinTitle', async (db) => {
await db.executeTransaction(async () => {
const now = Date.now();
// Update the pin's title and edited_title flag
const result = await db.execute(
`
UPDATE zen_pins
SET title = :newTitle,
edited_title = :isEdited,
updated_at = :now
WHERE uuid = :uuid
`,
{
uuid,
newTitle,
isEdited,
now,
}
);
// Only proceed with change tracking if a row was actually updated
if (result.rowsAffected > 0) {
changedUUIDs.add(uuid);
// Record the change
await db.execute(
`
INSERT OR REPLACE INTO zen_pins_changes (uuid, timestamp)
VALUES (:uuid, :timestamp)
`,
{
uuid,
timestamp: Math.floor(now / 1000),
}
);
await this.updateLastChangeTimestamp(db);
}
});
});
if (notifyObservers && changedUUIDs.size > 0) {
this._notifyPinsChanged('zen-pin-updated', Array.from(changedUUIDs));
}
},
async __dropTables() {
await PlacesUtils.withConnectionWrapper('ZenPinnedTabsStorage.__dropTables', async (db) => {
await db.execute(`DROP TABLE IF EXISTS zen_pins`);

View File

@@ -0,0 +1,475 @@
{
function clearBrowserElements() {
for (const element of document.getElementById('browser').children) {
element.style.display = 'none';
}
}
function getMotion() {
return gZenUIManager.motion;
}
async function animate(...args) {
return getMotion().animate(...args);
}
function initializeZenWelcome() {
document.documentElement.setAttribute('zen-welcome-stage', 'true');
const XUL = `
<html:div id="zen-welcome">
<html:div id="zen-welcome-start">
<html:h1 class="zen-branding-title" id="zen-welcome-title"></html:h1>
<button class="footer-button primary" id="zen-welcome-start-button">
</button>
</html:div>
<hbox id="zen-welcome-pages">
<vbox id="zen-welcome-page-sidebar">
<vbox id="zen-welcome-page-sidebar-content">
</vbox>
<vbox id="zen-welcome-page-sidebar-buttons">
</vbox>
</vbox>
<html:div id="zen-welcome-page-content">
</html:div>
</hbox>
</html:div>
`;
const fragment = window.MozXULElement.parseXULToFragment(XUL);
document.getElementById('browser').appendChild(fragment);
window.MozXULElement.insertFTLIfNeeded('browser/zen-welcome.ftl');
}
class ZenWelcomePages {
constructor(pages) {
this._currentPage = -1;
this._pages = pages;
this.init();
this.next();
}
init() {
document.getElementById('zen-welcome-pages').style.display = 'flex';
document.getElementById('zen-welcome-start').remove();
window.maximize();
animate('#zen-welcome-pages', { opacity: [0, 1] }, { delay: 0.1 });
}
async fadeInTitles(page) {
const [title1, description1, description2] = await document.l10n.formatValues(page.text);
const titleElement = document.getElementById('zen-welcome-page-sidebar-content');
titleElement.innerHTML =
`<html:h1>${title1}</html:h1><html:p>${description1}</html:p>` +
(description2 ? `<html:p>${description2}</html:p>` : '');
await animate(
'#zen-welcome-page-sidebar-content > *',
{ x: ['150%', 0] },
{
delay: getMotion().stagger(0.05),
type: 'spring',
bounce: 0.2,
}
);
}
async fadeInButtons(page) {
const buttons = document.getElementById('zen-welcome-page-sidebar-buttons');
let i = 0;
for (const button of page.buttons) {
const buttonElement = document.createXULElement('button');
document.l10n.setAttributes(buttonElement, button.l10n);
if (i++ === 0) {
buttonElement.classList.add('primary');
}
buttonElement.classList.add('footer-button');
buttonElement.addEventListener('click', async () => {
const shouldSkip = await button.onclick();
if (shouldSkip) {
this.next();
}
});
buttons.appendChild(buttonElement);
}
await animate(
'#zen-welcome-page-sidebar-buttons button',
{ x: ['150%', 0] },
{
delay: getMotion().stagger(0.1, { startDelay: 0.4 }),
type: 'spring',
bounce: 0.2,
}
);
}
async fadeInContent() {
await animate(
'#zen-welcome-page-content > *',
{ opacity: [0, 1] },
{
delay: getMotion().stagger(0.1),
type: 'spring',
bounce: 0.2,
}
);
}
async fadeOutButtons() {
await animate(
'#zen-welcome-page-sidebar-buttons button',
{ x: [0, '-150%'] },
{
type: 'spring',
bounce: 0,
delay: getMotion().stagger(0.1, { startDelay: 0.4 }),
}
);
document.getElementById('zen-welcome-page-sidebar-buttons').innerHTML = '';
document.getElementById('zen-welcome-page-sidebar-content').innerHTML = '';
}
async fadeOutTitles() {
await animate(
'#zen-welcome-page-sidebar-content > *',
{ x: [0, '-150%'] },
{
delay: getMotion().stagger(0.05, { startDelay: 0.3 }),
type: 'spring',
bounce: 0,
}
);
}
async fadeOutContent() {
await animate(
'#zen-welcome-page-content > *',
{ opacity: [1, 0] },
{
delay: getMotion().stagger(0.05, { startDelay: 0.3 }),
type: 'spring',
bounce: 0,
duration: 0.2,
}
);
}
async next() {
if (this._currentPage !== -1) {
const previousPage = this._pages[this._currentPage];
await Promise.all([this.fadeOutTitles(), this.fadeOutButtons(), this.fadeOutContent()]);
await previousPage.fadeOut();
document.getElementById('zen-welcome-page-content').innerHTML = '';
}
this._currentPage++;
const currentPage = this._pages[this._currentPage];
if (!currentPage) {
this.finish();
return;
}
await Promise.all([this.fadeInTitles(currentPage), this.fadeInButtons(currentPage)]);
currentPage.fadeIn();
await this.fadeInContent();
}
async finish() {
await animate('#zen-welcome-page-content', { x: [0, '100%'] }, { bounce: 0 });
document.getElementById('zen-welcome-page-content').remove();
await this.animHeart();
await animate('#zen-welcome-pages', { opacity: [1, 0] });
document.getElementById('zen-welcome').remove();
document.documentElement.removeAttribute('zen-welcome-stage');
for (const element of document.getElementById('browser').children) {
element.style.opacity = 0;
element.style.removeProperty('display');
}
await animate('#browser > *', { opacity: [0, 1] });
gZenUIManager.showToast('zen-welcome-finished');
}
async animHeart() {
const heart = document.createElement('div');
heart.id = 'zen-welcome-heart';
const sidebar = document.getElementById('zen-welcome-page-sidebar');
sidebar.style.width = '100%';
sidebar.appendChild(heart);
await animate(
'#zen-welcome-heart',
{ opacity: [0, 1, 1, 1, 0], scale: [0.5, 1, 1.2, 1, 1.2] },
{
duration: 1.5,
delay: 0.2,
bounce: 0,
}
);
}
}
function getWelcomePages() {
return [
{
text: [
{
id: 'zen-welcome-import-title',
},
{
id: 'zen-welcome-import-description-1',
},
{
id: 'zen-welcome-import-description-2',
},
],
buttons: [
{
l10n: 'zen-welcome-import-button',
onclick: async () => {
MigrationUtils.showMigrationWizard(window, {
isStartupMigration: true,
});
document.querySelector('#zen-welcome-page-sidebar-buttons button').remove();
const newButton = document.querySelector('#zen-welcome-page-sidebar-buttons button');
newButton.classList.add('primary');
document.l10n.setAttributes(newButton, 'zen-welcome-next-action');
return false;
},
},
{
l10n: 'zen-welcome-skip-button',
onclick: async () => {
return true;
},
},
],
fadeIn() {
const xul = `
<html:label for="zen-welcome-set-default-browser">
<html:input type="radio" id="zen-welcome-set-default-browser" name="zen-welcome-set-default-browser"></html:input>
<html:span data-l10n-id="zen-welcome-set-default-browser"></html:span>
</html:label>
<html:label for="zen-welcome-dont-set-default-browser">
<html:input checked="true" type="radio" id="zen-welcome-dont-set-default-browser" name="zen-welcome-set-default-browser"></html:input>
<html:span data-l10n-id="zen-welcome-dont-set-default-browser"></html:span>
</html:label>
`;
const fragment = window.MozXULElement.parseXULToFragment(xul);
document.getElementById('zen-welcome-page-content').appendChild(fragment);
},
async fadeOut() {
const shouldSetDefault = document.getElementById('zen-welcome-set-default-browser').checked;
if (AppConstants.HAVE_SHELL_SERVICE && shouldSetDefault) {
let shellSvc = getShellService();
if (!shellSvc) {
return;
}
try {
await shellSvc.setDefaultBrowser(false);
} catch (ex) {
console.error(ex);
return;
}
}
},
},
{
text: [
{
id: 'zen-welcome-workspace-colors-title',
},
{
id: 'zen-welcome-workspace-colors-description',
},
],
buttons: [
{
l10n: 'zen-welcome-next-action',
onclick: async () => {
return true;
},
},
],
fadeIn() {},
fadeOut() {},
},
{
text: [
{
id: 'zen-welcome-initial-essentials-title',
},
{
id: 'zen-welcome-initial-essentials-description-1',
},
{
id: 'zen-welcome-initial-essentials-description-2',
},
],
buttons: [
{
l10n: 'zen-welcome-next-action',
onclick: async () => {
return true;
},
},
],
fadeIn() {
const xul = `
<hbox id="zen-welcome-initial-essentials-browser">
<vbox id="zen-welcome-initial-essentials-browser-sidebar">
<hbox id="zen-welcome-initial-essentials-browser-sidebar-win-buttons">
<html:div></html:div>
<html:div></html:div>
<html:div></html:div>
</hbox>
<html:div id="zen-welcome-initial-essentials-browser-sidebar-essentials">
<html:div class="tabbrowser-tab" fadein="" visuallyselected="" data-url="https://web.whatsapp.com" style="--zen-tab-icon: url('https://web.whatsapp.com/favicon.ico');">
<stack class="tab-stack">
<html:div class="tab-background"></html:div>
</stack>
</html:div>
<html:div class="tabbrowser-tab" fadein="" visuallyselected="" data-url="https://discord.com" style="--zen-tab-icon: url('http://www.google.com/s2/favicons?domain=discord.com');">
<stack class="tab-stack">
<html:div class="tab-background"></html:div>
</stack>
</html:div>
<html:div class="tabbrowser-tab" fadein="" data-url="https://reddit.com" style="--zen-tab-icon: url('https://www.redditstatic.com/desktop2x/img/favicon/favicon-96x96.png');">
<stack class="tab-stack">
<html:div class="tab-background"></html:div>
</stack>
</html:div>
<html:div class="tabbrowser-tab" fadein="" data-url="https://slack.com/" style="--zen-tab-icon: url('https://a.slack-edge.com/80588/marketing/img/meta/favicon-32.png');">
<stack class="tab-stack">
<html:div class="tab-background"></html:div>
</stack>
</html:div>
<html:div class="tabbrowser-tab" fadein="" visuallyselected="" data-url="https://google.com" style="--zen-tab-icon: url('https://www.google.com/s2/favicons?domain=google.com');">
<stack class="tab-stack">
<html:div class="tab-background"></html:div>
</stack>
</html:div>
<html:div class="tabbrowser-tab" fadein="" data-url="https://twitter.com" style="--zen-tab-icon: url('https://abs.twimg.com/favicons/twitter.ico');">
<stack class="tab-stack">
<html:div class="tab-background"></html:div>
</stack>
</html:div>
<html:div class="tabbrowser-tab" fadein="" data-url="https://notion.com" style="--zen-tab-icon: url('https://www.notion.so/front-static/favicon.ico');">
<stack class="tab-stack">
<html:div class="tab-background"></html:div>
</stack>
</html:div>
<html:div class="tabbrowser-tab" fadein="" data-url="https://instagram.com" style="--zen-tab-icon: url('https://www.instagram.com/static/images/ico/favicon-192.png/68d99ba29cc8.png');">
<stack class="tab-stack">
<html:div class="tab-background"></html:div>
</stack>
</html:div>
<html:div class="tabbrowser-tab" fadein="" visuallyselected="" data-url="https://element.io" style="--zen-tab-icon: url('http://www.google.com/s2/favicons?domain=element.io');">
<stack class="tab-stack">
<html:div class="tab-background"></html:div>
</stack>
</html:div>
<html:div class="extra-tab"></html:div>
<html:div class="extra-tab"></html:div>
</html:div>
</vbox>
</hbox>
`;
const fragment = window.MozXULElement.parseXULToFragment(xul);
document.getElementById('zen-welcome-page-content').appendChild(fragment);
document
.getElementById('zen-welcome-initial-essentials-browser-sidebar-essentials')
.addEventListener('click', async (event) => {
const tab = event.target.closest('.tabbrowser-tab');
if (!tab) {
return;
}
tab.toggleAttribute('visuallyselected');
});
},
fadeOut() {},
},
{
text: [
{
id: 'zen-welcome-start-browsing-title',
},
{
id: 'zen-welcome-start-browsing-description-1',
},
],
buttons: [
{
l10n: 'zen-welcome-start-browsing',
onclick: async () => {
return true;
},
},
],
fadeIn() {},
fadeOut() {},
},
];
}
async function animateInitialStage() {
const [title1, title2] = await document.l10n.formatValues([
{ id: 'zen-welcome-title-line1' },
{ id: 'zen-welcome-title-line2' },
]);
const titleElement = document.getElementById('zen-welcome-title');
titleElement.innerHTML = `<html:span>${title1}</html:span><html:span>${title2}</html:span>`;
await animate(
'#zen-welcome-title span',
{ opacity: [0, 1], y: [20, 0], filter: ['blur(2px)', 'blur(0px)'] },
{
delay: getMotion().stagger(0.6, { startDelay: 0.2 }),
type: 'spring',
stiffness: 300,
damping: 20,
mass: 1.8,
}
);
const button = document.getElementById('zen-welcome-start-button');
await animate(
button,
{ opacity: [0, 1], y: [20, 0], filter: ['blur(2px)', 'blur(0px)'] },
{
delay: 0.1,
type: 'spring',
stiffness: 300,
damping: 20,
mass: 1.8,
}
);
button.addEventListener('click', async () => {
await animate(
'#zen-welcome-title span, #zen-welcome-start-button',
{ opacity: [1, 0], y: [0, -10], filter: ['blur(0px)', 'blur(2px)'] },
{
type: 'spring',
ease: [0.755, 0.05, 0.855, 0.06],
bounce: 0.4,
delay: getMotion().stagger(0.4),
}
);
new ZenWelcomePages(getWelcomePages());
});
}
function centerWindowOnScreen() {
window.addEventListener(
'MozAfterPaint',
function () {
window.resizeTo(875, 560);
window.focus();
const appWin = window.docShell.treeOwner.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIAppWindow);
appWin.rollupAllPopups();
},
{ once: true }
);
}
function startZenWelcome() {
clearBrowserElements();
centerWindowOnScreen();
initializeZenWelcome();
animateInitialStage();
}
startZenWelcome();
}

View File

@@ -154,7 +154,7 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
}
get tabboxChildren() {
return this.activeWorkspaceStrip.children;
return this.activeWorkspaceStrip?.children || [];
}
get pinnedTabsContainer() {
@@ -393,17 +393,23 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
event.preventDefault();
event.stopPropagation();
const delta = event.delta * 300;
this._swipeState.lastDelta = delta;
const delta = event.delta * 300 + 1;
const stripWidth = document.getElementById('tabbrowser-tabs').scrollWidth;
let translateX = this._swipeState.lastDelta + delta;
// Add a force multiplier as we are translating the strip depending on how close to the edge we are
let forceMultiplier = Math.min(1, 1 - Math.abs(translateX) / (stripWidth * 1.5));
if (forceMultiplier > 0.5) {
translateX *= forceMultiplier;
this._swipeState.lastDelta = delta;
} else {
translateX = this._swipeState.lastDelta;
}
if (Math.abs(delta) > 1) {
this._swipeState.direction = delta > 0 ? 'left' : 'right';
}
// Apply a translateX to the tab strip to give the user feedback on the swipe
const stripWidth = document.getElementById('tabbrowser-tabs').scrollWidth;
const translateX = Math.max(-stripWidth, Math.min(delta, stripWidth));
const currentWorkspace = this.activeWorkspace;
this._organizeWorkspaceStripLocations({ uuid: currentWorkspace }, true, translateX);
}
@@ -1337,10 +1343,18 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
return;
}
tab.setAttribute('zen-workspace-id', workspaceID);
const parent = tab.pinned ? '#zen-browser-tabs-pinned ' : '#zen-browser-tabs ';
const container = document.querySelector(parent + '.zen-workspace-tabs-section');
if (tab.hasAttribute('zen-essential')) {
return;
}
const parent = tab.pinned ? '#vertical-pinned-tabs-container ' : '#tabbrowser-arrowscrollbox ';
const container = document.querySelector(parent + `.zen-workspace-tabs-section[zen-workspace-id="${workspaceID}"]`);
if (container) {
container.insertBefore(tab, container.firstChild);
container.insertBefore(tab, container.lastChild);
}
// also change glance tab if it's the same tab
const glanceTab = tab.querySelector('.tabbrowser-tab[zen-glance-tab]');
if (glanceTab) {
glanceTab.setAttribute('zen-workspace-id', workspaceID);
}
}
@@ -1493,7 +1507,6 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
const newTransform = -(workspaceIndex - workspaces.workspaces.indexOf(otherWorkspace)) * 100;
for (const container of document.querySelectorAll(selector)) {
container.style.transform = `translateX(${newTransform + offsetPixels / 2}%)`;
container.style.opacity = offsetPixels ? 1 : !newTransform;
if (!offsetPixels && !container.hasAttribute('active')) {
container.setAttribute('hidden', 'true');
} else {
@@ -1542,16 +1555,11 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
const isCurrent = offset === 0;
if (shouldAnimate) {
element.removeAttribute('hidden');
if (isCurrent) {
element.style.opacity = 1;
}
animations.push(
gZenUIManager.motion.animate(
element,
{
transform: existingTransform ? [existingTransform, newTransform] : newTransform,
// -0 to convert to number
opacity: !isCurrent ? [!!offset - 0, !offset - 0] : [1, 1],
},
{
type: 'spring',
@@ -2009,6 +2017,8 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
delete this._lastSelectedWorkspaceTabs[previousWorkspaceID];
}
}
// Make sure we select the last tab in the new workspace
this._lastSelectedWorkspaceTabs[workspaceID] = tabs[tabs.length - 1];
const workspaces = await this._workspaces();
await this.changeWorkspace(workspaces.workspaces.find((workspace) => workspace.uuid === workspaceID));
}

View File

@@ -1,5 +1,5 @@
diff --git a/browser/components/BrowserGlue.sys.mjs b/browser/components/BrowserGlue.sys.mjs
index b888a753a7f23a9800fe04da51a4e6b898314ff2..35eea774e1ea4b1807ec65ebc767f423d81602bd 100644
index b888a753a7f23a9800fe04da51a4e6b898314ff2..a6a01cf035253b05ea7b20b434cf2002ff115d96 100644
--- a/browser/components/BrowserGlue.sys.mjs
+++ b/browser/components/BrowserGlue.sys.mjs
@@ -121,6 +121,7 @@ ChromeUtils.defineESModuleGetters(lazy, {
@@ -18,28 +18,3 @@ index b888a753a7f23a9800fe04da51a4e6b898314ff2..35eea774e1ea4b1807ec65ebc767f423
// A channel for "remote troubleshooting" code...
let channel = new lazy.WebChannel(
"remote-troubleshooting",
@@ -4761,6 +4763,7 @@ BrowserGlue.prototype = {
},
async _maybeShowDefaultBrowserPrompt() {
+ this._ZenMaybeShowWelcomeScreen();
// Highest priority is about:welcome window modal experiment
// Second highest priority is the upgrade dialog, which can include a "primary
// browser" request and is limited in various ways, e.g., major upgrades.
@@ -5302,6 +5305,16 @@ BrowserGlue.prototype = {
"nsIObserver",
"nsISupportsWeakReference",
]),
+
+ _ZenMaybeShowWelcomeScreen() {
+ const welcomeEnabled = Services.prefs.getBoolPref("zen.welcome-screen.enabled", true)
+ const welcomeSeen = Services.prefs.getBoolPref("zen.welcome-screen.seen", false)
+ if (welcomeEnabled && !welcomeSeen) {
+ lazy.BrowserWindowTracker.getTopWindow().gDialogBox.open(
+ "chrome://browser/content/zen-welcome/welcome.html"
+ );
+ }
+ },
};
var ContentBlockingCategoriesPrefs = {

View File

@@ -1,38 +0,0 @@
diff --git a/browser/components/migration/MigrationUtils.sys.mjs b/browser/components/migration/MigrationUtils.sys.mjs
index 000b471ee6c93815dde61127b8974774d0abafb1..32ba8d40bab5e609fc76dfe97a952d5a7a300a71 100644
--- a/browser/components/migration/MigrationUtils.sys.mjs
+++ b/browser/components/migration/MigrationUtils.sys.mjs
@@ -576,12 +576,15 @@ class MigrationUtils {
* True if the source selection page of the wizard should be skipped.
* @param {string} [aOptions.profileId]
* An identifier for the profile to use when migrating.
+ * @param {boolean} [aOptions.zenBlocking=false]
+ * True if the migration wizard should block the main thread.
* @returns {Promise<undefined>}
* If an about:preferences tab can be opened, this will resolve when
* that tab has been switched to. Otherwise, this will resolve
* just after opening the top-level dialog window.
*/
showMigrationWizard(aOpener, aOptions) {
+ let zenShouldBlock = aOptions.zenBlocking || false;
// When migration is kicked off from about:welcome, there are
// a few different behaviors that we want to test, controlled
// by a preference that is instrumented for Nimbus. The pref
@@ -648,7 +651,7 @@ class MigrationUtils {
if (aboutWelcomeBehavior == "autoclose") {
return aOpener.openPreferences("general-migrate-autoclose");
} else if (aboutWelcomeBehavior == "standalone") {
- openStandaloneWindow(false /* blocking */);
+ openStandaloneWindow(zenShouldBlock /* blocking */);
return Promise.resolve();
}
}
@@ -657,7 +660,7 @@ class MigrationUtils {
// If somehow we failed to open about:preferences, fall back to opening
// the top-level window.
- openStandaloneWindow(false /* blocking */);
+ openStandaloneWindow(zenShouldBlock /* blocking */);
return Promise.resolve();
}

View File

@@ -1,12 +0,0 @@
diff --git a/browser/components/moz.build b/browser/components/moz.build
index 6cbb7ce0037c1457eeae5c331a996719691ebd6b..611707852198740c9b4103f5e2a66e8ee4099a21 100644
--- a/browser/components/moz.build
+++ b/browser/components/moz.build
@@ -27,6 +27,7 @@ with Files("controlcenter/**"):
DIRS += [
+ "zen-welcome",
"about",
"aboutlogins",
"aboutwelcome",

View File

@@ -939,11 +939,6 @@ Preferences.addAll([
type: 'bool',
default: true,
},
{
id: 'zen.theme.pill-button',
type: 'bool',
default: true,
},
{
id: 'zen.workspaces.hide-default-container-indicator',
type: 'bool',

View File

@@ -81,13 +81,6 @@
</hbox>
<groupbox id="zenThemeGroup" data-category="paneZenLooks" hidden="true" class="highlighting-group">
<label><html:h2 data-l10n-id="zen-look-and-feel-buttons-header"/></label>
<description class="description-deemphasized" data-l10n-id="zen-look-and-feel-buttons-description" />
<checkbox id="zenLooksAndFeelPilledButtons"
data-l10n-id="zen-look-and-feel-pilled-buttons"
preference="zen.theme.pill-button"/>
<label><html:h2 data-l10n-id="zen-look-and-feel-urlbar-header"/></label>
<description class="description-deemphasized" data-l10n-id="zen-look-and-feel-urlbar-description" />

View File

@@ -1,8 +1,8 @@
diff --git a/browser/components/sessionstore/TabState.sys.mjs b/browser/components/sessionstore/TabState.sys.mjs
index 8f7ed557e6aa61e7e16ed4a8d785ad5fe651b3d8..dc0fdf17952df397a684f8a1da2f71739d007350 100644
index 8f7ed557e6aa61e7e16ed4a8d785ad5fe651b3d8..83bf443ca158c07e05075777da02b7f228d83dff 100644
--- a/browser/components/sessionstore/TabState.sys.mjs
+++ b/browser/components/sessionstore/TabState.sys.mjs
@@ -84,6 +84,14 @@ class _TabState {
@@ -84,6 +84,13 @@ class _TabState {
tabData.groupId = tab.group.id;
}
@@ -12,7 +12,6 @@ index 8f7ed557e6aa61e7e16ed4a8d785ad5fe651b3d8..dc0fdf17952df397a684f8a1da2f7173
+ tabData.zenDefaultUserContextId = tab.getAttribute("zenDefaultUserContextId");
+ tabData.zenPinnedEntry = tab.getAttribute("zen-pinned-entry");
+ tabData.zenPinnedIcon = tab.getAttribute("zen-pinned-icon");
+ tabData.zenHasStaticLabel = tab.getAttribute("zen-has-static-label");
+
tabData.searchMode = tab.ownerGlobal.gURLBar.getSearchMode(browser, true);

View File

@@ -1,5 +1,5 @@
diff --git a/browser/components/tabbrowser/content/tabbrowser.js b/browser/components/tabbrowser/content/tabbrowser.js
index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..8f2cd9ecd708e58a6b162740bb21dafeda43b085 100644
index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..e06b7ffb6c7769ad3f29e2c5aa05156a34fd7933 100644
--- a/browser/components/tabbrowser/content/tabbrowser.js
+++ b/browser/components/tabbrowser/content/tabbrowser.js
@@ -406,11 +406,52 @@
@@ -369,17 +369,7 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..8f2cd9ecd708e58a6b162740bb21dafe
if (forceStandaloneTab && neighbor.group) {
neighbor = neighbor.group;
}
@@ -5727,6 +5835,9 @@
this.tabContainer.insertBefore(aTab, neighbor);
}
});
+ if (aTab.hasAttribute("glance-id")) {
+ this.moveTabTo(aTab.querySelector("tab[glance-id]"), aIndex, options);
+ }
}
moveTabToGroup(aTab, aGroup) {
@@ -5802,7 +5913,7 @@
@@ -5802,7 +5910,7 @@
createLazyBrowser,
};
@@ -388,7 +378,7 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..8f2cd9ecd708e58a6b162740bb21dafe
if (aIndex < numPinned || (aTab.pinned && aIndex == numPinned)) {
params.pinned = true;
}
@@ -7443,6 +7554,7 @@
@@ -7443,6 +7551,7 @@
aWebProgress.isTopLevel
) {
this.mTab.setAttribute("busy", "true");
@@ -396,7 +386,7 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..8f2cd9ecd708e58a6b162740bb21dafe
gBrowser._tabAttrModified(this.mTab, ["busy"]);
this.mTab._notselectedsinceload = !this.mTab.selected;
gBrowser.syncThrobberAnimations(this.mTab);
@@ -8411,7 +8523,7 @@ var TabContextMenu = {
@@ -8411,7 +8520,7 @@ var TabContextMenu = {
);
contextUnpinSelectedTabs.hidden =
!this.contextTab.pinned || !multiselectionContext;
@@ -405,7 +395,7 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..8f2cd9ecd708e58a6b162740bb21dafe
// Move Tab items
let contextMoveTabOptions = document.getElementById(
"context_moveTabOptions"
@@ -8444,7 +8556,7 @@ var TabContextMenu = {
@@ -8444,7 +8553,7 @@ var TabContextMenu = {
let contextMoveTabToStart = document.getElementById("context_moveToStart");
let isFirstTab =
tabsToMove[0] == visibleTabs[0] ||
@@ -414,7 +404,7 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..8f2cd9ecd708e58a6b162740bb21dafe
contextMoveTabToStart.disabled = isFirstTab && allSelectedTabsAdjacent;
document.getElementById("context_openTabInWindow").disabled =
@@ -8677,6 +8789,7 @@ var TabContextMenu = {
@@ -8677,6 +8786,7 @@ var TabContextMenu = {
if (this.contextTab.multiselected) {
gBrowser.removeMultiSelectedTabs();
} else {

View File

@@ -1,7 +0,0 @@
# Important notes!
Inside browser.js, we hardcoded-ly detect the path name for `zen-welcome` so we can add special attributes to the welcome page. If this path name changes, the welcome page will not work properly.
Make sure to update the path name in browser.js if you change the path name of `zen-welcome`.
The constant that contains this path name is `ZEN_WELCOME_PATH`.

View File

@@ -1,9 +0,0 @@
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
browser.jar:
% content browser %content/browser/ contentaccessible=yes
content/browser/zen-welcome/welcome.html (welcome.html)
content/browser/zen-welcome/welcome.css (welcome.css)
content/browser/zen-welcome/welcome.js (welcome.js)

View File

@@ -1,4 +0,0 @@
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
JAR_MANIFESTS += ["jar.mn"]

View File

@@ -1,451 +0,0 @@
/*
This Source Code Form is subject to the terms of the Mozilla Public
License, v. 2.0. If a copy of the MPL was not distributed with this
file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
:root {
--noise: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEEAAABBCAMAAAC5KTl3AAAAgVBMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABtFS1lAAAAK3RSTlMWi3QSa1uQOKBWCTwcb6V4gWInTWYOqQSGfa6XLyszmyABlFFJXySxQ0BGn2PQBgAAC4NJREFUWMMV1kWO5UAQRdFk5kwzs/33v8Cunr7ZUehKAdaRUAse99ozDjF5BqswrPKm7btzJ2tRziN3rMYXC236humIV5Our7nHWnVdFOBojW2XVnkeu1IZHNJH5OPHj9TjgVxBGBwAAmp60WoA1gBBvg3XMFhxUQ4KuLqx0CritYZPPXinsOqB7I76+OHaZlPzLEcftrqOlOwjeXvuEuH6t6emkaofgVUDIb4fEZB6CmRAeFCTq11lxbAgUyx4rXkqlH9I4bTUDRRVD1xjbqb9HyUBn7rhtr1x+x9Y0e3BdX31/loYvZaLxqnjbRuokz+pPG7WebnSNKE3yE6Tka4aDEDMVYr6Neq126c+ZR2nzzm3yyiC7PGWG/1uueqZudrVGYNdsgOMDvt1cI8CXu63QIcPvYNY8z870WwYazTS7DqpDEknZqS0AFXObWUxTaw0q5pnHlq4oQImakpLfJkmErdvAfhsc7lod0DVT4tuob25C0tQjzdiFObCz7U7eaKGP3s6yQVgQ/y+q+nY6K5dfV75iXzcNlGIP38aj22sVwtWWKMRb7B5HoHPaBvI1Ve5TSXATi66vV6utxsV+aZNFu+93VvlrG/oj8Wp67YT8l+Oq6PjwdGatFm7SEAP13kE0y9CEcf9qhtEWCMIq5AGq71moEAI9vrmFcmO8+7ZyDnmRN/VUaFkM2ce8KuBGFzDMmY6myLfQGra2ofgHhbJRXuRDZ4H+HmliWBHXQ0ysLGfv6FetbxtxzRgIZWjIsGVFl5imPXeyvVyayNek+dSWzjXd4t310YBdaF8sXeKs481PjsXbAtIru2+wHbv3GVh3sQY6Dnu6pF3pZ714VYdDi9A5GkXR/6xgaZN/tpQ8wVV3zeBuB+njoBNE4wjc+uA523ysXGd/P2sntmOb3OdHNWP5OVrxD3eJHdtH8QVkEIAqCor3hReR96yqt6PkTQfenllooQ447h6tOrnnuzwA8fMpq+jqg1oW8fTYYIncAYpVeTvkEFr/khQSbjoE8ykx9049OkE5MQEO9lC24tT7DwThQgf4Fhf8nGgAo3GYaON3crODpOr2pu5dBABz69t7F5yJBBo+r6QJdeLDWEoO7r1tceR3haA7gc7eZrCvpxSXXeKpo4P+hRixo9DeOFbqQVjKyWfBg9pnrEZKzK7R437YTTwhfoySG/YOCt3fs4aXlU3FjKortqQ6XyXaD0+Y/8VoqpyU9TRW45eN4oBxAH8Y/jLnNXfELJW+/p/MgO9Z+mBli2qqAP7dV/Arc2+YZRZwtBW8/p32y5ZsEuCS4O5AAgfR7Dde7zhiGfgvurQkfAXIrUG61rmxc2EZo18ph4vaWZI+QM0JdsbNlBJlPlwf9uguujQJy0j7TgTHdtRnjybTg55Hkk9S6l2rpYahumSewKHVosa1bh2Y6r9JGkdKvIDN/eeAwScrfjoLkCxWJuFZQ53FNP5w9XbQd1HhgHcVB/0fATG3sUUid1RTfc2+7pZVKldFSsaEK0v4k90tapQOk2HIbMhaJQtrUEL5+3sDanh8sOpbYRoQoqXWu6SQcUTQL9jzOrXNPWCJwXge4U7tlU1hkF012cAmvp8llQxf1IEMcw14pURxVOWATz4ITnYQjuF+vDXg5hgoiqXzO6mS91FQUBheURHIJxUeU1i3P0WOMpsm7vFYk0JJi/Ev+X3FwYD69cARPuP5GIc0PxoAFjcLRbNur0iMTrQmBBNYJ2ngU4x7SWfdTRl52Bqv7LmYW3C1CyTCPTHeWWIAM/Whm32COHsaj+2UQ739XB9t6NV0o9E9b7CW3XNiXzi9e0KiE+3rntukdIDBWrU2jsfQWuyFJRANxq8StHVv1JPy2C3Byco7qdNbASrnNXZ8G0L/Wp/pif4Ai9aEZ9Bb+TRx+REBdGlkF/s0dUdMSMr+6YCbuGxqPWdzcdqutvqkBzCksFcwAtjf55TeuH79M6AQa7r5PLeXxMFIlQKrXP9VJ275WGX+ptpf+tvTDBsecPnYQAlAWrVbRVJ7K2pRHwIjtSpbX96Y/lbKk6ZWXlBmh15r8yAWQsYxXgBOXYMAfHnUXF+rDqnB8bXDRtAn7bCziIqetSboK3NexMePvsCRLvmsoREA+kH8j4HWFpnNEaWgOmR7xyXHfTaz3slHc/YA6H6tl/L8d5tPcIwwD0tjvRaq3Y5BmYBSDClpv0VIX4s8D0XK3sPdpAb94HjPLkgboEz9EdZATW6ZdcmQvtKUwoWw+nAVKA7IcdY1UHnvNnIBplKci+knzewLz5/GGnzkGuuGky+0LTjtGBGR85EQICDqKChnm5pH3Z44nnWAk1YRdyu3g7QoFZ0h8jkr2ffjKmi+Qvsp+9GvNGZHmgW+YQAGUw7PPt8IPKbdy432vhKtRJjKWcSqq7helj81o3nfmaxVZ7Sqie8OOBk9WsyTD/ab7fQ5aWwQeJvnH6+ayo4IdIkOSBJjzXkgr+1TPhAx1AXDsxtCCj3TzQTLA1p782f7a8vdgPfwwrXmZxxbqo2h+6Zlo6mcMY4V7cFBOLm17VCvx9Qa2tAnkxEB+KYyQgbgAAnmNDOdOO6y2Cb+lke1MWQc9o+EMdQf7ubIG3Ek8GZ4k1PtGjbhwgOMPp5Em59JMVk/jU8/aF73Xcrd3UBNZyueQu0/xz2aGtZT8CRziOax2BWFXaeDzgZNV7oRtUzFoijoETf3xkAFFk3OMb7SgPh5wxU1+MygDIp9gZChH2qEcpgLh8pBIK90PXT1ZSU+ZExFK4Vm4GL/J7+K13lS5dQkW4HQwl6GX4yLqu8GhGWS2k75yel5IZIfFNdAL0NpKr2N5dQesBnxa42DLgJd6agS1jJsp1mO1dip7PU4P6diLLoTsZ4m3Q0QweiqeFfIGPLgF6v6mSVv6xe85VBD/1Mpe3AurRbcJ9SEo8NszNVy8rOCEexyIFcJRvYAlI/wk2I7r3p60FFLQXoH2q9xri/m41svRPbW0/EnPn2DWsmk0IiPpB60aa3+hiFfWuC8ZvWKEd9LxAk3HcOof6d77RewPaPsGw5lQAHcZN2vx1448u9pLfMLGQ3BSRRjBzRhKt7HcCw/7aqjtCDs5q76b4ZGphxN2th1WeXYlfnozX3ebKtX4Te11hf1tZP1diiGjIDAB1cR4Sb9rcFPC/nBARjlgDxd+tCBb1t91j71xJcgGjT3g/dUFnXXNiDrxkyoHANPk58ACPUa42hj8tgGrhiXOCmygxFZBiT2wyAJTDJ4wJEPmp6JIrDaSWYNqv4xH2wwdSTGYb3E0pXnS39nmLUsqoVZxzSoegqzd0o06wdbTXsaHGL+IF4JtIcXddTcD/dCd8hVf+fWPSV553kjMmMEULLS8HcgmptDO955dLGX78PjiDA6IsTHPm5IA6bc5ha0gaGkoEttXuxU11B2dOJ65/Q08tEF1+Y9cr2Nh/VECfQ33GyvR/gsdN1LuIeLpKMCAF2yRr769g9/4aJLZNRI71m2S91+Kp+Q0zubTcxoG2/6gm1Q79wkMj2XNO2ui7nWw8ULtu27CCvqTGX2PffD+xcwgh/TrOKvGZMM5jRFGDTn4NO/lwnDR/GY/waDZtkWDUPI0O8ztcFVqp6r2ZW+2bvkJ3raptYagFqu95VdIaml2CIp6CKets34x+fH2C+zH4cVFO7vj+6k2FU39PtRhWluYeZ3gDz1TLB9K2v7SD9gJU1qDxoRDrAWcrFGLyndhdtd0505+gEP79adK8fmFCWNYC+ahzVNcRH79E8dA1iqX/N0qq22xcOc20ALxLDspEj4QCFBQMgaIwoKbxr0Bd7Sbws6GiRK6tqoPfpiCle23axejRLyO1I+ahsEpWrzT5ZsCyS5RcY9jMfENFxSnhKsrfW8JHH6/rdQUMfmQPT3Uz9gY0C/pu1yuCnrPUvio0a1qMEosA/EwIzzid7cqsAAAAASUVORK5CYII=');
}
html {
width: 100%;
height: 100%;
}
body {
display: flex;
position: relative;
width: 100%;
height: 100%;
overflow: hidden;
user-select: none;
}
body {
background: var(--zen-branding-bg);
}
#main-view {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
position: relative;
width: fit-content;
margin: auto;
}
#welcome .zen-branding-title,
#thanks .zen-branding-title {
text-align: center;
font-size: 7rem;
}
#buttons-footer {
margin-top: auto;
padding: 20px 0;
width: 100%;
display: flex;
justify-content: space-between;
align-items: center;
z-index: 2;
& button {
opacity: 0;
animation: fadeIn 0.5s ease-in-out forwards;
animation-delay: 0.8s;
}
& button:nth-child(2) {
animation-delay: 1s;
}
}
body:has(:is(#welcome, #thanks):not([hidden='true'])) {
& #buttons-footer {
justify-content: center;
position: fixed;
bottom: 40px;
margin: 0 auto;
& button {
background: var(--zen-branding-paper) !important;
color: var(--zen-branding-dark) !important;
}
}
}
:is(#theme, #search) > div:nth-child(2) {
width: 100%;
}
#main-view:has(:is(#welcome, #thanks):not([hidden='true'])) {
width: 100%;
& #back {
display: none;
}
}
button {
padding: 8px;
border-radius: 999px;
font-size: 16px;
font-weight: 600;
cursor: pointer;
}
button.primary {
background: var(--zen-branding-bg-reverse) !important;
color: var(--zen-branding-bg) !important;
transition: background 0.2s ease-in-out;
&:hover {
background: color-mix(in srgb, var(--zen-branding-bg-reverse) 80%, transparent 20%) !important;
}
}
.page {
display: flex;
flex-direction: column;
justify-content: center;
width: -moz-available;
align-items: center;
margin: 32px;
}
h2 {
font-size: 17px;
font-weight: 600;
margin: 35px 0 20px 0;
line-height: 1;
}
.page-split:not([hidden='true']) {
flex-direction: column;
margin: auto;
justify-content: start;
}
.page-split:not(#import, #theme) > div:first-child {
margin-bottom: 20px;
}
:not(#theme) .card h3 {
margin: auto;
text-align: center;
}
#theme {
& > div:first-child p {
margin-bottom: 0 !important;
}
}
#theme .card[disabled='true'] {
opacity: 0.7;
cursor: not-allowed;
}
.cardGroup {
display: flex;
flex-wrap: wrap;
align-items: stretch;
gap: 8px;
margin-bottom: 8px;
}
.cardGroup .card {
width: 140px;
display: flex;
flex-direction: column;
align-items: center;
align-content: space-between;
border: 2px solid transparent !important;
transition: all 0.1s ease-in-out !important;
margin: 0 10px;
border-radius: 7px;
outline: none !important;
cursor: auto;
user-select: none;
}
.cardGroup .card.selected {
border: 2px solid var(--zen-colors-primary) !important;
transform: scale(1.1);
}
h1 {
font-size: 32px;
font-weight: 700;
margin: 16px 0 5px 0;
line-height: 1;
}
.page > div:nth-child(2) h1 {
margin-bottom: 15px;
margin-top: 10px;
font-size: 18px;
}
p {
font-size: 16px;
opacity: 0.8;
margin: 0;
margin-bottom: 30px;
}
#zen-logo {
-moz-context-properties: fill;
fill: currentColor;
display: inline-block;
height: 42px;
width: 42px;
position: absolute;
top: 40px;
left: 50%;
transform: translateX(-50%);
}
.asset {
width: 500px;
padding-bottom: 32px;
}
@media (prefers-color-scheme: light) {
.dark-only {
display: none;
}
}
@media (prefers-color-scheme: dark) {
.light-only {
display: none;
}
}
input[type='checkbox'] {
display: inline-block;
vertical-align: middle;
}
#importNext {
margin-left: 30px;
color: var(--in-content-primary-button-background);
}
#themeNext,
#searchNext,
#thanksNext {
margin-top: 20px;
}
.page[hidden='true'] {
display: none;
}
.page:not([hidden='true']) {
display: flex;
}
.page:not([hidden='true']) > *:not(:has(.delay-animation)),
.delay-animation,
.delay-animation-2 {
opacity: 0;
animation: fadeIn 0.5s ease-in-out forwards;
}
#importBrowser {
width: 100%;
background: transparent !important;
border: 1px solid var(--zen-branding-bg-reverse);
color: var(--zen-branding-bg-reverse);
padding: 16px;
border-radius: 8px;
margin-bottom: 20px;
justify-content: start;
display: flex;
}
#layout {
text-align: center;
}
#layoutList {
display: flex;
gap: 20px;
& > [layout] {
display: flex;
flex-direction: column;
gap: 3px;
font-weight: 600;
cursor: pointer;
&[disabled='true'] {
opacity: 0.7;
cursor: not-allowed;
}
& img {
width: 250px;
border-radius: 10px;
border: 4px solid transparent;
}
&.selected img {
border: 4px solid var(--zen-colors-primary);
}
}
}
@keyframes fadeIn {
from {
opacity: 0;
transform: translate3d(0, 40px, 0);
filter: blur(15px);
}
to {
opacity: 1;
filter: blur(0);
transform: translate3d(0, 0, 0);
}
}
/* There should be no more than 5 elements in a page */
.page:not([hidden='true']) > *:nth-child(2):not(:has(.delay-animation)) {
animation-delay: 0.2s;
}
.page:not([hidden='true']) > *:nth-child(3),
.delay-animation:nth-child(1) {
animation-delay: 0.4s;
}
.page:not([hidden='true']) > *:nth-child(4),
.delay-animation:nth-child(2) {
animation-delay: 0.6s;
}
.page:not([hidden='true']) > *:nth-child(5),
.delay-animation:nth-child(3),
.delay-animation-2:nth-child(1) {
animation-delay: 0.8s;
}
.page:not([hidden='true']) > *:nth-child(6),
.delay-animation:nth-child(4),
.delay-animation-2:nth-child(2) {
animation-delay: 1s;
}
#welcome {
& h1 {
animation-duration: 0.8s !important;
}
}
.card h3 {
margin-top: 10px;
}
#circular-progress {
--size: 220px;
--half-size: calc(var(--size) / 2);
--stroke-width: 20px;
--radius: calc((var(--size) - var(--stroke-width)) / 2);
--circumference: calc(var(--radius) * pi * 2);
--dash: calc((var(--progress) * var(--circumference)) / 100);
position: absolute;
top: 15px;
right: 10px;
width: 55px;
height: 40px;
}
#circular-progress circle {
cx: var(--half-size);
cy: var(--half-size);
r: var(--radius);
stroke-width: var(--stroke-width);
fill: none;
stroke-linecap: round;
}
#circular-progress circle.bg {
stroke: transparent;
}
#circular-progress circle.fg {
transform: rotate(-90deg);
transform-origin: var(--half-size) var(--half-size);
stroke-dasharray: var(--dash) calc(var(--circumference) - var(--dash));
transition: stroke-dasharray 0.3s linear 0s;
stroke: var(--zen-branding-coral);
}
#colorListWrapper {
display: flex;
align-items: center;
}
#colorListWrapper > div {
border-radius: 999px;
height: 20px;
width: 20px;
border: 3px solid transparent;
margin: 0 5px;
}
#colorListWrapper > div.selected {
border: 3px solid light-dark(#000, #fff);
}
#welcome,
#thanks {
justify-content: center;
}
#themeList {
display: flex;
flex-wrap: nowrap;
}
#themeList > svg {
border: 3px solid transparent;
border-radius: 15px;
height: -moz-available;
}
#themeList > svg.selected {
border: 3px solid var(--zen-colors-primary);
}
#searchList.cardGroup {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 15px;
}
#searchList .card {
width: -moz-available !important;
margin: 0;
display: flex;
flex-direction: row;
border-radius: 15px;
& h3 {
text-align: start;
margin: 0;
margin-left: 20px;
}
&.selected {
transform: scale(1.01);
}
& img {
width: 30px;
height: 30px;
border-radius: 15px;
}
}

View File

@@ -1,186 +0,0 @@
<!--
This Source Code Form is subject to the terms of the Mozilla Public
License, v. 2.0. If a copy of the MPL was not distributed with this
file, You can obtain one at http://mozilla.org/MPL/2.0/.
-->
<!DOCTYPE html>
<html lang="en">
<head>
<meta name="color-scheme" content="light dark">
<meta name="referrer" content="no-referrer" />
<linkset>
<link
rel="stylesheet"
type="text/css"
href="chrome://global/skin/in-content/common.css"
/>
<link rel="stylesheet" href="chrome://global/skin/global.css" />
<link
rel="stylesheet"
href="chrome://browser/content/zen-welcome/welcome.css"
/>
<link
rel="stylesheet"
href="chrome://browser/content/zen-styles/zen-branding.css"
/>
<link rel="localization" href="branding/brand.ftl" />
<link rel="localization" href="browser/zen-welcome.ftl" />
</linkset>
<script src="chrome://browser/content/zenThemeModifier.js"></script>
</head>
<body class="gradient-background">
<img id="zen-logo" src="chrome://branding/content/about-logo.png" />
<div id="main-view">
<div class="page" id="welcome">
<h1 class="zen-branding-title" data-l10n-id="welcome-dialog-welcome-title-part-1"></h1>
<h1 class="zen-branding-title" data-l10n-id="welcome-dialog-welcome-title-part-2"></h1>
</div>
<div class="page page-split" id="import">
<div>
<h1 data-l10n-id="welcome-dialog-import"></h1>
<p data-l10n-id="welcome-dialog-import-subtext"></p>
</div>
<button
id="importBrowser"
data-l10n-id="welcome-dialog-import-action"
></button>
</div>
<div class="page page-split" id="theme">
<div>
<h1 data-l10n-id="welcome-dialog-theme"></h1>
<p data-l10n-id="welcome-dialog-theme-subtext"></p>
</div>
<div>
<h2 data-l10n-id="welcome-dialog-theme-header-1" class="delay-animation"></h2>
<div id="colorListWrapper" class="delay-animation">
</div>
<h2 data-l10n-id="welcome-dialog-theme-header-2" class="delay-animation"></h2>
<div id="themeList" class="cardGroup">
<svg viewBox="0 0 700 700" fill="none" xmlns="http://www.w3.org/2000/svg" class="delay-animation-2">
<g clip-path="url(#clip0_404_2706)">
<rect width="700" height="700" fill="#F4F4F4"/>
<g filter="url(#filter0_d_404_2706)">
<path d="M107 130C107 103.49 128.49 82 155 82H700V738H107V130Z" fill="white"/>
<path d="M155 82.5H699.5V737.5H107.5V130C107.5 103.766 128.766 82.5 155 82.5Z" stroke="black" stroke-opacity="0.2"/>
</g>
<mask id="path-3-inside-1_404_2706" fill="white">
<path d="M257 83H700V701H257V83Z"/>
</mask>
<path d="M257 83H700V701H257V83Z" fill="#F1F1F1"/>
<path d="M258 701V83H256V701H258Z" fill="black" fill-opacity="0.1" mask="url(#path-3-inside-1_404_2706)"/>
</g>
<defs>
<filter id="filter0_d_404_2706" x="103" y="82" width="601" height="664" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="4"/>
<feGaussianBlur stdDeviation="2"/>
<feComposite in2="hardAlpha" operator="out"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0"/>
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_404_2706"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_404_2706" result="shape"/>
</filter>
<clipPath id="clip0_404_2706">
<rect width="700" height="700" fill="white"/>
</clipPath>
</defs>
</svg>
<svg viewBox="0 0 700 700" fill="none" xmlns="http://www.w3.org/2000/svg" class="delay-animation-2">
<g clip-path="url(#clip0_404_2709)">
<rect width="700" height="700" fill="#515151"/>
<g filter="url(#filter0_d_404_2709)">
<path d="M107 130C107 103.49 128.49 82 155 82H700V727H107V130Z" fill="#717171"/>
<path d="M155 82.5H699.5V726.5H107.5V130C107.5 103.766 128.766 82.5 155 82.5Z" stroke="white" stroke-opacity="0.57"/>
</g>
<mask id="path-3-inside-1_404_2709" fill="white">
<path d="M257 83H700V701H257V83Z"/>
</mask>
<path d="M257 83H700V701H257V83Z" fill="#565656"/>
<path d="M258 701V83H256V701H258Z" fill="black" fill-opacity="0.1" mask="url(#path-3-inside-1_404_2709)"/>
</g>
<defs>
<filter id="filter0_d_404_2709" x="103" y="82" width="601" height="653" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="4"/>
<feGaussianBlur stdDeviation="2"/>
<feComposite in2="hardAlpha" operator="out"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0"/>
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_404_2709"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_404_2709" result="shape"/>
</filter>
<clipPath id="clip0_404_2709">
<rect width="700" height="700" fill="white"/>
</clipPath>
</defs>
</svg>
</div>
</div>
</div>
<div class="page page-split" id="layout">
<div>
<h1 data-l10n-id="welcome-dialog-layout"></h1>
<p data-l10n-id="welcome-dialog-layout-subtext"></p>
</div>
<div id="layoutList" class="cardGroup">
<hbox layout="single" class="selected delay-animation">
<img src="chrome://browser/content/zen-images/layouts/single-toolbar.png" />
<p data-l10n-id="welcome-dialog-layout-single-toolbar"></p>
</hbox>
<hbox layout="multiple" class="delay-animation">
<img src="chrome://browser/content/zen-images/layouts/multiple-toolbar.png" />
<p data-l10n-id="welcome-dialog-layout-multiple-toolbar"></p>
</hbox>
<hbox layout="collapsed" class="delay-animation">
<img src="chrome://browser/content/zen-images/layouts/collapsed.png" />
<p data-l10n-id="welcome-dialog-layout-collapsed-toolbar"></p>
</hbox>
</div>
</div>
<div class="page page-split" id="search">
<div>
<h1 data-l10n-id="welcome-dialog-search"></h1>
<p data-l10n-id="welcome-dialog-search-subtext"></p>
</div>
<div>
<div id="searchList" class="cardGroup"></div>
</div>
</div>
<div class="page" id="thanks">
<h1 class="zen-branding-title" data-l10n-id="welcome-dialog-thanks-title-part-1"></h1>
<h1 class="zen-branding-title" data-l10n-id="welcome-dialog-thanks-title-part-2"></h1>
</div>
<div id="buttons-footer">
<button
id="back"
data-l10n-id="welcome-dialog-back-action"
disabled
></button>
<button
id="next"
class="primary"
data-l10n-id="welcome-dialog-next-action"
></button>
</div>
</div>
<svg
width="250" height="250" viewBox="0 0 250 250"
id="circular-progress" style="--progress: 50"
>
<circle class="bg"></circle>
<circle class="fg"></circle>
</svg>
<script src="./welcome.js"></script>
<script src="chrome://browser/content/contentTheme.js"></script>
</body>
</html>

View File

@@ -1,354 +0,0 @@
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
const { XPCOMUtils } = ChromeUtils.import('resource://gre/modules/XPCOMUtils.jsm');
XPCOMUtils.defineLazyModuleGetters(this, {
AddonManager: 'resource://gre/modules/AddonManager.jsm',
MigrationUtils: 'resource:///modules/MigrationUtils.jsm',
});
ChromeUtils.defineModuleGetter(this, 'ExtensionSettingsStore', 'resource://gre/modules/ExtensionSettingsStore.jsm');
Services.scriptloader.loadSubScript('chrome://browser/content/ZenUIManager.mjs');
const kWelcomeSeenPref = 'zen.welcome-screen.seen';
// =============================================================================
// Util stuff copied from browser/components/preferences/search.js
class EngineStore {
constructor() {
this._engines = [];
}
async init() {
const visibleEngines = await Services.search.getVisibleEngines();
this.initSpecificEngine(visibleEngines);
}
getEngine() {
return this._engines;
}
initSpecificEngine(engines) {
for (const engine of engines) {
try {
this._engines.push(this._cloneEngine(engine));
} catch (e) {
// Ignore engines that throw an exception when cloning.
console.error(e);
}
}
}
getEngineByName(name) {
return this._engines.find((engine) => engine.name == name);
}
_cloneEngine(aEngine) {
const clonedObj = {};
for (const i of ['name', 'alias', '_iconURI', 'hidden']) {
clonedObj[i] = aEngine[i];
}
clonedObj.originalEngine = aEngine;
return clonedObj;
}
async getDefaultEngine() {
let engineName = await Services.search.getDefault();
return this.getEngineByName(engineName._name);
}
async setDefaultEngine(engine) {
await Services.search.setDefault(engine.originalEngine, Ci.nsISearchService.CHANGE_REASON_USER);
}
}
// =============================================================================
const sleep = (duration) => new Promise((resolve) => setTimeout(resolve, duration));
class Page {
/**
* A basic controller for individual pages
* @param {string} id The id of the element that represents this page.
*/
constructor(id) {
this.element = document.getElementById(id);
}
/**
*
* @param {Pages} pages The pages wrapper
*/
setPages(pages) {
this.pages = pages;
}
hide() {
this.element.setAttribute('hidden', 'true');
}
show() {
this.element.removeAttribute('hidden');
}
}
class Themes extends Page {
constructor(id) {
super(id);
this.loadThemes();
}
async loadThemes() {
window.addEventListener('DOMContentLoaded', this.setColorBar);
await sleep(1000);
const themes = (await AddonManager.getAddonsByTypes(['theme'])).filter((theme) => theme.id !== 'default-theme@mozilla.org');
const themeList = document.getElementById('themeList');
const themeElements = ['firefox-compact-light@mozilla.org', 'firefox-compact-dark@mozilla.org'];
themeElements.forEach((theme, i) => {
let container = themeList.children[i];
container.addEventListener(
'click',
(() => {
if (container.hasAttribute('disabled')) {
return;
}
for (const el of themeList.children) {
el.classList.remove('selected');
}
container.classList.add('selected');
themes.find((t) => t.id === theme).enable();
}).bind(this, i, container, theme)
);
if (themes.find((t) => t.id === theme).isActive) {
container.classList.add('selected');
}
});
}
setColorBar() {
const colorList = document.getElementById('colorListWrapper');
const colors = ['#aac7ff', '#74d7cb', '#a0d490', '#dec663', '#ffb787', '#ffb1c0', '#ddbfc3', '#f6b0ea', '#d4bbff'];
colors.forEach((color) => {
const container = document.createElement('div');
container.classList.add('color');
container.style.backgroundColor = color;
container.setAttribute('data-color', color);
container.addEventListener(
'click',
(() => {
Services.prefs.setStringPref('zen.theme.accent-color', color);
colorList.querySelectorAll('.selected').forEach((el) => el.classList.remove('selected'));
container.classList.add('selected');
}).bind(this, color, container)
);
colorList.appendChild(container);
});
}
}
class Layout extends Page {
constructor(id) {
super(id);
this.loadLayouts();
}
loadLayouts() {
const kExtendedSidebar = 'zen.view.sidebar-expanded';
const kSingleToolbar = 'zen.view.use-single-toolbar';
for (const layout of document.getElementById('layoutList').children) {
layout.addEventListener('click', () => {
if (layout.hasAttribute('disabled')) {
return;
}
for (const el of document.getElementById('layoutList').children) {
el.classList.remove('selected');
}
layout.classList.add('selected');
Services.prefs.setBoolPref(kExtendedSidebar, layout.getAttribute('layout') != 'collapsed');
Services.prefs.setBoolPref(kSingleToolbar, layout.getAttribute('layout') == 'single');
});
}
}
}
class Thanks extends Page {
constructor(id) {
super(id);
// Thanks :)
}
}
class Search extends Page {
constructor(id) {
super(id);
this.store = new EngineStore();
this.searchList = [];
this.loadSearch();
}
async loadSearch() {
await sleep(1100);
await this.store.init();
const defaultEngine = await Services.search.getDefault();
const searchElements = document.getElementById('searchList');
this.store.getEngine().forEach(async (search) => {
const container = await this.loadSpecificSearch(search, defaultEngine);
searchElements.appendChild(container);
this.searchList.push(container);
});
}
/**
* @returns {HTMLDivElement}
*/
async loadSpecificSearch(search, defaultSearch) {
const container = document.createElement('div');
container.classList.add('card');
container.classList.add('card-no-hover');
if (search.name == defaultSearch._name) {
container.classList.add('selected');
}
container.addEventListener('click', () => {
this.searchList.forEach((el) => el.classList.remove('selected'));
container.classList.add('selected');
this.store.setDefaultEngine(search);
});
const img = document.createElement('img');
img.src = await search.originalEngine.getIconURL();
const name = document.createElement('h3');
name.textContent = search.name;
container.appendChild(img);
container.appendChild(name);
return container;
}
}
class Import extends Page {
constructor(id) {
super(id);
const importButton = document.getElementById('importBrowser');
importButton.addEventListener('click', async () => {
MigrationUtils.showMigrationWizard(window, {
zenBlocking: true,
});
});
}
}
class Pages {
/**
* A wrapper around all pages
* @param {Page[]} pages The pages
*/
constructor(pages) {
this.pages = pages;
this.currentPage = 0;
this.pages.forEach((page) => page.setPages(this));
this._displayCurrentPage();
this.nextEl = document.getElementById(`next`);
this.prevEl = document.getElementById(`back`);
this.nextEl.addEventListener('click', () => {
this.next();
this.prevEl.removeAttribute('disabled');
});
this.prevEl.addEventListener('click', () => {
this.currentPage--;
this._displayCurrentPage();
if (this.pages.currentPage === 1) {
this.prevEl.setAttribute('disabled', 'true');
}
for (const button of document.getElementById('buttons-footer').children) {
button.style.display = 'none';
// Re-animate the buttons
setTimeout(() => {
button.style.removeProperty('display');
});
}
});
}
next() {
this.currentPage++;
document.getElementById('main-view').setAttribute('data-page', this.currentPage);
if (this.currentPage >= this.pages.length) {
// We can use internal js apis to close the window. We also want to set
// the settings api for welcome seen to false to stop it showing again
Services.prefs.setBoolPref(kWelcomeSeenPref, true);
close();
return;
}
for (const button of document.getElementById('buttons-footer').children) {
button.style.display = 'none';
// Re-animate the buttons
setTimeout(() => {
button.style.removeProperty('display');
});
}
this._displayCurrentPage();
}
_displayCurrentPage() {
let progress = document.getElementById('circular-progress');
progress.style.setProperty('--progress', ((this.currentPage + 1) / this.pages.length) * 100);
for (const page of this.pages) {
page.hide();
}
if (this.currentPage >= 1) {
document.body.classList.remove('gradient-background');
} else {
document.body.classList.add('gradient-background');
}
this.pages[this.currentPage].show();
}
}
const pages = new Pages([
new Page('welcome'),
new Themes('theme'),
new Layout('layout'),
new Import('import'),
new Search('search'),
new Thanks('thanks'),
]);

View File

@@ -1,134 +1,395 @@
skin/classic/browser/zen-icons/accessibility.svg (../shared/zen-icons/accessibility.svg)
skin/classic/browser/zen-icons/add-to-dictionary.svg (../shared/zen-icons/add-to-dictionary.svg)
skin/classic/browser/zen-icons/arrow-down.svg (../shared/zen-icons/arrow-down.svg)
skin/classic/browser/zen-icons/arrow-left.svg (../shared/zen-icons/arrow-left.svg)
skin/classic/browser/zen-icons/arrow-right.svg (../shared/zen-icons/arrow-right.svg)
skin/classic/browser/zen-icons/arrow-up.svg (../shared/zen-icons/arrow-up.svg)
skin/classic/browser/zen-icons/audio-save.svg (../shared/zen-icons/audio-save.svg)
skin/classic/browser/zen-icons/autoplay-media-blocked.svg (../shared/zen-icons/autoplay-media-blocked.svg)
skin/classic/browser/zen-icons/autoplay-media.svg (../shared/zen-icons/autoplay-media.svg)
skin/classic/browser/zen-icons/back.svg (../shared/zen-icons/back.svg)
skin/classic/browser/zen-icons/bookmark-hollow.svg (../shared/zen-icons/bookmark-hollow.svg)
skin/classic/browser/zen-icons/bookmark-star-on-tray.svg (../shared/zen-icons/bookmark-star-on-tray.svg)
skin/classic/browser/zen-icons/bookmark.svg (../shared/zen-icons/bookmark.svg)
skin/classic/browser/zen-icons/camera-blocked.svg (../shared/zen-icons/camera-blocked.svg)
skin/classic/browser/zen-icons/camera.svg (../shared/zen-icons/camera.svg)
skin/classic/browser/zen-icons/canvas-blocked.svg (../shared/zen-icons/canvas-blocked.svg)
skin/classic/browser/zen-icons/canvas.svg (../shared/zen-icons/canvas.svg)
skin/classic/browser/zen-icons/checkmark.svg (../shared/zen-icons/checkmark.svg)
skin/classic/browser/zen-icons/chevron.svg (../shared/zen-icons/chevron.svg)
skin/classic/browser/zen-icons/close-all.svg (../shared/zen-icons/close-all.svg)
skin/classic/browser/zen-icons/close.svg (../shared/zen-icons/close.svg)
skin/classic/browser/zen-icons/container-tab.svg (../shared/zen-icons/container-tab.svg)
skin/classic/browser/zen-icons/customize.svg (../shared/zen-icons/customize.svg)
skin/classic/browser/zen-icons/desktop-notification-blocked.svg (../shared/zen-icons/desktop-notification-blocked.svg)
skin/classic/browser/zen-icons/desktop-notification.svg (../shared/zen-icons/desktop-notification.svg)
skin/classic/browser/zen-icons/developer.svg (../shared/zen-icons/developer.svg)
skin/classic/browser/zen-icons/downloads.svg (../shared/zen-icons/downloads.svg)
skin/classic/browser/zen-icons/drag-indicator.svg (../shared/zen-icons/drag-indicator.svg)
skin/classic/browser/zen-icons/duplicate-tab.svg (../shared/zen-icons/duplicate-tab.svg)
skin/classic/browser/zen-icons/edit-copy.svg (../shared/zen-icons/edit-copy.svg)
skin/classic/browser/zen-icons/edit-cut.svg (../shared/zen-icons/edit-cut.svg)
skin/classic/browser/zen-icons/edit-delete.svg (../shared/zen-icons/edit-delete.svg)
skin/classic/browser/zen-icons/edit-paste.svg (../shared/zen-icons/edit-paste.svg)
skin/classic/browser/zen-icons/edit-redo.svg (../shared/zen-icons/edit-redo.svg)
skin/classic/browser/zen-icons/edit-select-all.svg (../shared/zen-icons/edit-select-all.svg)
skin/classic/browser/zen-icons/edit-theme.svg (../shared/zen-icons/edit-theme.svg)
skin/classic/browser/zen-icons/edit-undo.svg (../shared/zen-icons/edit-undo.svg)
skin/classic/browser/zen-icons/edit.svg (../shared/zen-icons/edit.svg)
skin/classic/browser/zen-icons/essential-add.svg (../shared/zen-icons/essential-add.svg)
skin/classic/browser/zen-icons/essential-remove.svg (../shared/zen-icons/essential-remove.svg)
skin/classic/browser/zen-icons/expand-sidebar.svg (../shared/zen-icons/expand-sidebar.svg)
skin/classic/browser/zen-icons/ext-link.svg (../shared/zen-icons/ext-link.svg)
skin/classic/browser/zen-icons/extension-blocked.svg (../shared/zen-icons/extension-blocked.svg)
skin/classic/browser/zen-icons/extension.svg (../shared/zen-icons/extension.svg)
skin/classic/browser/zen-icons/firefox.svg (../shared/zen-icons/firefox.svg)
skin/classic/browser/zen-icons/folder.svg (../shared/zen-icons/folder.svg)
skin/classic/browser/zen-icons/forget.svg (../shared/zen-icons/forget.svg)
skin/classic/browser/zen-icons/forward.svg (../shared/zen-icons/forward.svg)
skin/classic/browser/zen-icons/fullscreen-exit.svg (../shared/zen-icons/fullscreen-exit.svg)
skin/classic/browser/zen-icons/fullscreen.svg (../shared/zen-icons/fullscreen.svg)
skin/classic/browser/zen-icons/geo-blocked.svg (../shared/zen-icons/geo-blocked.svg)
skin/classic/browser/zen-icons/geo.svg (../shared/zen-icons/geo.svg)
skin/classic/browser/zen-icons/help.svg (../shared/zen-icons/help.svg)
skin/classic/browser/zen-icons/history.svg (../shared/zen-icons/history.svg)
skin/classic/browser/zen-icons/home.svg (../shared/zen-icons/home.svg)
skin/classic/browser/zen-icons/icons.css (../shared/zen-icons/icons.css)
skin/classic/browser/zen-icons/image-copy.svg (../shared/zen-icons/image-copy.svg)
skin/classic/browser/zen-icons/image-open.svg (../shared/zen-icons/image-open.svg)
skin/classic/browser/zen-icons/image-save.svg (../shared/zen-icons/image-save.svg)
skin/classic/browser/zen-icons/info.svg (../shared/zen-icons/info.svg)
skin/classic/browser/zen-icons/inspect.svg (../shared/zen-icons/inspect.svg)
skin/classic/browser/zen-icons/jar.inc.mn (../shared/zen-icons/jar.inc.mn)
skin/classic/browser/zen-icons/library.svg (../shared/zen-icons/library.svg)
skin/classic/browser/zen-icons/link.svg (../shared/zen-icons/link.svg)
skin/classic/browser/zen-icons/mail.svg (../shared/zen-icons/mail.svg)
skin/classic/browser/zen-icons/manage.svg (../shared/zen-icons/manage.svg)
skin/classic/browser/zen-icons/media-loop.svg (../shared/zen-icons/media-loop.svg)
skin/classic/browser/zen-icons/media-mute.svg (../shared/zen-icons/media-mute.svg)
skin/classic/browser/zen-icons/media-pause.svg (../shared/zen-icons/media-pause.svg)
skin/classic/browser/zen-icons/media-pip.svg (../shared/zen-icons/media-pip.svg)
skin/classic/browser/zen-icons/media-play.svg (../shared/zen-icons/media-play.svg)
skin/classic/browser/zen-icons/media-speed.svg (../shared/zen-icons/media-speed.svg)
skin/classic/browser/zen-icons/media-unmute.svg (../shared/zen-icons/media-unmute.svg)
skin/classic/browser/zen-icons/menu-bar.svg (../shared/zen-icons/menu-bar.svg)
skin/classic/browser/zen-icons/menu.svg (../shared/zen-icons/menu.svg)
skin/classic/browser/zen-icons/microphone-blocked.svg (../shared/zen-icons/microphone-blocked.svg)
skin/classic/browser/zen-icons/microphone.svg (../shared/zen-icons/microphone.svg)
skin/classic/browser/zen-icons/midi.svg (../shared/zen-icons/midi.svg)
skin/classic/browser/zen-icons/move-tab.svg (../shared/zen-icons/move-tab.svg)
skin/classic/browser/zen-icons/new-tab-image.svg (../shared/zen-icons/new-tab-image.svg)
skin/classic/browser/zen-icons/nucleo-copyright-notice.html (../shared/zen-icons/nucleo-copyright-notice.html)
skin/classic/browser/zen-icons/open.svg (../shared/zen-icons/open.svg)
skin/classic/browser/zen-icons/page-portrait.svg (../shared/zen-icons/page-portrait.svg)
skin/classic/browser/zen-icons/passwords.svg (../shared/zen-icons/passwords.svg)
skin/classic/browser/zen-icons/paste-and-go.svg (../shared/zen-icons/paste-and-go.svg)
skin/classic/browser/zen-icons/permissions.svg (../shared/zen-icons/permissions.svg)
skin/classic/browser/zen-icons/persistent-storage-blocked.svg (../shared/zen-icons/persistent-storage-blocked.svg)
skin/classic/browser/zen-icons/persistent-storage.svg (../shared/zen-icons/persistent-storage.svg)
skin/classic/browser/zen-icons/pin.svg (../shared/zen-icons/pin.svg)
skin/classic/browser/zen-icons/plus.svg (../shared/zen-icons/plus.svg)
skin/classic/browser/zen-icons/pocket-outline.svg (../shared/zen-icons/pocket-outline.svg)
skin/classic/browser/zen-icons/popup.svg (../shared/zen-icons/popup.svg)
skin/classic/browser/zen-icons/print.svg (../shared/zen-icons/print.svg)
skin/classic/browser/zen-icons/private-window.svg (../shared/zen-icons/private-window.svg)
skin/classic/browser/zen-icons/privateBrowsing.svg (../shared/zen-icons/privateBrowsing.svg)
skin/classic/browser/zen-icons/reader-mode.svg (../shared/zen-icons/reader-mode.svg)
skin/classic/browser/zen-icons/reload-to-stop.svg (../shared/zen-icons/reload-to-stop.svg)
skin/classic/browser/zen-icons/reload.svg (../shared/zen-icons/reload.svg)
skin/classic/browser/zen-icons/report.svg (../shared/zen-icons/report.svg)
skin/classic/browser/zen-icons/save.svg (../shared/zen-icons/save.svg)
skin/classic/browser/zen-icons/screen-blocked.svg (../shared/zen-icons/screen-blocked.svg)
skin/classic/browser/zen-icons/screen.svg (../shared/zen-icons/screen.svg)
skin/classic/browser/zen-icons/screenshot.svg (../shared/zen-icons/screenshot.svg)
skin/classic/browser/zen-icons/search-glass.svg (../shared/zen-icons/search-glass.svg)
skin/classic/browser/zen-icons/search-page.svg (../shared/zen-icons/search-page.svg)
skin/classic/browser/zen-icons/security-broken.svg (../shared/zen-icons/security-broken.svg)
skin/classic/browser/zen-icons/security-warning.svg (../shared/zen-icons/security-warning.svg)
skin/classic/browser/zen-icons/security.svg (../shared/zen-icons/security.svg)
skin/classic/browser/zen-icons/send-to-device.svg (../shared/zen-icons/send-to-device.svg)
skin/classic/browser/zen-icons/settings.svg (../shared/zen-icons/settings.svg)
skin/classic/browser/zen-icons/share.svg (../shared/zen-icons/share.svg)
skin/classic/browser/zen-icons/sidebar.svg (../shared/zen-icons/sidebar.svg)
skin/classic/browser/zen-icons/sidebars-right.svg (../shared/zen-icons/sidebars-right.svg)
skin/classic/browser/zen-icons/source-code.svg (../shared/zen-icons/source-code.svg)
skin/classic/browser/zen-icons/spell-check.svg (../shared/zen-icons/spell-check.svg)
skin/classic/browser/zen-icons/split.svg (../shared/zen-icons/split.svg)
skin/classic/browser/zen-icons/stop-to-reload.svg (../shared/zen-icons/stop-to-reload.svg)
skin/classic/browser/zen-icons/tab-audio-blocked-small.svg (../shared/zen-icons/tab-audio-blocked-small.svg)
skin/classic/browser/zen-icons/tab-audio-muted-small.svg (../shared/zen-icons/tab-audio-muted-small.svg)
skin/classic/browser/zen-icons/tab-audio-playing-small.svg (../shared/zen-icons/tab-audio-playing-small.svg)
skin/classic/browser/zen-icons/tab.svg (../shared/zen-icons/tab.svg)
skin/classic/browser/zen-icons/tool-profiler.svg (../shared/zen-icons/tool-profiler.svg)
skin/classic/browser/zen-icons/tracking-protection.svg (../shared/zen-icons/tracking-protection.svg)
skin/classic/browser/zen-icons/translations.svg (../shared/zen-icons/translations.svg)
skin/classic/browser/zen-icons/unpin.svg (../shared/zen-icons/unpin.svg)
skin/classic/browser/zen-icons/update-resources.sh (../shared/zen-icons/update-resources.sh)
skin/classic/browser/zen-icons/video-open.svg (../shared/zen-icons/video-open.svg)
skin/classic/browser/zen-icons/video-save.svg (../shared/zen-icons/video-save.svg)
skin/classic/browser/zen-icons/window.svg (../shared/zen-icons/window.svg)
skin/classic/browser/zen-icons/xr-blocked.svg (../shared/zen-icons/xr-blocked.svg)
skin/classic/browser/zen-icons/xr.svg (../shared/zen-icons/xr.svg)
skin/classic/browser/zen-icons/zoom-control.svg (../shared/zen-icons/zoom-control.svg)
skin/classic/browser/zen-icons/zoom-out.svg (../shared/zen-icons/zoom-out.svg)
#ifdef XP_WIN
skin/classic/browser/zen-icons/accessibility.svg (../shared/zen-icons/win/accessibility.svg)
skin/classic/browser/zen-icons/add-to-dictionary.svg (../shared/zen-icons/win/add-to-dictionary.svg)
skin/classic/browser/zen-icons/arrow-down.svg (../shared/zen-icons/win/arrow-down.svg)
skin/classic/browser/zen-icons/arrow-left.svg (../shared/zen-icons/win/arrow-left.svg)
skin/classic/browser/zen-icons/arrow-right.svg (../shared/zen-icons/win/arrow-right.svg)
skin/classic/browser/zen-icons/arrow-up.svg (../shared/zen-icons/win/arrow-up.svg)
skin/classic/browser/zen-icons/audio-save.svg (../shared/zen-icons/win/audio-save.svg)
skin/classic/browser/zen-icons/autoplay-media-blocked.svg (../shared/zen-icons/win/autoplay-media-blocked.svg)
skin/classic/browser/zen-icons/autoplay-media.svg (../shared/zen-icons/win/autoplay-media.svg)
skin/classic/browser/zen-icons/back.svg (../shared/zen-icons/win/back.svg)
skin/classic/browser/zen-icons/bookmark-hollow.svg (../shared/zen-icons/win/bookmark-hollow.svg)
skin/classic/browser/zen-icons/bookmark-star-on-tray.svg (../shared/zen-icons/win/bookmark-star-on-tray.svg)
skin/classic/browser/zen-icons/bookmark.svg (../shared/zen-icons/win/bookmark.svg)
skin/classic/browser/zen-icons/camera-blocked.svg (../shared/zen-icons/win/camera-blocked.svg)
skin/classic/browser/zen-icons/camera.svg (../shared/zen-icons/win/camera.svg)
skin/classic/browser/zen-icons/canvas-blocked.svg (../shared/zen-icons/win/canvas-blocked.svg)
skin/classic/browser/zen-icons/canvas.svg (../shared/zen-icons/win/canvas.svg)
skin/classic/browser/zen-icons/checkmark.svg (../shared/zen-icons/win/checkmark.svg)
skin/classic/browser/zen-icons/chevron.svg (../shared/zen-icons/win/chevron.svg)
skin/classic/browser/zen-icons/close-all.svg (../shared/zen-icons/win/close-all.svg)
skin/classic/browser/zen-icons/close.svg (../shared/zen-icons/win/close.svg)
skin/classic/browser/zen-icons/container-tab.svg (../shared/zen-icons/win/container-tab.svg)
skin/classic/browser/zen-icons/customize.svg (../shared/zen-icons/win/customize.svg)
skin/classic/browser/zen-icons/desktop-notification-blocked.svg (../shared/zen-icons/win/desktop-notification-blocked.svg)
skin/classic/browser/zen-icons/desktop-notification.svg (../shared/zen-icons/win/desktop-notification.svg)
skin/classic/browser/zen-icons/developer.svg (../shared/zen-icons/win/developer.svg)
skin/classic/browser/zen-icons/downloads.svg (../shared/zen-icons/win/downloads.svg)
skin/classic/browser/zen-icons/drag-indicator.svg (../shared/zen-icons/win/drag-indicator.svg)
skin/classic/browser/zen-icons/duplicate-tab.svg (../shared/zen-icons/win/duplicate-tab.svg)
skin/classic/browser/zen-icons/edit-copy.svg (../shared/zen-icons/win/edit-copy.svg)
skin/classic/browser/zen-icons/edit-cut.svg (../shared/zen-icons/win/edit-cut.svg)
skin/classic/browser/zen-icons/edit-delete.svg (../shared/zen-icons/win/edit-delete.svg)
skin/classic/browser/zen-icons/edit-paste.svg (../shared/zen-icons/win/edit-paste.svg)
skin/classic/browser/zen-icons/edit-redo.svg (../shared/zen-icons/win/edit-redo.svg)
skin/classic/browser/zen-icons/edit-select-all.svg (../shared/zen-icons/win/edit-select-all.svg)
skin/classic/browser/zen-icons/edit-theme.svg (../shared/zen-icons/win/edit-theme.svg)
skin/classic/browser/zen-icons/edit-undo.svg (../shared/zen-icons/win/edit-undo.svg)
skin/classic/browser/zen-icons/edit.svg (../shared/zen-icons/win/edit.svg)
skin/classic/browser/zen-icons/essential-add.svg (../shared/zen-icons/win/essential-add.svg)
skin/classic/browser/zen-icons/essential-remove.svg (../shared/zen-icons/win/essential-remove.svg)
skin/classic/browser/zen-icons/expand-sidebar.svg (../shared/zen-icons/win/expand-sidebar.svg)
skin/classic/browser/zen-icons/ext-link.svg (../shared/zen-icons/win/ext-link.svg)
skin/classic/browser/zen-icons/extension-blocked.svg (../shared/zen-icons/win/extension-blocked.svg)
skin/classic/browser/zen-icons/extension.svg (../shared/zen-icons/win/extension.svg)
skin/classic/browser/zen-icons/folder.svg (../shared/zen-icons/win/folder.svg)
skin/classic/browser/zen-icons/forget.svg (../shared/zen-icons/win/forget.svg)
skin/classic/browser/zen-icons/forward.svg (../shared/zen-icons/win/forward.svg)
skin/classic/browser/zen-icons/fullscreen-exit.svg (../shared/zen-icons/win/fullscreen-exit.svg)
skin/classic/browser/zen-icons/fullscreen.svg (../shared/zen-icons/win/fullscreen.svg)
skin/classic/browser/zen-icons/geo-blocked.svg (../shared/zen-icons/win/geo-blocked.svg)
skin/classic/browser/zen-icons/geo.svg (../shared/zen-icons/win/geo.svg)
skin/classic/browser/zen-icons/help.svg (../shared/zen-icons/win/help.svg)
skin/classic/browser/zen-icons/history.svg (../shared/zen-icons/win/history.svg)
skin/classic/browser/zen-icons/home.svg (../shared/zen-icons/win/home.svg)
skin/classic/browser/zen-icons/image-copy.svg (../shared/zen-icons/win/image-copy.svg)
skin/classic/browser/zen-icons/image-open.svg (../shared/zen-icons/win/image-open.svg)
skin/classic/browser/zen-icons/image-save.svg (../shared/zen-icons/win/image-save.svg)
skin/classic/browser/zen-icons/info.svg (../shared/zen-icons/win/info.svg)
skin/classic/browser/zen-icons/inspect.svg (../shared/zen-icons/win/inspect.svg)
skin/classic/browser/zen-icons/library.svg (../shared/zen-icons/win/library.svg)
skin/classic/browser/zen-icons/link.svg (../shared/zen-icons/win/link.svg)
skin/classic/browser/zen-icons/mail.svg (../shared/zen-icons/win/mail.svg)
skin/classic/browser/zen-icons/manage.svg (../shared/zen-icons/win/manage.svg)
skin/classic/browser/zen-icons/media-loop.svg (../shared/zen-icons/win/media-loop.svg)
skin/classic/browser/zen-icons/media-mute.svg (../shared/zen-icons/win/media-mute.svg)
skin/classic/browser/zen-icons/media-pause.svg (../shared/zen-icons/win/media-pause.svg)
skin/classic/browser/zen-icons/media-pip.svg (../shared/zen-icons/win/media-pip.svg)
skin/classic/browser/zen-icons/media-play.svg (../shared/zen-icons/win/media-play.svg)
skin/classic/browser/zen-icons/media-speed.svg (../shared/zen-icons/win/media-speed.svg)
skin/classic/browser/zen-icons/media-unmute.svg (../shared/zen-icons/win/media-unmute.svg)
skin/classic/browser/zen-icons/menu-bar.svg (../shared/zen-icons/win/menu-bar.svg)
skin/classic/browser/zen-icons/menu.svg (../shared/zen-icons/win/menu.svg)
skin/classic/browser/zen-icons/microphone-blocked.svg (../shared/zen-icons/win/microphone-blocked.svg)
skin/classic/browser/zen-icons/microphone.svg (../shared/zen-icons/win/microphone.svg)
skin/classic/browser/zen-icons/midi.svg (../shared/zen-icons/win/midi.svg)
skin/classic/browser/zen-icons/move-tab.svg (../shared/zen-icons/win/move-tab.svg)
skin/classic/browser/zen-icons/new-tab-image.svg (../shared/zen-icons/win/new-tab-image.svg)
skin/classic/browser/zen-icons/open.svg (../shared/zen-icons/win/open.svg)
skin/classic/browser/zen-icons/page-portrait.svg (../shared/zen-icons/win/page-portrait.svg)
skin/classic/browser/zen-icons/palette.svg (../shared/zen-icons/win/palette.svg)
skin/classic/browser/zen-icons/passwords.svg (../shared/zen-icons/win/passwords.svg)
skin/classic/browser/zen-icons/paste-and-go.svg (../shared/zen-icons/win/paste-and-go.svg)
skin/classic/browser/zen-icons/permissions.svg (../shared/zen-icons/win/permissions.svg)
skin/classic/browser/zen-icons/persistent-storage-blocked.svg (../shared/zen-icons/win/persistent-storage-blocked.svg)
skin/classic/browser/zen-icons/persistent-storage.svg (../shared/zen-icons/win/persistent-storage.svg)
skin/classic/browser/zen-icons/pin.svg (../shared/zen-icons/win/pin.svg)
skin/classic/browser/zen-icons/plus.svg (../shared/zen-icons/win/plus.svg)
skin/classic/browser/zen-icons/popup.svg (../shared/zen-icons/win/popup.svg)
skin/classic/browser/zen-icons/print.svg (../shared/zen-icons/win/print.svg)
skin/classic/browser/zen-icons/private-window.svg (../shared/zen-icons/win/private-window.svg)
skin/classic/browser/zen-icons/privateBrowsing.svg (../shared/zen-icons/win/privateBrowsing.svg)
skin/classic/browser/zen-icons/reader-mode.svg (../shared/zen-icons/win/reader-mode.svg)
skin/classic/browser/zen-icons/reload-to-stop.svg (../shared/zen-icons/win/reload-to-stop.svg)
skin/classic/browser/zen-icons/reload.svg (../shared/zen-icons/win/reload.svg)
skin/classic/browser/zen-icons/report.svg (../shared/zen-icons/win/report.svg)
skin/classic/browser/zen-icons/save.svg (../shared/zen-icons/win/save.svg)
skin/classic/browser/zen-icons/screen-blocked.svg (../shared/zen-icons/win/screen-blocked.svg)
skin/classic/browser/zen-icons/screen.svg (../shared/zen-icons/win/screen.svg)
skin/classic/browser/zen-icons/screenshot.svg (../shared/zen-icons/win/screenshot.svg)
skin/classic/browser/zen-icons/search-glass.svg (../shared/zen-icons/win/search-glass.svg)
skin/classic/browser/zen-icons/search-page.svg (../shared/zen-icons/win/search-page.svg)
skin/classic/browser/zen-icons/security-broken.svg (../shared/zen-icons/win/security-broken.svg)
skin/classic/browser/zen-icons/security-warning.svg (../shared/zen-icons/win/security-warning.svg)
skin/classic/browser/zen-icons/security.svg (../shared/zen-icons/win/security.svg)
skin/classic/browser/zen-icons/send-to-device.svg (../shared/zen-icons/win/send-to-device.svg)
skin/classic/browser/zen-icons/settings.svg (../shared/zen-icons/win/settings.svg)
skin/classic/browser/zen-icons/share.svg (../shared/zen-icons/win/share.svg)
skin/classic/browser/zen-icons/sidebar.svg (../shared/zen-icons/win/sidebar.svg)
skin/classic/browser/zen-icons/sidebars-right.svg (../shared/zen-icons/win/sidebars-right.svg)
skin/classic/browser/zen-icons/source-code.svg (../shared/zen-icons/win/source-code.svg)
skin/classic/browser/zen-icons/spell-check.svg (../shared/zen-icons/win/spell-check.svg)
skin/classic/browser/zen-icons/split.svg (../shared/zen-icons/win/split.svg)
skin/classic/browser/zen-icons/stop-to-reload.svg (../shared/zen-icons/win/stop-to-reload.svg)
skin/classic/browser/zen-icons/tab-audio-blocked-small.svg (../shared/zen-icons/win/tab-audio-blocked-small.svg)
skin/classic/browser/zen-icons/tab-audio-muted-small.svg (../shared/zen-icons/win/tab-audio-muted-small.svg)
skin/classic/browser/zen-icons/tab-audio-playing-small.svg (../shared/zen-icons/win/tab-audio-playing-small.svg)
skin/classic/browser/zen-icons/tab.svg (../shared/zen-icons/win/tab.svg)
skin/classic/browser/zen-icons/tracking-protection.svg (../shared/zen-icons/win/tracking-protection.svg)
skin/classic/browser/zen-icons/translations.svg (../shared/zen-icons/win/translations.svg)
skin/classic/browser/zen-icons/unpin.svg (../shared/zen-icons/win/unpin.svg)
skin/classic/browser/zen-icons/video-open.svg (../shared/zen-icons/win/video-open.svg)
skin/classic/browser/zen-icons/video-save.svg (../shared/zen-icons/win/video-save.svg)
skin/classic/browser/zen-icons/window.svg (../shared/zen-icons/win/window.svg)
skin/classic/browser/zen-icons/xr-blocked.svg (../shared/zen-icons/win/xr-blocked.svg)
skin/classic/browser/zen-icons/xr.svg (../shared/zen-icons/win/xr.svg)
skin/classic/browser/zen-icons/zoom-control.svg (../shared/zen-icons/win/zoom-control.svg)
skin/classic/browser/zen-icons/zoom-out.svg (../shared/zen-icons/win/zoom-out.svg)
#endif
#ifdef XP_MACOSX
skin/classic/browser/zen-icons/accessibility.svg (../shared/zen-icons/lin/accessibility.svg)
skin/classic/browser/zen-icons/add-to-dictionary.svg (../shared/zen-icons/lin/add-to-dictionary.svg)
skin/classic/browser/zen-icons/arrow-down.svg (../shared/zen-icons/lin/arrow-down.svg)
skin/classic/browser/zen-icons/arrow-left.svg (../shared/zen-icons/lin/arrow-left.svg)
skin/classic/browser/zen-icons/arrow-right.svg (../shared/zen-icons/lin/arrow-right.svg)
skin/classic/browser/zen-icons/arrow-up.svg (../shared/zen-icons/lin/arrow-up.svg)
skin/classic/browser/zen-icons/audio-save.svg (../shared/zen-icons/lin/audio-save.svg)
skin/classic/browser/zen-icons/autoplay-media-blocked.svg (../shared/zen-icons/lin/autoplay-media-blocked.svg)
skin/classic/browser/zen-icons/autoplay-media.svg (../shared/zen-icons/lin/autoplay-media.svg)
skin/classic/browser/zen-icons/back.svg (../shared/zen-icons/lin/back.svg)
skin/classic/browser/zen-icons/bookmark-hollow.svg (../shared/zen-icons/lin/bookmark-hollow.svg)
skin/classic/browser/zen-icons/bookmark-star-on-tray.svg (../shared/zen-icons/lin/bookmark-star-on-tray.svg)
skin/classic/browser/zen-icons/bookmark.svg (../shared/zen-icons/lin/bookmark.svg)
skin/classic/browser/zen-icons/camera-blocked.svg (../shared/zen-icons/lin/camera-blocked.svg)
skin/classic/browser/zen-icons/camera.svg (../shared/zen-icons/lin/camera.svg)
skin/classic/browser/zen-icons/canvas-blocked.svg (../shared/zen-icons/lin/canvas-blocked.svg)
skin/classic/browser/zen-icons/canvas.svg (../shared/zen-icons/lin/canvas.svg)
skin/classic/browser/zen-icons/checkmark.svg (../shared/zen-icons/lin/checkmark.svg)
skin/classic/browser/zen-icons/chevron.svg (../shared/zen-icons/lin/chevron.svg)
skin/classic/browser/zen-icons/close-all.svg (../shared/zen-icons/lin/close-all.svg)
skin/classic/browser/zen-icons/close.svg (../shared/zen-icons/lin/close.svg)
skin/classic/browser/zen-icons/container-tab.svg (../shared/zen-icons/lin/container-tab.svg)
skin/classic/browser/zen-icons/customize.svg (../shared/zen-icons/lin/customize.svg)
skin/classic/browser/zen-icons/desktop-notification-blocked.svg (../shared/zen-icons/lin/desktop-notification-blocked.svg)
skin/classic/browser/zen-icons/desktop-notification.svg (../shared/zen-icons/lin/desktop-notification.svg)
skin/classic/browser/zen-icons/developer.svg (../shared/zen-icons/lin/developer.svg)
skin/classic/browser/zen-icons/downloads.svg (../shared/zen-icons/lin/downloads.svg)
skin/classic/browser/zen-icons/drag-indicator.svg (../shared/zen-icons/lin/drag-indicator.svg)
skin/classic/browser/zen-icons/duplicate-tab.svg (../shared/zen-icons/lin/duplicate-tab.svg)
skin/classic/browser/zen-icons/edit-copy.svg (../shared/zen-icons/lin/edit-copy.svg)
skin/classic/browser/zen-icons/edit-cut.svg (../shared/zen-icons/lin/edit-cut.svg)
skin/classic/browser/zen-icons/edit-delete.svg (../shared/zen-icons/lin/edit-delete.svg)
skin/classic/browser/zen-icons/edit-paste.svg (../shared/zen-icons/lin/edit-paste.svg)
skin/classic/browser/zen-icons/edit-redo.svg (../shared/zen-icons/lin/edit-redo.svg)
skin/classic/browser/zen-icons/edit-select-all.svg (../shared/zen-icons/lin/edit-select-all.svg)
skin/classic/browser/zen-icons/edit-theme.svg (../shared/zen-icons/lin/edit-theme.svg)
skin/classic/browser/zen-icons/edit-undo.svg (../shared/zen-icons/lin/edit-undo.svg)
skin/classic/browser/zen-icons/edit.svg (../shared/zen-icons/lin/edit.svg)
skin/classic/browser/zen-icons/essential-add.svg (../shared/zen-icons/lin/essential-add.svg)
skin/classic/browser/zen-icons/essential-remove.svg (../shared/zen-icons/lin/essential-remove.svg)
skin/classic/browser/zen-icons/expand-sidebar.svg (../shared/zen-icons/lin/expand-sidebar.svg)
skin/classic/browser/zen-icons/ext-link.svg (../shared/zen-icons/lin/ext-link.svg)
skin/classic/browser/zen-icons/extension-blocked.svg (../shared/zen-icons/lin/extension-blocked.svg)
skin/classic/browser/zen-icons/extension.svg (../shared/zen-icons/lin/extension.svg)
skin/classic/browser/zen-icons/firefox.svg (../shared/zen-icons/lin/firefox.svg)
skin/classic/browser/zen-icons/folder.svg (../shared/zen-icons/lin/folder.svg)
skin/classic/browser/zen-icons/forget.svg (../shared/zen-icons/lin/forget.svg)
skin/classic/browser/zen-icons/forward.svg (../shared/zen-icons/lin/forward.svg)
skin/classic/browser/zen-icons/fullscreen-exit.svg (../shared/zen-icons/lin/fullscreen-exit.svg)
skin/classic/browser/zen-icons/fullscreen.svg (../shared/zen-icons/lin/fullscreen.svg)
skin/classic/browser/zen-icons/geo-blocked.svg (../shared/zen-icons/lin/geo-blocked.svg)
skin/classic/browser/zen-icons/geo.svg (../shared/zen-icons/lin/geo.svg)
skin/classic/browser/zen-icons/help.svg (../shared/zen-icons/lin/help.svg)
skin/classic/browser/zen-icons/history.svg (../shared/zen-icons/lin/history.svg)
skin/classic/browser/zen-icons/home.svg (../shared/zen-icons/lin/home.svg)
skin/classic/browser/zen-icons/image-copy.svg (../shared/zen-icons/lin/image-copy.svg)
skin/classic/browser/zen-icons/image-open.svg (../shared/zen-icons/lin/image-open.svg)
skin/classic/browser/zen-icons/image-save.svg (../shared/zen-icons/lin/image-save.svg)
skin/classic/browser/zen-icons/info.svg (../shared/zen-icons/lin/info.svg)
skin/classic/browser/zen-icons/inspect.svg (../shared/zen-icons/lin/inspect.svg)
skin/classic/browser/zen-icons/library.svg (../shared/zen-icons/lin/library.svg)
skin/classic/browser/zen-icons/link.svg (../shared/zen-icons/lin/link.svg)
skin/classic/browser/zen-icons/mail.svg (../shared/zen-icons/lin/mail.svg)
skin/classic/browser/zen-icons/manage.svg (../shared/zen-icons/lin/manage.svg)
skin/classic/browser/zen-icons/media-loop.svg (../shared/zen-icons/lin/media-loop.svg)
skin/classic/browser/zen-icons/media-mute.svg (../shared/zen-icons/lin/media-mute.svg)
skin/classic/browser/zen-icons/media-pause.svg (../shared/zen-icons/lin/media-pause.svg)
skin/classic/browser/zen-icons/media-pip.svg (../shared/zen-icons/lin/media-pip.svg)
skin/classic/browser/zen-icons/media-play.svg (../shared/zen-icons/lin/media-play.svg)
skin/classic/browser/zen-icons/media-speed.svg (../shared/zen-icons/lin/media-speed.svg)
skin/classic/browser/zen-icons/media-unmute.svg (../shared/zen-icons/lin/media-unmute.svg)
skin/classic/browser/zen-icons/menu-bar.svg (../shared/zen-icons/lin/menu-bar.svg)
skin/classic/browser/zen-icons/menu.svg (../shared/zen-icons/lin/menu.svg)
skin/classic/browser/zen-icons/microphone-blocked.svg (../shared/zen-icons/lin/microphone-blocked.svg)
skin/classic/browser/zen-icons/microphone.svg (../shared/zen-icons/lin/microphone.svg)
skin/classic/browser/zen-icons/midi.svg (../shared/zen-icons/lin/midi.svg)
skin/classic/browser/zen-icons/move-tab.svg (../shared/zen-icons/lin/move-tab.svg)
skin/classic/browser/zen-icons/new-tab-image.svg (../shared/zen-icons/lin/new-tab-image.svg)
skin/classic/browser/zen-icons/open.svg (../shared/zen-icons/lin/open.svg)
skin/classic/browser/zen-icons/page-portrait.svg (../shared/zen-icons/lin/page-portrait.svg)
skin/classic/browser/zen-icons/palette.svg (../shared/zen-icons/lin/palette.svg)
skin/classic/browser/zen-icons/passwords.svg (../shared/zen-icons/lin/passwords.svg)
skin/classic/browser/zen-icons/paste-and-go.svg (../shared/zen-icons/lin/paste-and-go.svg)
skin/classic/browser/zen-icons/permissions.svg (../shared/zen-icons/lin/permissions.svg)
skin/classic/browser/zen-icons/persistent-storage-blocked.svg (../shared/zen-icons/lin/persistent-storage-blocked.svg)
skin/classic/browser/zen-icons/persistent-storage.svg (../shared/zen-icons/lin/persistent-storage.svg)
skin/classic/browser/zen-icons/pin.svg (../shared/zen-icons/lin/pin.svg)
skin/classic/browser/zen-icons/plus.svg (../shared/zen-icons/lin/plus.svg)
skin/classic/browser/zen-icons/pocket-outline.svg (../shared/zen-icons/lin/pocket-outline.svg)
skin/classic/browser/zen-icons/popup.svg (../shared/zen-icons/lin/popup.svg)
skin/classic/browser/zen-icons/print.svg (../shared/zen-icons/lin/print.svg)
skin/classic/browser/zen-icons/private-window.svg (../shared/zen-icons/lin/private-window.svg)
skin/classic/browser/zen-icons/privateBrowsing.svg (../shared/zen-icons/lin/privateBrowsing.svg)
skin/classic/browser/zen-icons/reader-mode.svg (../shared/zen-icons/lin/reader-mode.svg)
skin/classic/browser/zen-icons/reload-to-stop.svg (../shared/zen-icons/lin/reload-to-stop.svg)
skin/classic/browser/zen-icons/reload.svg (../shared/zen-icons/lin/reload.svg)
skin/classic/browser/zen-icons/report.svg (../shared/zen-icons/lin/report.svg)
skin/classic/browser/zen-icons/save.svg (../shared/zen-icons/lin/save.svg)
skin/classic/browser/zen-icons/screen-blocked.svg (../shared/zen-icons/lin/screen-blocked.svg)
skin/classic/browser/zen-icons/screen.svg (../shared/zen-icons/lin/screen.svg)
skin/classic/browser/zen-icons/screenshot.svg (../shared/zen-icons/lin/screenshot.svg)
skin/classic/browser/zen-icons/search-glass.svg (../shared/zen-icons/lin/search-glass.svg)
skin/classic/browser/zen-icons/search-page.svg (../shared/zen-icons/lin/search-page.svg)
skin/classic/browser/zen-icons/security-broken.svg (../shared/zen-icons/lin/security-broken.svg)
skin/classic/browser/zen-icons/security-warning.svg (../shared/zen-icons/lin/security-warning.svg)
skin/classic/browser/zen-icons/security.svg (../shared/zen-icons/lin/security.svg)
skin/classic/browser/zen-icons/send-to-device.svg (../shared/zen-icons/lin/send-to-device.svg)
skin/classic/browser/zen-icons/settings.svg (../shared/zen-icons/lin/settings.svg)
skin/classic/browser/zen-icons/share.svg (../shared/zen-icons/lin/share.svg)
skin/classic/browser/zen-icons/sidebar.svg (../shared/zen-icons/lin/sidebar.svg)
skin/classic/browser/zen-icons/sidebars-right.svg (../shared/zen-icons/lin/sidebars-right.svg)
skin/classic/browser/zen-icons/source-code.svg (../shared/zen-icons/lin/source-code.svg)
skin/classic/browser/zen-icons/spell-check.svg (../shared/zen-icons/lin/spell-check.svg)
skin/classic/browser/zen-icons/split.svg (../shared/zen-icons/lin/split.svg)
skin/classic/browser/zen-icons/stop-to-reload.svg (../shared/zen-icons/lin/stop-to-reload.svg)
skin/classic/browser/zen-icons/tab-audio-blocked-small.svg (../shared/zen-icons/lin/tab-audio-blocked-small.svg)
skin/classic/browser/zen-icons/tab-audio-muted-small.svg (../shared/zen-icons/lin/tab-audio-muted-small.svg)
skin/classic/browser/zen-icons/tab-audio-playing-small.svg (../shared/zen-icons/lin/tab-audio-playing-small.svg)
skin/classic/browser/zen-icons/tab.svg (../shared/zen-icons/lin/tab.svg)
skin/classic/browser/zen-icons/tool-profiler.svg (../shared/zen-icons/lin/tool-profiler.svg)
skin/classic/browser/zen-icons/tracking-protection.svg (../shared/zen-icons/lin/tracking-protection.svg)
skin/classic/browser/zen-icons/translations.svg (../shared/zen-icons/lin/translations.svg)
skin/classic/browser/zen-icons/unpin.svg (../shared/zen-icons/lin/unpin.svg)
skin/classic/browser/zen-icons/video-open.svg (../shared/zen-icons/lin/video-open.svg)
skin/classic/browser/zen-icons/video-save.svg (../shared/zen-icons/lin/video-save.svg)
skin/classic/browser/zen-icons/window.svg (../shared/zen-icons/lin/window.svg)
skin/classic/browser/zen-icons/xr-blocked.svg (../shared/zen-icons/lin/xr-blocked.svg)
skin/classic/browser/zen-icons/xr.svg (../shared/zen-icons/lin/xr.svg)
skin/classic/browser/zen-icons/zoom-control.svg (../shared/zen-icons/lin/zoom-control.svg)
skin/classic/browser/zen-icons/zoom-out.svg (../shared/zen-icons/lin/zoom-out.svg)
#endif
#ifdef XP_LINUX
skin/classic/browser/zen-icons/accessibility.svg (../shared/zen-icons/lin/accessibility.svg)
skin/classic/browser/zen-icons/add-to-dictionary.svg (../shared/zen-icons/lin/add-to-dictionary.svg)
skin/classic/browser/zen-icons/arrow-down.svg (../shared/zen-icons/lin/arrow-down.svg)
skin/classic/browser/zen-icons/arrow-left.svg (../shared/zen-icons/lin/arrow-left.svg)
skin/classic/browser/zen-icons/arrow-right.svg (../shared/zen-icons/lin/arrow-right.svg)
skin/classic/browser/zen-icons/arrow-up.svg (../shared/zen-icons/lin/arrow-up.svg)
skin/classic/browser/zen-icons/audio-save.svg (../shared/zen-icons/lin/audio-save.svg)
skin/classic/browser/zen-icons/autoplay-media-blocked.svg (../shared/zen-icons/lin/autoplay-media-blocked.svg)
skin/classic/browser/zen-icons/autoplay-media.svg (../shared/zen-icons/lin/autoplay-media.svg)
skin/classic/browser/zen-icons/back.svg (../shared/zen-icons/lin/back.svg)
skin/classic/browser/zen-icons/bookmark-hollow.svg (../shared/zen-icons/lin/bookmark-hollow.svg)
skin/classic/browser/zen-icons/bookmark-star-on-tray.svg (../shared/zen-icons/lin/bookmark-star-on-tray.svg)
skin/classic/browser/zen-icons/bookmark.svg (../shared/zen-icons/lin/bookmark.svg)
skin/classic/browser/zen-icons/camera-blocked.svg (../shared/zen-icons/lin/camera-blocked.svg)
skin/classic/browser/zen-icons/camera.svg (../shared/zen-icons/lin/camera.svg)
skin/classic/browser/zen-icons/canvas-blocked.svg (../shared/zen-icons/lin/canvas-blocked.svg)
skin/classic/browser/zen-icons/canvas.svg (../shared/zen-icons/lin/canvas.svg)
skin/classic/browser/zen-icons/checkmark.svg (../shared/zen-icons/lin/checkmark.svg)
skin/classic/browser/zen-icons/chevron.svg (../shared/zen-icons/lin/chevron.svg)
skin/classic/browser/zen-icons/close-all.svg (../shared/zen-icons/lin/close-all.svg)
skin/classic/browser/zen-icons/close.svg (../shared/zen-icons/lin/close.svg)
skin/classic/browser/zen-icons/container-tab.svg (../shared/zen-icons/lin/container-tab.svg)
skin/classic/browser/zen-icons/customize.svg (../shared/zen-icons/lin/customize.svg)
skin/classic/browser/zen-icons/desktop-notification-blocked.svg (../shared/zen-icons/lin/desktop-notification-blocked.svg)
skin/classic/browser/zen-icons/desktop-notification.svg (../shared/zen-icons/lin/desktop-notification.svg)
skin/classic/browser/zen-icons/developer.svg (../shared/zen-icons/lin/developer.svg)
skin/classic/browser/zen-icons/downloads.svg (../shared/zen-icons/lin/downloads.svg)
skin/classic/browser/zen-icons/drag-indicator.svg (../shared/zen-icons/lin/drag-indicator.svg)
skin/classic/browser/zen-icons/duplicate-tab.svg (../shared/zen-icons/lin/duplicate-tab.svg)
skin/classic/browser/zen-icons/edit-copy.svg (../shared/zen-icons/lin/edit-copy.svg)
skin/classic/browser/zen-icons/edit-cut.svg (../shared/zen-icons/lin/edit-cut.svg)
skin/classic/browser/zen-icons/edit-delete.svg (../shared/zen-icons/lin/edit-delete.svg)
skin/classic/browser/zen-icons/edit-paste.svg (../shared/zen-icons/lin/edit-paste.svg)
skin/classic/browser/zen-icons/edit-redo.svg (../shared/zen-icons/lin/edit-redo.svg)
skin/classic/browser/zen-icons/edit-select-all.svg (../shared/zen-icons/lin/edit-select-all.svg)
skin/classic/browser/zen-icons/edit-theme.svg (../shared/zen-icons/lin/edit-theme.svg)
skin/classic/browser/zen-icons/edit-undo.svg (../shared/zen-icons/lin/edit-undo.svg)
skin/classic/browser/zen-icons/edit.svg (../shared/zen-icons/lin/edit.svg)
skin/classic/browser/zen-icons/essential-add.svg (../shared/zen-icons/lin/essential-add.svg)
skin/classic/browser/zen-icons/essential-remove.svg (../shared/zen-icons/lin/essential-remove.svg)
skin/classic/browser/zen-icons/expand-sidebar.svg (../shared/zen-icons/lin/expand-sidebar.svg)
skin/classic/browser/zen-icons/ext-link.svg (../shared/zen-icons/lin/ext-link.svg)
skin/classic/browser/zen-icons/extension-blocked.svg (../shared/zen-icons/lin/extension-blocked.svg)
skin/classic/browser/zen-icons/extension.svg (../shared/zen-icons/lin/extension.svg)
skin/classic/browser/zen-icons/firefox.svg (../shared/zen-icons/lin/firefox.svg)
skin/classic/browser/zen-icons/folder.svg (../shared/zen-icons/lin/folder.svg)
skin/classic/browser/zen-icons/forget.svg (../shared/zen-icons/lin/forget.svg)
skin/classic/browser/zen-icons/forward.svg (../shared/zen-icons/lin/forward.svg)
skin/classic/browser/zen-icons/fullscreen-exit.svg (../shared/zen-icons/lin/fullscreen-exit.svg)
skin/classic/browser/zen-icons/fullscreen.svg (../shared/zen-icons/lin/fullscreen.svg)
skin/classic/browser/zen-icons/geo-blocked.svg (../shared/zen-icons/lin/geo-blocked.svg)
skin/classic/browser/zen-icons/geo.svg (../shared/zen-icons/lin/geo.svg)
skin/classic/browser/zen-icons/help.svg (../shared/zen-icons/lin/help.svg)
skin/classic/browser/zen-icons/history.svg (../shared/zen-icons/lin/history.svg)
skin/classic/browser/zen-icons/home.svg (../shared/zen-icons/lin/home.svg)
skin/classic/browser/zen-icons/image-copy.svg (../shared/zen-icons/lin/image-copy.svg)
skin/classic/browser/zen-icons/image-open.svg (../shared/zen-icons/lin/image-open.svg)
skin/classic/browser/zen-icons/image-save.svg (../shared/zen-icons/lin/image-save.svg)
skin/classic/browser/zen-icons/info.svg (../shared/zen-icons/lin/info.svg)
skin/classic/browser/zen-icons/inspect.svg (../shared/zen-icons/lin/inspect.svg)
skin/classic/browser/zen-icons/library.svg (../shared/zen-icons/lin/library.svg)
skin/classic/browser/zen-icons/link.svg (../shared/zen-icons/lin/link.svg)
skin/classic/browser/zen-icons/mail.svg (../shared/zen-icons/lin/mail.svg)
skin/classic/browser/zen-icons/manage.svg (../shared/zen-icons/lin/manage.svg)
skin/classic/browser/zen-icons/media-loop.svg (../shared/zen-icons/lin/media-loop.svg)
skin/classic/browser/zen-icons/media-mute.svg (../shared/zen-icons/lin/media-mute.svg)
skin/classic/browser/zen-icons/media-pause.svg (../shared/zen-icons/lin/media-pause.svg)
skin/classic/browser/zen-icons/media-pip.svg (../shared/zen-icons/lin/media-pip.svg)
skin/classic/browser/zen-icons/media-play.svg (../shared/zen-icons/lin/media-play.svg)
skin/classic/browser/zen-icons/media-speed.svg (../shared/zen-icons/lin/media-speed.svg)
skin/classic/browser/zen-icons/media-unmute.svg (../shared/zen-icons/lin/media-unmute.svg)
skin/classic/browser/zen-icons/menu-bar.svg (../shared/zen-icons/lin/menu-bar.svg)
skin/classic/browser/zen-icons/menu.svg (../shared/zen-icons/lin/menu.svg)
skin/classic/browser/zen-icons/microphone-blocked.svg (../shared/zen-icons/lin/microphone-blocked.svg)
skin/classic/browser/zen-icons/microphone.svg (../shared/zen-icons/lin/microphone.svg)
skin/classic/browser/zen-icons/midi.svg (../shared/zen-icons/lin/midi.svg)
skin/classic/browser/zen-icons/move-tab.svg (../shared/zen-icons/lin/move-tab.svg)
skin/classic/browser/zen-icons/new-tab-image.svg (../shared/zen-icons/lin/new-tab-image.svg)
skin/classic/browser/zen-icons/open.svg (../shared/zen-icons/lin/open.svg)
skin/classic/browser/zen-icons/page-portrait.svg (../shared/zen-icons/lin/page-portrait.svg)
skin/classic/browser/zen-icons/palette.svg (../shared/zen-icons/lin/palette.svg)
skin/classic/browser/zen-icons/passwords.svg (../shared/zen-icons/lin/passwords.svg)
skin/classic/browser/zen-icons/paste-and-go.svg (../shared/zen-icons/lin/paste-and-go.svg)
skin/classic/browser/zen-icons/permissions.svg (../shared/zen-icons/lin/permissions.svg)
skin/classic/browser/zen-icons/persistent-storage-blocked.svg (../shared/zen-icons/lin/persistent-storage-blocked.svg)
skin/classic/browser/zen-icons/persistent-storage.svg (../shared/zen-icons/lin/persistent-storage.svg)
skin/classic/browser/zen-icons/pin.svg (../shared/zen-icons/lin/pin.svg)
skin/classic/browser/zen-icons/plus.svg (../shared/zen-icons/lin/plus.svg)
skin/classic/browser/zen-icons/pocket-outline.svg (../shared/zen-icons/lin/pocket-outline.svg)
skin/classic/browser/zen-icons/popup.svg (../shared/zen-icons/lin/popup.svg)
skin/classic/browser/zen-icons/print.svg (../shared/zen-icons/lin/print.svg)
skin/classic/browser/zen-icons/private-window.svg (../shared/zen-icons/lin/private-window.svg)
skin/classic/browser/zen-icons/privateBrowsing.svg (../shared/zen-icons/lin/privateBrowsing.svg)
skin/classic/browser/zen-icons/reader-mode.svg (../shared/zen-icons/lin/reader-mode.svg)
skin/classic/browser/zen-icons/reload-to-stop.svg (../shared/zen-icons/lin/reload-to-stop.svg)
skin/classic/browser/zen-icons/reload.svg (../shared/zen-icons/lin/reload.svg)
skin/classic/browser/zen-icons/report.svg (../shared/zen-icons/lin/report.svg)
skin/classic/browser/zen-icons/save.svg (../shared/zen-icons/lin/save.svg)
skin/classic/browser/zen-icons/screen-blocked.svg (../shared/zen-icons/lin/screen-blocked.svg)
skin/classic/browser/zen-icons/screen.svg (../shared/zen-icons/lin/screen.svg)
skin/classic/browser/zen-icons/screenshot.svg (../shared/zen-icons/lin/screenshot.svg)
skin/classic/browser/zen-icons/search-glass.svg (../shared/zen-icons/lin/search-glass.svg)
skin/classic/browser/zen-icons/search-page.svg (../shared/zen-icons/lin/search-page.svg)
skin/classic/browser/zen-icons/security-broken.svg (../shared/zen-icons/lin/security-broken.svg)
skin/classic/browser/zen-icons/security-warning.svg (../shared/zen-icons/lin/security-warning.svg)
skin/classic/browser/zen-icons/security.svg (../shared/zen-icons/lin/security.svg)
skin/classic/browser/zen-icons/send-to-device.svg (../shared/zen-icons/lin/send-to-device.svg)
skin/classic/browser/zen-icons/settings.svg (../shared/zen-icons/lin/settings.svg)
skin/classic/browser/zen-icons/share.svg (../shared/zen-icons/lin/share.svg)
skin/classic/browser/zen-icons/sidebar.svg (../shared/zen-icons/lin/sidebar.svg)
skin/classic/browser/zen-icons/sidebars-right.svg (../shared/zen-icons/lin/sidebars-right.svg)
skin/classic/browser/zen-icons/source-code.svg (../shared/zen-icons/lin/source-code.svg)
skin/classic/browser/zen-icons/spell-check.svg (../shared/zen-icons/lin/spell-check.svg)
skin/classic/browser/zen-icons/split.svg (../shared/zen-icons/lin/split.svg)
skin/classic/browser/zen-icons/stop-to-reload.svg (../shared/zen-icons/lin/stop-to-reload.svg)
skin/classic/browser/zen-icons/tab-audio-blocked-small.svg (../shared/zen-icons/lin/tab-audio-blocked-small.svg)
skin/classic/browser/zen-icons/tab-audio-muted-small.svg (../shared/zen-icons/lin/tab-audio-muted-small.svg)
skin/classic/browser/zen-icons/tab-audio-playing-small.svg (../shared/zen-icons/lin/tab-audio-playing-small.svg)
skin/classic/browser/zen-icons/tab.svg (../shared/zen-icons/lin/tab.svg)
skin/classic/browser/zen-icons/tool-profiler.svg (../shared/zen-icons/lin/tool-profiler.svg)
skin/classic/browser/zen-icons/tracking-protection.svg (../shared/zen-icons/lin/tracking-protection.svg)
skin/classic/browser/zen-icons/translations.svg (../shared/zen-icons/lin/translations.svg)
skin/classic/browser/zen-icons/unpin.svg (../shared/zen-icons/lin/unpin.svg)
skin/classic/browser/zen-icons/video-open.svg (../shared/zen-icons/lin/video-open.svg)
skin/classic/browser/zen-icons/video-save.svg (../shared/zen-icons/lin/video-save.svg)
skin/classic/browser/zen-icons/window.svg (../shared/zen-icons/lin/window.svg)
skin/classic/browser/zen-icons/xr-blocked.svg (../shared/zen-icons/lin/xr-blocked.svg)
skin/classic/browser/zen-icons/xr.svg (../shared/zen-icons/lin/xr.svg)
skin/classic/browser/zen-icons/zoom-control.svg (../shared/zen-icons/lin/zoom-control.svg)
skin/classic/browser/zen-icons/zoom-out.svg (../shared/zen-icons/lin/zoom-out.svg)
#endif
skin/classic/browser/zen-icons/icons.css (../shared/zen-icons/icons.css)

View File

Before

Width:  |  Height:  |  Size: 572 B

After

Width:  |  Height:  |  Size: 572 B

View File

Before

Width:  |  Height:  |  Size: 528 B

After

Width:  |  Height:  |  Size: 528 B

View File

Before

Width:  |  Height:  |  Size: 316 B

After

Width:  |  Height:  |  Size: 316 B

View File

Before

Width:  |  Height:  |  Size: 317 B

After

Width:  |  Height:  |  Size: 317 B

View File

Before

Width:  |  Height:  |  Size: 316 B

After

Width:  |  Height:  |  Size: 316 B

View File

Before

Width:  |  Height:  |  Size: 317 B

After

Width:  |  Height:  |  Size: 317 B

View File

Before

Width:  |  Height:  |  Size: 692 B

After

Width:  |  Height:  |  Size: 692 B

View File

Before

Width:  |  Height:  |  Size: 593 B

After

Width:  |  Height:  |  Size: 593 B

View File

Before

Width:  |  Height:  |  Size: 377 B

After

Width:  |  Height:  |  Size: 377 B

View File

Before

Width:  |  Height:  |  Size: 380 B

After

Width:  |  Height:  |  Size: 380 B

View File

Before

Width:  |  Height:  |  Size: 464 B

After

Width:  |  Height:  |  Size: 464 B

View File

Before

Width:  |  Height:  |  Size: 464 B

After

Width:  |  Height:  |  Size: 464 B

View File

Before

Width:  |  Height:  |  Size: 439 B

After

Width:  |  Height:  |  Size: 439 B

View File

Before

Width:  |  Height:  |  Size: 843 B

After

Width:  |  Height:  |  Size: 843 B

View File

Before

Width:  |  Height:  |  Size: 660 B

After

Width:  |  Height:  |  Size: 660 B

View File

Before

Width:  |  Height:  |  Size: 1006 B

After

Width:  |  Height:  |  Size: 1006 B

View File

Before

Width:  |  Height:  |  Size: 556 B

After

Width:  |  Height:  |  Size: 556 B

View File

Before

Width:  |  Height:  |  Size: 318 B

After

Width:  |  Height:  |  Size: 318 B

View File

Before

Width:  |  Height:  |  Size: 388 B

After

Width:  |  Height:  |  Size: 388 B

View File

Before

Width:  |  Height:  |  Size: 562 B

After

Width:  |  Height:  |  Size: 562 B

View File

Before

Width:  |  Height:  |  Size: 366 B

After

Width:  |  Height:  |  Size: 366 B

View File

Before

Width:  |  Height:  |  Size: 668 B

After

Width:  |  Height:  |  Size: 668 B

View File

Before

Width:  |  Height:  |  Size: 634 B

After

Width:  |  Height:  |  Size: 634 B

View File

Before

Width:  |  Height:  |  Size: 694 B

After

Width:  |  Height:  |  Size: 694 B

View File

Before

Width:  |  Height:  |  Size: 911 B

After

Width:  |  Height:  |  Size: 911 B

View File

Before

Width:  |  Height:  |  Size: 489 B

After

Width:  |  Height:  |  Size: 489 B

View File

Before

Width:  |  Height:  |  Size: 684 B

After

Width:  |  Height:  |  Size: 684 B

View File

Before

Width:  |  Height:  |  Size: 468 B

After

Width:  |  Height:  |  Size: 468 B

View File

Before

Width:  |  Height:  |  Size: 449 B

After

Width:  |  Height:  |  Size: 449 B

View File

Before

Width:  |  Height:  |  Size: 564 B

After

Width:  |  Height:  |  Size: 564 B

View File

Before

Width:  |  Height:  |  Size: 711 B

After

Width:  |  Height:  |  Size: 711 B

View File

Before

Width:  |  Height:  |  Size: 474 B

After

Width:  |  Height:  |  Size: 474 B

View File

Before

Width:  |  Height:  |  Size: 415 B

After

Width:  |  Height:  |  Size: 415 B

View File

Before

Width:  |  Height:  |  Size: 773 B

After

Width:  |  Height:  |  Size: 773 B

View File

Before

Width:  |  Height:  |  Size: 901 B

After

Width:  |  Height:  |  Size: 901 B

View File

Before

Width:  |  Height:  |  Size: 409 B

After

Width:  |  Height:  |  Size: 409 B

View File

Before

Width:  |  Height:  |  Size: 455 B

After

Width:  |  Height:  |  Size: 455 B

View File

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

Before

Width:  |  Height:  |  Size: 632 B

After

Width:  |  Height:  |  Size: 632 B

View File

Before

Width:  |  Height:  |  Size: 666 B

After

Width:  |  Height:  |  Size: 666 B

View File

Before

Width:  |  Height:  |  Size: 522 B

After

Width:  |  Height:  |  Size: 522 B

View File

Before

Width:  |  Height:  |  Size: 649 B

After

Width:  |  Height:  |  Size: 649 B

View File

Before

Width:  |  Height:  |  Size: 814 B

After

Width:  |  Height:  |  Size: 814 B

View File

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

Before

Width:  |  Height:  |  Size: 433 B

After

Width:  |  Height:  |  Size: 433 B

View File

Before

Width:  |  Height:  |  Size: 525 B

After

Width:  |  Height:  |  Size: 525 B

View File

Before

Width:  |  Height:  |  Size: 383 B

After

Width:  |  Height:  |  Size: 383 B

View File

Before

Width:  |  Height:  |  Size: 537 B

After

Width:  |  Height:  |  Size: 537 B

View File

Before

Width:  |  Height:  |  Size: 537 B

After

Width:  |  Height:  |  Size: 537 B

View File

Before

Width:  |  Height:  |  Size: 718 B

After

Width:  |  Height:  |  Size: 718 B

View File

Before

Width:  |  Height:  |  Size: 505 B

After

Width:  |  Height:  |  Size: 505 B

View File

Before

Width:  |  Height:  |  Size: 604 B

After

Width:  |  Height:  |  Size: 604 B

View File

Before

Width:  |  Height:  |  Size: 520 B

After

Width:  |  Height:  |  Size: 520 B

View File

Before

Width:  |  Height:  |  Size: 534 B

After

Width:  |  Height:  |  Size: 534 B

File diff suppressed because it is too large Load Diff

View File

Before

Width:  |  Height:  |  Size: 701 B

After

Width:  |  Height:  |  Size: 701 B

View File

Before

Width:  |  Height:  |  Size: 626 B

After

Width:  |  Height:  |  Size: 626 B

View File

Before

Width:  |  Height:  |  Size: 693 B

After

Width:  |  Height:  |  Size: 693 B

Some files were not shown because too many files have changed in this diff Show More