+ Muted blogs:
+
+
+
+ No muted blogs! Use the ⋯ meatballs menu on any post to mute the blog that posted it.
+
+
+
+
+
+
+
+
+
+
+
+
+
+`, 'text/html');
+
+const adoptedStyleSheets = await fetchStyleSheets([
+ '/lib/modern-normalize.css',
+ '/action/acorn.css',
+ './index.css',
+].map(import.meta.resolve));
+
+const blogNamesStorageKey = 'mute.blogNames';
+const mutedBlogsEntriesStorageKey = 'mute.mutedBlogEntries';
+
+class MuteMutedUsersElement extends CustomElement {
+ /** @type {HTMLUListElement} */ #mutedBlogList;
+ /** @type {HTMLTemplateElement} */ #mutedBlogTemplate;
+ /** @type {HTMLTemplateElement} */ #unmuteTemplate;
+
+ constructor () {
+ super(templateDocument, adoptedStyleSheets);
+
+ this.#mutedBlogList = this.shadowRoot.getElementById('muted-blogs');
+ this.#mutedBlogTemplate = this.shadowRoot.getElementById('muted-blog');
+ this.#unmuteTemplate = this.shadowRoot.getElementById('unmute-template');
+ }
+
+ getBlogNames = async () => {
+ const { [blogNamesStorageKey]: blogNames = {} } = await browser.storage.local.get(blogNamesStorageKey);
+ return blogNames;
+ };
+
+ getMutedBlogs = async () => {
+ const { [mutedBlogsEntriesStorageKey]: mutedBlogsEntries } = await browser.storage.local.get(mutedBlogsEntriesStorageKey);
+ return Object.fromEntries(mutedBlogsEntries ?? []);
+ };
+
+ setMutedBlogs = mutedBlogs =>
+ browser.storage.local.set({ [mutedBlogsEntriesStorageKey]: Object.entries(mutedBlogs) });
+
+ /** @type {(event: PointerEvent) => Promise