add missing files
This commit is contained in:
@@ -0,0 +1,19 @@
|
||||
const personaFieldNames = ["name", "pronouns", "appearance", "background", "details", "exampleDialogues"];
|
||||
|
||||
export function populatePersonaForm(fields, persona = {}) {
|
||||
personaFieldNames.forEach((name) => {
|
||||
const field = fields[name];
|
||||
if (!field) return;
|
||||
const sourceName = name === "exampleDialogues" ? "example_dialogues" : name;
|
||||
field.value = persona[sourceName] || "";
|
||||
});
|
||||
}
|
||||
|
||||
export function readPersonaForm(fields) {
|
||||
return personaFieldNames.reduce((payload, name) => {
|
||||
const field = fields[name];
|
||||
if (!field) return payload;
|
||||
payload[name] = field.value.trim();
|
||||
return payload;
|
||||
}, {});
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
export function setStatus(element, message = "", state = "", baseClass = "status") {
|
||||
if (!element) return;
|
||||
element.textContent = message;
|
||||
element.className = [baseClass, state].filter(Boolean).join(" ");
|
||||
}
|
||||
|
||||
export function clearStatus(element, baseClass = "status") {
|
||||
setStatus(element, "", "hidden", baseClass);
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
(() => {
|
||||
const themes = new Set(["fakegpt", "fraud", "germini", "slopilot", "beta-ai", "confusity"]);
|
||||
const storedTheme = localStorage.getItem("krishd-theme");
|
||||
const storedMode = localStorage.getItem("krishd-theme-mode");
|
||||
const theme = themes.has(storedTheme) ? storedTheme : "fakegpt";
|
||||
const mode = storedMode === "dark" ? "dark" : "light";
|
||||
document.documentElement.dataset.theme = theme;
|
||||
document.documentElement.dataset.themeMode = mode;
|
||||
document.addEventListener("readystatechange", () => {
|
||||
if (!document.body) return;
|
||||
document.body.dataset.theme = theme;
|
||||
document.body.dataset.themeMode = mode;
|
||||
});
|
||||
})();
|
||||
@@ -0,0 +1,60 @@
|
||||
import {themes} from "./constants.js";
|
||||
|
||||
export const THEME_STORAGE_KEY = "krishd-theme";
|
||||
export const THEME_MODE_STORAGE_KEY = "krishd-theme-mode";
|
||||
export const DEFAULT_THEME = "fakegpt";
|
||||
export const DEFAULT_THEME_MODE = "light";
|
||||
|
||||
export function normalizeTheme(themeKey) {
|
||||
return Object.hasOwn(themes, themeKey) ? themeKey : DEFAULT_THEME;
|
||||
}
|
||||
|
||||
export function normalizeThemeMode(modeKey) {
|
||||
return modeKey === "dark" ? "dark" : DEFAULT_THEME_MODE;
|
||||
}
|
||||
|
||||
export function readStoredAppearance() {
|
||||
return {
|
||||
theme: normalizeTheme(localStorage.getItem(THEME_STORAGE_KEY)),
|
||||
mode: normalizeThemeMode(localStorage.getItem(THEME_MODE_STORAGE_KEY))
|
||||
};
|
||||
}
|
||||
|
||||
export function applyTheme(themeKey, {
|
||||
persist = true,
|
||||
title = null,
|
||||
themeSelect = null,
|
||||
nameTargets = document.querySelectorAll("[data-theme-name]"),
|
||||
logoTargets = document.querySelectorAll("[data-theme-logo]")
|
||||
} = {}) {
|
||||
const nextTheme = normalizeTheme(themeKey);
|
||||
const theme = themes[nextTheme];
|
||||
document.body.dataset.theme = nextTheme;
|
||||
if (typeof title === "function") document.title = title(theme);
|
||||
if (typeof title === "string") document.title = title;
|
||||
nameTargets.forEach((target) => { target.textContent = theme.name; });
|
||||
logoTargets.forEach((target) => { target.textContent = theme.short; });
|
||||
if (themeSelect) themeSelect.value = nextTheme;
|
||||
if (persist) localStorage.setItem(THEME_STORAGE_KEY, nextTheme);
|
||||
document.dispatchEvent(new CustomEvent("appearancechange", {detail: {theme: nextTheme}}));
|
||||
return nextTheme;
|
||||
}
|
||||
|
||||
export function applyThemeMode(modeKey, {persist = true, modeSelect = null} = {}) {
|
||||
const nextMode = normalizeThemeMode(modeKey);
|
||||
document.body.dataset.themeMode = nextMode;
|
||||
if (modeSelect) modeSelect.value = nextMode;
|
||||
if (persist) localStorage.setItem(THEME_MODE_STORAGE_KEY, nextMode);
|
||||
document.dispatchEvent(new CustomEvent("appearancechange", {detail: {mode: nextMode}}));
|
||||
return nextMode;
|
||||
}
|
||||
|
||||
export function initializeAppearance(options = {}) {
|
||||
const appearance = readStoredAppearance();
|
||||
applyTheme(appearance.theme, {...options, persist: false});
|
||||
applyThemeMode(appearance.mode, {
|
||||
persist: false,
|
||||
modeSelect: options.modeSelect || null
|
||||
});
|
||||
return appearance;
|
||||
}
|
||||
Reference in New Issue
Block a user