Refactor theme detection
This commit is contained in:
parent
c420699e51
commit
a62a882791
4 changed files with 31 additions and 29 deletions
|
@ -29,6 +29,7 @@ let collapseWhitespace = false;
|
||||||
let TurndownService = null;
|
let TurndownService = null;
|
||||||
let userTheme = 'auto';
|
let userTheme = 'auto';
|
||||||
let currentTheme = 'light';
|
let currentTheme = 'light';
|
||||||
|
let detectSystemTheme;
|
||||||
|
|
||||||
function normalizeRules(rules) {
|
function normalizeRules(rules) {
|
||||||
return Array.isArray(rules) ? rules.map(r => {
|
return Array.isArray(rules) ? rules.map(r => {
|
||||||
|
@ -50,24 +51,6 @@ function iconPaths(name) {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
async function detectSystemTheme() {
|
|
||||||
try {
|
|
||||||
const t = await browser.theme.getCurrent();
|
|
||||||
const scheme = t?.properties?.color_scheme;
|
|
||||||
if (scheme === 'dark' || scheme === 'light') {
|
|
||||||
return scheme;
|
|
||||||
}
|
|
||||||
const color = t?.colors?.frame || t?.colors?.toolbar;
|
|
||||||
if (color && /^#/.test(color)) {
|
|
||||||
const r = parseInt(color.slice(1, 3), 16);
|
|
||||||
const g = parseInt(color.slice(3, 5), 16);
|
|
||||||
const b = parseInt(color.slice(5, 7), 16);
|
|
||||||
const lum = (0.299 * r + 0.587 * g + 0.114 * b) / 255;
|
|
||||||
return lum < 0.5 ? 'dark' : 'light';
|
|
||||||
}
|
|
||||||
} catch {}
|
|
||||||
return 'light';
|
|
||||||
}
|
|
||||||
|
|
||||||
const ICONS = {
|
const ICONS = {
|
||||||
logo: () => 'resources/img/logo.png',
|
logo: () => 'resources/img/logo.png',
|
||||||
|
@ -298,6 +281,7 @@ async function clearCacheForMessages(idsInput) {
|
||||||
|
|
||||||
(async () => {
|
(async () => {
|
||||||
logger = await import(browser.runtime.getURL("logger.js"));
|
logger = await import(browser.runtime.getURL("logger.js"));
|
||||||
|
({ detectSystemTheme } = await import(browser.runtime.getURL('modules/themeUtils.js')));
|
||||||
try {
|
try {
|
||||||
AiClassifier = await import(browser.runtime.getURL("modules/AiClassifier.js"));
|
AiClassifier = await import(browser.runtime.getURL("modules/AiClassifier.js"));
|
||||||
logger.aiLog("AiClassifier imported", { debug: true });
|
logger.aiLog("AiClassifier imported", { debug: true });
|
||||||
|
|
|
@ -1,8 +1,9 @@
|
||||||
const aiLog = (await import(browser.runtime.getURL("logger.js"))).aiLog;
|
const aiLog = (await import(browser.runtime.getURL("logger.js"))).aiLog;
|
||||||
const storage = (globalThis.messenger ?? browser).storage;
|
const storage = (globalThis.messenger ?? browser).storage;
|
||||||
|
const { detectSystemTheme } = await import(browser.runtime.getURL('modules/themeUtils.js'));
|
||||||
const { theme } = await storage.local.get('theme');
|
const { theme } = await storage.local.get('theme');
|
||||||
const mode = (theme || 'auto') === 'auto'
|
const mode = (theme || 'auto') === 'auto'
|
||||||
? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light')
|
? await detectSystemTheme()
|
||||||
: theme;
|
: theme;
|
||||||
document.documentElement.dataset.theme = mode;
|
document.documentElement.dataset.theme = mode;
|
||||||
|
|
||||||
|
|
20
modules/themeUtils.js
Normal file
20
modules/themeUtils.js
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
export async function detectSystemTheme() {
|
||||||
|
try {
|
||||||
|
const t = await browser.theme.getCurrent();
|
||||||
|
const scheme = t?.properties?.color_scheme;
|
||||||
|
if (scheme === 'dark' || scheme === 'light') {
|
||||||
|
return scheme;
|
||||||
|
}
|
||||||
|
const color = t?.colors?.frame || t?.colors?.toolbar;
|
||||||
|
if (color && /^#/.test(color)) {
|
||||||
|
const r = parseInt(color.slice(1, 3), 16);
|
||||||
|
const g = parseInt(color.slice(3, 5), 16);
|
||||||
|
const b = parseInt(color.slice(5, 7), 16);
|
||||||
|
const lum = (0.299 * r + 0.587 * g + 0.114 * b) / 255;
|
||||||
|
return lum < 0.5 ? 'dark' : 'light';
|
||||||
|
}
|
||||||
|
} catch {}
|
||||||
|
return 'light';
|
||||||
|
}
|
|
@ -3,6 +3,7 @@ document.addEventListener('DOMContentLoaded', async () => {
|
||||||
const logger = await import(browser.runtime.getURL('logger.js'));
|
const logger = await import(browser.runtime.getURL('logger.js'));
|
||||||
const AiClassifier = await import(browser.runtime.getURL('modules/AiClassifier.js'));
|
const AiClassifier = await import(browser.runtime.getURL('modules/AiClassifier.js'));
|
||||||
const dataTransfer = await import(browser.runtime.getURL('options/dataTransfer.js'));
|
const dataTransfer = await import(browser.runtime.getURL('options/dataTransfer.js'));
|
||||||
|
const { detectSystemTheme } = await import(browser.runtime.getURL('modules/themeUtils.js'));
|
||||||
const defaults = await storage.local.get([
|
const defaults = await storage.local.get([
|
||||||
'endpoint',
|
'endpoint',
|
||||||
'templateName',
|
'templateName',
|
||||||
|
@ -42,10 +43,6 @@ document.addEventListener('DOMContentLoaded', async () => {
|
||||||
const themeSelect = document.getElementById('theme-select');
|
const themeSelect = document.getElementById('theme-select');
|
||||||
themeSelect.value = defaults.theme || 'auto';
|
themeSelect.value = defaults.theme || 'auto';
|
||||||
|
|
||||||
function systemTheme() {
|
|
||||||
return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
|
|
||||||
}
|
|
||||||
|
|
||||||
function updateIcons(theme) {
|
function updateIcons(theme) {
|
||||||
document.querySelectorAll('img[data-icon]').forEach(img => {
|
document.querySelectorAll('img[data-icon]').forEach(img => {
|
||||||
const name = img.dataset.icon;
|
const name = img.dataset.icon;
|
||||||
|
@ -58,16 +55,16 @@ document.addEventListener('DOMContentLoaded', async () => {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function applyTheme(setting) {
|
async function applyTheme(setting) {
|
||||||
const mode = setting === 'auto' ? systemTheme() : setting;
|
const mode = setting === 'auto' ? await detectSystemTheme() : setting;
|
||||||
document.documentElement.dataset.theme = mode;
|
document.documentElement.dataset.theme = mode;
|
||||||
updateIcons(mode);
|
updateIcons(mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
applyTheme(themeSelect.value);
|
await applyTheme(themeSelect.value);
|
||||||
themeSelect.addEventListener('change', () => {
|
themeSelect.addEventListener('change', async () => {
|
||||||
markDirty();
|
markDirty();
|
||||||
applyTheme(themeSelect.value);
|
await applyTheme(themeSelect.value);
|
||||||
});
|
});
|
||||||
const DEFAULT_AI_PARAMS = {
|
const DEFAULT_AI_PARAMS = {
|
||||||
max_tokens: 4096,
|
max_tokens: 4096,
|
||||||
|
@ -486,7 +483,7 @@ document.addEventListener('DOMContentLoaded', async () => {
|
||||||
const collapseWhitespace = collapseWhitespaceToggle.checked;
|
const collapseWhitespace = collapseWhitespaceToggle.checked;
|
||||||
const theme = themeSelect.value;
|
const theme = themeSelect.value;
|
||||||
await storage.local.set({ endpoint, templateName, customTemplate: customTemplateText, customSystemPrompt, aiParams: aiParamsSave, debugLogging, htmlToMarkdown, stripUrlParams, altTextImages, collapseWhitespace, aiRules: rules, theme });
|
await storage.local.set({ endpoint, templateName, customTemplate: customTemplateText, customSystemPrompt, aiParams: aiParamsSave, debugLogging, htmlToMarkdown, stripUrlParams, altTextImages, collapseWhitespace, aiRules: rules, theme });
|
||||||
applyTheme(theme);
|
await applyTheme(theme);
|
||||||
try {
|
try {
|
||||||
await AiClassifier.setConfig({ endpoint, templateName, customTemplate: customTemplateText, customSystemPrompt, aiParams: aiParamsSave, debugLogging });
|
await AiClassifier.setConfig({ endpoint, templateName, customTemplate: customTemplateText, customSystemPrompt, aiParams: aiParamsSave, debugLogging });
|
||||||
logger.setDebug(debugLogging);
|
logger.setDebug(debugLogging);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue