From b900c0064142ac970ae2c4c7bb0928916fed74d7 Mon Sep 17 00:00:00 2001 From: dragonwocky Date: Mon, 27 Sep 2021 19:01:21 +1000 Subject: [PATCH] bugfix storage, theming, validation, update launcher --- extension/api/registry.mjs | 31 +++++--- extension/api/storage.mjs | 27 +++---- extension/api/validation.mjs | 5 +- extension/api/web.mjs | 2 +- extension/launcher.js | 55 +++++++++------ .../mod.json | 1 - .../mod.json | 3 +- .../README.md | 3 - .../client.css | 29 ++++---- .../client.mjs | 70 +++++++++---------- .../file.svg | 2 - .../mod.json | 15 +--- .../tooltips.css | 20 ------ .../client.mjs | 17 +++-- .../mod.json | 1 - .../theme.css | 6 +- .../mod.json | 1 - 17 files changed, 139 insertions(+), 149 deletions(-) delete mode 100644 extension/repo/menu@a6621988-551d-495a-97d8-3c568bca2e9e/README.md delete mode 100644 extension/repo/menu@a6621988-551d-495a-97d8-3c568bca2e9e/file.svg delete mode 100644 extension/repo/menu@a6621988-551d-495a-97d8-3c568bca2e9e/tooltips.css diff --git a/extension/api/registry.mjs b/extension/api/registry.mjs index c2d7efb..8fb6d5b 100644 --- a/extension/api/registry.mjs +++ b/extension/api/registry.mjs @@ -47,9 +47,13 @@ async function validate(mod) { optional = false, } = {} ) => { - const test = await is(type === 'file' ? `repo/${mod._dir}/${value}` : value, type, { - extension, - }); + const test = await is( + type === 'file' && value ? `repo/${mod._dir}/${value}` : value, + type, + { + extension, + } + ); if (!test) { if (optional && (await is(value, 'undefined'))) return true; if (error) _errors.push({ source: mod._dir, message: error }); @@ -61,9 +65,14 @@ async function validate(mod) { check('name', mod.name, 'string'), check('id', mod.id, 'uuid'), check('version', mod.version, 'semver'), - check('environments', mod.environments, 'array').then((passed) => - passed ? mod.environments.map((tag) => check('environments.env', tag, 'env')) : 0 - ), + check('environments', mod.environments, 'array', { optional: true }).then((passed) => { + if (!passed) return false; + if (!mod.environments) { + mod.environments = env.supported; + return true; + } + return mod.environments.map((tag) => check('environments.env', tag, 'env')); + }), check('description', mod.description, 'string'), // file doubles for url here check('preview', mod.preview, 'file', { optional: true }), @@ -202,9 +211,10 @@ async function validate(mod) { /** * list all available mods in the repo + * @param {function} filter - a function to filter out mods * @returns {array} a validated list of mod.json objects */ -export const list = async () => { +export const list = async (filter = (mod) => true) => { if (!_cache.length) { for (const dir of await getJSON('repo/registry.json')) { try { @@ -216,7 +226,9 @@ export const list = async () => { } } } - return _cache; + const list = []; + for (const mod of _cache) if (await filter(mod)) list.push(mod); + return list; }; /** @@ -263,6 +275,7 @@ export const enabled = async (id) => { export const optionDefault = async (id, key) => { const mod = await get(id), opt = mod.options.find((opt) => opt.key === key); + if (!opt) return undefined; switch (opt.type) { case 'toggle': case 'text': @@ -272,6 +285,6 @@ export const optionDefault = async (id, key) => { case 'select': return opt.values[0]; case 'file': + return undefined; } - return undefined; }; diff --git a/extension/api/storage.mjs b/extension/api/storage.mjs index 0be7681..13d9f91 100644 --- a/extension/api/storage.mjs +++ b/extension/api/storage.mjs @@ -24,15 +24,15 @@ export const get = (path, fallback = undefined) => { if (!path.length) return fallback; const namespace = path.shift(); return new Promise((res, rej) => - chrome.storage.sync.get([namespace], async (values) => { + chrome.storage.sync.get(async (values) => { let value = values[namespace]; - while (path.length) { - value = value[path.shift()]; - if (path.length && !value) { + do { + if (value === undefined) { value = fallback; break; } - } + value = value[path.shift()]; + } while (path.length); res(value ?? fallback); }) ); @@ -54,17 +54,18 @@ export const set = (path, value) => { } const pathClone = [...path], namespace = path.shift(); - chrome.storage.sync.get([namespace], async (values) => { + chrome.storage.sync.get([], async (values) => { const update = values[namespace] ?? {}; let pointer = update, old; - while (true) { + while (path.length) { const key = path.shift(); if (!path.length) { old = pointer[key]; pointer[key] = value; break; - } else if (!pointer[key]) pointer[key] = {}; + } + pointer[key] = pointer[key] ?? {}; pointer = pointer[key]; } chrome.storage.sync.set({ [namespace]: update }, () => { @@ -82,14 +83,14 @@ export const set = (path, value) => { /** * create a wrapper for accessing a partition of the storage * @param {array} namespace - the path of keys to prefix all storage requests with - * @param {Function} [get] - the storage get function to be wrapped - * @param {Function} [set] - the storage set function to be wrapped + * @param {function} [get] - the storage get function to be wrapped + * @param {function} [set] - the storage set function to be wrapped * @returns {object} an object with the wrapped get/set functions */ -export const db = (namespace, get = get, set = set) => { +export const db = (namespace, getFunc = get, setFunc = set) => { return { - get: (path, fallback = undefined) => get([namespace, ...path], fallback), - set: (path, value) => set([namespace, ...path], value), + get: (path = [], fallback = undefined) => getFunc([...namespace, ...path], fallback), + set: (path, value) => setFunc([...namespace, ...path], value), }; }; diff --git a/extension/api/validation.mjs b/extension/api/validation.mjs index 90c29be..9612ae4 100644 --- a/extension/api/validation.mjs +++ b/extension/api/validation.mjs @@ -88,8 +88,9 @@ export const is = async (value, type, { extension = '' } = {}) => { case 'undefined': case 'boolean': case 'number': - case 'string': return typeof value === type && extension; + case 'string': + return typeof value === type && value.length && extension; case 'alphanumeric': case 'uuid': case 'semver': @@ -98,7 +99,7 @@ export const is = async (value, type, { extension = '' } = {}) => { case 'color': return typeof value === 'string' && test(value, patterns[type]) && extension; case 'file': - return typeof value === 'string' && (await isFile(value)) && extension; + return typeof value === 'string' && value && (await isFile(value)) && extension; case 'env': return supported.includes(value); case 'optionType': diff --git a/extension/api/web.mjs b/extension/api/web.mjs index 03a162d..aa58913 100644 --- a/extension/api/web.mjs +++ b/extension/api/web.mjs @@ -128,7 +128,7 @@ export const empty = ($container) => { * loads/applies a css stylesheet to the page * @param {string} path - a url or within-the-enhancer filepath */ -export const stylesheet = (path) => { +export const loadStylesheet = (path) => { render( document.head, html` { -// for (const mod of await registry.get((mod) => registry.isEnabled(mod.id))) { -// for (const sheet of mod.css?.client || []) { -// web.loadStylesheet(`repo/${mod._dir}/${sheet}`); -// } -// for (const script of mod.js?.client || []) { -// import(chrome.runtime.getURL(`repo/${mod._dir}/${script}`)); -// } -// } -// const errors = await registry.errors(); -// if (errors.length) { -// console.log('notion-enhancer errors:'); -// console.table(errors); -// } -// }); -// } +if ( + localStorage['LRU:KeyValueStore2:current-user-id'] && + location.pathname.split(/[/-]/g).reverse()[0].length === 32 +) { + import(chrome.runtime.getURL('api/_.mjs')).then(async (api) => { + const { registry, storage, web } = api, + profile = await storage.get(['currentprofile'], 'default'); + for (const mod of await registry.list((mod) => registry.enabled(mod.id))) { + const db = storage.db( + ['profiles', profile, mod.id], + async (path, fallback = undefined) => { + if (path.length === 4) { + // profiles -> profile -> mod -> option + fallback = (await registry.optionDefault(mod.id, path[3])) ?? fallback; + } + return storage.get(path, fallback); + } + ); + for (const sheet of mod.css?.client || []) { + web.loadStylesheet(`repo/${mod._dir}/${sheet}`); + } + for (let script of mod.js?.client || []) { + script = await import(chrome.runtime.getURL(`repo/${mod._dir}/${script}`)); + script.default(api, db); + } + } + const errors = await registry.errors(); + if (errors.length) { + console.log('[notion-enhancer] registry errors:'); + console.table(errors); + } + }); +} diff --git a/extension/repo/bypass-preview@cb6fd684-f113-4a7a-9423-8f0f0cff069f/mod.json b/extension/repo/bypass-preview@cb6fd684-f113-4a7a-9423-8f0f0cff069f/mod.json index f350807..1d0cfb4 100644 --- a/extension/repo/bypass-preview@cb6fd684-f113-4a7a-9423-8f0f0cff069f/mod.json +++ b/extension/repo/bypass-preview@cb6fd684-f113-4a7a-9423-8f0f0cff069f/mod.json @@ -2,7 +2,6 @@ "name": "bypass-preview", "id": "cb6fd684-f113-4a7a-9423-8f0f0cff069f", "version": "0.2.0", - "environments": ["linux", "win32", "darwin", "extension"], "description": "go straight to the normal full view when opening a page.", "tags": ["extension", "automation"], "authors": [ diff --git a/extension/repo/calendar-scroll@b1c7db33-dfee-489a-a76c-0dd66f7ed29a/mod.json b/extension/repo/calendar-scroll@b1c7db33-dfee-489a-a76c-0dd66f7ed29a/mod.json index 1c0f72a..f86b47b 100644 --- a/extension/repo/calendar-scroll@b1c7db33-dfee-489a-a76c-0dd66f7ed29a/mod.json +++ b/extension/repo/calendar-scroll@b1c7db33-dfee-489a-a76c-0dd66f7ed29a/mod.json @@ -2,7 +2,6 @@ "name": "calendar-scroll", "id": "b1c7db33-dfee-489a-a76c-0dd66f7ed29a", "version": "0.2.0", - "environments": ["linux", "win32", "darwin", "extension"], "description": "add a button to scroll down to the current week in fullpage/infinite-scroll calendars.", "tags": ["extension", "shortcut"], "authors": [ @@ -14,7 +13,7 @@ } ], "js": { - "client": ["client.mjs"] + "client": ["client.mjs?"] }, "css": { "client": ["client.css"] diff --git a/extension/repo/menu@a6621988-551d-495a-97d8-3c568bca2e9e/README.md b/extension/repo/menu@a6621988-551d-495a-97d8-3c568bca2e9e/README.md deleted file mode 100644 index c9b8a11..0000000 --- a/extension/repo/menu@a6621988-551d-495a-97d8-3c568bca2e9e/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# menu - -[theming mod link test](?view=mod&id=0f0bf8b6-eae6-4273-b307-8fc43f2ee082) diff --git a/extension/repo/menu@a6621988-551d-495a-97d8-3c568bca2e9e/client.css b/extension/repo/menu@a6621988-551d-495a-97d8-3c568bca2e9e/client.css index 78d1843..75087fb 100644 --- a/extension/repo/menu@a6621988-551d-495a-97d8-3c568bca2e9e/client.css +++ b/extension/repo/menu@a6621988-551d-495a-97d8-3c568bca2e9e/client.css @@ -4,22 +4,22 @@ * (https://notion-enhancer.github.io/) under the MIT license */ -.enhancer--sidebarMenuTrigger { +.enhancer--sidebarMenuLink { user-select: none; -webkit-user-select: none; transition: background 20ms ease-in 0s; cursor: pointer; - color: var(--theme--text_sidebar); + color: var(--theme--text_ui); } -.enhancer--sidebarMenuTrigger:hover { - background: var(--theme--button-hover); +.enhancer--sidebarMenuLink:hover { + background: var(--theme--ui_interactive-hover); } -.enhancer--sidebarMenuTrigger svg { +.enhancer--sidebarMenuLink svg { width: 16px; height: 16px; margin-left: 2px; } -.enhancer--sidebarMenuTrigger > div { +.enhancer--sidebarMenuLink > div { display: flex; align-items: center; min-height: 27px; @@ -27,7 +27,7 @@ padding: 2px 14px; width: 100%; } -.enhancer--sidebarMenuTrigger > div > :first-child { +.enhancer--sidebarMenuLink > div > :first-child { flex-shrink: 0; flex-grow: 0; border-radius: 3px; @@ -38,19 +38,20 @@ justify-content: center; margin-right: 8px; } -.enhancer--sidebarMenuTrigger > div > :nth-child(2) { +.enhancer--sidebarMenuLink > div > :nth-child(2) { flex: 1 1 auto; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } -.enhancer--notifications { + +.enhancer--sidebarMenuLink[data-has-notifications] { color: var(--theme--text); } -.enhancer--notifications > div > :last-child { +.enhancer--sidebarMenuLink > div > .enhancer--notificationBubble { display: flex; } -.enhancer--notifications > div > :last-child > div { +.enhancer--sidebarMenuLink > div > .enhancer--notificationBubble > div { display: inline-flex; align-items: center; justify-content: center; @@ -59,10 +60,10 @@ font-size: 10px; font-weight: 600; border-radius: 3px; - color: var(--theme--tag_new-text); - background: var(--theme--tag_new); + color: var(--theme--accent_red-text); + background: var(--theme--accent_red); } -.enhancer--notifications > div > :last-child > div > span { +.enhancer--sidebarMenuLink > div > .enhancer--notificationBubble > div > span { margin-bottom: 1px; margin-left: -0.5px; } diff --git a/extension/repo/menu@a6621988-551d-495a-97d8-3c568bca2e9e/client.mjs b/extension/repo/menu@a6621988-551d-495a-97d8-3c568bca2e9e/client.mjs index fdbd364..f3f496a 100644 --- a/extension/repo/menu@a6621988-551d-495a-97d8-3c568bca2e9e/client.mjs +++ b/extension/repo/menu@a6621988-551d-495a-97d8-3c568bca2e9e/client.mjs @@ -6,46 +6,44 @@ 'use strict'; -const _id = 'a6621988-551d-495a-97d8-3c568bca2e9e'; -import { env, storage, web, fs, registry } from '../../api/_.mjs'; +export default async function (api, db) { + const { env, fs, registry, web } = api, + sidebarSelector = '.notion-sidebar-container .notion-sidebar > div:nth-child(4)'; + await web.whenReady([sidebarSelector]); + + const $sidebarLink = web.html``; + web.addHotkeyListener(await db.get(['hotkey']), env.openEnhancerMenu); -const sidebarSelector = - '#notion-app > div > div.notion-cursor-listener > div.notion-sidebar-container > div > div > div > div:nth-child(4)'; -web.whenReady([sidebarSelector]).then(async () => { - const $enhancerSidebarElement = web.createElement( - web.html`
-
-
${await fs.getText('icons/colour.svg')}
-
notion-enhancer
-
-
` - ), - errors = await registry.errors(), - notifications = { - list: await fs.getJSON('https://notion-enhancer.github.io/notifications.json'), - dismissed: await storage.get(_id, 'notifications', []), - }; - notifications.waiting = notifications.list.filter( - ({ id }) => !notifications.dismissed.includes(id) - ); - if (notifications.waiting.length + errors.length) { - $enhancerSidebarElement.classList.add('enhancer--notifications'); - $enhancerSidebarElement.children[0].append( - web.createElement( - web.html`
${ - notifications.waiting.length + errors.length - }
` - ) - ); - } const setTheme = () => - storage.set(_id, 'theme', document.querySelector('.notion-dark-theme') ? 'dark' : 'light'); - $enhancerSidebarElement.addEventListener('click', () => { + db.set(['theme'], document.querySelector('.notion-dark-theme') ? 'dark' : 'light'); + $sidebarLink.addEventListener('click', () => { setTheme().then(env.openEnhancerMenu); }); window.addEventListener('focus', setTheme); window.addEventListener('blur', setTheme); setTheme(); - document.querySelector(sidebarSelector).appendChild($enhancerSidebarElement); -}); -web.addHotkeyListener(await storage.get(_id, 'hotkey.focustoggle'), env.openEnhancerMenu); + + const errors = await registry.errors(), + notifications = { + cache: await db.get(['notifications'], []), + provider: await fs.getJSON('https://notion-enhancer.github.io/notifications.json'), + count: errors.length, + }; + for (const notification of notifications.provider) { + if (!notifications.cache.includes(notification.id)) notifications.count++; + } + if (notifications.count) { + $sidebarLink.dataset.hasNotifications = true; + web.render( + $sidebarLink.children[0], + web.html`
${notifications.count}
` + ); + } + + web.render(document.querySelector(sidebarSelector), $sidebarLink); +} diff --git a/extension/repo/menu@a6621988-551d-495a-97d8-3c568bca2e9e/file.svg b/extension/repo/menu@a6621988-551d-495a-97d8-3c568bca2e9e/file.svg deleted file mode 100644 index 89a009e..0000000 --- a/extension/repo/menu@a6621988-551d-495a-97d8-3c568bca2e9e/file.svg +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/extension/repo/menu@a6621988-551d-495a-97d8-3c568bca2e9e/mod.json b/extension/repo/menu@a6621988-551d-495a-97d8-3c568bca2e9e/mod.json index 6a03319..a7ac01b 100644 --- a/extension/repo/menu@a6621988-551d-495a-97d8-3c568bca2e9e/mod.json +++ b/extension/repo/menu@a6621988-551d-495a-97d8-3c568bca2e9e/mod.json @@ -2,7 +2,6 @@ "name": "menu", "id": "a6621988-551d-495a-97d8-3c568bca2e9e", "version": "0.11.0", - "environments": ["linux", "win32", "darwin", "extension"], "description": "the enhancer's graphical menu, related buttons and shortcuts.", "tags": ["core"], "authors": [ @@ -14,24 +13,16 @@ } ], "css": { - "frame": ["tooltips.css"], - "client": ["client.css", "tooltips.css"], - "menu": ["menu.css", "markdown.css", "tooltips.css"] + "client": ["client.css"], + "menu": ["menu.css", "markdown.css"] }, "js": { "client": ["client.mjs"] }, "options": [ - { - "type": "toggle", - "key": "themes.autoresolve", - "label": "auto-resolve theme conflicts", - "value": true, - "tooltip": "when a theme is enabled any other themes of the same mode (light/dark) will be disabled" - }, { "type": "text", - "key": "hotkey.focustoggle", + "key": "hotkey", "label": "toggle hotkey", "value": "Ctrl+Alt+E", "tooltip": "toggles focus between notion & the enhancer menu" diff --git a/extension/repo/menu@a6621988-551d-495a-97d8-3c568bca2e9e/tooltips.css b/extension/repo/menu@a6621988-551d-495a-97d8-3c568bca2e9e/tooltips.css deleted file mode 100644 index dc40542..0000000 --- a/extension/repo/menu@a6621988-551d-495a-97d8-3c568bca2e9e/tooltips.css +++ /dev/null @@ -1,20 +0,0 @@ -/* - * notion-enhancer core: tooltips - * (c) 2021 dragonwocky (https://dragonwocky.me/) - * (https://notion-enhancer.github.io/) under the MIT license - */ - -.enhancer--tooltip { - position: absolute; - background: var(--theme--tooltip); - color: var(--theme--tooltip-text); - font-size: var(--theme--font_ui_small-size); - padding: 0.15rem 0.4rem; - box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06) !important; - border-radius: 3px; - max-width: 20rem; - display: none; -} -.enhancer--tooltip p { - margin: 0.25rem 0; -} diff --git a/extension/repo/theming@0f0bf8b6-eae6-4273-b307-8fc43f2ee082/client.mjs b/extension/repo/theming@0f0bf8b6-eae6-4273-b307-8fc43f2ee082/client.mjs index ea246ad..e55d25c 100644 --- a/extension/repo/theming@0f0bf8b6-eae6-4273-b307-8fc43f2ee082/client.mjs +++ b/extension/repo/theming@0f0bf8b6-eae6-4273-b307-8fc43f2ee082/client.mjs @@ -6,11 +6,14 @@ 'use strict'; -import { web } from '../../api/_.mjs'; +export default function (api, db) { + const { web } = api; -const $root = document.querySelector(':root'); -web.addDocumentObserver((mutation) => { - if (mutation.target === document.body) { - $root.classList[document.body.classList.contains('dark') ? 'add' : 'remove']('dark'); - } -}); + const $root = document.querySelector(':root'); + $root.classList[document.body.classList.contains('dark') ? 'add' : 'remove']('dark'); + web.addDocumentObserver((mutation) => { + if (mutation.target === document.body) { + $root.classList[document.body.classList.contains('dark') ? 'add' : 'remove']('dark'); + } + }); +} diff --git a/extension/repo/theming@0f0bf8b6-eae6-4273-b307-8fc43f2ee082/mod.json b/extension/repo/theming@0f0bf8b6-eae6-4273-b307-8fc43f2ee082/mod.json index cc32d56..27b6db1 100644 --- a/extension/repo/theming@0f0bf8b6-eae6-4273-b307-8fc43f2ee082/mod.json +++ b/extension/repo/theming@0f0bf8b6-eae6-4273-b307-8fc43f2ee082/mod.json @@ -2,7 +2,6 @@ "name": "theming", "id": "0f0bf8b6-eae6-4273-b307-8fc43f2ee082", "version": "0.11.0", - "environments": ["linux", "win32", "darwin", "extension"], "description": "the default theme variables, required by other themes & extensions.", "tags": ["core"], "authors": [ diff --git a/extension/repo/theming@0f0bf8b6-eae6-4273-b307-8fc43f2ee082/theme.css b/extension/repo/theming@0f0bf8b6-eae6-4273-b307-8fc43f2ee082/theme.css index fe935ab..38983ec 100644 --- a/extension/repo/theming@0f0bf8b6-eae6-4273-b307-8fc43f2ee082/theme.css +++ b/extension/repo/theming@0f0bf8b6-eae6-4273-b307-8fc43f2ee082/theme.css @@ -153,7 +153,7 @@ body, .notion-overlay-container.notion-default-overlay-container [style*='display: flex'] - > [style*='position: relative; max-width:'][style*='overflow: hidden']:not([style*='border-radius: 3px;'][style*='position: relative; max-width: calc(100vw - 24px); box-shadow: rgba(0, 0, 0, 0.3) 0px 1px 4px; overflow: hidden;'][style*='padding: 4px 8px; font-size: 12px; line-height: 1.4; font-weight: 500; white-space: nowrap;']), + > [style*='position: relative; max-width:'][style*='overflow: hidden']:not([style*='border-radius: 3px;'][style*='position: relative; max-width: calc(100vw - 24px); box-shadow: rgba(0, 0, 0, 0.3) 0px 1px 4px; overflow: hidden;'][style*='padding: 4px 8px; font-size: 12px; line-height: 1.4; font-weight: 500;']), .notion-overlay-container.notion-default-overlay-container [style*='display: flex'] > [style*='position: relative; max-width:'][style*='overflow: hidden'] @@ -391,13 +391,13 @@ body, } .notion-overlay-container - [style*='border-radius: 3px;'][style*='position: relative; max-width: calc(100vw - 24px); box-shadow: rgba(0, 0, 0, 0.3) 0px 1px 4px; overflow: hidden;'][style*='padding: 4px 8px; font-size: 12px; line-height: 1.4; font-weight: 500; white-space: nowrap;'] { + [style*='border-radius: 3px;'][style*='position: relative; max-width: calc(100vw - 24px); box-shadow: rgba(0, 0, 0, 0.3) 0px 1px 4px; overflow: hidden;'][style*='padding: 4px 8px; font-size: 12px; line-height: 1.4; font-weight: 500;'] { background: var(--theme--ui_tooltip) !important; box-shadow: var(--theme--ui_shadow) 0px 1px 4px !important; color: var(--theme--ui_tooltip-title) !important; } .notion-overlay-container - [style*='border-radius: 3px;'][style*='position: relative; max-width: calc(100vw - 24px); box-shadow: rgba(0, 0, 0, 0.3) 0px 1px 4px; overflow: hidden;'][style*='padding: 4px 8px; font-size: 12px; line-height: 1.4; font-weight: 500; white-space: nowrap;'] + [style*='border-radius: 3px;'][style*='position: relative; max-width: calc(100vw - 24px); box-shadow: rgba(0, 0, 0, 0.3) 0px 1px 4px; overflow: hidden;'][style*='padding: 4px 8px; font-size: 12px; line-height: 1.4; font-weight: 500;'] [style*='color: '] { color: var(--theme--ui_tooltip-description) !important; } diff --git a/extension/repo/tweaks@5174a483-c88d-4bf8-a95f-35cd330b76e2/mod.json b/extension/repo/tweaks@5174a483-c88d-4bf8-a95f-35cd330b76e2/mod.json index da5b0da..1517326 100644 --- a/extension/repo/tweaks@5174a483-c88d-4bf8-a95f-35cd330b76e2/mod.json +++ b/extension/repo/tweaks@5174a483-c88d-4bf8-a95f-35cd330b76e2/mod.json @@ -2,7 +2,6 @@ "name": "tweaks", "id": "5174a483-c88d-4bf8-a95f-35cd330b76e2", "version": "0.2.0", - "environments": ["linux", "win32", "darwin", "extension"], "description": "common style/layout changes and custom inserts.", "tags": ["extension", "customisation"], "authors": [