mirror of
https://github.com/zen-browser/desktop
synced 2026-04-26 01:25:02 +02:00
138 lines
3.5 KiB
JavaScript
138 lines
3.5 KiB
JavaScript
/* 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/. */
|
|
|
|
import { html } from "chrome://global/content/vendor/lit.all.mjs";
|
|
import { MozLitElement } from "chrome://global/content/lit-utils.mjs";
|
|
|
|
const lazy = {};
|
|
|
|
ChromeUtils.defineLazyGetter(lazy, "siblingElement", () => {
|
|
// All our notifications should be attached after the media controls toolbar
|
|
return document.getElementById("zen-media-controls-toolbar");
|
|
});
|
|
|
|
/**
|
|
* Zen Sidebar Notification Component
|
|
*
|
|
* Displays and takes care of animations for notifications that
|
|
* appear in the sidebar.
|
|
*/
|
|
class ZenSidebarNotification extends MozLitElement {
|
|
static properties = {
|
|
headingL10nId: { type: String, fluent: true },
|
|
links: { type: Array },
|
|
};
|
|
|
|
constructor({ headingL10nId = "", links = [] } = {}) {
|
|
super();
|
|
this.headingL10nId = headingL10nId;
|
|
this.links = links;
|
|
}
|
|
|
|
connectedCallback() {
|
|
super.connectedCallback();
|
|
if (this.parentElement) {
|
|
this.#animateIn();
|
|
}
|
|
}
|
|
|
|
remove() {
|
|
this.#animateOut().then(() => {
|
|
super.remove();
|
|
});
|
|
}
|
|
|
|
render() {
|
|
return html`
|
|
<link
|
|
rel="stylesheet"
|
|
href="chrome://browser/content/zen-styles/zen-sidebar-notification.css"
|
|
/>
|
|
<div class="zen-sidebar-notification-header">
|
|
<label
|
|
class="zen-sidebar-notification-heading"
|
|
flex="1"
|
|
data-l10n-id=${this.headingL10nId}
|
|
></label>
|
|
<div
|
|
class="zen-sidebar-notification-close-button"
|
|
@click=${() => this.remove()}
|
|
>
|
|
<img src="chrome://browser/skin/zen-icons/close.svg" />
|
|
</div>
|
|
</div>
|
|
<div class="zen-sidebar-notification-body">
|
|
${this.links.map(
|
|
link => html`
|
|
<div
|
|
class="zen-sidebar-notification-link-container"
|
|
data-l10n-id="${link.l10nId}-tooltip"
|
|
?special=${link.special}
|
|
@click=${() => {
|
|
if (link.action) {
|
|
link.action();
|
|
return;
|
|
}
|
|
window.openLinkIn(link.url, "tab", {
|
|
triggeringPrincipal:
|
|
Services.scriptSecurityManager.getSystemPrincipal(),
|
|
forceForeground: true,
|
|
});
|
|
this.remove();
|
|
}}
|
|
>
|
|
<img
|
|
class="zen-sidebar-notification-link-icon"
|
|
src=${link.icon}
|
|
/>
|
|
<label
|
|
class="zen-sidebar-notification-link-text"
|
|
data-l10n-id="${link.l10nId}-label"
|
|
></label>
|
|
</div>
|
|
`
|
|
)}
|
|
</div>
|
|
`;
|
|
}
|
|
|
|
#animateIn() {
|
|
this.style.opacity = "0";
|
|
return gZenUIManager.motion.animate(
|
|
this,
|
|
{
|
|
opacity: [0, 1],
|
|
y: [50, 0],
|
|
},
|
|
{
|
|
delay: 1,
|
|
}
|
|
);
|
|
}
|
|
|
|
#animateOut() {
|
|
return gZenUIManager.motion.animate(
|
|
this,
|
|
{
|
|
opacity: [1, 0],
|
|
y: [0, 10],
|
|
},
|
|
{}
|
|
);
|
|
}
|
|
}
|
|
|
|
export default function createSidebarNotification(args) {
|
|
if (!gZenVerticalTabsManager._prefsSidebarExpanded) {
|
|
return null;
|
|
}
|
|
|
|
const notification = new ZenSidebarNotification(args);
|
|
|
|
lazy.siblingElement.insertAdjacentElement("afterend", notification);
|
|
return notification;
|
|
}
|
|
|
|
customElements.define("zen-sidebar-notification", ZenSidebarNotification);
|