diff --git a/src/browser/app/profile/zen-browser.js b/src/browser/app/profile/zen-browser.js
index 7f9246f3e..097df3e05 100644
--- a/src/browser/app/profile/zen-browser.js
+++ b/src/browser/app/profile/zen-browser.js
@@ -112,6 +112,9 @@ pref('zen.tab-unloader.enabled', true);
pref('zen.tab-unloader.timeout-minutes', 20);
pref('zen.tab-unloader.excluded-urls', "example.com,example.org");
+pref('zen.pinned-tab-manager.reset-pinned-tab-on-close-shortcut', false);
+pref('zen.pinned-tab-manager.restore-pinned-tabs-to-pinned-url', false);
+
// Pref to enable the new profiles (TODO: Check this out!)
//pref("browser.profiles.enabled", true);
diff --git a/src/browser/base/content/ZenStartup.mjs b/src/browser/base/content/ZenStartup.mjs
index c9fc37e71..505793fd8 100644
--- a/src/browser/base/content/ZenStartup.mjs
+++ b/src/browser/base/content/ZenStartup.mjs
@@ -39,6 +39,7 @@
gZenUIManager.init();
gZenVerticalTabsManager.init();
gZenCompactModeManager.init();
+ gZenPinnedTabManager.init();
function throttle(f, delay) {
let timer = 0;
diff --git a/src/browser/base/content/zen-assets.inc.xhtml b/src/browser/base/content/zen-assets.inc.xhtml
index 74d0d6af7..737eab480 100644
--- a/src/browser/base/content/zen-assets.inc.xhtml
+++ b/src/browser/base/content/zen-assets.inc.xhtml
@@ -31,6 +31,7 @@
+
diff --git a/src/browser/base/content/zen-assets.jar.inc.mn b/src/browser/base/content/zen-assets.jar.inc.mn
index 582dfb14f..e8525521d 100644
--- a/src/browser/base/content/zen-assets.jar.inc.mn
+++ b/src/browser/base/content/zen-assets.jar.inc.mn
@@ -16,6 +16,7 @@
content/browser/zen-components/ZenThemeBuilder.mjs (content/zen-components/src/ZenThemeBuilder.mjs)
content/browser/zen-components/ZenThemesImporter.mjs (content/zen-components/src/ZenThemesImporter.mjs)
content/browser/zen-components/ZenTabUnloader.mjs (content/zen-components/src/ZenTabUnloader.mjs)
+ content/browser/zen-components/ZenPinnedTabManager.mjs (content/zen-components/src/ZenPinnedTabManager.mjs)
content/browser/zen-components/ZenCommonUtils.mjs (content/zen-components/src/ZenCommonUtils.mjs)
content/browser/zen-components/ZenGradientGenerator.mjs (content/zen-components/src/ZenGradientGenerator.mjs)
diff --git a/src/browser/components/preferences/zen-settings.js b/src/browser/components/preferences/zen-settings.js
index 36d4de02e..2a70e8e57 100644
--- a/src/browser/components/preferences/zen-settings.js
+++ b/src/browser/components/preferences/zen-settings.js
@@ -1020,4 +1020,14 @@ Preferences.addAll([
type: 'bool',
default: false,
},
+ {
+ id: 'zen.pinned-tab-manager.restore-pinned-tabs-to-pinned-url',
+ type: 'bool',
+ default: true,
+ },
+ {
+ id: 'zen.pinned-tab-manager.close-shortcut-behavior',
+ type: 'string',
+ default: 'switch',
+ },
]);
diff --git a/src/browser/components/preferences/zenTabsManagement.inc.xhtml b/src/browser/components/preferences/zenTabsManagement.inc.xhtml
index c2b41f34f..0b9ffda98 100644
--- a/src/browser/components/preferences/zenTabsManagement.inc.xhtml
+++ b/src/browser/components/preferences/zenTabsManagement.inc.xhtml
@@ -48,6 +48,7 @@
data-l10n-id="zen-tabs-unloader-enabled"
preference="zen.tab-unloader.enabled"/>
+
@@ -59,6 +60,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/browser/components/sessionstore/TabState-sys-mjs.patch b/src/browser/components/sessionstore/TabState-sys-mjs.patch
index 1d2056633..a9793795d 100644
--- a/src/browser/components/sessionstore/TabState-sys-mjs.patch
+++ b/src/browser/components/sessionstore/TabState-sys-mjs.patch
@@ -1,13 +1,16 @@
diff --git a/browser/components/sessionstore/TabState.sys.mjs b/browser/components/sessionstore/TabState.sys.mjs
-index 26f5671c849d9b0a126d79b07bc7d3d7870826ec..26f80d69a28f1196096e67a0e628a69b5b367727 100644
+index 26f5671c849d9b0a126d79b07bc7d3d7870826ec..5e356a35639c802fcf6d95d42993d5bd5cda514a 100644
--- a/browser/components/sessionstore/TabState.sys.mjs
+++ b/browser/components/sessionstore/TabState.sys.mjs
-@@ -98,6 +98,9 @@ var TabStateInternal = {
+@@ -98,6 +98,12 @@ var TabStateInternal = {
tabData.muteReason = tab.muteReason;
}
+ tabData.zenWorkspace = tab.getAttribute("zen-workspace-id");
+ tabData.zenDefaultUserContextId = tab.getAttribute("zenDefaultUserContextId");
++ tabData.zenPinnedUrl = tab.getAttribute("zen-pinned-url");
++ tabData.zenPinnedTitle = tab.getAttribute("zen-pinned-title");
++ tabData.zenPinnedIcon = tab.getAttribute("zen-pinned-icon");
+
tabData.searchMode = tab.ownerGlobal.gURLBar.getSearchMode(browser, true);
diff --git a/src/browser/components/tabbrowser/content/tabbrowser-js.patch b/src/browser/components/tabbrowser/content/tabbrowser-js.patch
index bce895bac..81626a1ad 100644
--- a/src/browser/components/tabbrowser/content/tabbrowser-js.patch
+++ b/src/browser/components/tabbrowser/content/tabbrowser-js.patch
@@ -1,8 +1,8 @@
diff --git a/browser/components/tabbrowser/content/tabbrowser.js b/browser/components/tabbrowser/content/tabbrowser.js
-index ef857bd81f2cd7c163ecc74ac1cf81a0b63ce838..807eb0c493f15643412b05d8dad81d36d7470155 100644
+index c89ae2cbb978d6218bd56a059c5ca1e371231607..ab88ba4024bf5d069ef4ca613024f422ad513405 100644
--- a/browser/components/tabbrowser/content/tabbrowser.js
+++ b/browser/components/tabbrowser/content/tabbrowser.js
-@@ -452,11 +452,26 @@
+@@ -456,11 +456,26 @@
return duplicateTabs;
},
@@ -31,7 +31,7 @@ index ef857bd81f2cd7c163ecc74ac1cf81a0b63ce838..807eb0c493f15643412b05d8dad81d36
}
return i;
},
-@@ -2704,6 +2719,11 @@
+@@ -2705,6 +2720,11 @@
);
}
@@ -43,7 +43,7 @@ index ef857bd81f2cd7c163ecc74ac1cf81a0b63ce838..807eb0c493f15643412b05d8dad81d36
if (!UserInteraction.running("browser.tabs.opening", window)) {
UserInteraction.start("browser.tabs.opening", "initting", window);
}
-@@ -2771,6 +2791,9 @@
+@@ -2773,6 +2793,9 @@
noInitialLabel,
skipBackgroundNotify,
});
@@ -53,7 +53,7 @@ index ef857bd81f2cd7c163ecc74ac1cf81a0b63ce838..807eb0c493f15643412b05d8dad81d36
if (insertTab) {
// insert the tab into the tab container in the correct position
this._insertTabAtIndex(t, {
-@@ -3248,6 +3271,14 @@
+@@ -3262,6 +3285,14 @@
) {
tabWasReused = true;
tab = this.selectedTab;
@@ -68,7 +68,17 @@ index ef857bd81f2cd7c163ecc74ac1cf81a0b63ce838..807eb0c493f15643412b05d8dad81d36
if (!tabData.pinned) {
this.unpinTab(tab);
} else {
-@@ -3297,6 +3328,13 @@
+@@ -3275,6 +3306,9 @@
+ restoreTabsLazily && !select && !tabData.pinned;
+
+ let url = "about:blank";
++
++ gZenPinnedTabManager.resetPinnedTabData(tabData);
++
+ if (tabData.entries?.length) {
+ let activeIndex = (tabData.index || tabData.entries.length) - 1;
+ // Ensure the index is in bounds.
+@@ -3311,6 +3345,12 @@
preferredRemoteType,
});
@@ -78,11 +88,19 @@ index ef857bd81f2cd7c163ecc74ac1cf81a0b63ce838..807eb0c493f15643412b05d8dad81d36
+ if (tabData.zenDefaultUserContextId) {
+ tab.setAttribute("zenDefaultUserContextId", "true");
+ }
-+
if (select) {
tabToSelect = tab;
}
-@@ -4184,6 +4222,7 @@
+@@ -3345,7 +3385,7 @@
+ this.tabContainer._invalidateCachedTabs();
+ }
+ }
+-
++ gZenPinnedTabManager.updatePinnedTabForSessionRestore(tabData, tab);
+ tab.initialize();
+ }
+
+@@ -4198,6 +4238,7 @@
isLastTab ||
aTab.pinned ||
aTab.hidden ||
@@ -90,7 +108,7 @@ index ef857bd81f2cd7c163ecc74ac1cf81a0b63ce838..807eb0c493f15643412b05d8dad81d36
this._removingTabs.size >
3 /* don't want lots of concurrent animations */ ||
!aTab.hasAttribute(
-@@ -5117,10 +5156,10 @@
+@@ -5131,10 +5172,10 @@
SessionStore.deleteCustomTabValue(aTab, "hiddenBy");
},
@@ -103,3 +121,12 @@ index ef857bd81f2cd7c163ecc74ac1cf81a0b63ce838..807eb0c493f15643412b05d8dad81d36
aTab.selected ||
aTab.closing ||
// Tabs that are sharing the screen, microphone or camera cannot be hidden.
+@@ -7870,7 +7911,7 @@ var TabContextMenu = {
+ );
+ contextUnpinSelectedTabs.hidden =
+ !this.contextTab.pinned || !multiselectionContext;
+-
++ gZenPinnedTabManager.updatePinnedTabContextMenu(this.contextTab);
+ // Move Tab items
+ let contextMoveTabOptions = document.getElementById(
+ "context_moveTabOptions"
diff --git a/src/browser/themes/shared/zen-icons/icons.css b/src/browser/themes/shared/zen-icons/icons.css
index 5c671b7d4..b8c89a34b 100644
--- a/src/browser/themes/shared/zen-icons/icons.css
+++ b/src/browser/themes/shared/zen-icons/icons.css
@@ -773,7 +773,8 @@ menuitem[id='placesContext_deleteHost'],
#context_reloadTab,
#context_reloadSelectedTabs,
#toolbar-context-reloadSelectedTab,
-#toolbar-context-reloadSelectedTabs {
+#toolbar-context-reloadSelectedTabs,
+#context_zen-reset-pinned-tab {
--menu-image: url('reload.svg');
}
@@ -872,7 +873,8 @@ menuitem[contexttype='fullscreen'][label*='Exit'] {
#context_unpinTab,
#context_pinSelectedTabs,
#context_unpinSelectedTabs,
-.customize-context-moveToPanel {
+.customize-context-moveToPanel,
+#context_zen-replace-pinned-url-with-current {
--menu-image: url('pin.svg');
}