45 |
46 |
47 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | ## A note on maintenance
2 |
3 | This project will never make it past alpha, nor will it receive any bug fixes or new features that do not directly affect me (@trickypr). I am putting my energy towards [a project using a different approach](https://github.com/pulse-browser/experiment). For a rough guide to my reasoning, see [this Mastodon post](https://mas.to/@trickypr/111328440028458478).
4 |
5 |
6 |
7 |
8 |
9 | # Pulse Browser
10 |
11 | An experimental Firefox fork that enhances focus and increases work productivity due to its Hyper minimalistic UI and built-in tools.
12 |
13 | [](https://discord.gg/xNkretH7sD) 
14 |   
15 |
16 |
17 |
18 | ## 📸 Images
19 |
20 |
21 |
22 |
23 |
24 |
25 | ## 🌑 Features
26 |
27 | | | Features of Pulse Browser |
28 | | --- | ----------------------------------------------------------- |
29 | | 🛡️ | Removed **Telemetry** |
30 | | 🗡️ | Built in **Ad-Block** (uBlock Origin) |
31 | | 💃 | Built in light-weight **QR Code Generator** |
32 | | 🦊 | Firefox source based browser with regular security updates |
33 | | 🍫 | A sidebar to put tools you love within the reach of a click |
34 | | 📖 | Hyper minimalistic UI to increase pure focus |
35 | | ⬆️ | Adequately maintained repository and software |
36 |
37 | ## 👨💻 Install
38 |
39 | We (Pulse-Browser developers) support building open source software personally for security and comfort reasons. Although this is an option, we also have prebuilt installers available on our [Releases](https://github.com/pulse-browser/browser/releases) page.
40 |
41 | ## 🐛 Bugs, Support and Chat
42 |
43 | For bug reports, support, and just having a friendly chat with the team, feel free to join the discord at https://discord.gg/xNkretH7sD or create an issue on the GitHub repository.
44 |
45 | ## 📋 Goals
46 |
47 | - Minimalist ui that feels more native than firefox's (custom skin, not a rewrite)
48 | - Replace some internal firefox components with better open source alternatives (e.g. uBlock origin)
49 | - Remove mozilla's telemetry, ads and pocket
50 |
51 | ## 🏗️ Credits
52 |
53 | - Dot HQ's [melon build tool](https://github.com/dothq/melon), which was extracted from Dot Browser. They have been driving development of firefox forks and have made incredible progress. - [MPL-2.0 License](https://github.com/dothq/melon/blob/main/LICENSE)
54 | - We maintain our own fork, [Gluon](https://github.com/pulse-browser/gluon) which is used by this project
55 | - The [BetterFox](https://github.com/yokoffing/Better-Fox) user.js tweaks, which are used throughout the browser. - [MIT License](https://github.com/yokoffing/Better-Fox/blob/master/LICENSE)
56 | - [uBlock](https://github.com/gorhill/uBlock) extension from GitHub for blocking ads. - [GNU General Public License v3.0](https://github.com/gorhill/uBlock/blob/master/LICENSE.txt)
57 | - [Firefox-QR-Code-Generator](https://github.com/pulse-browser/firefox-qr-generator) extension from GitHub for a QR Code generator. - [MPL-2.0 License](https://github.com/pulse-browser/firefox-qr-generator/blob/main/LICENSE)
58 | - [Tabliss](https://github.com/joelshepherd/tabliss) extension to provide a better new-tab experience. - [GNU General Public License v3.0](hhttps://github.com/joelshepherd/tabliss/blob/main/LICENSE.txt)
59 | - [Firefox](https://firefox.com) and the rest of the mozilla team. - [MPL Version 2.0](https://www.mozilla.org/en-US/MPL/2.0/)
60 |
--------------------------------------------------------------------------------
/src/browser/components/migration/FirefoxProfileMigrator-jsm.patch.disabled:
--------------------------------------------------------------------------------
1 | diff --git a/browser/components/migration/FirefoxProfileMigrator.jsm b/browser/components/migration/FirefoxProfileMigrator.jsm
2 | index bba617374f2ff9bb2466826a884163b76ee4bb55..349a699a2b0778e4e00f16e933dc7ec8fc21da2e 100644
3 | --- a/browser/components/migration/FirefoxProfileMigrator.jsm
4 | +++ b/browser/components/migration/FirefoxProfileMigrator.jsm
5 | @@ -13,6 +13,9 @@
6 | * from the source profile.
7 | */
8 |
9 | +const { XPCOMUtils } = ChromeUtils.import(
10 | + "resource://gre/modules/XPCOMUtils.jsm"
11 | +);
12 | const { MigrationUtils, MigratorPrototype } = ChromeUtils.import(
13 | "resource:///modules/MigrationUtils.jsm"
14 | );
15 | @@ -40,13 +43,77 @@ ChromeUtils.defineModuleGetter(
16 | "resource://gre/modules/ProfileAge.jsm"
17 | );
18 |
19 | +XPCOMUtils.defineLazyModuleGetters(this, {
20 | + AppConstants: "resource://gre/modules/AppConstants.jsm",
21 | + LoginHelper: "resource://gre/modules/LoginHelper.jsm",
22 | + MigrationUtils: "resource:///modules/MigrationUtils.jsm",
23 | + OS: "resource://gre/modules/osfile.jsm",
24 | +});
25 | +
26 | function FirefoxProfileMigrator() {
27 | this.wrappedJSObject = this; // for testing...
28 | }
29 |
30 | +// =============================================================================
31 | +// Focus browser helper functions
32 | +
33 | +function getProfileStorageDir() {
34 | + /**
35 | + * The location in the filesystem where this folder is located. e.g. ULibDir
36 | + * (`/Users//Library/`)
37 | + * @type {string}
38 | + */
39 | + let rootDir;
40 | + let subFolders = [];
41 | +
42 | + if (AppConstants.platform == "macosx") {
43 | + rootDir = "ULibDir"
44 | +
45 | + subFolders.push("Application Support");
46 | + subFolders.push("Firefox");
47 | + subFolders.push("Profiles");
48 | + } else if (AppConstants.platform == "win") {
49 | + // TODO: Windows support for profile imports
50 | + throw new Error("Unimplemented: Windows doesn't support profile imports from other firefox instances")
51 | + } else {
52 | + // TODO: Linux / unix support for profile imports
53 | + throw new Error("Unimplemented: Linux / Unix doesn't support profile imports from other firefox instances")
54 | + }
55 | +
56 | + // Try to use firefox's dirsvc to convert this to a path string
57 | + try {
58 | + let target = Services.dirsvc.get(rootDir, Ci.nsIFile);
59 | + subFolders.forEach(dir => target.append(dir));
60 | +
61 | + return target
62 | + } catch (e) {
63 | + // Some form of error occurred with the path logic, so log it to the console
64 | + // so we can debug it latter
65 | + Cu.reportError(e);
66 | + }
67 | +
68 | + // Return null if nothing has been returned already. I would really love to use
69 | + // an option here but that would add significant complexity to this patch file
70 | + return null;
71 | +}
72 | +
73 | FirefoxProfileMigrator.prototype = Object.create(MigratorPrototype);
74 |
75 | FirefoxProfileMigrator.prototype._getAllProfiles = function() {
76 | + const profileStorageDirectory = getProfileStorageDir();
77 | +
78 | + console.log("profileStorageDirectory: ", profileStorageDirectory);
79 | +
80 | + const children = MigrationUtils.spinResolve(
81 | + IOUtils.getChildren(profileStorageDirectory.path)
82 | + );
83 | +
84 | + const probablyValidProfiles = children
85 | + .filter(folder => !folder.includes('.DS_Store'))
86 | + .filter(folder => folder.split(".").length == 2);
87 | +
88 | + console.log("children: ", probablyValidProfiles);
89 | +
90 | let allProfiles = new Map();
91 | let profileService = Cc["@mozilla.org/toolkit/profile-service;1"].getService(
92 | Ci.nsIToolkitProfileService
93 | @@ -54,10 +121,11 @@ FirefoxProfileMigrator.prototype._getAllProfiles = function() {
94 | for (let profile of profileService.profiles) {
95 | let rootDir = profile.rootDir;
96 |
97 | + console.log(rootDir)
98 | +
99 | if (
100 | rootDir.exists() &&
101 | - rootDir.isReadable() &&
102 | - !rootDir.equals(MigrationUtils.profileStartup.directory)
103 | + rootDir.isReadable()
104 | ) {
105 | allProfiles.set(profile.name, rootDir);
106 | }
107 | @@ -370,7 +438,7 @@ FirefoxProfileMigrator.prototype._getResourcesInternal = function(
108 | };
109 |
110 | Object.defineProperty(FirefoxProfileMigrator.prototype, "startupOnlyMigrator", {
111 | - get: () => true,
112 | + get: () => false,
113 | });
114 |
115 | FirefoxProfileMigrator.prototype.classDescription = "Firefox Profile Migrator";
116 |
--------------------------------------------------------------------------------
/src/browser/app/profile/pulse-browser.js:
--------------------------------------------------------------------------------
1 | // This Source Code Form is subject to the terms of the Mozilla Public
2 | // License, v. 2.0. If a copy of the MPL was not distributed with this
3 | // file, You can obtain one at http://mozilla.org/MPL/2.0/.
4 | //
5 | // Note: You must have semicolons at the end of each line in user setting files
6 |
7 | // Betterfox has a lower priority than the prefs included in this file
8 | #include better-fox.js
9 | #include smooth-fox.js
10 |
11 | // Prefs from browser/branding/unofficial/prefs/firefox-branding.js:
12 |
13 | // The time interval between checks for a new version (in seconds)
14 | pref("app.update.interval", 86400); // 24 hours
15 | // Give the user x seconds to react before showing the big UI. default=24 hours
16 | pref("app.update.promptWaitTime", 86400);
17 |
18 | // The number of days a binary is permitted to be old
19 | // without checking for an update. This assumes that
20 | // app.update.checkInstallTime is true.
21 | pref("app.update.checkInstallTime.days", 2);
22 |
23 | // Give the user x seconds to reboot before showing a badge on the hamburger
24 | // button. default=immediately
25 | pref("app.update.badgeWaitTime", 0);
26 |
27 | // Number of usages of the web console.
28 | // If this is less than 5, then pasting code into the web console is disabled
29 | pref("devtools.selfxss.count", 5);
30 |
31 | // Betterfox overrides:
32 | pref('identity.fxaccounts.enabled', true); // Enable firefox sync
33 |
34 | // Enable importers for other browsers
35 | pref('browser.migrate.vivaldi.enabled', true);
36 | pref('browser.migrate.opera-gx.enabled', true);
37 | pref('browser.migrate.opera.enabled', true);
38 |
39 | // Enable downloading DRM.
40 | pref('media.eme.enabled', true);
41 |
42 | // Enable linux hardware video decoding. Note that this may cause a crash
43 | // on start for some linux setups, for example, those that do not have DMA-BUF
44 | // or VA-API. We should see if we can find a work around for those
45 | // crashes when they come up
46 | pref('media.ffmpeg.vaapi.enabled', true);
47 |
48 | // Disable firefox's about:welcome page
49 | pref('browser.aboutwelcome.enabled', true);
50 |
51 | pref('pulse.welcome.enabled', true);
52 | pref('pulse.welcome.seen', false);
53 |
54 | // Sidebar pref
55 | pref('pulse.sidebar.enabled', true);
56 | pref('pulse.sidebar.extensions.enabled', true);
57 | // Note that this is causing state & performance issues. I am going to disable
58 | // it by default
59 | pref('pulse.sidebar.keeptabsactive.enabled', false);
60 |
61 |
62 | //PIP pref
63 | pref('media.videocontrols.picture-in-picture.audio-toggle.enabled', true);
64 |
65 | // This preference tells the browser that our addons are preinstalled and should
66 | // be provided with permissions without asking
67 | // TODO: Documentation in gluon for preference
68 | pref('extensions.installedDistroAddon.extension@tabliss.io', true);
69 |
70 | pref('browser.discovery.enabled', false);
71 | pref('svg.context-properties.content.enabled', true);
72 |
73 | // Allow the user to install unsigned addons from sources like our custom addon
74 | // store
75 | pref('xpinstall.signatures.required', false);
76 | // Allow the usage of theme experiments
77 | pref('extensions.experiments.enabled', true);
78 |
79 | // Disable VPN promos
80 | pref('browser.vpn_promo.enabled', false);
81 |
82 | // Enable WebMIDI. This is still currently in testing inside of Firefox, but
83 | // will also provide us with the benefit of more features
84 | pref('dom.webmidi.enabled', true);
85 |
86 | // Our versioning system is incomprehensible to Mozilla's servers. To fix a bunch
87 | // of addon bugs, we need to update these prefs
88 | pref("extensions.getAddons.search.browseURL", "https://addons.mozilla.org/%LOCALE%/firefox/search?q=%TERMS%&platform=%OS%&appver=%PLATFORMVERSION%");
89 | pref("extensions.getAddons.langpacks.url", "https://services.addons.mozilla.org/api/v4/addons/language-tools/?app=firefox&type=language&appversion=%PLATFORMVERSION%");
90 |
91 | // Check for system add-on updates.
92 | pref("extensions.systemAddon.update.url", "https://updates.pulsebrowser.app/browser/addons/%CHANNEL%/update.xml");
93 | pref("extensions.systemAddon.update.enabled", true);
94 |
95 | //Update Routes (Download page for manual download and Temperoraliy Discord Invite Link for Release Notes)
96 | pref("app.update.url.manual", "https://pulsebrowser.app/download");
97 | pref("app.update.url.details", "hhttps://pulsebrowser.app/download");
98 | pref("app.releaseNotesURL", "https://github.com/pulse-browser/browser/blob/alpha/CHANGELOG.md");
99 | pref("app.releaseNotesURL.aboutDialog", "https://github.com/pulse-browser/browser/blob/alpha/CHANGELOG.md");
100 |
101 | // This pref needs to be here to not break context menus (GH#169)
102 | pref("extensions.pocket.enabled", false);
103 |
104 | // Reenable accessability. Should have a low enough performance impact with the
105 | // changes in 113
106 | // 0: auto-detect
107 | // 1: force disable
108 | // -1: force enable
109 | pref('accessibility.force_disabled', 0);
110 |
111 | // This feature isn't stable / performant, but I am going to enable it anyway
112 | // specifically to get vertical tab styling to work with minimal jank
113 | pref('layout.css.has-selector.enabled', true);
114 |
115 | // Allow for showing and hiding of assorted tab buttons at the users
116 | // digression
117 | pref('pulse.tabs.show.close', true);
118 | pref('pulse.tabs.show.new', true);
119 |
120 | // Disable bookmark toolbar by default
121 | pref('browser.toolbars.bookmarks.visibility', 'never');
122 |
123 |
--------------------------------------------------------------------------------
/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | # Changelog
2 |
3 | All notable changes to this project will be documented in this file.
4 |
5 | The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6 | and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7 |
8 | ## 1.0.0-a.88
9 |
10 | ## Changed
11 |
12 | - Update to firefox `121.0`
13 | - Bump to prerelease betterfox
14 |
15 | ## Fixed
16 |
17 | - Addons will now update correctly (will send platform version rather than app version)
18 |
19 | ## 1.0.0-a.84
20 |
21 | ### Added
22 |
23 | - Note regarding maintenance to ReadMe
24 |
25 | ### Changed
26 |
27 | - Updated to Firefox `120.0`
28 | - Updated uBlock to `1.54.0`
29 |
30 | ## 1.0.0-a.84
31 |
32 | ### Changed
33 |
34 | - Updated to Firefox `119.0`
35 |
36 | ## 1.0.0-a.83
37 |
38 | ### Changed
39 |
40 | - Firefox updated to `118.0.1`
41 | - Sidebar tabs no longer persist state on new profiles (can be reenabled in prefs)
42 | - Assorted URLs now point to more correct / relevant locations
43 |
44 | ### Fixed
45 |
46 | - Fix fetching new language packs (bug [#287](https://github.com/pulse-browser/browser/issues/287))
47 | - Sidebar starts up on the correct side of the browser (bug [#277](https://github.com/pulse-browser/browser/issues/277))
48 |
49 | ## 1.0.0-a.82
50 |
51 | ### Changed
52 |
53 | - Update uBlock to `1.52.2`
54 |
55 | ### Fixed
56 |
57 | - Vertical tabs will correctly follow fullscreen state
58 |
59 | ## 1.0.0-a.81
60 |
61 | ### Changed
62 |
63 | - Update Betterfox to `117.0`
64 |
65 | ### Fixed
66 |
67 | - Improve contrast on pulse light and dark themes
68 | - Assorted UI inconsistencies for vertical tabs
69 | - Make vertical tabs visible in fullscreen (tested in sway)
70 |
71 | ## 1.0.0-a.80
72 |
73 | ### Changed
74 |
75 | - Updated Gecko to `117.0.1`
76 |
77 | ## 1.0.0-a.79
78 |
79 | ### Changed
80 |
81 | - Updated gecko to `117.0`
82 | - Updated betterfox `116.1`
83 |
84 | ## 1.0.0-a.78
85 |
86 | ### Changed
87 |
88 | - Updated gecko to `116.0.2` and all it causes
89 |
90 | ## 1.0.0-a.77
91 |
92 | ### Added
93 |
94 | - Vertical tabs: Open new tab w/ clipboard contents on space middle click
95 | - The new tab & close tab buttons can now be hidden
96 |
97 | ### Changed
98 |
99 | - Vertical tabs: New tab button no longer has text
100 | - Partial `:has` support is enabled (this is intended for userchrome use only)
101 |
102 | ### Fixed
103 |
104 | - Pinned vertical tabs are no longer positioned. Sorta defeats their purpose, but it stops a semi-major bug
105 | - Sidebar sites now appear on new windows
106 | - Vertical tabs: New tab icon is now centered
107 |
108 | ## 1.0.0-a.75
109 |
110 | ### Changed
111 |
112 | - Clean up vertical tab styles
113 |
114 | ### Fixed
115 |
116 | - Fix tab movement
117 |
118 | ## 1.0.0-a.74
119 |
120 | ### Changed
121 |
122 | - Update Firefox to `115.0.1`
123 | - Update Betterfox
124 |
125 | ## 1.0.0-a.67 through 1.0.0-a.73
126 |
127 | Fight with CI.
128 |
129 | ## 1.0.0-a.66
130 |
131 | ### Changed
132 |
133 | - Update Firefox to `114.0.1`
134 |
135 | ## 1.0.0-a.65
136 |
137 | ### Changed
138 |
139 | - Update Firefox to `113.0.1`
140 |
141 | ## 1.0.0-a.64
142 |
143 | ### Fixed
144 |
145 | - Add branding prefs back (#242)
146 |
147 | ## 1.0.0-a.63
148 |
149 | ### Fixed
150 |
151 | - uBlock now works in sidebars (#238)
152 |
153 | ### Changed
154 |
155 | - Updated Firefox to `112.0` (#237)
156 | - Updated uBlock to `1.48.8` (#237)
157 | - Update BetterFox (#237)
158 |
159 | ## 1.0.0-a.62
160 |
161 | ### Fixed
162 |
163 | - Specified wayland app name (#231)
164 | - Migration for disabling sidebar animations (#234)
165 | - New tab button no longer follows OS style (#233, @surapunoyousei)
166 | - Fix vertical tab borders on windows (#232, @surapunoyousei)
167 | - Download URL points to Pulse site (#235)
168 |
169 | ## 1.0.0-a.61
170 |
171 | ### Added
172 |
173 | - The user can reposition the sideber (#222)
174 |
175 | ### Changed
176 |
177 | - Updated Firefox to `111.0` (#227)
178 | - Updated uBlock to `1.47.4` (#227)
179 | - Update BetterFox (#227)
180 | - Distroid is now `com.fushra.browser.alpha` (#227)
181 |
182 | ## 1.0.0-a.60
183 |
184 | ### Fixed
185 |
186 | - Forget functionality would forget all cookies (#215, [Bug 1816279](https://bugzilla.mozilla.org/show_bug.cgi?id=1816279))
187 |
188 | ### Changed
189 |
190 | - Updated Firefox to `110.0.1` (#219)
191 | - Updated Better-Fox (#218)
192 | - Enable VA-API by default (#216)
193 |
194 | ## 1.0.0-a.58
195 |
196 | ### Changed
197 |
198 | - Updated Firefox to 110.0 (#209)
199 | - Updated UBlock to 1.47.0 (#209)
200 |
201 | ## 1.0.0-a.57
202 |
203 | ### Fixed
204 |
205 | - Reenable firefox sync (#208)
206 |
207 | ## 1.0.0-a.56
208 |
209 | ### Fixed
210 |
211 | - Fix our Better-Fox implementation
212 |
213 | ## 1.0.0-a.55
214 |
215 | ### Fixed
216 |
217 | - Vertical tab scrolling is less horrible
218 |
219 | ## 1.0.0-a.54
220 |
221 | ### Added
222 |
223 | - Vertical tab resizing (#199)
224 |
225 | ### Changed
226 |
227 | - Welcome screeen will ask if you want to enable vertical tabs (#198)
228 | - Pulse Theme for vertical tabs has been cleaned up (#201)
229 |
230 | ## 1.0.0-a.53
231 |
232 | ### Added
233 |
234 | - Vivaldi & Opera importers (#200, Upstream)
235 |
236 | ### Changed
237 |
238 | - Updated Firefox to `109.0` (#200)
239 | - Update uBlock Origin to `1.46.0` (#200)
240 |
241 | ### Fixed
242 |
243 | - Vertical tabs no-longer display in fullscreen (#197, @Jacob-Tsekrekos)
244 | - Remove gap above toolbar w/ vertical tabs on Windows (#197, @Jacob-Tsekrekos)
245 |
--------------------------------------------------------------------------------
/src/browser/themes/pulse/vertical_tabs.css:
--------------------------------------------------------------------------------
1 | /*
2 | * This Source Code Form is subject to the terms of the Mozilla Public
3 | * License, v. 2.0. If a copy of the MPL was not distributed with this
4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/.
5 | */
6 | :root {
7 | --vertical-tabs-max-width: 350px;
8 | --vertical-tabs-collapse-width: calc(
9 | 16px + 2 * var(--inline-tab-padding) + 2 * var(--tab-block-margin)
10 | );
11 | }
12 |
13 | /* ========================================================================== */
14 | /* Toolbar styles */
15 |
16 | #browser #TabsToolbar .toolbar-items {
17 | height: 100%;
18 | }
19 |
20 | #browser #TabsToolbar .titlebar-spacer,
21 | #browser #TabsToolbar .titlebar-buttonbox-container,
22 | #browser #TabsToolbar #alltabs-button {
23 | display: none;
24 | }
25 |
26 | #main-window[verticaltabs='true'] #titlebar {
27 | display: none;
28 | }
29 |
30 | #browser #TabsToolbar {
31 | background-color: -moz-Dialog;
32 | max-width: var(--vertical-tabs-max-width);
33 | min-width: var(--vertical-tabs-collapse-width);
34 | -moz-box-ordinal-group: 0;
35 | overflow-x: hidden;
36 |
37 | transition:
38 | min-width 150ms ease-in-out,
39 | max-width 150ms ease-in-out;
40 | }
41 |
42 | #browser #TabsToolbar:-moz-lwtheme {
43 | background-image: var(--lwt-additional-images);
44 | background-repeat: no-repeat, no-repeat, no-repeat;
45 | background-position: center;
46 | background-size: cover;
47 |
48 | background-color: var(--lwt-accent-color-inactive, var(--lwt-accent-color));
49 | }
50 |
51 | /* Collapse styles */
52 | #browser #TabsToolbar:not([collapse='true']) {
53 | min-width: 76px;
54 | }
55 |
56 | #browser #TabsToolbar[collapse='true'] {
57 | max-width: var(--vertical-tabs-collapse-width);
58 | }
59 |
60 | /** On collapse hover of tabs or splitter, the max width should increase again */
61 | #browser #TabsToolbar[collapse='true']:hover
62 | /* #TabsToolbar[collapse='true']:has(+ #verticaltabs-splitter:hover) */ {
63 | max-width: var(--vertical-tabs-max-width);
64 | }
65 |
66 | /* ========================================================================== */
67 | /* Tab styles */
68 |
69 | #browser #TabsToolbar .tabbrowser-tab {
70 | max-width: unset;
71 | width: 100%;
72 |
73 | /* Stops the tabs from getting squished or stretched */
74 | min-height: unset;
75 | height: var(--tab-min-height);
76 | max-height: var(--tab-min-height);
77 |
78 | transition:
79 | min-height 150ms ease-in-out,
80 | max-height 150ms ease-in-out;
81 | }
82 |
83 | #browser #TabsToolbar .tab-background {
84 | height: calc(var(--tab-min-height) - 2px);
85 | }
86 |
87 | /* Work around for tab closing animation whilst in vertical tabs. Without this
88 | the clean up code (created by 608589) will not work correctly */
89 | /* TODO: This causes tabs to stick around for longer and trigger a clean up
90 | function. This isn't that performant, so we should look into fixing it in
91 | the future */
92 | #browser #TabsToolbar .tabbrowser-tab:not([pinned], [fadein]) {
93 | min-width: 0.1px;
94 | max-width: 0.1px;
95 | max-width: 0.1px;
96 | max-height: 0.1px;
97 | }
98 |
99 | #browser #TabsToolbar tab.tabbrowser-tab:nth-child(1) {
100 | margin-left: 0;
101 | }
102 |
103 | /* Border radius up at the top left of the browser when vertical tabs are enabled */
104 | @media (-moz-gtk-csd-available) {
105 | :root[tabsintitlebar][sizemode='normal']:not([gtktiledwindow='true'])
106 | #main-window[verticaltabs='true']
107 | #nav-bar {
108 | border-top-left-radius: env(-moz-gtk-csd-titlebar-radius);
109 | border-top-right-radius: env(-moz-gtk-csd-titlebar-radius);
110 | }
111 | }
112 |
113 | #main-window:not([verticaltabs='true']) #nav-bar .titlebar-buttonbox-container {
114 | display: none;
115 | }
116 |
117 | /* This fixes some consistencies with which buttons should be visible */
118 | #browser #tabbrowser-arrowscrollbox-periphery {
119 | display: none;
120 | }
121 |
122 | /** Extra margins for pinned tabs */
123 | #browser
124 | #tabbrowser-tabs[haspinnedtabs]:not([positionpinnedtabs])
125 | > #tabbrowser-arrowscrollbox
126 | > .tabbrowser-tab:nth-child(1 of :not([pinned], [hidden])) {
127 | margin-inline-start: 0px !important;
128 | }
129 |
130 | #browser .tab-content {
131 | padding: 0 var(--inline-tab-padding) !important;
132 | }
133 |
134 | #browser .tab-throbber,
135 | #browser .tab-icon-pending,
136 | #browser .tab-icon-image,
137 | #browser .tab-sharing-icon-overlay,
138 | #browser .tab-icon-overlay {
139 | margin-inline-end: 5.5px;
140 | }
141 |
142 | /* ========================================================================== */
143 | /* New tab icon styles */
144 |
145 | /* Put the new tab button on the bottom */
146 | #browser #TabsToolbar #TabsToolbar-customization-target {
147 | flex-direction: column;
148 | height: 100%;
149 | /* Not sure why, but this forces the scroll box to scroll */
150 | max-height: 100%;
151 | }
152 |
153 | #browser #new-tab-button {
154 | display: inherit !important;
155 | appearance: inherit !important;
156 |
157 | border-radius: var(--tab-border-radius);
158 | margin: 2px;
159 | /* Note that we don't want left & right padding to ensure centering */
160 | padding: var(--inline-tab-padding) 0;
161 |
162 | height: calc(var(--tab-min-height) - 2px);
163 | }
164 |
165 | /* Disable text & styling for new tab button */
166 | #browser #new-tab-button image {
167 | margin-left: 0;
168 | }
169 | #browser #new-tab-button label {
170 | display: none;
171 | }
172 |
173 | #browser #new-tab-button:hover {
174 | background: var(--toolbarbutton-hover-background);
175 | }
176 |
177 | #browser #tabbrowser-tabs {
178 | border-inline-start: none;
179 | margin-inline-start: 0;
180 | padding-inline-start: 0;
181 | }
182 |
183 | #browser
184 | #tabbrowser-tabs[haspinnedtabs]:not([positionpinnedtabs])
185 | > #tabbrowser-arrowscrollbox
186 | > .tabbrowser-tab[first-visible-unpinned-tab] {
187 | margin-inline-start: 0px !important;
188 | }
189 |
190 | #verticaltabs-splitter {
191 | -moz-box-ordinal-group: 1;
192 | border: solid 1px var(--tab-selected-bgcolor, var(--toolbar-bgcolor));
193 | }
194 |
--------------------------------------------------------------------------------
/configs/branding/beta/MacOSInstaller.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
46 |
--------------------------------------------------------------------------------
/configs/branding/alpha/MacOSInstaller.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
46 |
--------------------------------------------------------------------------------
/configs/branding/stable/MacOSInstaller.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/src/browser/themes/addons/pulse/dark/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "manifest_version": 2,
3 |
4 | "applications": {
5 | "gecko": {
6 | "id": "pulse-dark@browser.fushra.com"
7 | }
8 | },
9 |
10 | "name": "Pulse Dark",
11 | "description": "Pulse's dark theme",
12 | "author": "Fushra",
13 | "version": "1.2",
14 |
15 | "icons": { "32": "icon.svg" },
16 |
17 | "theme": {
18 | "colors": {
19 | "tab_background_text": "rgb(191, 188, 194)", // Grey 300
20 | "tab_selected": "rgb(26, 23, 28)", // Grey 900
21 | "tab_text": "rgb(242, 241, 244)", // Grey 100
22 |
23 | "icons": "rgb(242, 241, 244)", // Grey 100
24 | "frame": "rgb(38, 34, 42)", // Grey 850
25 | "popup": "rgb(38, 34, 42)", // Grey 850
26 | "popup_text": "rgb(242, 241, 244)", // Grey 100
27 | "popup_border": "transparent",
28 | "popup_highlight": "rgb(43,42,51)", // TODO: what
29 | "tab_line": "transparent",
30 |
31 | "toolbar": "rgb(26, 23, 28)", // Grey 900
32 | "toolbar_top_separator": "transparent",
33 | "toolbar_bottom_separator": "rgb(26, 23, 28)", // Grey 900
34 | "toolbar_field": "rgb(38, 34, 42)", // Grey 850
35 | "toolbar_field_border": "transparent",
36 | "toolbar_field_text": "rgb(242, 241, 244)", // Grey 100
37 | "toolbar_field_focus": "rgb(51, 47, 55)", // Grey 800
38 | "toolbar_text": "rgb(191, 188, 194)", // Grey 300
39 |
40 | "ntp_background": "rgb(38, 34, 42)", // Grey 850
41 | "ntp_card_background": "rgb(51, 47, 55)", // Grey 800
42 | "ntp_text": "rgb(242, 241, 244)", // Grey 100
43 |
44 | "sidebar_text": "rgb(242, 241, 244)", // Grey 100
45 | "sidebar_border": "transparent",
46 |
47 | "button": "rgb(26, 23, 28)", // Grey 900
48 | "button_hover": "rgb(77, 73, 80)", // Grey 700
49 | "button_active": "rgb(101, 99, 105)", // Grey 600
50 | "button_primary": "rgba(130, 64, 191, 1.00)", // Primary 500
51 | "button_primary_hover": "rgb(163, 99, 222, 1.00)", // Primary 600
52 | "button_primary_active": "rgb(130, 64, 191, 0.40)", // Primary 500, 40%
53 | "button_primary_color": "rgb(243, 230, 255)", // Primary 100
54 |
55 | "error_text_color": "rgb(255, 154, 162)", // TODO: We need red / error colors
56 |
57 | "input_background": "rgb(51, 47, 55)", // Grey 800
58 | "input_color": "rgb(242, 241, 244)", // Grey 100
59 | "input_border": "transparent",
60 | "input_border_error": "rgb(255, 132, 138)", // TODO: We need red / error colors
61 |
62 | "autocomplete_popup_separator": "rgb(77, 73, 80)", // Grey 700
63 | "appmenu_update_icon_color": "#54FFBD", // TODO
64 | "appmenu_info_icon_color": "#80EBFF", // TODO
65 | "tab_icon_overlay_stroke": "rgb(66,65,77)", // TODO: What even are these?
66 | "tab_icon_overlay_fill": "rgb(251,251,254)", // TODO: What even are these?
67 |
68 | "pulse_grey_900": "rgb(26, 23, 28)",
69 | "pulse_grey_850": "rgb(38, 34, 42)",
70 | "pulse_grey_800": "rgb(51, 47, 55)",
71 | "pulse_grey_700": "rgb(77, 73, 80)",
72 | "pulse_grey_600": "rgb(101, 99, 105)",
73 | "pulse_grey_500": "rgb(128, 125, 130)",
74 | "pulse_grey_400": "rgb(161, 158, 163)",
75 | "pulse_grey_300": "rgb(191, 188, 194)",
76 | "pulse_grey_200": "rgb(217, 214, 220)",
77 | "pulse_grey_100": "rgb(242, 241, 244)",
78 |
79 | "pulse_primary_900": "rgb(27, 0, 51)",
80 | "pulse_primary_800": "rgb(52, 8, 94)",
81 | "pulse_primary_700": "rgb(78, 19, 134)",
82 | "pulse_primary_600": "rgb(104, 41, 163)",
83 | "pulse_primary_500": "rgb(130, 64, 191)",
84 | "pulse_primary_400": "rgb(163, 99, 222)",
85 | "pulse_primary_300": "rgb(163, 99, 222)",
86 | "pulse_primary_200": "rgb(218, 182, 251)",
87 | "pulse_primary_100": "rgb(243, 230, 255)",
88 |
89 | "pulse_secondary_900": "rgb(53, 4, 57)",
90 | "pulse_secondary_800": "rgb(80, 11, 86)",
91 | "pulse_secondary_700": "rgb(121, 18, 130)",
92 | "pulse_secondary_600": "rgb(164, 41, 174)",
93 | "pulse_secondary_500": "rgb(199, 50, 211)",
94 | "pulse_secondary_400": "rgb(229, 74, 232)",
95 | "pulse_secondary_300": "rgb(252, 121, 255)",
96 | "pulse_secondary_200": "rgb(253, 158, 255)",
97 | "pulse_secondary_100": "rgb(249, 216, 252)"
98 | },
99 | "properties": {
100 | "arrowpanel_border_radius": "4px",
101 | "arrowpanel_menuitem_border_radius": "4px",
102 |
103 | "panel_hover": "color-mix(in srgb, currentColor 9%, transparent)",
104 | "panel_active": "color-mix(in srgb, currentColor 14%, transparent)",
105 | "panel_active_darker": "color-mix(in srgb, currentColor 25%, transparent)",
106 | "toolbar_field_icon_opacity": "1",
107 |
108 | "tab_rounding_size": "8px",
109 | "tab_rounding_size_neg": "-8px",
110 | "tab_block_margin": "0px",
111 | "tab_border_radius": "0px",
112 | "tab_padding_inline": "0px",
113 |
114 | "gradient": "linear-gradient(var(--gradient-orientation), var(--pulse-primary-500) 0%, var(--pulse-secondary-500) 100%)",
115 | "zap_gradient": "var(--gradient)",
116 |
117 | "toolbar_button_border_radius": "4px"
118 | }
119 | },
120 |
121 | "theme_experiment": {
122 | "stylesheet": "experiment.css",
123 | "colors": {
124 | "button": "--button-bgcolor",
125 | "button_hover": "--button-hover-bgcolor",
126 | "button_active": "--button-active-bgcolor",
127 | "button_primary": "--button-primary-bgcolor",
128 | "button_primary_hover": "--button-primary-hover-bgcolor",
129 | "button_primary_active": "--button-primary-active-bgcolor",
130 | "button_primary_color": "--button-primary-color",
131 | "error_text_color": "--error-text-color",
132 | "input_background": "--input-bgcolor",
133 | "input_color": "--input-color",
134 | "input_border": "--input-border-color",
135 | "input_border_error": "--input-error-border-color",
136 | "autocomplete_popup_separator": "--autocomplete-popup-separator-color",
137 | "appmenu_update_icon_color": "--panel-banner-item-update-supported-bgcolor",
138 | "appmenu_info_icon_color": "--panel-banner-item-info-icon-bgcolor",
139 | "tab_icon_overlay_stroke": "--tab-icon-overlay-stroke",
140 | "tab_icon_overlay_fill": "--tab-icon-overlay-fill",
141 |
142 | "pulse_grey_900": "--pulse-grey-900",
143 | "pulse_grey_850": "--pulse-grey-850",
144 | "pulse_grey_800": "--pulse-grey-800",
145 | "pulse_grey_700": "--pulse-grey-700",
146 | "pulse_grey_600": "--pulse-grey-600",
147 | "pulse_grey_500": "--pulse-grey-500",
148 | "pulse_grey_400": "--pulse-grey-400",
149 | "pulse_grey_300": "--pulse-grey-300",
150 | "pulse_grey_200": "--pulse-grey-200",
151 | "pulse_grey_100": "--pulse-grey-100",
152 |
153 | "pulse_primary_900": "--pulse-primary-900",
154 | "pulse_primary_800": "--pulse-primary-800",
155 | "pulse_primary_700": "--pulse-primary-700",
156 | "pulse_primary_600": "--pulse-primary-600",
157 | "pulse_primary_500": "--pulse-primary-500",
158 | "pulse_primary_400": "--pulse-primary-400",
159 | "pulse_primary_300": "--pulse-primary-300",
160 | "pulse_primary_200": "--pulse-primary-200",
161 | "pulse_primary_100": "--pulse-primary-100",
162 |
163 | "pulse_secondary_900": "--pulse-secondary-900",
164 | "pulse_secondary_800": "--pulse-secondary-800",
165 | "pulse_secondary_700": "--pulse-secondary-700",
166 | "pulse_secondary_600": "--pulse-secondary-600",
167 | "pulse_secondary_500": "--pulse-secondary-500",
168 | "pulse_secondary_400": "--pulse-secondary-400",
169 | "pulse_secondary_300": "--pulse-secondary-300",
170 | "pulse_secondary_200": "--pulse-secondary-200",
171 | "pulse_secondary_100": "--pulse-secondary-100"
172 | },
173 | "properties": {
174 | "arrowpanel_border_radius": "--arrowpanel-border-radius",
175 | "arrowpanel_menuitem_border_radius": "--arrowpanel-menuitem-border-radius",
176 |
177 | "panel_hover": "--panel-item-hover-bgcolor",
178 | "panel_active": "--arrowpanel-dimmed-further",
179 | "panel_active_darker": "--panel-item-active-bgcolor",
180 | "toolbar_field_icon_opacity": "--urlbar-icon-fill-opacity",
181 |
182 | "tab_rounding_size": "--tab-rounding-size",
183 | "tab_rounding_size_neg": "--tab-rounding-size-neg",
184 | // The padding around each tab. In proton, this is what makes them float
185 | "tab_block_margin": "--tab-block-margin",
186 | // The border radius of the tab
187 | "tab_border_radius": "--tab-border-radius",
188 | // Padding to the left and right of the tab. **Pulse Browser custom**
189 | "tab_padding_inline": "--tab-padding-inline",
190 |
191 | "gradient": "--gradient",
192 | "zap_gradient": "--panel-separator-zap-gradient",
193 |
194 | "toolbar_button_border_radius": "--toolbarbutton-border-radius"
195 | }
196 | }
197 | }
198 |
--------------------------------------------------------------------------------
/src/browser/themes/addons/pulse/light/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "manifest_version": 2,
3 |
4 | "applications": {
5 | "gecko": {
6 | "id": "pulse-light@browser.fushra.com"
7 | }
8 | },
9 |
10 | "name": "Pulse Light",
11 | "description": "Pulse's light theme",
12 | "author": "Fushra",
13 | "version": "1.2",
14 |
15 | "icons": { "32": "icon.svg" },
16 |
17 | "theme": {
18 | "colors": {
19 | "tab_background_text": "rgb(51, 47, 55)", // Grey 800
20 | "tab_selected": "rgb(242, 241, 244)", // Grey 100
21 | "tab_text": "rgb(26, 23, 28)", // Grey 900
22 |
23 | "icons": "rgb(91,91,102)", // Grey 900
24 | "frame": "rgb(217, 214, 220)", // Grey 200
25 | "popup": "rgb(217, 214, 220)", // Grey 200
26 | "popup_text": "rgb(26, 23, 28)", // Grey 900
27 | "popup_border": "transparent",
28 | "popup_highlight": "#e0e0e6", // TODO: What
29 | "popup_highlight_text": "#15141a", // TODO: what
30 | "tab_line": "transparent",
31 |
32 | "toolbar": "rgb(242, 241, 244)", // Grey 100
33 | "toolbar_top_separator": "transparent",
34 | "toolbar_bottom_separator": "rgb(242, 241, 244)", // Grey 100
35 | "toolbar_field": "rgb(217, 214, 220)", // Grey 200
36 | "toolbar_field_text": "rgb(26, 23, 28)", // Grey 900
37 | "toolbar_field_border": "transparent",
38 | "toolbar_field_focus": "rgb(217, 214, 220)", // Grey 200
39 | "toolbar_text": "rgb(26, 23, 28)", // Grey 900
40 |
41 | "ntp_background": "rgb(217, 214, 220)", // Grey 200
42 | "ntp_text": "rgb(26, 23, 28)", // Grey 900
43 |
44 | "button": "rgba(191, 188, 194, .33)", // Grey 300, 33% opacity
45 | "button_hover": "rgba(191, 188, 194, .66)", // Grey 300, 66% opacity
46 | "button_active": "rgba(191, 188, 194)", // Grey 300
47 | "button_primary": "rgba(130, 64, 191, 1.00)", // Primary 500, 20%
48 | "button_primary_hover": "rgba(163, 99, 222, 1.00)", // Primary 500, 30%
49 | "button_primary_active": "rgba(130, 64, 191, 0.40)", // Primary 500, 40%
50 | "button_primary_color": "rgba(242, 241, 244)", // Primary 100
51 |
52 | "error_text_color": "rgb(197,0,66)", // TODO: Error buttons
53 |
54 | "input_color": "rgb(217, 214, 220)", // Grey 200
55 | "input_background": "rgb(242, 241, 244)", // Grey 100
56 | "input_border_error": "#E22850", // TODO: Error buttons
57 |
58 | "autocomplete_popup_hover": "rgb(191, 188, 194)", // Grey 300
59 | "autocomplete_popup_separator": "rgb(191, 188, 194)", // Grey 300
60 | "appmenu_update_icon_color": "#2AC3A2", // TODO
61 | "appmenu_info_icon_color": "#0090ED", // TODO
62 | "tab_icon_overlay_stroke": "rgb(255,255,255)", // TODO: What is this
63 | "tab_icon_overlay_fill": "rgb(91,91,102)", // TODO: What is this
64 | "sidebar": "transparent",
65 | "sidebar_border": "transparent",
66 |
67 | "pulse_grey_900": "rgb(26, 23, 28)",
68 | "pulse_grey_850": "rgb(38, 34, 42)",
69 | "pulse_grey_800": "rgb(51, 47, 55)",
70 | "pulse_grey_700": "rgb(77, 73, 80)",
71 | "pulse_grey_600": "rgb(101, 99, 105)",
72 | "pulse_grey_500": "rgb(128, 125, 130)",
73 | "pulse_grey_400": "rgb(161, 158, 163)",
74 | "pulse_grey_300": "rgb(191, 188, 194)",
75 | "pulse_grey_200": "rgb(217, 214, 220)",
76 | "pulse_grey_100": "rgb(242, 241, 244)",
77 |
78 | "pulse_primary_900": "rgb(27, 0, 51)",
79 | "pulse_primary_800": "rgb(52, 8, 94)",
80 | "pulse_primary_700": "rgb(78, 19, 134)",
81 | "pulse_primary_600": "rgb(104, 41, 163)",
82 | "pulse_primary_500": "rgb(130, 64, 191)",
83 | "pulse_primary_400": "rgb(163, 99, 222)",
84 | "pulse_primary_300": "rgb(163, 99, 222)",
85 | "pulse_primary_200": "rgb(218, 182, 251)",
86 | "pulse_primary_100": "rgb(243, 230, 255)",
87 |
88 | "pulse_secondary_900": "rgb(53, 4, 57)",
89 | "pulse_secondary_800": "rgb(80, 11, 86)",
90 | "pulse_secondary_700": "rgb(121, 18, 130)",
91 | "pulse_secondary_600": "rgb(164, 41, 174)",
92 | "pulse_secondary_500": "rgb(199, 50, 211)",
93 | "pulse_secondary_400": "rgb(229, 74, 232)",
94 | "pulse_secondary_300": "rgb(252, 121, 255)",
95 | "pulse_secondary_200": "rgb(253, 158, 255)",
96 | "pulse_secondary_100": "rgb(249, 216, 252)"
97 | },
98 | "properties": {
99 | "arrowpanel_border_radius": "4px",
100 | "arrowpanel_menuitem_border_radius": "4px",
101 |
102 | "panel_hover": "color-mix(in srgb, currentColor 9%, transparent)",
103 | "panel_active": "color-mix(in srgb, currentColor 14%, transparent)",
104 | "panel_active_darker": "color-mix(in srgb, currentColor 25%, transparent)",
105 | "toolbar_field_icon_opacity": "1",
106 |
107 | "tab_rounding_size": "8px",
108 | "tab_rounding_size_neg": "-8px",
109 | "tab_block_margin": "0px",
110 | "tab_border_radius": "0px",
111 | "tab_padding_inline": "0px",
112 |
113 | "gradient": "linear-gradient(var(--gradient-orientation), var(--pulse-primary-500) 0%, var(--pulse-secondary-500) 100%)",
114 | "zap_gradient": "var(--gradient)",
115 |
116 | "toolbar_button_border_radius": "4px"
117 | }
118 | },
119 |
120 | "theme_experiment": {
121 | "stylesheet": "experiment.css",
122 | "colors": {
123 | "button": "--button-bgcolor",
124 | "button_hover": "--button-hover-bgcolor",
125 | "button_active": "--button-active-bgcolor",
126 | "button_primary": "--button-primary-bgcolor",
127 | "button_primary_hover": "--button-primary-hover-bgcolor",
128 | "button_primary_active": "--button-primary-active-bgcolor",
129 | "button_primary_color": "--button-primary-color",
130 | "error_text_color": "--error-text-color",
131 | "input_background": "--input-bgcolor",
132 | "input_color": "--input-color",
133 | "input_border": "--input-border-color",
134 | "input_border_error": "--input-error-border-color",
135 | "autocomplete_popup_separator": "--autocomplete-popup-separator-color",
136 | "appmenu_update_icon_color": "--panel-banner-item-update-supported-bgcolor",
137 | "appmenu_info_icon_color": "--panel-banner-item-info-icon-bgcolor",
138 | "tab_icon_overlay_stroke": "--tab-icon-overlay-stroke",
139 | "tab_icon_overlay_fill": "--tab-icon-overlay-fill",
140 |
141 | "pulse_grey_900": "--pulse-grey-900",
142 | "pulse_grey_850": "--pulse-grey-850",
143 | "pulse_grey_800": "--pulse-grey-800",
144 | "pulse_grey_700": "--pulse-grey-700",
145 | "pulse_grey_600": "--pulse-grey-600",
146 | "pulse_grey_500": "--pulse-grey-500",
147 | "pulse_grey_400": "--pulse-grey-400",
148 | "pulse_grey_300": "--pulse-grey-300",
149 | "pulse_grey_200": "--pulse-grey-200",
150 | "pulse_grey_100": "--pulse-grey-100",
151 |
152 | "pulse_primary_900": "--pulse-primary-900",
153 | "pulse_primary_800": "--pulse-primary-800",
154 | "pulse_primary_700": "--pulse-primary-700",
155 | "pulse_primary_600": "--pulse-primary-600",
156 | "pulse_primary_500": "--pulse-primary-500",
157 | "pulse_primary_400": "--pulse-primary-400",
158 | "pulse_primary_300": "--pulse-primary-300",
159 | "pulse_primary_200": "--pulse-primary-200",
160 | "pulse_primary_100": "--pulse-primary-100",
161 |
162 | "pulse_secondary_900": "--pulse-secondary-900",
163 | "pulse_secondary_800": "--pulse-secondary-800",
164 | "pulse_secondary_700": "--pulse-secondary-700",
165 | "pulse_secondary_600": "--pulse-secondary-600",
166 | "pulse_secondary_500": "--pulse-secondary-500",
167 | "pulse_secondary_400": "--pulse-secondary-400",
168 | "pulse_secondary_300": "--pulse-secondary-300",
169 | "pulse_secondary_200": "--pulse-secondary-200",
170 | "pulse_secondary_100": "--pulse-secondary-100"
171 | },
172 | "properties": {
173 | "arrowpanel_border_radius": "--arrowpanel-border-radius",
174 | "arrowpanel_menuitem_border_radius": "--arrowpanel-menuitem-border-radius",
175 |
176 | "panel_hover": "--panel-item-hover-bgcolor",
177 | "panel_active": "--arrowpanel-dimmed-further",
178 | "panel_active_darker": "--panel-item-active-bgcolor",
179 | "toolbar_field_icon_opacity": "--urlbar-icon-fill-opacity",
180 |
181 | "tab_rounding_size": "--tab-rounding-size",
182 | "tab_rounding_size_neg": "--tab-rounding-size-neg",
183 | // The padding around each tab. In proton, this is what makes them float
184 | "tab_block_margin": "--tab-block-margin",
185 | // The border radius of the tab
186 | "tab_border_radius": "--tab-border-radius",
187 | // Padding to the left and right of the tab. **Pulse Browser custom**
188 | "tab_padding_inline": "--tab-padding-inline",
189 |
190 | "gradient": "--gradient",
191 | "zap_gradient": "--panel-separator-zap-gradient",
192 |
193 | "toolbar_button_border_radius": "--toolbarbutton-border-radius"
194 | }
195 | }
196 | }
197 |
--------------------------------------------------------------------------------