From f969cd6694d9659d65bd6e570c70d6decac155b7 Mon Sep 17 00:00:00 2001 From: Arnold W Date: Wed, 29 Jul 2026 20:31:32 +0200 Subject: [PATCH 01/32] feat(ui): introduce Atlas workspace --- src/modules/server/apiRoutes.js | 57 +- src/ui/components/ActivityDrawer.js | 137 +++ src/ui/components/App.js | 53 +- src/ui/components/AtlasHeader.js | 113 +++ src/ui/components/CheatItem.js | 214 ++-- src/ui/components/LazyCategory.js | 37 - src/ui/components/Sidebar.js | 237 ++--- src/ui/components/UpdateModal.js | 52 +- src/ui/components/WorkspaceContext.js | 77 ++ src/ui/components/views/Account.js | 38 +- src/ui/components/views/AtlasCheats.js | 711 +++++++++++++ src/ui/components/views/Cheats.js | 298 +----- src/ui/components/views/Config.js | 192 ++-- src/ui/components/views/DevTools.js | 19 +- src/ui/components/views/Search.js | 208 +++- src/ui/components/views/account/tabShared.js | 22 +- .../components/views/account/w2/Pay2WinTab.js | 4 + .../components/views/account/w3/EquinoxTab.js | 4 +- .../components/views/config/ConfigActions.js | 52 + src/ui/components/views/config/configDraft.js | 187 ++++ src/ui/components/views/search/sections.js | 357 +++++-- .../components/views/search/workspaceUtils.js | 31 +- src/ui/entry/index.html | 4 +- src/ui/entry/style.css | 4 + src/ui/state/constants.js | 30 +- src/ui/state/store.js | 39 +- src/ui/styles/_account-pages.css | 90 ++ src/ui/styles/_activity-drawer.css | 215 ++++ src/ui/styles/_atlas-shell.css | 696 +++++++++++++ src/ui/styles/_search.css | 781 +++++++++++++-- src/ui/styles/_world-tabs.css | 204 ++++ src/ui/styles/cheats.css | 937 ++++++++++++++---- src/ui/styles/config.css | 191 ++++ src/ui/styles/devtools.css | 99 +- src/ui/styles/tabs/w3/_cogs.css | 27 +- src/ui/styles/tooltip.css | 50 +- 36 files changed, 5225 insertions(+), 1242 deletions(-) create mode 100644 src/ui/components/ActivityDrawer.js create mode 100644 src/ui/components/AtlasHeader.js delete mode 100644 src/ui/components/LazyCategory.js create mode 100644 src/ui/components/WorkspaceContext.js create mode 100644 src/ui/components/views/AtlasCheats.js create mode 100644 src/ui/components/views/config/ConfigActions.js create mode 100644 src/ui/components/views/config/configDraft.js create mode 100644 src/ui/styles/_activity-drawer.css create mode 100644 src/ui/styles/_atlas-shell.css diff --git a/src/modules/server/apiRoutes.js b/src/modules/server/apiRoutes.js index 39fd3ac7..db8f3762 100644 --- a/src/modules/server/apiRoutes.js +++ b/src/modules/server/apiRoutes.js @@ -43,6 +43,14 @@ function setupApiRoutes(app, context, client, config) { let cachedUpdateInfo = null; let updateCheckRequest = null; + const getCurrentConfigPayload = () => ({ + startupCheats: [...startupCheats], + cheatConfig: prepareConfigForJson(cheatConfig), + injectorConfig: prepareConfigForJson(injectorConfig), + }); + let ramConfigBaseline = getCurrentConfigPayload(); + let diskConfigBaseline = getCurrentConfigPayload(); + const getUpdateInfo = (force = false) => { if (!force && cachedUpdateInfo) return cachedUpdateInfo; if (!force && updateCheckRequest) return updateCheckRequest; @@ -231,10 +239,14 @@ function setupApiRoutes(app, context, client, config) { } const fullConfigResponse = { - startupCheats: startupCheats, + startupCheats: [...startupCheats], cheatConfig: serializableCheatConfig, - injectorConfig: injectorConfig, + injectorConfig: prepareConfigForJson(injectorConfig), defaultConfig: serializableDefaultConfig, + configBaselines: { + ram: ramConfigBaseline, + disk: diskConfigBaseline, + }, }; res.json(fullConfigResponse); } catch (error) { @@ -253,24 +265,6 @@ function setupApiRoutes(app, context, client, config) { } try { - if (receivedFullConfig.cheatConfig) { - const receivedCheatConfig = receivedFullConfig.cheatConfig; - const parsedCheatConfig = parseConfigFromJson(receivedCheatConfig); - - deepMerge(cheatConfig, parsedCheatConfig); - } - - if (Array.isArray(receivedFullConfig.startupCheats)) { - startupCheats.length = 0; - startupCheats.push(...receivedFullConfig.startupCheats); - log.debug("Updated server-side startupCheats"); - } - - if (receivedFullConfig.injectorConfig) { - deepMerge(injectorConfig, receivedFullConfig.injectorConfig); - log.debug("Updated server-side injectorConfig"); - } - const parsedCheatConfig = receivedFullConfig.cheatConfig ? parseConfigFromJson(receivedFullConfig.cheatConfig) : cheatConfig; @@ -278,7 +272,8 @@ function setupApiRoutes(app, context, client, config) { if (!contextExistsResult || !contextExistsResult.result || !contextExistsResult.result.value) { log.error("Cheat context not found in iframe. Cannot update config in game"); return res.status(200).json({ - message: "Configuration updated on server, but failed to apply in game (context lost)", + message: "Configuration was not applied because the game context was lost", + appliedToGame: false, }); } @@ -304,21 +299,33 @@ function setupApiRoutes(app, context, client, config) { log.error("Error updating config in game:", updateResult.exceptionDetails.text); gameUpdateDetails = `Failed to apply in game: ${updateResult.exceptionDetails.text}`; return res.status(200).json({ - message: "Configuration updated on server, but failed to apply in game", + message: "Configuration was not applied in game", details: gameUpdateDetails, + appliedToGame: false, }); } else { gameUpdateDetails = updateResult.result.value; log.debug(`In-game config update result: ${gameUpdateDetails}`); if (gameUpdateDetails.startsWith("Error:")) { return res.status(200).json({ - message: "Configuration updated on server, but failed to apply in game", + message: "Configuration was not applied in game", details: gameUpdateDetails, + appliedToGame: false, }); } } - res.json({ message: "Configuration updated successfully", details: gameUpdateDetails }); + deepMerge(cheatConfig, parsedCheatConfig); + ramConfigBaseline = { + ...ramConfigBaseline, + cheatConfig: prepareConfigForJson(cheatConfig), + }; + res.json({ + message: "Live cheat configuration updated successfully", + details: gameUpdateDetails, + appliedToGame: true, + ramBaseline: ramConfigBaseline, + }); } catch (apiError) { log.error("Error in /api/config/update:", apiError); res.status(500).json({ @@ -416,6 +423,8 @@ exports.injectorConfig = ${new_injectorConfig}; if (parsedUiCheatConfig) deepMerge(cheatConfig, parsedUiCheatConfig); if (filteredInjectorConfig) deepMerge(injectorConfig, filteredInjectorConfig); + diskConfigBaseline = getCurrentConfigPayload(); + res.json({ message: "Configuration successfully saved to config.custom.js" }); } catch (apiError) { log.error("Error in /api/config/save:", apiError); diff --git a/src/ui/components/ActivityDrawer.js b/src/ui/components/ActivityDrawer.js new file mode 100644 index 00000000..42027369 --- /dev/null +++ b/src/ui/components/ActivityDrawer.js @@ -0,0 +1,137 @@ +import van from "../vendor/van-1.6.0.js"; +import store from "../state/store.js"; +import { VIEWS } from "../state/constants.js"; +import { Icons } from "../assets/icons.js"; +import { formatDisplayValue } from "./views/search/valueUtils.js"; + +const { section, div, button, span, code } = van.tags; + +const formatTime = (timestamp) => + new Date(timestamp).toLocaleTimeString([], { hour: "2-digit", minute: "2-digit", second: "2-digit" }); + +const ActivityPanel = () => + div( + { + class: () => `atlas-drawer-panel ${store.app.activityDrawer === "activity" ? "is-active" : ""}`, + id: "atlas-activity-panel", + role: "tabpanel", + "aria-labelledby": "atlas-activity-tab", + }, + () => { + const entries = store.app.notificationHistory.slice(0, 10); + if (!entries.length) { + return div({ class: "atlas-drawer-empty" }, "No activity recorded in this session."); + } + + return div( + { class: "atlas-activity-list" }, + ...entries.map((entry) => + div( + { class: `atlas-activity-row is-${entry.type || "success"}` }, + span({ class: "atlas-activity-time" }, formatTime(entry.id)), + span({ class: "atlas-activity-kind" }, entry.type === "error" ? "error" : "event"), + span({ class: "atlas-activity-message" }, entry.message) + ) + ) + ); + } + ); + +const MonitorPanel = () => + div( + { + class: () => `atlas-drawer-panel ${store.app.activityDrawer === "monitors" ? "is-active" : ""}`, + id: "atlas-monitors-panel", + role: "tabpanel", + "aria-labelledby": "atlas-monitors-tab", + }, + () => { + const monitors = Object.entries(store.data.monitorValues || {}).sort(([, a], [, b]) => + String(a?.path || "").localeCompare(String(b?.path || "")) + ); + + if (!monitors.length) { + return div( + { class: "atlas-drawer-empty" }, + span("No live monitors are subscribed."), + button( + { + class: "atlas-inline-action", + type: "button", + onclick: () => store.setActiveTab(VIEWS.SEARCH.id), + }, + "Open Search" + ) + ); + } + + return div( + { class: "atlas-monitor-list" }, + ...monitors.map(([id, monitor]) => { + const latest = Array.isArray(monitor?.history) ? monitor.history[0] : null; + const displayValue = latest ? formatDisplayValue(latest.value) : "Waiting for value..."; + + return div( + { class: `atlas-monitor-row ${monitor?.error ? "has-error" : ""}` }, + span({ class: "atlas-monitor-status", "aria-hidden": "true" }), + code({ class: "atlas-monitor-path", title: monitor?.path || id }, monitor?.path || id), + code({ class: "atlas-monitor-value" }, monitor?.error || displayValue) + ); + }) + ); + } + ); + +export const ActivityDrawer = () => + section( + { + class: () => `atlas-activity-drawer ${store.app.activityDrawer ? "is-open" : ""}`, + id: "atlas-activity-drawer", + "aria-label": "Activity and monitors", + "aria-hidden": () => String(!store.app.activityDrawer), + inert: () => !store.app.activityDrawer, + }, + div( + { class: "atlas-drawer-tabs", role: "tablist", "aria-label": "Runtime information" }, + button( + { + class: () => `atlas-drawer-tab ${store.app.activityDrawer === "activity" ? "is-active" : ""}`, + id: "atlas-activity-tab", + type: "button", + role: "tab", + "aria-selected": () => String(store.app.activityDrawer === "activity"), + "aria-controls": "atlas-activity-panel", + onclick: () => store.openActivityDrawer("activity"), + }, + Icons.Bell(), + "Activity" + ), + button( + { + class: () => `atlas-drawer-tab ${store.app.activityDrawer === "monitors" ? "is-active" : ""}`, + id: "atlas-monitors-tab", + type: "button", + role: "tab", + "aria-selected": () => String(store.app.activityDrawer === "monitors"), + "aria-controls": "atlas-monitors-panel", + onclick: () => store.openActivityDrawer("monitors"), + }, + Icons.Eye(), + "Monitors" + ), + span({ class: "atlas-drawer-summary" }, () => { + const monitorCount = Object.keys(store.data.monitorValues || {}).length; + return `${store.app.notificationHistory.length} events / ${monitorCount} monitors`; + }), + button( + { + class: "atlas-drawer-close", + type: "button", + onclick: () => store.closeActivityDrawer(), + "aria-label": "Close activity drawer", + }, + Icons.X() + ) + ), + div({ class: "atlas-drawer-content" }, ActivityPanel(), MonitorPanel()) + ); diff --git a/src/ui/components/App.js b/src/ui/components/App.js index 0cbec0c5..72c5012f 100644 --- a/src/ui/components/App.js +++ b/src/ui/components/App.js @@ -3,8 +3,10 @@ import store from "../state/store.js"; import { VIEWS } from "../state/constants.js"; // Components -import { Sidebar } from "./Sidebar.js"; -import { Toast } from "./Toast.js"; +import { Sidebar, SidebarBackdrop } from "./Sidebar.js"; +import { AtlasHeader } from "./AtlasHeader.js"; +import { ActivityDrawer } from "./ActivityDrawer.js"; +import { invokeWorkspaceSave } from "./WorkspaceContext.js"; import { TooltipContainer } from "./Tooltip.js"; import { UpdateModal } from "./UpdateModal.js"; import { Cheats } from "./views/Cheats.js"; @@ -30,32 +32,35 @@ export const App = () => { // Global Keyboard Shortcuts document.addEventListener("keydown", (e) => { - const isInputFocused = ["INPUT", "TEXTAREA", "SELECT"].includes(document.activeElement?.tagName); + const activeElement = document.activeElement; + const isInputFocused = + ["INPUT", "TEXTAREA", "SELECT"].includes(activeElement?.tagName) || activeElement?.isContentEditable; + + if (e.key === "Escape") { + store.closeMobileSidebar(); + store.closeActivityDrawer(); + return; + } + + if ((e.ctrlKey || e.metaKey) && e.key.toLowerCase() === "s") { + e.preventDefault(); + invokeWorkspaceSave(store.app.activeTab); + return; + } if (isInputFocused) return; - if (e.key === "1") store.app.activeTab = VIEWS.CHEATS.id; - if (e.key === "2") store.app.activeTab = VIEWS.ACCOUNT.id; - if (e.key === "3") store.app.activeTab = VIEWS.CONFIG.id; - if (e.key === "4") store.app.activeTab = VIEWS.SEARCH.id; - if (e.key === "5") store.app.activeTab = VIEWS.DEVTOOLS.id; + if (e.key === "1") store.setActiveTab(VIEWS.CHEATS.id); + if (e.key === "2") store.setActiveTab(VIEWS.ACCOUNT.id); + if (e.key === "3") store.setActiveTab(VIEWS.CONFIG.id); + if (e.key === "4") store.setActiveTab(VIEWS.SEARCH.id); + if (e.key === "5") store.setActiveTab(VIEWS.DEVTOOLS.id); if (e.key === "/") { e.preventDefault(); const searchInput = document.querySelector(".tab-pane.active .global-search-input"); searchInput?.focus(); } - - if (e.ctrlKey && e.key === "s") { - e.preventDefault(); - const isConfigActive = - store.app.activeTab === VIEWS.CONFIG.id || - (store.app.activeTab === VIEWS.CHEATS.id && store.app.configDrawerOpen); - - if (isConfigActive) { - document.getElementById("save-config-button")?.click(); - } - } }); const viewInstances = {}; @@ -94,10 +99,14 @@ export const App = () => { return div( { class: "app-layout" }, - Sidebar(), - main({ class: "viewport" }, tabContent), + AtlasHeader(), + div( + { class: "atlas-body" }, + Sidebar(), + main({ class: "viewport atlas-canvas" }, tabContent, ActivityDrawer()), + SidebarBackdrop() + ), UpdateModal(), - Toast(), TooltipContainer() ); }; diff --git a/src/ui/components/AtlasHeader.js b/src/ui/components/AtlasHeader.js new file mode 100644 index 00000000..4aa35e0c --- /dev/null +++ b/src/ui/components/AtlasHeader.js @@ -0,0 +1,113 @@ +import van from "../vendor/van-1.6.0.js"; +import store from "../state/store.js"; +import { VIEWS, VIEW_ORDER } from "../state/constants.js"; +import { Icons } from "../assets/icons.js"; + +const { header, div, button, span } = van.tags; + +const activeView = () => VIEW_ORDER.find((view) => view.id === store.app.activeTab) || VIEWS.CHEATS; + +export const AtlasHeader = () => + header( + { class: "atlas-header" }, + div( + { class: "atlas-header-brand" }, + button( + { + class: "atlas-mobile-menu", + type: "button", + onclick: () => store.toggleMobileSidebar(), + "aria-controls": "atlas-sidebar", + "aria-expanded": () => String(store.app.sidebarMobileOpen), + "aria-label": () => + store.app.sidebarMobileOpen ? "Close workspace navigation" : "Open workspace navigation", + }, + span({ "aria-hidden": "true" }, span(), span(), span()) + ), + span({ class: "atlas-brand-mark", "aria-hidden": "true" }, Icons.Lightning()), + span({ class: "atlas-brand-name" }, "Idleon Injector") + ), + div( + { class: "atlas-breadcrumb", "aria-label": "Current workspace" }, + span({ class: "atlas-breadcrumb-root" }, "Workspace"), + Icons.ChevronRight({ class: "atlas-breadcrumb-separator" }), + span({ class: "atlas-breadcrumb-current" }, () => activeView().atlasLabel || activeView().sidebarLabel) + ), + div( + { class: "atlas-header-actions" }, + span( + { + class: () => `atlas-connection ${store.app.heartbeat ? "is-online" : "is-offline"}`, + role: "status", + "aria-live": "polite", + }, + span({ class: "atlas-connection-dot", "aria-hidden": "true" }), + span(() => { + if (!store.app.heartbeat) return "Disconnected"; + return store.app.connectionTransport === "websocket" ? "Connected / WS" : "Connected / HTTP"; + }) + ), + span( + { + class: () => `atlas-dirty-indicator ${store.app.configDirty ? "is-visible" : ""}`, + role: "status", + title: "Unsaved config changes", + }, + span({ "aria-hidden": "true" }, "*"), + "Unsaved changes" + ), + button( + { + class: () => + `atlas-header-button atlas-version ${store.app.updateInfo?.updateAvailable ? "has-update" : ""}`, + type: "button", + onclick: () => { + if (store.app.updateInfo?.updateAvailable) store.openUpdateModal(); + }, + "aria-disabled": () => String(!store.app.updateInfo?.updateAvailable), + title: () => + store.app.updateInfo?.updateAvailable + ? "Update available" + : store.app.appInfo?.version + ? "Current version" + : "Version unavailable", + }, + () => (store.app.appInfo?.version ? `v${store.app.appInfo.version}` : "Version unavailable"), + () => + store.app.updateInfo?.updateAvailable ? span({ class: "atlas-update-dot" }) : span({ hidden: true }) + ), + button( + { + class: () => + `atlas-header-button atlas-drawer-trigger ${store.app.activityDrawer === "activity" ? "is-active" : ""}`, + type: "button", + onclick: () => store.toggleActivityDrawer("activity"), + "aria-controls": "atlas-activity-drawer", + "aria-expanded": () => String(store.app.activityDrawer === "activity"), + }, + Icons.Bell(), + span({ class: "atlas-action-label" }, "Activity"), + () => { + const count = store.app.notificationHistory.length; + return count + ? span( + { class: "atlas-activity-count", "aria-label": `${count} activity entries` }, + count > 99 ? "99+" : count + ) + : span({ hidden: true }); + } + ), + button( + { + class: () => + `atlas-header-button atlas-drawer-trigger ${store.app.activityDrawer === "monitors" ? "is-active" : ""}`, + type: "button", + onclick: () => store.toggleActivityDrawer("monitors"), + "aria-controls": "atlas-activity-drawer", + "aria-expanded": () => String(store.app.activityDrawer === "monitors"), + }, + Icons.Eye(), + span({ class: "atlas-action-label" }, "Monitors") + ) + ) + ); diff --git a/src/ui/components/CheatItem.js b/src/ui/components/CheatItem.js index 15d6dbb2..3e151e5c 100644 --- a/src/ui/components/CheatItem.js +++ b/src/ui/components/CheatItem.js @@ -1,120 +1,148 @@ import van from "../vendor/van-1.6.0.js"; -import store from "../state/store.js"; import { Icons } from "../assets/icons.js"; -const { div, input, button, span } = van.tags; +const { div, button, span } = van.tags; /** - * Individual cheat button with optional parameter input and favorite toggle. - * @param {object} cheat - Cheat data object with value, message, needsParam, category - * @returns {Element} Cheat item DOM element + * Stable Atlas table row for one real cheat command or saved parameterized action. + * Row selection is intentionally separate from execution. + * @param {object} props + * @returns {Element} */ -export const CheatItem = (cheat) => { - const needsValue = cheat.needsParam === true; - const hasConfig = store.hasConfigEntry(cheat.value); +export const CheatItem = ({ + entry, + selected, + getStateInfo, + isFavorite, + onSelect, + onExecute, + onFavorite, + onOpenConfig, + canExecute, +}) => { + const pending = van.state(false); + const feedback = van.state(null); + const cheat = entry.cheat; + const needsParameter = cheat.needsParam === true; - // Use direct DOM reference instead of van.state to save thousands of listeners - const inputRef = needsValue - ? input({ - type: "text", - class: "cheat-input", - placeholder: "Val", - }) - : null; - - const getInputValue = () => (inputRef ? inputRef.value.trim() : ""); + const flash = (value) => { + feedback.val = value; + setTimeout(() => { + if (feedback.val === value) feedback.val = null; + }, 1200); + }; - const feedbackState = van.state(null); + const execute = async () => { + if (pending.val || !canExecute()) return; - const handleExecute = async () => { - let finalAction = cheat.value; - if (needsValue) { - const val = getInputValue(); - if (!val) { - store.notify(`Value required for '${cheat.value}'`, "error"); - feedbackState.val = "error"; - setTimeout(() => (feedbackState.val = null), 1000); - return; - } - finalAction = `${cheat.value} ${val}`; + if (needsParameter && !entry.parameter) { + onSelect(entry, { focusParameter: true }); + return; } try { - await store.executeCheat(finalAction, cheat.message); - feedbackState.val = "success"; + pending.val = true; + await onExecute(entry.action || cheat.value, cheat.message || cheat.value); + flash("success"); } catch { - feedbackState.val = "error"; + flash("error"); + } finally { + pending.val = false; } - setTimeout(() => (feedbackState.val = null), 1000); }; - const handleConfigClick = (e) => { - e.stopPropagation(); - store.navigateToCheatConfig(cheat.value); - }; + const actionControl = () => { + const state = getStateInfo(cheat.value); - const handleFavorite = () => { - if (needsValue) { - const val = getInputValue(); - if (!val) { - store.notify(`Enter a value first to favorite '${cheat.value}'`, "error"); - return; - } - store.toggleFavorite(`${cheat.value} ${val}`); - } else { - store.toggleFavorite(cheat.value); + if (state.known && !needsParameter) { + return button( + { + type: "button", + class: () => + `atlas-cheat-switch ${getStateInfo(cheat.value).active ? "is-on" : ""} ${ + pending.val ? "is-pending" : "" + }`, + role: "switch", + "aria-checked": () => String(getStateInfo(cheat.value).active), + "aria-label": () => `${getStateInfo(cheat.value).active ? "Disable" : "Enable"} ${cheat.value}`, + disabled: () => pending.val || !canExecute(), + onclick: (event) => { + event.stopPropagation(); + execute(); + }, + }, + span({ class: "atlas-cheat-switch-thumb" }) + ); } - }; - const isFavorited = () => { - if (needsValue) { - const val = getInputValue(); - if (!val) return false; - return store.isFavorite(`${cheat.value} ${val}`); - } - return store.isFavorite(cheat.value); + return button( + { + type: "button", + class: () => `atlas-cheat-run ${pending.val ? "is-pending" : ""}`, + disabled: () => pending.val || !canExecute(), + onclick: (event) => { + event.stopPropagation(); + execute(); + }, + }, + () => (pending.val ? "Running" : needsParameter && !entry.parameter ? "Set value" : "Run") + ); }; - // Build button content with optional gear icon - const buttonContent = [ - span( - { class: "cheat-button-text" }, - cheat.message && cheat.message !== cheat.value ? `${cheat.value} - ${cheat.message}` : cheat.value - ), - hasConfig - ? span( - { - class: "cheat-config-icon", - onclick: handleConfigClick, - title: "Open config for this cheat", - }, - Icons.Config() - ) - : null, - ]; - return div( - { class: "cheat-item-container" }, - button( - { - class: () => - `cheat-button ${hasConfig ? "has-config" : ""} ${ - feedbackState.val === "success" ? "feedback-success" : "" - } ${feedbackState.val === "error" ? "feedback-error" : ""}`, - onclick: handleExecute, - }, - ...buttonContent + { + class: () => + `atlas-cheat-row ${selected() ? "is-selected" : ""} ${ + getStateInfo(cheat.value).active ? "is-active" : "" + } ${feedback.val ? `feedback-${feedback.val}` : ""}`, + role: "row", + "aria-selected": () => String(selected()), + "data-cheat-row": entry.id, + onclick: () => onSelect(entry), + }, + div( + { class: "atlas-cheat-command-cell", role: "cell" }, + span({ class: "atlas-cheat-glyph", "aria-hidden": "true" }, Icons.Lightning()), + div( + { class: "atlas-cheat-command-copy" }, + span({ class: "atlas-cheat-command" }, entry.action || cheat.value), + entry.parameter ? span({ class: "atlas-cheat-saved-value" }, `Saved value: ${entry.parameter}`) : null + ), + entry.hasConfig + ? button( + { + type: "button", + class: "atlas-cheat-config-link", + title: "Edit linked configuration", + "aria-label": `Edit configuration for ${cheat.value}`, + onclick: (event) => { + event.stopPropagation(); + onOpenConfig(entry); + }, + }, + Icons.Config() + ) + : null ), - inputRef, - button( - { - class: () => `favorite-btn ${isFavorited() ? "is-favorite" : ""}`, - onclick: (e) => { - e.stopPropagation(); - handleFavorite(); + span({ class: "atlas-cheat-description", role: "cell" }, cheat.message || "No description provided"), + span({ class: "atlas-cheat-category", role: "cell" }, cheat.category || "general"), + div( + { class: "atlas-cheat-state-cell", role: "cell" }, + () => actionControl(), + button( + { + type: "button", + class: () => `atlas-cheat-favorite ${isFavorite(entry) ? "is-favorite" : ""}`, + title: () => (isFavorite(entry) ? "Remove from favorites" : "Add to favorites"), + "aria-label": () => (isFavorite(entry) ? "Remove from favorites" : "Add to favorites"), + "aria-pressed": () => String(isFavorite(entry)), + onclick: (event) => { + event.stopPropagation(); + onFavorite(entry); + }, }, - }, - Icons.Star() + Icons.Star() + ) ) ); }; diff --git a/src/ui/components/LazyCategory.js b/src/ui/components/LazyCategory.js deleted file mode 100644 index 0b8f24ba..00000000 --- a/src/ui/components/LazyCategory.js +++ /dev/null @@ -1,37 +0,0 @@ -import van from "../vendor/van-1.6.0.js"; -import { CheatItem } from "./CheatItem.js"; - -const { div, details, summary } = van.tags; - -/** - * Lazy Rendering Category - * Wraps
element and only renders children when opened. - * @param {object} props - Component props - * @param {string} props.category - Category name - * @param {boolean} props.isOpen - Whether to start expanded - * @param {Array} props.cheats - Array of cheat objects in this category - * @returns {Element} Details element with lazy-loaded content - */ -export const LazyCategory = ({ category, isOpen, cheats }) => { - const isExpanded = van.state(isOpen); - - return details( - { - class: "cheat-category", - open: isOpen, - ontoggle: (e) => { - isExpanded.val = e.target.open; - }, - }, - summary(category), - () => { - if (!isExpanded.val) { - return div({ class: "cheat-category-content", style: "display:none" }); - } - return div( - { class: "cheat-category-content" }, - cheats.map((cheat) => CheatItem(cheat)) - ); - } - ); -}; diff --git a/src/ui/components/Sidebar.js b/src/ui/components/Sidebar.js index 8506fda6..e832d311 100644 --- a/src/ui/components/Sidebar.js +++ b/src/ui/components/Sidebar.js @@ -1,168 +1,135 @@ import van from "../vendor/van-1.6.0.js"; import store from "../state/store.js"; -import { VIEWS, IS_ELECTRON } from "../state/constants.js"; +import { VIEWS, VIEW_ORDER, IS_ELECTRON } from "../state/constants.js"; import { Icons } from "../assets/icons.js"; -import { withTooltip } from "./Tooltip.js"; -import { NotificationHistory } from "./NotificationHistory.js"; +import { WorkspaceContextSlot } from "./WorkspaceContext.js"; -const { nav, div, button, span, a } = van.tags; +const { aside, nav, div, button, span, a } = van.tags; -const SHORTCUTS_TOOLTIP_TEXT = - "Keyboard shortcuts:\n" + - "1 - Cheats\n" + - "2 - Account Options\n" + - "3 - Config\n" + - "4 - Search\n" + - "5 - Chromedebug\n" + - "/ - Focus search\n" + - "Ctrl+S - Save config (Config tab)\n"; +const viewIcons = { + [VIEWS.CHEATS.id]: Icons.Cheats, + [VIEWS.ACCOUNT.id]: Icons.Account, + [VIEWS.CONFIG.id]: Icons.Config, + [VIEWS.SEARCH.id]: Icons.Search, + [VIEWS.DEVTOOLS.id]: Icons.DevTools, +}; -const ActiveCheatList = () => { - return div({ class: "active-cheats" }, div({ class: "active-cheats-header" }, "ACTIVE CHEATS"), () => { - const activeCheats = store.getActiveCheats(); +const DefaultWorkspaceContext = (viewId) => { + const view = VIEW_ORDER.find((candidate) => candidate.id === viewId); + return div( + { class: "atlas-context-placeholder" }, + div({ class: "atlas-context-heading" }, "Context"), + div( + { class: "atlas-context-empty" }, + `${view?.atlasLabel || view?.sidebarLabel || "Workspace"} controls are available in the main view.` + ) + ); +}; - if (activeCheats.length === 0) { - return div({ class: "active-cheats-list" }, span({ class: "no-active-cheats" }, "None")); - } +export const Sidebar = () => { + const compactQuery = window.matchMedia("(max-width: 1023px)"); + const responsiveRailQuery = window.matchMedia("(min-width: 1024px) and (max-width: 1280px)"); + const compactLayout = van.state(compactQuery.matches); + const responsiveRail = van.state(responsiveRailQuery.matches); - return div( - { class: "active-cheats-list" }, - ...activeCheats.map((cheat) => - span( - { class: "active-cheat-item", onclick: () => store.executeCheat(cheat, cheat) }, - span({ class: "active-cheat-text" }, cheat) - ) - ) - ); + compactQuery.addEventListener("change", (event) => { + compactLayout.val = event.matches; + if (!event.matches) store.closeMobileSidebar(); }); -}; -export const Sidebar = () => { - const hasUpdate = () => store.app.updateInfo?.updateAvailable; + responsiveRailQuery.addEventListener("change", (event) => { + responsiveRail.val = event.matches; + }); - const NavBtn = (viewConfig, Icon) => - withTooltip( - button( - { - class: () => `tab-button ${store.app.activeTab === viewConfig.id ? "active" : ""}`, - onclick: () => (store.app.activeTab = viewConfig.id), - }, - Icon(), - span({ class: "tab-label" }, viewConfig.sidebarLabel) - ), - viewConfig.sidebarLabel, - "right", - () => store.app.sidebarCollapsed - ); + van.derive(() => { + if (!compactLayout.val || !store.app.sidebarMobileOpen) return; + requestAnimationFrame(() => document.querySelector("#atlas-sidebar .atlas-nav-button.active")?.focus()); + }); - return nav( + return aside( { - class: () => `sidebar ${store.app.sidebarCollapsed ? "sidebar-collapsed" : ""}`, + class: () => + `sidebar atlas-sidebar ${store.app.sidebarCollapsed ? "sidebar-collapsed" : ""} ${ + responsiveRail.val && ![VIEWS.CHEATS.id, VIEWS.ACCOUNT.id].includes(store.app.activeTab) + ? "is-responsive-rail" + : "" + } ${store.app.sidebarMobileOpen ? "is-mobile-open" : ""}`, + id: "atlas-sidebar", + "aria-label": "Workspace navigation", + "aria-hidden": () => String(compactLayout.val && !store.app.sidebarMobileOpen), + inert: () => compactLayout.val && !store.app.sidebarMobileOpen, }, - div( - { class: "brand" }, - div( - { class: "brand-main" }, - div({ class: "brand-logo" }, Icons.Logo()), - div( - { class: "brand-text" }, - span("IDLEON"), - span({ class: "highlight" }, "INJECTOR"), - div( - { - class: () => - `brand-version ${store.app.appInfo?.version ? "" : "brand-version-hidden"}`.trim(), - }, - button( - { - type: "button", - class: () => `brand-version-button ${hasUpdate() ? "has-update" : ""}`, - onclick: () => store.openUpdateModal(), - "aria-label": () => - hasUpdate() - ? `Update available: ${store.app.updateInfo.latestVersion}` - : "Current version", - }, - span(() => (store.app.appInfo?.version ? `v${store.app.appInfo.version}` : "")), - span({ - class: () => `update-ready-dot ${hasUpdate() ? "" : "is-hidden"}`, - "aria-hidden": "true", - }) - ) - ) - ) - ), - NotificationHistory() - ), - div( - { class: "nav-menu" }, - NavBtn(VIEWS.CHEATS, Icons.Cheats), - NavBtn(VIEWS.ACCOUNT, Icons.Account), - NavBtn(VIEWS.CONFIG, Icons.Config), - NavBtn(VIEWS.SEARCH, Icons.Search), - NavBtn(VIEWS.DEVTOOLS, Icons.DevTools), - withTooltip( - a( + div({ class: "atlas-sidebar-section-label" }, "Workspaces"), + nav( + { class: "atlas-workspace-nav", "aria-label": "Workspaces" }, + ...VIEW_ORDER.map((view, index) => { + const Icon = viewIcons[view.id]; + return button( { - class: "tab-button github-link", - href: "https://github.com/MrJoiny/Idleon-Injector", - target: "_blank", - onclick: (e) => { - if (IS_ELECTRON) { - e.preventDefault(); - store.openExternalUrl("https://github.com/MrJoiny/Idleon-Injector"); - } - }, + class: () => `atlas-nav-button ${store.app.activeTab === view.id ? "active" : ""}`, + type: "button", + onclick: () => store.setActiveTab(view.id), + "aria-current": () => (store.app.activeTab === view.id ? "page" : "false"), + title: `${view.atlasLabel || view.sidebarLabel} (${index + 1})`, }, - Icons.GitHub(), - span({ class: "tab-label" }, "GitHub") - ), - "Official GitHub Repository", - "right", - () => store.app.sidebarCollapsed - ) + Icon(), + span({ class: "tab-label" }, view.atlasLabel || view.sidebarLabel), + span({ class: "atlas-nav-shortcut", "aria-hidden": "true" }, index + 1) + ); + }) ), - ActiveCheatList(), + div({ class: "atlas-sidebar-divider" }), + WorkspaceContextSlot({ fallback: DefaultWorkspaceContext }), div( - { class: "system-status" }, - div({ - class: () => { - const online = IS_ELECTRON || store.app.heartbeat; - return `status-dot ${online ? "is-online" : "is-offline"}`; - }, - }), - span( + { class: "atlas-sidebar-footer" }, + a( { - id: "system-status-text", - class: () => { - const online = IS_ELECTRON || store.app.heartbeat; - return online ? "is-online" : "is-offline"; + class: "atlas-nav-button atlas-github-link", + href: "https://github.com/MrJoiny/Idleon-Injector", + target: "_blank", + rel: "noopener noreferrer", + onclick: (event) => { + if (!IS_ELECTRON) return; + event.preventDefault(); + store.openExternalUrl("https://github.com/MrJoiny/Idleon-Injector"); }, + title: "Open GitHub repository", }, - () => (IS_ELECTRON || store.app.heartbeat ? "SYSTEM ONLINE" : "CONNECTION LOST") + Icons.GitHub(), + span({ class: "tab-label" }, "GitHub") ), - - withTooltip( + div( + { class: "atlas-sidebar-controls" }, button( { + class: "atlas-shortcuts-button", type: "button", - class: "system-shortcuts-button", + title: "Shortcuts: 1-5 switch workspaces, / focuses search, Ctrl+S saves, Esc closes overlays", "aria-label": "Keyboard shortcuts", }, Icons.Keyboard() ), - SHORTCUTS_TOOLTIP_TEXT, - "right", - () => !store.app.sidebarCollapsed + button( + { + class: "sidebar-toggle", + type: "button", + onclick: () => store.toggleSidebar(), + "aria-label": () => (store.app.sidebarCollapsed ? "Expand navigation" : "Collapse navigation"), + title: () => (store.app.sidebarCollapsed ? "Expand navigation" : "Collapse navigation"), + }, + () => (store.app.sidebarCollapsed ? Icons.ChevronRight() : Icons.ChevronLeft()), + span({ class: "tab-label" }, "Collapse") + ) ) - ), - - withTooltip( - button({ class: "sidebar-toggle", onclick: () => store.toggleSidebar() }, () => - store.app.sidebarCollapsed ? Icons.ChevronRight() : Icons.ChevronLeft() - ), - () => (store.app.sidebarCollapsed ? "Expand sidebar" : "Collapse sidebar"), - "right" ) ); }; + +export const SidebarBackdrop = () => + button({ + class: () => `atlas-sidebar-backdrop ${store.app.sidebarMobileOpen ? "is-visible" : ""}`, + type: "button", + onclick: () => store.closeMobileSidebar(), + "aria-label": "Close workspace navigation", + tabindex: () => (store.app.sidebarMobileOpen ? "0" : "-1"), + }); diff --git a/src/ui/components/UpdateModal.js b/src/ui/components/UpdateModal.js index af702f02..37320314 100644 --- a/src/ui/components/UpdateModal.js +++ b/src/ui/components/UpdateModal.js @@ -1,12 +1,28 @@ import van from "../vendor/van-1.6.0.js"; import store from "../state/store.js"; import { IS_ELECTRON } from "../state/constants.js"; +import { configDraftStatus, discardConfigDraft, saveConfigDraft } from "./views/config/configDraft.js"; const { div, h3, p, button, a, span } = van.tags; export const UpdateModal = () => { const hiddenUnless = (condition) => (condition ? "" : "is-hidden"); const updateInfo = () => store.app.updateInfo || {}; + const isBusy = () => store.app.updateApplying || !!configDraftStatus.savingTarget; + + const closeModal = () => { + if (!isBusy()) store.closeUpdateModal(); + }; + + const saveAndApplyUpdate = async () => { + if (configDraftStatus.diskDirty && !(await saveConfigDraft("disk"))) return; + await store.applyUpdate(); + }; + + const discardAndApplyUpdate = async () => { + if (configDraftStatus.diskDirty && !discardConfigDraft()) return; + await store.applyUpdate(); + }; const openReleaseLink = (event, url) => { if (!IS_ELECTRON) return; @@ -19,7 +35,7 @@ export const UpdateModal = () => { { class: () => `modal update-modal ${hiddenUnless(store.app.updateModalOpen && updateInfo().updateAvailable)}`, - onclick: () => store.closeUpdateModal(), + onclick: closeModal, }, div( { class: "modal-box update-modal-box", onclick: (event) => event.stopPropagation() }, @@ -42,8 +58,13 @@ export const UpdateModal = () => { ), p( { - class: () => - `update-modal-warning ${hiddenUnless(updateInfo().canApplyUpdate === false)}`, + class: () => `update-modal-warning ${hiddenUnless(configDraftStatus.diskDirty)}`, + }, + "You have configuration changes that have not been saved to disk." + ), + p( + { + class: () => `update-modal-warning ${hiddenUnless(updateInfo().canApplyUpdate === false)}`, }, "Auto-update is only available in packaged builds." ), @@ -63,19 +84,32 @@ export const UpdateModal = () => { { id: "modal-cancel", type: "button", - disabled: () => store.app.updateApplying, - onclick: () => store.closeUpdateModal(), + disabled: isBusy, + onclick: closeModal, + }, + "Cancel" + ), + button( + { + class: () => `btn-secondary ${hiddenUnless(configDraftStatus.diskDirty)}`, + type: "button", + disabled: () => isBusy() || !updateInfo().canApplyUpdate, + onclick: discardAndApplyUpdate, }, - "Deny" + "Discard & Update" ), button( { id: "modal-accept", type: "button", - disabled: () => store.app.updateApplying || !updateInfo().canApplyUpdate, - onclick: () => store.applyUpdate(), + disabled: () => isBusy() || !updateInfo().canApplyUpdate, + onclick: saveAndApplyUpdate, }, - () => (store.app.updateApplying ? "Preparing..." : "Accept") + () => { + if (store.app.updateApplying) return "Preparing..."; + if (configDraftStatus.savingTarget === "disk") return "Saving..."; + return configDraftStatus.diskDirty ? "Save & Update" : "Update"; + } ) ) ) diff --git a/src/ui/components/WorkspaceContext.js b/src/ui/components/WorkspaceContext.js new file mode 100644 index 00000000..dd675255 --- /dev/null +++ b/src/ui/components/WorkspaceContext.js @@ -0,0 +1,77 @@ +import van from "../vendor/van-1.6.0.js"; +import store from "../state/store.js"; + +const { div } = van.tags; + +const renderers = new Map(); +const saveHandlers = new Map(); +const revision = van.state(0); + +/** + * Register contextual navigation for a workspace. + * The renderer must return one DOM node so VanJS can preserve predictable child identity. + * + * @param {string} viewId - Workspace ID from VIEWS. + * @param {() => HTMLElement} renderer - Creates the contextual navigation node. + * @returns {() => void} Unregister callback. + */ +export const registerWorkspaceContext = (viewId, renderer) => { + if (!viewId || typeof renderer !== "function") { + throw new TypeError("Workspace context requires a view ID and renderer"); + } + + renderers.set(viewId, renderer); + revision.val += 1; + + return () => { + if (renderers.get(viewId) !== renderer) return; + renderers.delete(viewId); + revision.val += 1; + }; +}; + +/** + * Register the save action for a workspace-owned draft or inspector. + * This is the integration point used by the global Ctrl+S shortcut. + * + * @param {string} viewId - Workspace ID from VIEWS. + * @param {() => void|Promise} handler - Workspace save action. + * @returns {() => void} Unregister callback. + */ +export const registerWorkspaceSaveHandler = (viewId, handler) => { + if (!viewId || typeof handler !== "function") { + throw new TypeError("Workspace save action requires a view ID and handler"); + } + + saveHandlers.set(viewId, handler); + return () => { + if (saveHandlers.get(viewId) === handler) saveHandlers.delete(viewId); + }; +}; + +/** + * Invoke the active workspace save action when one is registered. + * + * @param {string} viewId - Workspace ID from VIEWS. + * @returns {boolean} Whether a workspace save action was invoked. + */ +export const invokeWorkspaceSave = (viewId) => { + const handler = saveHandlers.get(viewId); + if (!handler) return false; + handler(); + return true; +}; + +/** + * Render the active workspace's registered context, or the supplied fallback. + * + * @param {{fallback: (viewId: string) => HTMLElement}} props + * @returns {HTMLElement} + */ +export const WorkspaceContextSlot = ({ fallback }) => + div({ class: "atlas-context-slot", id: "atlas-workspace-context" }, () => { + revision.val; + const viewId = store.app.activeTab; + const renderer = renderers.get(viewId); + return renderer ? renderer() : fallback(viewId); + }); diff --git a/src/ui/components/views/Account.js b/src/ui/components/views/Account.js index c8ed0e0f..5a72d25d 100644 --- a/src/ui/components/views/Account.js +++ b/src/ui/components/views/Account.js @@ -9,6 +9,9 @@ */ import van from "../../vendor/van-1.6.0.js"; +import store from "../../state/store.js"; +import { VIEWS } from "../../state/constants.js"; +import { registerWorkspaceContext } from "../WorkspaceContext.js"; import { AccountOptionsTab } from "./account/AccountOptionsTab.js"; import { CardsTab } from "./account/CardsTab.js"; import { TasksTab } from "./account/TasksTab.js"; @@ -44,28 +47,39 @@ const ACCOUNT_TABS = [ export const Account = () => { const activeTab = van.state(ACCOUNT_TABS[0].id); - - return div( - { id: "options-account-tab", class: "tab-pane account-tab-layout" }, - - // Sub-navigation + const workspaceContext = div( + { class: "account-workspace-context", role: "navigation", "aria-label": "Account sections" }, + div({ class: "atlas-context-heading" }, "Account sections"), renderTabNav({ tabs: ACCOUNT_TABS, activeId: activeTab, - navClass: "account-sub-nav", + navClass: "account-root-nav", buttonClass: (tab) => { if (tab.isWorld) return `account-top-tab-btn world-tab-btn w${tab.worldNum}-world-tab`; const compactClass = tab.id === "tasks" || tab.id === "cards" ? "account-compact-tab-btn" : ""; return `account-top-tab-btn account-options-btn ${compactClass}`; }, - renderLabel: (tab) => (tab.isWorld ? span({ class: "world-tab-btn-num" }, `W${tab.worldNum}`) : tab.label), - getButtonProps: (tab) => ({ title: tab.label }), - }), + renderLabel: (tab) => + tab.isWorld + ? span( + { class: "account-tree-label" }, + span({ class: "world-tab-btn-num" }, `W${tab.worldNum}`), + span({ class: "account-tree-label__text" }, tab.label) + ) + : span({ class: "account-tree-label__text" }, tab.label), + getButtonProps: (tab) => ({ title: tab.label, "aria-label": tab.label }), + onSelect: () => store.closeMobileSidebar(), + }) + ); + registerWorkspaceContext(VIEWS.ACCOUNT.id, () => workspaceContext); + + return div( + { id: "options-account-tab", class: "tab-pane account-tab-layout" }, - // Tab panes — lazy-mount: component is created (and its data fetched) - // only when the user first activates that tab. The div stays in the DOM - // so CSS visibility toggling keeps state alive after mount. div( + // Tab panes — lazy-mount: component is created (and its data fetched) + // only when the user first activates that tab. The div stays in the DOM + // so CSS visibility toggling keeps state alive after mount. { class: "account-sub-tab-content" }, ...renderLazyPanes({ tabs: ACCOUNT_TABS, diff --git a/src/ui/components/views/AtlasCheats.js b/src/ui/components/views/AtlasCheats.js new file mode 100644 index 00000000..f9f7c8a9 --- /dev/null +++ b/src/ui/components/views/AtlasCheats.js @@ -0,0 +1,711 @@ +import van from "../../vendor/van-1.6.0.js"; +import vanX from "../../vendor/van-x-0.6.3.js"; +import store from "../../state/store.js"; +import { CATEGORY_ORDER, VIEWS } from "../../state/constants.js"; +import * as API from "../../services/api.js"; +import { configPathExists, getCheatConfigPath } from "../../utils/index.js"; +import { Icons } from "../../assets/icons.js"; +import { Loader } from "../Loader.js"; +import { EmptyState } from "../EmptyState.js"; +import { CheatItem } from "../CheatItem.js"; +import { ConfigNode } from "../config/ConfigNode.js"; +import { registerWorkspaceContext, registerWorkspaceSaveHandler } from "../WorkspaceContext.js"; +import { ConfigActions } from "./config/ConfigActions.js"; +import { + buildConfigPathTemplate, + configDraftReady, + getConfigDraft, + getConfigPathData, + saveConfigDraft, +} from "./config/configDraft.js"; + +const { div, button, span, input, code } = van.tags; + +const PAGE_SIZE = 50; + +const normalizeRootStateKey = (key) => (key.endsWith("s") ? key.slice(0, -1) : key); + +/** + * Flatten the full boolean state response without discarding false values. + * Presence in this map means the backend can truthfully expose a switch. + * @param {object} states + * @returns {Map} + */ +const flattenCheatStates = (states) => { + const result = new Map(); + + const visit = (value, path) => { + if (typeof value === "boolean") { + result.set(path.join(" "), value); + return; + } + + if (!value || typeof value !== "object") return; + for (const [key, child] of Object.entries(value)) { + const segment = path.length === 0 ? normalizeRootStateKey(key) : key; + visit(child, [...path, segment]); + } + }; + + visit(states, []); + return result; +}; + +const sortCategoryNames = (categories) => + [...categories].sort((a, b) => { + const indexA = CATEGORY_ORDER.indexOf(a); + const indexB = CATEGORY_ORDER.indexOf(b); + if (indexA !== -1 && indexB !== -1) return indexA - indexB; + if (indexA !== -1) return -1; + if (indexB !== -1) return 1; + return a.localeCompare(b); + }); + +const makeBaseEntry = (cheat) => ({ + id: `base:${cheat.value}`, + action: cheat.value, + parameter: "", + cheat, +}); + +const matchesFilter = (cheat, term) => + [cheat.value, cheat.message, cheat.category].filter(Boolean).some((value) => value.toLowerCase().includes(term)); + +/** + * Resolve a stored favorite/recent action back to its command definition. + * Longest-prefix matching preserves parameters that contain spaces. + * @param {string} action + * @param {object[]} cheats + * @returns {object|null} + */ +const resolveStoredAction = (action, cheats) => { + const exact = cheats.find((cheat) => cheat.value === action); + if (exact) return makeBaseEntry(exact); + + const parameterized = cheats + .filter((cheat) => cheat.needsParam && action.startsWith(`${cheat.value} `)) + .sort((a, b) => b.value.length - a.value.length)[0]; + + if (!parameterized) return null; + return { + id: `action:${action}`, + action, + parameter: action.slice(parameterized.value.length + 1), + cheat: parameterized, + }; +}; + +const ScopeButton = ({ id, label, count, activeScope, onSelect, icon = null }) => + button( + { + type: "button", + class: () => `atlas-scope-button ${activeScope() === id ? "is-active" : ""}`, + "aria-current": () => (activeScope() === id ? "page" : null), + onclick: () => onSelect(id), + }, + icon ? span({ class: "atlas-scope-icon", "aria-hidden": "true" }, icon) : null, + span({ class: "atlas-scope-label" }, label), + span({ class: "atlas-scope-count" }, count) + ); + +/** + * Atlas dense cheat browser with explicit selection, execution, and config editing. + * @returns {Element} + */ +export const AtlasCheats = () => { + const compactInspectorQuery = window.matchMedia("(max-width: 1023px)"); + const compactInspector = van.state(compactInspectorQuery.matches); + const ui = vanX.reactive({ + filter: "", + scope: "all", + selectedAction: "", + inspectorTab: "details", + inspectorOpen: !compactInspector.val, + page: 0, + }); + const parameterStates = new Map(); + + compactInspectorQuery.addEventListener("change", (event) => { + compactInspector.val = event.matches; + ui.inspectorOpen = !event.matches; + }); + + if (store.data.cheats.length === 0) store.loadCheats(); + registerWorkspaceSaveHandler(VIEWS.CHEATS.id, () => saveConfigDraft("disk")); + + const stateMap = van.derive(() => flattenCheatStates(store.data.activeCheatStates)); + + const getStateInfo = (command) => { + const states = stateMap.val; + return { + known: states.has(command), + active: states.get(command) === true, + }; + }; + + const getEntriesForScope = () => { + const cheats = [...store.data.cheats]; + const decorateEntry = (entry) => ({ + ...entry, + hasConfig: store.hasConfigEntry(entry.cheat.value), + }); + + if (ui.scope === "favorites") { + return [...store.data.favoriteCheats] + .map((action) => resolveStoredAction(action, cheats)) + .filter(Boolean) + .map(decorateEntry); + } + + if (ui.scope === "recent") { + return [...store.data.recentCheats] + .map((action) => resolveStoredAction(action, cheats)) + .filter(Boolean) + .map(decorateEntry); + } + + const entries = cheats.map(makeBaseEntry).map(decorateEntry); + if (ui.scope === "active") return entries.filter((entry) => getStateInfo(entry.cheat.value).active); + if (ui.scope.startsWith("category:")) { + const category = ui.scope.slice("category:".length); + return entries.filter((entry) => (entry.cheat.category || "general") === category); + } + return entries; + }; + + const matchingCategoryCounts = van.derive(() => { + const term = ui.filter.trim().toLowerCase(); + const counts = new Map(); + + for (const cheat of store.data.cheats) { + if (term && !matchesFilter(cheat, term)) continue; + const category = cheat.category || "general"; + counts.set(category, (counts.get(category) || 0) + 1); + } + + return counts; + }); + + const visibleEntries = van.derive(() => { + const term = ui.filter.trim().toLowerCase(); + const entries = getEntriesForScope(); + if (!term) return entries; + + return entries.filter((entry) => matchesFilter(entry.cheat, term)); + }); + + const pageCount = van.derive(() => Math.max(1, Math.ceil(visibleEntries.val.length / PAGE_SIZE))); + const currentPage = van.derive(() => { + const lastPage = pageCount.val - 1; + if (ui.page > lastPage) ui.page = lastPage; + return ui.page; + }); + + const visibleRows = van.derive(() => { + const start = currentPage.val * PAGE_SIZE; + return visibleEntries.val.slice(start, start + PAGE_SIZE); + }); + + const selectScope = (scope) => { + ui.scope = scope; + ui.page = 0; + }; + + const selectedEntry = van.derive(() => { + const selected = visibleRows.val.find((entry) => entry.action === ui.selectedAction); + return selected || visibleRows.val[0] || null; + }); + + van.derive(() => { + const entry = selectedEntry.val; + if (ui.inspectorTab === "config" && entry && !entry.hasConfig) ui.inspectorTab = "details"; + }); + + van.derive(() => { + if (!ui.scope.startsWith("category:")) return; + const category = ui.scope.slice("category:".length); + if (matchingCategoryCounts.val.has(category)) return; + ui.scope = "all"; + ui.page = 0; + }); + + const setPage = (page) => { + ui.page = Math.max(0, Math.min(page, pageCount.val - 1)); + ui.selectedAction = visibleRows.val[0]?.action || ""; + }; + + const getParameterState = (entry) => { + const key = entry.cheat.value; + if (!parameterStates.has(key)) parameterStates.set(key, van.state(entry.parameter || "")); + const state = parameterStates.get(key); + if (entry.parameter && state.val !== entry.parameter) state.val = entry.parameter; + return state; + }; + + const selectEntry = (entry, { focusParameter = false } = {}) => { + ui.selectedAction = entry.action; + if (compactInspector.val) ui.inspectorOpen = true; + if (entry.parameter) getParameterState(entry).val = entry.parameter; + + if (focusParameter) { + ui.inspectorTab = "details"; + requestAnimationFrame(() => document.querySelector("#atlas-cheat-parameter")?.focus()); + } + }; + + const getExecutionAction = (entry) => { + if (!entry.cheat.needsParam) return entry.cheat.value; + const parameter = getParameterState(entry).val.trim(); + return parameter ? `${entry.cheat.value} ${parameter}` : null; + }; + + const executeAction = async (action, message) => { + if (!store.app.heartbeat) throw new Error("The injector is disconnected"); + + try { + const result = await API.executeCheatAction(action); + store.addToRecent(action); + store.notify(`Cheat ${result?.result || "Success"}`); + return result; + } catch (error) { + store.notify(`Error executing '${message}': ${error.message}`, "error"); + throw error; + } + }; + + const toggleFavorite = (entry) => { + const action = getExecutionAction(entry); + if (!action) { + selectEntry(entry, { focusParameter: true }); + store.notify("Enter a value before saving this command", "error"); + return; + } + store.toggleFavorite(action); + }; + + const openConfig = (entry) => { + selectEntry(entry); + ui.inspectorTab = "config"; + }; + + const handleTableKeydown = (event) => { + if (["INPUT", "BUTTON", "TEXTAREA", "SELECT"].includes(event.target.tagName)) return; + const entries = visibleRows.val; + if (entries.length === 0) return; + + const currentAction = selectedEntry.val?.action; + let index = Math.max( + 0, + entries.findIndex((entry) => entry.action === currentAction) + ); + + if (["ArrowDown", "j"].includes(event.key)) index = Math.min(entries.length - 1, index + 1); + else if (["ArrowUp", "k"].includes(event.key)) index = Math.max(0, index - 1); + else if (event.key === "Enter") { + ui.inspectorOpen = true; + requestAnimationFrame(() => document.querySelector(".atlas-cheat-inspector")?.focus()); + return; + } else { + return; + } + + event.preventDefault(); + selectEntry(entries[index]); + document + .querySelector(`[data-cheat-row="${CSS.escape(entries[index].id)}"]`) + ?.scrollIntoView({ block: "nearest" }); + }; + + const workspaceContext = div( + { class: "atlas-cheat-context", role: "navigation", "aria-label": "Cheat scopes" }, + div({ class: "atlas-tree-heading" }, "VIEWS"), + ScopeButton({ + id: "all", + label: "All cheats", + count: () => store.data.cheats.length, + activeScope: () => ui.scope, + onSelect: selectScope, + icon: Icons.Cheats(), + }), + ScopeButton({ + id: "active", + label: "Active", + count: () => [...stateMap.val.values()].filter(Boolean).length, + activeScope: () => ui.scope, + onSelect: selectScope, + icon: Icons.Lightning(), + }), + ScopeButton({ + id: "favorites", + label: "Favorites", + count: () => store.data.favoriteCheats.length, + activeScope: () => ui.scope, + onSelect: selectScope, + icon: Icons.Star(), + }), + ScopeButton({ + id: "recent", + label: "Recent", + count: () => store.data.recentCheats.length, + activeScope: () => ui.scope, + onSelect: selectScope, + icon: Icons.Refresh(), + }), + div({ class: "atlas-tree-heading atlas-category-heading" }, "CATEGORIES"), + div({ class: "atlas-category-scopes" }, () => + div( + ...sortCategoryNames(matchingCategoryCounts.val.keys()).map((category) => + ScopeButton({ + id: `category:${category}`, + label: category, + count: () => matchingCategoryCounts.val.get(category) || 0, + activeScope: () => ui.scope, + onSelect: selectScope, + }) + ) + ) + ) + ); + registerWorkspaceContext(VIEWS.CHEATS.id, () => workspaceContext); + + const table = div( + { + class: "atlas-cheat-table", + role: "table", + tabindex: "0", + "aria-label": "Cheat commands", + onkeydown: handleTableKeydown, + }, + div( + { class: "atlas-cheat-toolbar" }, + div( + { class: "atlas-cheat-search" }, + Icons.Search(), + input({ + type: "search", + class: "global-search-input", + value: () => ui.filter, + placeholder: "Filter by command, description, or category...", + "aria-label": "Filter cheats", + oninput: (event) => { + ui.filter = event.target.value; + ui.page = 0; + }, + }) + ), + span({ class: "atlas-row-count", "aria-live": "polite" }, () => { + const total = visibleEntries.val.length; + if (total === 0) return "0 rows"; + const start = currentPage.val * PAGE_SIZE + 1; + const end = Math.min(total, start + PAGE_SIZE - 1); + return `${start}-${end} of ${total} rows`; + }), + div( + { class: "atlas-cheat-pagination", "aria-label": "Cheat list pages" }, + button( + { + type: "button", + disabled: () => currentPage.val === 0, + "aria-label": "Previous page", + onclick: () => setPage(currentPage.val - 1), + }, + Icons.ChevronLeft() + ), + span(() => `Page ${currentPage.val + 1} / ${pageCount.val}`), + button( + { + type: "button", + disabled: () => currentPage.val >= pageCount.val - 1, + "aria-label": "Next page", + onclick: () => setPage(currentPage.val + 1), + }, + Icons.ChevronRight() + ) + ), + button( + { + type: "button", + class: "atlas-inspector-toggle", + disabled: () => !selectedEntry.val, + onclick: () => (ui.inspectorOpen = true), + "aria-controls": "atlas-cheat-inspector", + "aria-expanded": () => String(ui.inspectorOpen), + }, + "Inspect" + ), + span({ class: "atlas-table-hint" }, "Up/Down or j/k move - Enter inspect") + ), + div( + { class: "atlas-cheat-table-head", role: "row" }, + span({ role: "columnheader" }, "Command"), + span({ role: "columnheader" }, "Description"), + span({ role: "columnheader" }, "Category"), + span({ role: "columnheader" }, "State / action") + ), + div({ class: "atlas-cheat-table-body", role: "rowgroup" }, () => { + const entries = visibleRows.val; + if (store.app.isLoading && store.data.cheats.length === 0) return Loader({ text: "INITIALIZING" }); + if (entries.length === 0) { + return EmptyState({ + icon: Icons.SearchX(), + title: "NO CHEATS FOUND", + subtitle: ui.filter ? "Try a different filter" : "This scope is empty", + }); + } + + return div( + { class: "atlas-cheat-row-list" }, + ...entries.map((entry) => + CheatItem({ + entry, + selected: () => selectedEntry.val?.action === entry.action, + getStateInfo, + isFavorite: (item) => store.isFavorite(item.action || item.cheat.value), + onSelect: selectEntry, + onExecute: executeAction, + onFavorite: toggleFavorite, + onOpenConfig: openConfig, + canExecute: () => store.app.heartbeat, + }) + ) + ); + }) + ); + + const inspectorDetails = (entry) => { + const parameterState = entry.cheat.needsParam ? getParameterState(entry) : null; + const pending = van.state(false); + const executeFromInspector = async () => { + const action = getExecutionAction(entry); + if (!action) { + document.querySelector("#atlas-cheat-parameter")?.focus(); + return; + } + + pending.val = true; + try { + await executeAction(action, entry.cheat.message || entry.cheat.value); + ui.selectedAction = action; + } finally { + pending.val = false; + } + }; + + return div( + { class: "atlas-inspector-pane atlas-inspector-details" }, + div({ class: "atlas-inspector-description" }, entry.cheat.message || "No description provided."), + entry.cheat.needsParam + ? div( + { class: "atlas-inspector-field" }, + span("Command value"), + input({ + id: "atlas-cheat-parameter", + type: "text", + value: parameterState, + placeholder: "Enter required value", + oninput: (event) => (parameterState.val = event.target.value), + onkeydown: (event) => { + if (event.key === "Enter") executeFromInspector(); + }, + }) + ) + : null, + button( + { + type: "button", + class: "atlas-inspector-run", + disabled: () => + pending.val || !store.app.heartbeat || (entry.cheat.needsParam && !parameterState.val.trim()), + onclick: executeFromInspector, + }, + () => { + if (pending.val) return "Running..."; + if (!store.app.heartbeat) return "Disconnected"; + const state = getStateInfo(entry.cheat.value); + if (state.known) return `${state.active ? "Disable" : "Enable"} cheat`; + return "Run command"; + } + ), + div( + { class: "atlas-inspector-facts" }, + div(span("Category"), span(entry.cheat.category || "general")), + div( + span("Behavior"), + span(() => { + const state = getStateInfo(entry.cheat.value); + return entry.cheat.needsParam ? "Parameterized command" : state.known ? "Toggle" : "Command"; + }) + ), + div( + span("Live state"), + span(() => { + const state = getStateInfo(entry.cheat.value); + return state.known ? (state.active ? "Active" : "Inactive") : "Not exposed"; + }) + ), + div( + span("Command"), + code(() => getExecutionAction(entry) || entry.cheat.value) + ) + ) + ); + }; + + const configInspectorCache = new Map(); + + const getInspectorConfig = (entry) => { + const cacheKey = entry.cheat.value; + const cached = configInspectorCache.get(cacheKey); + if (cached) return cached; + + const host = div({ class: "atlas-inspector-pane atlas-inspector-config" }, Loader({ text: "LOADING CONFIG" })); + let mounted = false; + + configInspectorCache.set(cacheKey, host); + getConfigDraft(); + + van.derive(() => { + if (!configDraftReady.val || mounted) return; + + const draft = getConfigDraft(); + const path = getCheatConfigPath(entry.cheat.value); + const templateRoot = store.app.config?.cheatConfig; + const hasPath = Boolean( + draft?.cheatConfig && Array.isArray(path) && path.length > 0 && configPathExists(path, templateRoot) + ); + + mounted = true; + + if (!hasPath) { + host.replaceChildren( + EmptyState({ + icon: Icons.CircleSlash(), + title: "NO LINKED CONFIG", + subtitle: "This command does not map to an editable config subtree.", + }) + ); + return; + } + + const nodes = ConfigNode({ + data: getConfigPathData(draft.cheatConfig, path), + path: "cheatConfig", + template: buildConfigPathTemplate(templateRoot, path), + forceOpen: true, + }); + + host.replaceChildren( + div({ class: "atlas-linked-config-path" }, `cheatConfig.${path.join(".")}`), + div({ class: "atlas-linked-config-tree" }, ...nodes), + button( + { + type: "button", + class: "atlas-open-full-config", + onclick: () => store.navigateToCheatConfig(entry.cheat.value), + }, + "Open full Config", + Icons.ChevronRight() + ), + ConfigActions({ compact: true }) + ); + }); + + return host; + }; + + const inspector = div( + { + id: "atlas-cheat-inspector", + class: () => `atlas-cheat-inspector ${ui.inspectorOpen ? "is-open" : ""}`, + tabindex: "-1", + role: "complementary", + "aria-label": "Selected cheat inspector", + "aria-hidden": () => String(compactInspector.val && !ui.inspectorOpen), + inert: () => compactInspector.val && !ui.inspectorOpen, + onkeydown: (event) => { + if (event.key === "Escape" && compactInspector.val) ui.inspectorOpen = false; + }, + }, + () => { + const entry = selectedEntry.val; + if (!entry) { + return EmptyState({ + icon: Icons.CircleSlash(), + title: "NO SELECTION", + subtitle: "Select a command to inspect it.", + }); + } + + return div( + { class: "atlas-inspector-content" }, + div( + { class: "atlas-inspector-header" }, + span({ class: "atlas-inspector-icon", "aria-hidden": "true" }, Icons.Lightning()), + div({ class: "atlas-inspector-title" }, span(entry.cheat.value), code(entry.action)), + div( + { class: "atlas-inspector-header-actions" }, + button( + { + type: "button", + class: () => + `atlas-cheat-favorite ${store.isFavorite(getExecutionAction(entry) || entry.action) ? "is-favorite" : ""}`, + title: "Toggle favorite", + "aria-label": "Toggle favorite", + onclick: () => toggleFavorite(entry), + }, + Icons.Star() + ), + button( + { + type: "button", + class: "atlas-inspector-close", + title: "Close inspector", + "aria-label": "Close cheat inspector", + onclick: () => (ui.inspectorOpen = false), + }, + Icons.X() + ) + ) + ), + div( + { class: "atlas-inspector-tabs", role: "tablist" }, + button( + { + type: "button", + role: "tab", + class: () => (ui.inspectorTab === "details" ? "is-active" : ""), + "aria-selected": () => String(ui.inspectorTab === "details"), + onclick: () => (ui.inspectorTab = "details"), + }, + "Details" + ), + button( + { + type: "button", + role: "tab", + class: () => (ui.inspectorTab === "config" ? "is-active" : ""), + "aria-selected": () => String(ui.inspectorTab === "config"), + disabled: () => !store.hasConfigEntry(entry.cheat.value), + onclick: () => (ui.inspectorTab = "config"), + }, + "Config" + ) + ), + () => (ui.inspectorTab === "config" ? getInspectorConfig(entry) : inspectorDetails(entry)) + ); + } + ); + + const inspectorBackdrop = button({ + type: "button", + class: () => `atlas-inspector-backdrop ${ui.inspectorOpen ? "is-visible" : ""}`, + tabindex: () => (compactInspector.val && ui.inspectorOpen ? "0" : "-1"), + "aria-label": "Close cheat inspector", + onclick: () => (ui.inspectorOpen = false), + }); + + return div( + { id: "cheats-tab", class: "tab-pane atlas-cheats-pane" }, + div({ class: "atlas-cheats-workbench" }, table, inspectorBackdrop, inspector) + ); +}; diff --git a/src/ui/components/views/Cheats.js b/src/ui/components/views/Cheats.js index 6e4fa3c3..d7e9eb7a 100644 --- a/src/ui/components/views/Cheats.js +++ b/src/ui/components/views/Cheats.js @@ -1,297 +1 @@ -import van from "../../vendor/van-1.6.0.js"; -import vanX from "../../vendor/van-x-0.6.3.js"; -import store from "../../state/store.js"; -import { Loader } from "../Loader.js"; -import { EmptyState } from "../EmptyState.js"; -import { SearchBar } from "../SearchBar.js"; -import { Icons } from "../../assets/icons.js"; -import { CATEGORY_ORDER } from "../../state/constants.js"; -import { CheatItem } from "../CheatItem.js"; -import { LazyCategory } from "../LazyCategory.js"; - -const { div, button, span } = van.tags; - -const QuickAccessSection = () => { - /** - * Find a cheat object by its value, handling parameterized commands. - * @param {string} val - The cheat value to find - * @returns {object|null} The cheat object or a reconstructed one for parameterized commands - */ - const getCheatByValue = (val) => { - const allCheats = store.data.cheats; - // Direct match - const found = allCheats.find((c) => c.value === val); - if (found) return found; - - // Handle parameterized commands (e.g., "drop Copper 100" -> base "drop Copper") - const baseParts = val.split(" "); - if (baseParts.length > 1) { - const baseCmd = baseParts.slice(0, -1).join(" "); - const paramFound = allCheats.find((c) => c.value === baseCmd); - if (paramFound) { - return { - value: val, - message: `${paramFound.message} (${baseParts[baseParts.length - 1]})`, - category: paramFound.category, - }; - } - } - return null; - }; - - const QuickAccessBtn = (cheatValue, isFavorite = false) => { - const cheat = getCheatByValue(cheatValue); - if (!cheat) return null; - - return div( - { class: "quick-access-item" }, - button( - { - class: () => `quick-access-btn ${isFavorite ? "is-favorite-btn" : ""}`, - onclick: () => store.executeCheat(cheat.value, cheat.message), - title: cheat.message, - }, - span({ class: "quick-access-btn-text" }, cheat.value), - isFavorite - ? span( - { - class: "quick-access-remove-icon", - onclick: (e) => { - e.stopPropagation(); - store.toggleFavorite(cheatValue); - }, - title: "Remove from favorites", - }, - Icons.X() - ) - : null - ) - ); - }; - - return div( - { class: "quick-access-section" }, - div({ class: "quick-access-group" }, div({ class: "quick-access-header" }, "★ FAVORITES"), () => { - const favorites = [...store.data.favoriteCheats]; - if (favorites.length === 0) { - return div({ class: "quick-access-empty" }, "No favorites yet"); - } - return div({ class: "quick-access-items" }, ...favorites.map((val) => QuickAccessBtn(val, true))); - }), - - div({ class: "quick-access-group" }, div({ class: "quick-access-header" }, "↻ RECENT"), () => { - const recent = [...store.data.recentCheats]; - if (recent.length === 0) { - return div({ class: "quick-access-empty" }, "No recent cheats"); - } - return div({ class: "quick-access-items" }, ...recent.slice(0, 5).map((val) => QuickAccessBtn(val, false))); - }) - ); -}; - -/** - * Groups cheats by category, filtering by search term. - * Moved outside component to avoid re-creation and allow use in handlers. - */ -const getGroupedCheats = (list, term) => { - const groups = {}; - const searchTerm = term.toLowerCase(); - - for (let i = 0; i < list.length; i++) { - const cheat = list[i]; - - // Filter: match term against value or message - if (searchTerm) { - const msg = (cheat.message || "").toLowerCase(); - const val = (cheat.value || "").toLowerCase(); - if (!msg.includes(searchTerm) && !val.includes(searchTerm)) continue; - } - - const category = cheat.category || "general"; - if (!groups[category]) groups[category] = []; - groups[category].push(cheat); - } - - // Return sorted by category name with specific order - const sortedKeys = Object.keys(groups).sort((a, b) => { - const indexA = CATEGORY_ORDER.indexOf(a); - const indexB = CATEGORY_ORDER.indexOf(b); - - if (indexA !== -1 && indexB !== -1) return indexA - indexB; - if (indexA !== -1) return -1; - if (indexB !== -1) return 1; - - return a.localeCompare(b); - }); - - const result = {}; - for (const key of sortedKeys) { - result[key] = groups[key]; - } - return result; -}; - -export const Cheats = () => { - const ui = vanX.reactive({ - filter: "", - shouldOpen: false, - activeCategory: null, - }); - - if (store.data.cheats.length === 0) { - store.loadCheats(); - } - - // Pagination state - const pagination = vanX.reactive({ - limit: 50, - }); - - const resetPagination = () => { - pagination.limit = 50; - }; - - const validateActiveCategory = (filter) => { - const groupedData = getGroupedCheats(store.data.cheats, filter); - const categories = Object.keys(groupedData); - - if (categories.length > 0) { - if (!ui.activeCategory || !categories.includes(ui.activeCategory)) { - ui.activeCategory = categories[0]; - } - } else { - ui.activeCategory = null; - } - }; - - const handleSearch = (val) => { - ui.filter = val; - ui.shouldOpen = val.length > 0; - validateActiveCategory(val); - resetPagination(); - }; - - const handleCategorySwitch = (cat) => { - ui.activeCategory = cat; - resetPagination(); - }; - - const handleConfigDrawerToggle = () => { - store.clearForcedConfigPath(); - - if (store.app.configDrawerOpen) { - store.closeConfigDrawer(); - return; - } - - store.openConfigDrawer(); - }; - - return div( - { id: "cheats-tab", class: "tab-pane" }, - - div( - { class: "scroll-container" }, - - div( - { class: "control-bar" }, - SearchBar({ - placeholder: "SEARCH_COMMANDS", - onInput: handleSearch, - style: "flex: 1;", - }), - button( - { - class: () => `config-drawer-toggle ${store.app.configDrawerOpen ? "active" : ""}`, - onclick: handleConfigDrawerToggle, - title: "Toggle config drawer", - }, - Icons.Config() - ), - button( - { - class: "view-mode-toggle", - onclick: store.toggleCheatsViewMode, - title: "Toggle View Mode (List/Tabs)", - }, - () => (store.app.cheatsViewMode === "tabs" ? Icons.List() : Icons.Tabs()) - ) - ), - - QuickAccessSection(), - - () => { - if (store.app.isLoading && store.data.cheats.length === 0) { - return Loader({ text: "INITIALIZING" }); - } - - // Get fresh snapshot of cheats and filter term - const filterTerm = ui.filter; - const groupedData = getGroupedCheats(store.data.cheats, filterTerm); - const categories = Object.keys(groupedData); - - if (categories.length === 0) { - return EmptyState({ - icon: Icons.SearchX(), - title: "NO CHEATS FOUND", - subtitle: filterTerm ? "Try a different search term" : "Cheats list is empty", - }); - } - - // Initialize active category if null or invalid (subscription-free peek) - const rawUi = vanX.raw(ui); - if (!rawUi.activeCategory || !categories.includes(rawUi.activeCategory)) { - ui.activeCategory = categories[0]; - } - - const isTabsMode = store.app.cheatsViewMode === "tabs"; - - if (isTabsMode) { - return div( - // Tabs Bar - div( - { class: "tabs-bar" }, - categories.map((cat) => - button( - { - class: () => `tab-btn ${ui.activeCategory === cat ? "active" : ""}`, - onclick: () => handleCategorySwitch(cat), - }, - cat - ) - ) - ), - // Tab Content - wrapped in reactive function to respond to category/pagination changes - () => { - const activeCheats = groupedData[ui.activeCategory] || []; - const visibleCheats = activeCheats.slice(0, pagination.limit); - const hasMore = activeCheats.length > pagination.limit; - return div( - { class: "tab-content" }, - visibleCheats.map((cheat) => CheatItem(cheat)), - hasMore - ? button( - { class: "load-more-btn", onclick: () => (pagination.limit += 50) }, - `LOAD MORE (${activeCheats.length - pagination.limit} REMAINING)` - ) - : null - ); - } - ); - } - - // List View (Accordion) with Lazy Loading - return div( - { id: "cheat-buttons", class: "grid-layout" }, - categories.map((cat) => { - return LazyCategory({ - category: cat, - isOpen: ui.shouldOpen, // Force open if searching - cheats: groupedData[cat], - }); - }) - ); - } - ) - ); -}; +export { AtlasCheats as Cheats } from "./AtlasCheats.js"; diff --git a/src/ui/components/views/Config.js b/src/ui/components/views/Config.js index a00b3aa5..f3bee319 100644 --- a/src/ui/components/views/Config.js +++ b/src/ui/components/views/Config.js @@ -1,13 +1,21 @@ import van from "../../vendor/van-1.6.0.js"; -import vanX from "../../vendor/van-x-0.6.3.js"; import store from "../../state/store.js"; +import { VIEWS } from "../../state/constants.js"; import { Loader } from "../Loader.js"; import { EmptyState } from "../EmptyState.js"; import { ConfigNode } from "../config/ConfigNode.js"; import { StartupCheats, AddCheatSearchBar } from "../config/StartupCheats.js"; import { SearchBar } from "../SearchBar.js"; import { Icons } from "../../assets/icons.js"; -import { withTooltip } from "../Tooltip.js"; +import { registerWorkspaceSaveHandler } from "../WorkspaceContext.js"; +import { ConfigActions } from "./config/ConfigActions.js"; +import { + buildConfigPathTemplate, + configDraftReady, + getConfigDraft, + getConfigPathData, + saveConfigDraft, +} from "./config/configDraft.js"; const { div, button, select, option, label, span } = van.tags; @@ -16,20 +24,10 @@ export const Config = () => { const categoryFilter = van.state("all"); const configSearchTerm = van.state(""); const isAddingCheat = van.state(false); - const draftReady = van.state(false); - - // Draft will be a vanX.reactive object, but we store it in a regular variable to avoid reactivity cascade - let draft = null; let addCheatFn = null; - if (!store.app.config) store.loadConfig(); - - van.derive(() => { - if (store.app.config && !draft) { - draft = vanX.reactive(JSON.parse(JSON.stringify(store.app.config))); - draftReady.val = true; - } - }); + getConfigDraft(); + registerWorkspaceSaveHandler(VIEWS.CONFIG.id, () => saveConfigDraft("disk")); // Handle forced config path navigation from Cheats tab van.derive(() => { @@ -67,15 +65,6 @@ export const Config = () => { store.clearForcedConfigPath(); }; - const save = (isPersistent) => { - if (!draft) return; - - const toSave = JSON.parse(JSON.stringify(draft)); - delete toSave.defaultConfig; - - store.saveConfig(toSave, isPersistent); - }; - const handleAddCheat = (val) => { if (addCheatFn) { addCheatFn(val); @@ -83,46 +72,8 @@ export const Config = () => { } }; - /** - * Wraps only the first path level, keeping reactive references intact for edits. - * @param {object} root - Reactive config object - * @param {string[]} pathParts - Path segments - * @returns {object} - */ - const getForcedPathData = (root, pathParts) => { - if (!pathParts?.length || !root) return root; - const first = pathParts[0]; - return first in root ? { [first]: root[first] } : {}; - }; - - /** - * Builds a filtered template with only the specified path for display. - * @param {object} root - Template object - * @param {string[]} pathParts - Path segments (e.g., ["w1", "owl"]) - * @returns {object} Filtered structure (e.g., { w1: { owl: {...} } }) - */ - const buildForcedPathTemplate = (root, pathParts) => { - if (!pathParts?.length || !root) return root; - - let current = root; - const result = {}; - let node = result; - - for (let i = 0; i < pathParts.length; i++) { - const part = pathParts[i]; - if (!(part in current)) return {}; - - const isLast = i === pathParts.length - 1; - node[part] = isLast ? current[part] : {}; - node = node[part]; - current = current[part]; - } - - return result; - }; - const buildContent = () => { - const config = draft; + const config = getConfigDraft(); const startupCheatsResult = StartupCheats(config.startupCheats); addCheatFn = startupCheatsResult.addItem; @@ -130,43 +81,55 @@ export const Config = () => { const root = config.cheatConfig || {}; const rootTemplate = store.app.config.cheatConfig || {}; - const cheatConfigNode = div({ id: "cheatconfig-options" }, () => { + const cheatConfigNode = div({ id: "cheatconfig-options" }); + let renderRequest = 0; + + van.derive(() => { const forcedPath = store.app.configForcedPath; const filter = categoryFilter.val; const search = configSearchTerm.val; + const requestedPath = forcedPath?.length ? [...forcedPath] : null; + const request = ++renderRequest; + + queueMicrotask(() => { + if (request !== renderRequest) return; + + let data, template; + + if (requestedPath?.length) { + // Forced path mode: show only the specific config entry + data = getConfigPathData(root, requestedPath); + template = buildConfigPathTemplate(rootTemplate, requestedPath); + } else { + // Normal filtering mode + data = filter === "all" ? root : { [filter]: root[filter] }; + template = filter === "all" ? rootTemplate : { [filter]: rootTemplate[filter] }; + } + + const nodes = ConfigNode({ + data, + path: "cheatConfig", + template, + searchTerm: requestedPath ? "" : search, // Ignore search term when in forced path mode + forceOpen: !!requestedPath, + }); - let data, template; - - if (forcedPath && forcedPath.length > 0) { - // Forced path mode: show only the specific config entry - data = getForcedPathData(root, forcedPath); - template = buildForcedPathTemplate(rootTemplate, forcedPath); - } else { - // Normal filtering mode - data = filter === "all" ? root : { [filter]: root[filter] }; - template = filter === "all" ? rootTemplate : { [filter]: rootTemplate[filter] }; - } + const hasMatches = nodes.some((node) => node !== null); + if ((search || requestedPath) && !hasMatches) { + cheatConfigNode.replaceChildren( + EmptyState({ + icon: Icons.SearchX(), + title: "NO CONFIG FOUND", + subtitle: requestedPath + ? `Config path "${requestedPath.join(" ")}" not found` + : "Try a different search term or category", + }) + ); + return; + } - const nodes = ConfigNode({ - data, - path: "cheatConfig", - template, - searchTerm: forcedPath ? "" : search, // Ignore search term when in forced path mode - forceOpen: !!forcedPath, + cheatConfigNode.replaceChildren(div(nodes)); }); - - const hasMatches = nodes.some((node) => node !== null); - if ((search || forcedPath) && !hasMatches) { - return EmptyState({ - icon: Icons.SearchX(), - title: "NO CONFIG FOUND", - subtitle: forcedPath - ? `Config path "${forcedPath.join(" ")}" not found` - : "Try a different search term or category", - }); - } - - return div(nodes); }); const injectorConfigNode = div( @@ -300,15 +263,31 @@ export const Config = () => { ); }; + const contentHost = div({ style: "display: contents" }, Loader({ text: "LOADING CONFIG" })); + let contentNode = null; + let contentRequest = 0; + + van.derive(() => { + const isReady = configDraftReady.val; + const request = ++contentRequest; + + queueMicrotask(() => { + if (request !== contentRequest) return; + + if (!isReady) { + contentHost.replaceChildren(Loader({ text: "LOADING CONFIG" })); + return; + } + + contentNode ||= buildContent(); + contentHost.replaceChildren(contentNode); + }); + }); + return div( { id: "config-tab", class: "tab-pane config-layout" }, - () => { - if (store.app.isLoading || !draftReady.val) { - return Loader({ text: "LOADING CONFIG" }); - } - return buildContent(); - }, + contentHost, div( { class: "action-bar" }, @@ -336,24 +315,13 @@ export const Config = () => { ? AddCheatSearchBar( handleAddCheat, () => (isAddingCheat.val = false), - draft?.startupCheats || [] + getConfigDraft()?.startupCheats || [] ) : div() ), div({ class: () => `spacer ${activeSubTab.val === "startupcheats" && isAddingCheat.val ? "hidden" : ""}` }), - - withTooltip( - button( - { id: "update-config-button", class: "btn-secondary", onclick: () => save(false) }, - "APPLY (RAM)" - ), - "Apply to session only (lost on restart)" - ), - withTooltip( - button({ id: "save-config-button", class: "btn-primary", onclick: () => save(true) }, "SAVE (DISK)"), - "Save permanently to config file" - ) + ConfigActions({ withIds: true }) ) ); }; diff --git a/src/ui/components/views/DevTools.js b/src/ui/components/views/DevTools.js index f3116359..0ba15641 100644 --- a/src/ui/components/views/DevTools.js +++ b/src/ui/components/views/DevTools.js @@ -48,8 +48,9 @@ export const DevTools = () => { const renderEmbeddedView = () => div( - { class: "danger-zone-header" }, - div({ class: "devtools-popout-title" }, "⚠ DEVTOOLS POP-OUT"), + { class: "devtools-popout-card", role: "status" }, + div({ class: "devtools-popout-kicker" }, "EMBEDDED GAME VIEW"), + div({ class: "devtools-popout-title" }, "ChromeDebug opens separately"), div("Embedded DevTools is disabled inside the game UI to prevent crashes"), div("Use the pop-out window for full DevTools access"), @@ -57,6 +58,7 @@ export const DevTools = () => { { class: "devtools-actions" }, button( { + type: "button", class: "btn-primary", onclick: openWebUi, }, @@ -64,6 +66,7 @@ export const DevTools = () => { ), button( { + type: "button", class: "btn-primary", onclick: openDevTools, }, @@ -71,7 +74,7 @@ export const DevTools = () => { ) ), - () => (error.val ? div({ class: "devtools-error" }, error.val) : null) + () => (error.val ? div({ class: "devtools-error", role: "alert" }, error.val) : null) ); const renderContent = () => { @@ -81,21 +84,25 @@ export const DevTools = () => { if (error.val) { return div( - { id: "devtools-message", class: "is-error" }, + { id: "devtools-message", class: "is-error", role: "alert" }, `Failed to load DevTools: ${error.val}` ); } if (!url.val) { - return div({ id: "devtools-message" }, "ESTABLISHING UPLINK"); + return div({ id: "devtools-message", role: "status", "aria-live": "polite" }, "Connecting to ChromeDebug"); } return iframe({ id: "devtools-iframe", src: url.val, + title: "Chrome DevTools", }); }; - return div({ id: "devtools-tab", class: "tab-pane" }, div({ class: "terminal-wrapper" }, renderContent)); + return div( + { id: "devtools-tab", class: "tab-pane devtools-workspace" }, + div({ class: "terminal-wrapper" }, renderContent) + ); }; diff --git a/src/ui/components/views/Search.js b/src/ui/components/views/Search.js index 3f3a859c..667d8820 100644 --- a/src/ui/components/views/Search.js +++ b/src/ui/components/views/Search.js @@ -2,7 +2,6 @@ import van from "../../vendor/van-1.6.0.js"; import vanX from "../../vendor/van-x-0.6.3.js"; import store from "../../state/store.js"; import { detectQueryType } from "../../utils/index.js"; -import { FAVORITE_KEYS } from "../../state/constants.js"; import { NEW_SCAN_TYPES, NEXT_SCAN_TYPES, @@ -28,8 +27,6 @@ import { } from "./search/valueUtils.js"; import { uniqueStrings, - loadLocalFavoriteKeys, - saveLocalFavoriteKeys, normalizeSavedEntry, loadSearchWorkspace, buildSearchWorkspace, @@ -38,21 +35,18 @@ import { normalizeFilterText, matchesEntryFilter, } from "./search/workspaceUtils.js"; -import { KeysSection, SearchInputSection, ResultsSection, SavedResultsSection } from "./search/sections.js"; +import { KeysSection, SearchInputSection, ResultsSection, SearchInspector } from "./search/sections.js"; -const { div } = van.tags; +const { div, button, span } = van.tags; export const Search = () => { const restoredWorkspace = loadSearchWorkspace() || {}; - // loadLocalFavoriteKeys returns null only when the user has never set - // favorites; fall back to the curated defaults in that case, but honor a - // deliberately emptied list. - const localFavoriteKeys = loadLocalFavoriteKeys(); + const inspectorOverlayQuery = window.matchMedia("(max-width: 1279px)"); + const keysOverlayQuery = window.matchMedia("(max-width: 1023px)"); const initialSearchQuery = ""; const ui = vanX.reactive({ allKeys: [], - favoriteKeys: uniqueStrings(localFavoriteKeys ?? FAVORITE_KEYS), selectedKeys: uniqueStrings(restoredWorkspace.selectedKeys), searchQuery: initialSearchQuery, searchQuery2: "", @@ -70,11 +64,10 @@ export const Search = () => { results: [], displayLimit: 50, error: null, - allKeysExpanded: false, allKeysFilter: "", scopePaths: [], lastSearchMode: "new", - edit: { path: null, draft: "", type: "" }, + edit: { path: null, draft: "", type: "", surface: "row" }, isSettingValue: false, hasSearched: false, savedResults: Array.isArray(restoredWorkspace.savedResults) @@ -82,13 +75,34 @@ export const Search = () => { : [], savedEdit: { path: null, draft: "", type: "" }, isRefreshingSavedResults: false, + selectedResultPath: null, + inspectorTab: "saved", + inspectorOpen: false, + keysOpen: false, + inspectorOverlay: inspectorOverlayQuery.matches, + keysOverlay: keysOverlayQuery.matches, }); - const getValidFavorites = () => uniqueStrings(ui.favoriteKeys).filter((k) => ui.allKeys.includes(k)); + inspectorOverlayQuery.addEventListener("change", (event) => { + const focusWasInInspector = document.activeElement?.closest("#search-inspector"); + ui.inspectorOverlay = event.matches; + ui.inspectorOpen = false; + if (event.matches && focusWasInInspector) { + setTimeout(() => document.querySelector("#search-tab .search-inspector-toggle")?.focus(), 0); + } + }); + + keysOverlayQuery.addEventListener("change", (event) => { + const focusWasInKeys = document.activeElement?.closest("#search-keys-panel"); + ui.keysOverlay = event.matches; + ui.keysOpen = false; + if (event.matches && focusWasInKeys) { + setTimeout(() => document.querySelector("#search-tab .search-keys-toggle")?.focus(), 0); + } + }); - const getOtherKeys = () => { - const favSet = new Set(getValidFavorites()); - let keys = ui.allKeys.filter((k) => !favSet.has(k)); + const getFilteredKeys = () => { + let keys = ui.allKeys; if (ui.allKeysFilter) { const filter = ui.allKeysFilter.toLowerCase(); keys = keys.filter((k) => k.toLowerCase().includes(filter)); @@ -211,10 +225,6 @@ export const Search = () => { saveSearchWorkspace(buildSearchWorkspace(ui)); }); - van.derive(() => { - saveLocalFavoriteKeys(ui.favoriteKeys); - }); - van.derive(() => { ui.savedResults; store.data.monitorValues; @@ -236,13 +246,95 @@ export const Search = () => { const getFilteredResults = () => getFilteredList(ui.results, ui.resultsFilterApplied, filterCache.results); const getFilteredSavedResults = () => getFilteredList(ui.savedResults, ui.savedFilterApplied, filterCache.saved); + let inspectorTrigger = null; + let keysTrigger = null; + + const trapOverlayFocus = (panel, event, isOverlay) => { + if (event.key !== "Tab" || !isOverlay) return; + const focusable = [ + ...panel.querySelectorAll( + 'button:not([disabled]), input:not([disabled]), select:not([disabled]), summary, [tabindex="0"]' + ), + ].filter((node) => node.offsetParent !== null); + const first = focusable[0]; + const last = focusable[focusable.length - 1]; + if (!first || !last) return; + + if (event.shiftKey && document.activeElement === first) { + event.preventDefault(); + last.focus(); + } else if (!event.shiftKey && document.activeElement === last) { + event.preventDefault(); + first.focus(); + } + }; + + const closeInspector = () => { + if (!ui.inspectorOpen) return; + if (document.activeElement?.closest("#search-inspector")) document.activeElement.blur(); + ui.inspectorOpen = false; + setTimeout(() => inspectorTrigger?.focus(), 0); + }; + + const closeKeysPane = () => { + if (!ui.keysOpen) return; + if (document.activeElement?.closest("#search-keys-panel")) document.activeElement.blur(); + ui.keysOpen = false; + setTimeout(() => keysTrigger?.focus(), 0); + }; const handlers = { - getValidFavorites, - getOtherKeys, + getFilteredKeys, areAllSelected, getFilteredResults, getFilteredSavedResults, + getSelectedResult: () => ui.results.find((result) => result.path === ui.selectedResultPath) || null, + selectResult: (result, event) => { + if (ui.edit.path && ui.edit.path !== result.path) handlers.cancelEdit(); + if (ui.savedEdit.path) handlers.cancelSavedEdit(); + ui.selectedResultPath = result.path; + ui.inspectorTab = "selected"; + ui.inspectorOpen = ui.inspectorOverlay; + inspectorTrigger = event?.currentTarget || document.activeElement; + }, + openSavedInspector: (event) => { + ui.inspectorTab = "saved"; + ui.inspectorOpen = true; + inspectorTrigger = event?.currentTarget || document.activeElement; + }, + closeInspector, + toggleInspector: (event) => { + if (ui.inspectorOpen) { + closeInspector(); + return; + } + ui.inspectorOpen = true; + inspectorTrigger = event?.currentTarget || document.activeElement; + }, + openKeysPane: (event) => { + ui.keysOpen = true; + keysTrigger = event?.currentTarget || document.activeElement; + setTimeout(() => document.querySelector("#search-keys-panel .search-keys-close")?.focus(), 0); + }, + closeKeysPane, + handleInspectorKeydown: (event) => { + if (!ui.inspectorOpen) return; + if (event.key === "Escape") { + event.preventDefault(); + closeInspector(); + return; + } + trapOverlayFocus(event.currentTarget, event, ui.inspectorOverlay); + }, + handleKeysPanelKeydown: (event) => { + if (!ui.keysOpen) return; + if (event.key === "Escape") { + event.preventDefault(); + closeKeysPane(); + return; + } + trapOverlayFocus(event.currentTarget, event, ui.keysOverlay); + }, handleKeyChange: (keyName, isChecked) => updateSelection([keyName], isChecked), @@ -256,18 +348,6 @@ export const Search = () => { ui.selectedKeys = []; }, - isFavoriteKey: (keyName) => ui.favoriteKeys.includes(keyName), - - toggleFavoriteKey: (keyName) => { - const hasKey = ui.favoriteKeys.includes(keyName); - if (hasKey) { - ui.favoriteKeys = ui.favoriteKeys.filter((key) => key !== keyName); - return; - } - - ui.favoriteKeys = [...ui.favoriteKeys, keyName]; - }, - handleResultsFilterInput: (e) => { const value = e.target.value; @@ -323,6 +403,8 @@ export const Search = () => { ui.displayLimit = 50; ui.error = null; ui.hasSearched = false; + ui.selectedResultPath = null; + ui.inspectorTab = "saved"; handlers.cancelEdit(); handlers.cancelSavedEdit(); store.notify("Scan reset. Ready for first scan.", "success"); @@ -511,12 +593,23 @@ export const Search = () => { ui.edit.path = result.path; ui.edit.draft = seedEditValue(result); ui.edit.type = expectedUiType(result); + ui.edit.surface = "row"; + }, + + startInspectorEdit: (result) => { + if (ui.isSettingValue) return; + handlers.cancelSavedEdit(); + ui.edit.path = result.path; + ui.edit.draft = seedEditValue(result); + ui.edit.type = expectedUiType(result); + ui.edit.surface = "inspector"; }, cancelEdit: () => { ui.edit.path = null; ui.edit.draft = ""; ui.edit.type = ""; + ui.edit.surface = "row"; }, saveEdit: () => commitEdit(ui.edit, handlers.cancelEdit), @@ -634,6 +727,10 @@ export const Search = () => { : baseData.results || []; ui.results = filteredResults; + if (!filteredResults.some((result) => result.path === ui.selectedResultPath)) { + ui.selectedResultPath = null; + ui.inspectorTab = "saved"; + } ui.scopePaths = filteredResults.map((r) => r.path); ui.previousSnapshot = buildSnapshotFromResults(filteredResults); ui.scanSessionActive = true; @@ -661,8 +758,7 @@ export const Search = () => { try { const allKeys = await store.fetchGgaKeys(); ui.allKeys = allKeys; - const validFavorites = getValidFavorites(); - ui.selectedKeys = pickInitialSelectedKeys(allKeys, restoredWorkspace.selectedKeys, validFavorites); + ui.selectedKeys = pickInitialSelectedKeys(allKeys, restoredWorkspace.selectedKeys); } catch (err) { ui.error = err.message || "Failed to load GGA keys"; } finally { @@ -675,12 +771,46 @@ export const Search = () => { div( { class: "search-layout" }, KeysSection({ ui, handlers }), + button({ + type: "button", + class: () => `search-keys-backdrop ${ui.keysOpen ? "is-open" : ""}`, + onclick: handlers.closeKeysPane, + tabindex: () => (ui.keysOpen ? 0 : -1), + "aria-label": "Close key navigation", + }), div( { class: "search-right-column" }, + div( + { class: "search-pane-toolbar" }, + button( + { + type: "button", + class: "search-keys-toggle", + onclick: handlers.openKeysPane, + "aria-expanded": () => String(ui.keysOpen), + "aria-controls": "search-keys-panel", + }, + "Keys", + span({ class: "search-toolbar-count" }, () => ui.selectedKeys.length) + ), + button( + { + type: "button", + class: "search-inspector-toggle", + onclick: handlers.toggleInspector, + "aria-expanded": () => String(ui.inspectorOpen), + "aria-controls": "search-inspector", + }, + () => (ui.inspectorTab === "saved" ? "Saved" : "Inspector"), + span({ class: "search-toolbar-count" }, () => + ui.inspectorTab === "saved" ? ui.savedResults.length : ui.selectedResultPath ? 1 : 0 + ) + ) + ), SearchInputSection({ ui, handlers }), - ResultsSection({ ui, handlers }), - SavedResultsSection({ ui, handlers }) - ) + ResultsSection({ ui, handlers }) + ), + SearchInspector({ ui, handlers }) ) ); }; diff --git a/src/ui/components/views/account/tabShared.js b/src/ui/components/views/account/tabShared.js index 0bd96848..18bf2f02 100644 --- a/src/ui/components/views/account/tabShared.js +++ b/src/ui/components/views/account/tabShared.js @@ -11,6 +11,21 @@ export const createComingSoonPlaceholder = (label) => p({ class: "world-sub-placeholder__label" }, `${label} — COMING SOON`) ); +/** + * Render a shared account-workspace tab navigation row. + * @param {object} props - Navigation options + * @param {object[]} props.tabs - Tabs to render + * @param {object} props.activeId - VanJS state containing the active tab ID + * @param {string} props.navClass - Additional navigation class + * @param {string|Function} props.buttonClass - Additional button class or class resolver + * @param {string} [props.activeClass] - Class applied to the active tab + * @param {string|null} [props.stubClass] - Optional class applied to stub tabs + * @param {Function} [props.isStub] - Stub-tab predicate + * @param {Function} [props.renderLabel] - Tab-label renderer + * @param {Function|null} [props.getButtonProps] - Additional button-props resolver + * @param {Function|null} [props.onSelect] - Callback invoked after a tab is selected + * @returns {Element} Account tab navigation element + */ export const renderTabNav = ({ tabs, activeId, @@ -21,6 +36,7 @@ export const renderTabNav = ({ isStub = () => false, renderLabel = (tab) => tab.label, getButtonProps = null, + onSelect = null, }) => div( { class: joinClasses("account-sub-nav", navClass) }, @@ -36,7 +52,11 @@ export const renderTabNav = ({ activeId.val === tab.id && activeClass, stubClass && isStub(tab) && stubClass ), - onclick: () => (activeId.val = tab.id), + "aria-current": () => (activeId.val === tab.id ? "page" : "false"), + onclick: () => { + activeId.val = tab.id; + if (typeof onSelect === "function") onSelect(tab); + }, }, renderLabel(tab) ) diff --git a/src/ui/components/views/account/w2/Pay2WinTab.js b/src/ui/components/views/account/w2/Pay2WinTab.js index 68e87fee..341b1be8 100644 --- a/src/ui/components/views/account/w2/Pay2WinTab.js +++ b/src/ui/components/views/account/w2/Pay2WinTab.js @@ -76,6 +76,9 @@ const P2W_SECTION_DEFS = [ title: "PLAYER BOOSTS", note: "P2W player alchemy boosts", bucket: 3, + // CauldronLvMAX reads PixelHelperActor for these caps. That actor is not + // available in every game scene, unlike the stored P2W values. + maxViaFormula: false, rowLabels: ["ALCH SPD", "EXTRA EXP"], }, ]; @@ -206,6 +209,7 @@ export const Pay2WinTab = () => { for (let index = 0; index < section.rowLabels.length; index++) { section.valueStates[index].val = Number(bucketValues[index] ?? 0); + if (section.maxViaFormula === false) continue; maxTargets.push({ args: [section.bucket, index, "0"], apply: (value) => { diff --git a/src/ui/components/views/account/w3/EquinoxTab.js b/src/ui/components/views/account/w3/EquinoxTab.js index 097a38c4..8b943d31 100644 --- a/src/ui/components/views/account/w3/EquinoxTab.js +++ b/src/ui/components/views/account/w3/EquinoxTab.js @@ -276,7 +276,9 @@ export const EquinoxTab = () => { gga("Dream"), gga("WeeklyBoss.h"), readComputed("dream", "BarFillReq", [0]), - readComputed("dream", "BarFillRate", [0]), + // BarFillRate reads an actor that is not available in every game scene. + // The rate is informational, so a missing value must not block the editor. + readComputed("dream", "BarFillRate", [0]).catch(() => 0), readComputed("dream", "UpgUnlocked", [0]), ]); diff --git a/src/ui/components/views/config/ConfigActions.js b/src/ui/components/views/config/ConfigActions.js new file mode 100644 index 00000000..e6011d13 --- /dev/null +++ b/src/ui/components/views/config/ConfigActions.js @@ -0,0 +1,52 @@ +import van from "../../../vendor/van-1.6.0.js"; +import { withTooltip } from "../../Tooltip.js"; +import { configDraftStatus, saveConfigDraft } from "./configDraft.js"; + +const { div, button, span } = van.tags; + +/** + * Explicit live-cheat/disk-draft controls shared by both Config surfaces. + * @param {object} [props] + * @param {boolean} [props.compact] + * @param {boolean} [props.withIds] + * @returns {Element} + */ +export const ConfigActions = ({ compact = false, withIds = false } = {}) => + div( + { class: () => `atlas-config-actions ${compact ? "is-compact" : ""}` }, + div( + { class: "atlas-config-dirty-state", "aria-live": "polite" }, + span({ class: () => `atlas-config-status-chip ${configDraftStatus.ramDirty ? "is-dirty" : ""}` }, () => + configDraftStatus.ramDirty ? "Not applied to session" : "Session current" + ), + span({ class: () => `atlas-config-status-chip ${configDraftStatus.diskDirty ? "is-dirty" : ""}` }, () => + configDraftStatus.diskDirty ? "Not saved to disk" : "Disk current" + ) + ), + withTooltip( + button( + { + ...(withIds ? { id: "update-config-button" } : {}), + type: "button", + class: "btn-secondary", + disabled: () => !configDraftStatus.ramDirty || Boolean(configDraftStatus.savingTarget), + onclick: () => saveConfigDraft("ram"), + }, + () => (configDraftStatus.savingTarget === "ram" ? "APPLYING..." : "APPLY ALL (RAM)") + ), + "Apply pending Cheat Config changes to this session. Startup and Injector changes require a disk save." + ), + withTooltip( + button( + { + ...(withIds ? { id: "save-config-button" } : {}), + type: "button", + class: "btn-primary", + disabled: () => !configDraftStatus.diskDirty || Boolean(configDraftStatus.savingTarget), + onclick: () => saveConfigDraft("disk"), + }, + () => (configDraftStatus.savingTarget === "disk" ? "SAVING..." : "SAVE ALL (DISK)") + ), + "Save the complete pending draft permanently to config.custom.js" + ) + ); diff --git a/src/ui/components/views/config/configDraft.js b/src/ui/components/views/config/configDraft.js new file mode 100644 index 00000000..53436d22 --- /dev/null +++ b/src/ui/components/views/config/configDraft.js @@ -0,0 +1,187 @@ +import van from "../../../vendor/van-1.6.0.js"; +import vanX from "../../../vendor/van-x-0.6.3.js"; +import store from "../../../state/store.js"; +import * as API from "../../../services/api.js"; + +export const configDraftReady = van.state(false); +export const configDraftStatus = vanX.reactive({ + ramDirty: false, + diskDirty: false, + savingTarget: null, +}); + +let draft = null; +let ramSnapshot = null; +let diskSnapshot = null; + +const clone = (value) => JSON.parse(JSON.stringify(value)); + +const setDraftStatus = (ramDirty, diskDirty) => { + if (configDraftStatus.ramDirty !== ramDirty) configDraftStatus.ramDirty = ramDirty; + if (configDraftStatus.diskDirty !== diskDirty) configDraftStatus.diskDirty = diskDirty; + if (store.app.configDirty !== diskDirty) store.setConfigDirty(diskDirty); +}; + +const getPayload = (source = draft) => { + if (!source) return null; + + const payload = clone(source); + delete payload.defaultConfig; + delete payload.configBaselines; + return payload; +}; + +const snapshot = (source = draft) => { + const payload = getPayload(source); + return payload ? JSON.stringify(payload) : null; +}; + +const ramSnapshotFor = (source = draft) => { + const payload = getPayload(source); + return payload ? JSON.stringify(payload.cheatConfig || {}) : null; +}; + +const refreshDraftStatus = () => { + if (!draft) { + setDraftStatus(false, false); + return; + } + + const currentRamSnapshot = ramSnapshotFor(); + const currentDiskSnapshot = snapshot(); + setDraftStatus(currentRamSnapshot !== ramSnapshot, currentDiskSnapshot !== diskSnapshot); +}; + +const initializeDraft = (config) => { + const draftSource = clone(config); + const baselines = draftSource.configBaselines; + delete draftSource.configBaselines; + + draft = vanX.reactive(draftSource); + ramSnapshot = baselines?.ram ? ramSnapshotFor(baselines.ram) : ramSnapshotFor(); + diskSnapshot = baselines?.disk ? snapshot(baselines.disk) : snapshot(); + configDraftReady.val = true; + refreshDraftStatus(); +}; + +van.derive(() => { + const config = store.app.config; + if (config && !draft) initializeDraft(config); +}); + +van.derive(() => { + configDraftReady.val; + refreshDraftStatus(); +}); + +if (typeof window !== "undefined") { + window.addEventListener("beforeunload", (event) => { + if (!configDraftStatus.diskDirty) return; + + event.preventDefault(); + event.returnValue = ""; + }); +} + +/** + * Ensure the production config is loading and return the shared draft when ready. + * @returns {object|null} + */ +export const getConfigDraft = () => { + if (!store.app.config && !store.app.isLoading) store.loadConfig(); + return draft; +}; + +/** + * Save the complete shared draft to one explicit destination. + * @param {"ram"|"disk"} target + * @returns {Promise} + */ +export const saveConfigDraft = async (target) => { + if (!draft || configDraftStatus.savingTarget) return false; + + const payload = getPayload(); + configDraftStatus.savingTarget = target; + + try { + const result = target === "disk" ? await API.saveConfigFile(payload) : await API.updateSessionConfig(payload); + const savedSnapshot = JSON.stringify(payload); + + if (target === "disk") { + diskSnapshot = savedSnapshot; + } else if (result?.appliedToGame === true) { + // The endpoint applies only cheatConfig to the live game. Advance + // that baseline from the exact acknowledged payload, while the + // full draft remains independently dirty until saved to disk. + ramSnapshot = ramSnapshotFor(payload); + } else { + refreshDraftStatus(); + store.notify(result?.message || "Configuration was not applied to the game", "error"); + return false; + } + + refreshDraftStatus(); + store.notify(result?.message || (target === "disk" ? "SAVED TO DISK" : "RAM UPDATED")); + return true; + } catch (error) { + store.notify(error.message || `Failed to save config to ${target}`, "error"); + return false; + } finally { + configDraftStatus.savingTarget = null; + } +}; + +/** + * Restore the shared draft to the last version saved on disk. + * Reactive references are retained so mounted editors keep their DOM identity. + * @returns {boolean} + */ +export const discardConfigDraft = () => { + if (!draft || !diskSnapshot || configDraftStatus.savingTarget) return false; + + const replacement = JSON.parse(diskSnapshot); + if ("defaultConfig" in draft) replacement.defaultConfig = clone(draft.defaultConfig); + + vanX.replace(draft, replacement); + refreshDraftStatus(); + return true; +}; + +/** + * Wrap only the first path level while retaining the draft's reactive references. + * ConfigNode then follows the narrow template to the exact requested subtree. + * @param {object} root + * @param {string[]} pathParts + * @returns {object} + */ +export const getConfigPathData = (root, pathParts) => { + if (!pathParts?.length || !root) return root; + const first = pathParts[0]; + return first in root ? { [first]: root[first] } : {}; +}; + +/** + * Build a template containing only one exact nested path. + * @param {object} root + * @param {string[]} pathParts + * @returns {object} + */ +export const buildConfigPathTemplate = (root, pathParts) => { + if (!pathParts?.length || !root) return root; + + let current = root; + const result = {}; + let node = result; + + for (let index = 0; index < pathParts.length; index++) { + const part = pathParts[index]; + if (!(part in current)) return {}; + + const isLast = index === pathParts.length - 1; + node[part] = isLast ? current[part] : {}; + node = node[part]; + current = current[part]; + } + + return result; +}; diff --git a/src/ui/components/views/search/sections.js b/src/ui/components/views/search/sections.js index dae4d2a6..fcee9da3 100644 --- a/src/ui/components/views/search/sections.js +++ b/src/ui/components/views/search/sections.js @@ -21,11 +21,10 @@ import { } from "./valueUtils.js"; import { createStaticRowReconciler } from "../account/accountShared.js"; -const { div, input, button, span, label, details, summary, select, option } = van.tags; +const { div, input, button, span, label, select, option, aside } = van.tags; -const KeyCheckbox = ({ keyName, selectedKeys, onChange, isFavorite, onToggleFavorite }) => { +const KeyCheckbox = ({ keyName, selectedKeys, onChange }) => { const isChecked = () => selectedKeys.includes(keyName); - const favorite = () => (typeof isFavorite === "function" ? isFavorite(keyName) : false); return label( { class: () => `key-checkbox ${isChecked() ? "checked" : ""}`, title: keyName }, @@ -34,26 +33,14 @@ const KeyCheckbox = ({ keyName, selectedKeys, onChange, isFavorite, onToggleFavo checked: isChecked, onchange: (e) => onChange(keyName, e.target.checked), }), - span({ class: "key-checkbox-label" }, keyName), - button( - { - class: () => `key-favorite-btn ${favorite() ? "active" : ""}`, - title: () => (favorite() ? "Remove from favorites" : "Add to favorites"), - onclick: (e) => { - e.preventDefault(); - e.stopPropagation(); - onToggleFavorite(keyName); - }, - }, - Icons.Star() - ) + span({ class: "key-checkbox-label" }, keyName) ); }; const ResultItem = ({ result, ui, handlers }) => { const copyFeedback = van.state(null); - const isEditing = () => ui.edit.path === result.path; + const isEditing = () => ui.edit.path === result.path && ui.edit.surface !== "inspector"; const isInSavedList = () => ui.savedResults.some((entry) => entry.path === result.path); const handleCopy = (e) => { @@ -95,7 +82,19 @@ const ResultItem = ({ result, ui, handlers }) => { return div( { - class: () => "search-result-item " + (copyFeedback.val === "success" ? "copied" : ""), + class: () => + "search-result-item " + + (ui.selectedResultPath === result.path ? "is-selected " : "") + + (copyFeedback.val === "success" ? "copied" : ""), + onclick: (event) => handlers.selectResult(result, event), + onkeydown: (event) => { + if (event.target !== event.currentTarget) return; + if (event.key !== "Enter" && event.key !== " ") return; + event.preventDefault(); + handlers.selectResult(result, event); + }, + tabindex: 0, + "aria-current": () => (ui.selectedResultPath === result.path ? "true" : "false"), }, span({ class: "result-path" }, result.path), span({ class: "result-equals" }, "="), @@ -194,7 +193,15 @@ const SearchButton = ({ export const KeysSection = ({ ui, handlers }) => div( - { class: "search-keys-section" }, + { + id: "search-keys-panel", + class: () => `search-keys-section ${ui.keysOpen ? "is-open" : ""}`, + role: () => (ui.keysOverlay ? "dialog" : "navigation"), + "aria-modal": () => String(ui.keysOverlay && ui.keysOpen), + "aria-hidden": () => String(ui.keysOverlay && !ui.keysOpen), + "aria-label": "Search keys", + onkeydown: handlers.handleKeysPanelKeydown, + }, div( { class: "section-header" }, span({ class: "section-title" }, "SEARCH IN KEYS"), @@ -208,78 +215,53 @@ export const KeysSection = ({ ui, handlers }) => }, () => (handlers.areAllSelected() ? "NONE" : "ALL") ), - button( - { - class: "btn-secondary btn-small", - onclick: () => handlers.selectKeys(handlers.getValidFavorites()), - title: "Select all favorites", - }, - "FAV" - ), button( { class: "btn-secondary btn-small", onclick: handlers.clearSelection, title: "Clear selection" }, "CLEAR" + ), + button( + { + class: "search-keys-close", + onclick: handlers.closeKeysPane, + title: "Close key navigation", + "aria-label": "Close key navigation", + }, + Icons.X() ) ) ), div( { class: "keys-content scroll-container" }, - div({ class: "keys-group" }, div({ class: "keys-group-header" }, "* FAVORITES"), () => { - if (ui.isLoading) { - return div({ class: "keys-loading" }, "Loading"); - } - const validFavorites = handlers.getValidFavorites(); - if (validFavorites.length === 0) { - return div({ class: "keys-loading" }, "No keys available"); - } - return div( - { class: "keys-grid" }, - ...validFavorites.map((key) => - KeyCheckbox({ - keyName: key, - selectedKeys: ui.selectedKeys, - onChange: handlers.handleKeyChange, - isFavorite: handlers.isFavoriteKey, - onToggleFavorite: handlers.toggleFavoriteKey, - }) - ) - ); - }), - details( - { - class: "keys-group expandable", - open: ui.allKeysExpanded, - ontoggle: (e) => (ui.allKeysExpanded = e.target.open), - }, - summary({ class: "keys-group-header" }, () => `ALL KEYS (${handlers.getOtherKeys().length} MORE)`), + div( + { class: "keys-group" }, + div({ class: "keys-group-header" }, () => `ALL KEYS (${handlers.getFilteredKeys().length})`), div( - { class: "keys-expand-content" }, - div( - { class: "keys-filter" }, - input({ - type: "text", - class: "keys-filter-input", - placeholder: "FILTER KEYS", - value: () => ui.allKeysFilter, - oninput: (e) => (ui.allKeysFilter = e.target.value), - }) - ), - () => { - const otherKeys = handlers.getOtherKeys(); - return div( - { class: "keys-grid" }, - ...otherKeys.map((key) => - KeyCheckbox({ - keyName: key, - selectedKeys: ui.selectedKeys, - onChange: handlers.handleKeyChange, - isFavorite: handlers.isFavoriteKey, - onToggleFavorite: handlers.toggleFavoriteKey, - }) - ) - ); - } - ) + { class: "keys-filter" }, + input({ + type: "text", + class: "keys-filter-input", + placeholder: "FILTER KEYS", + value: () => ui.allKeysFilter, + oninput: (e) => (ui.allKeysFilter = e.target.value), + }) + ), + () => { + if (ui.isLoading) return div({ class: "keys-loading" }, "Loading"); + + const keys = handlers.getFilteredKeys(); + if (keys.length === 0) return div({ class: "keys-loading" }, "No keys match this filter"); + + return div( + { class: "keys-grid" }, + ...keys.map((key) => + KeyCheckbox({ + keyName: key, + selectedKeys: ui.selectedKeys, + onChange: handlers.handleKeyChange, + }) + ) + ); + } ) ), div({ class: "keys-footer" }, () => @@ -336,7 +318,7 @@ export const SearchInputSection = ({ ui, handlers }) => showPrimaryInput ? input({ type: "text", - class: "search-query-input", + class: "search-query-input global-search-input", placeholder: getScanTypePlaceholder(activeScanType), value: () => ui.searchQuery, oninput: handlers.handleQueryInput, @@ -863,3 +845,212 @@ export const SavedResultsSection = ({ ui, handlers }) => { ) ); }; + +const SelectedResultSection = ({ result, ui, handlers }) => { + const copyFeedback = van.state(false); + const savedEntry = () => ui.savedResults.find((entry) => entry.path === result.path) || null; + const isEditing = () => ui.edit.path === result.path && ui.edit.surface === "inspector"; + const monitorEntry = () => + resolveMonitorEntry(monitorPathForSearchResult(result.path), store.data.monitorValues || {}).entry; + const monitorHistory = () => (savedEntry()?.monitorEnabled === false ? [] : getMonitorHistory(monitorEntry())); + + const copyPath = () => { + const success = copyToClipboard("bEngine.gameAttributes.h." + result.path); + copyFeedback.val = success; + store.notify(success ? "Path copied to clipboard" : "Failed to copy", success ? "success" : "error"); + if (success) setTimeout(() => (copyFeedback.val = false), 1500); + }; + + const toggleSavedMonitor = () => { + const entry = savedEntry(); + if (!entry) { + handlers.addToSavedResults(result); + return; + } + handlers.toggleSavedMonitor(result.path, entry.monitorEnabled === false); + }; + + return div( + { class: "search-selected-result" }, + div( + { class: "selected-result-heading" }, + span({ class: "selected-result-kicker" }, "GGA PATH"), + span({ class: "selected-result-path" }, result.path) + ), + div( + { class: "selected-result-meta" }, + div(span("Type"), span({ class: `type-${result.type}` }, result.type || "unknown")), + div( + span("Saved"), + span(() => (savedEntry() ? "Yes" : "No")) + ), + div( + span("Watcher"), + span(() => { + const entry = savedEntry(); + if (!entry) return "Not saved"; + if (entry.monitorEnabled === false) return "Paused"; + return monitorEntry()?.error ? "Error" : monitorEntry() ? "Live" : "Pending"; + }) + ) + ), + div({ class: "selected-result-value" }, span({ class: "selected-result-label" }, "VALUE"), () => + isEditing() + ? input({ + class: "result-edit-input selected-result-edit-input", + value: () => ui.edit.draft, + oninput: (event) => (ui.edit.draft = event.target.value), + onkeydown: (event) => { + event.stopPropagation(); + if (event.key === "Enter") handlers.saveEdit(); + if (event.key === "Escape") handlers.cancelEdit(); + }, + }) + : span({ class: `selected-result-display type-${result.type}` }, result.formattedValue) + ), + div({ class: "selected-result-history" }, () => { + const history = monitorHistory(); + if (history.length === 0) { + return span({ class: "selected-result-history-empty" }, "Save this path to retain a live monitor."); + } + if (canGraph(history)) { + return div( + { class: "selected-result-sparkline" }, + Sparkline({ data: history, width: 280, height: 54 }) + ); + } + return div( + { class: "selected-result-history-values" }, + ...history + .slice(0, 10) + .map((entry) => + span({ title: new Date(entry.ts).toLocaleTimeString() }, formatDisplayValue(entry.value)) + ) + ); + }), + div( + { class: "selected-result-actions" }, + () => + isEditing() + ? div( + { class: "selected-result-edit-actions" }, + button({ class: "btn-primary", onclick: handlers.saveEdit }, "Save value"), + button({ class: "btn-secondary", onclick: handlers.cancelEdit }, "Cancel") + ) + : div( + { class: "selected-result-edit-actions" }, + button( + { class: "btn-primary", onclick: () => handlers.startInspectorEdit(result) }, + Icons.Pencil(), + "Edit value" + ), + button({ class: "btn-secondary", onclick: copyPath }, () => + copyFeedback.val ? "Copied" : "Copy path" + ) + ), + button( + { + class: () => + `btn-secondary selected-monitor-action ${savedEntry() && savedEntry().monitorEnabled !== false ? "active" : ""}`, + onclick: toggleSavedMonitor, + }, + Icons.Eye(), + () => { + const entry = savedEntry(); + if (!entry) return "Save & monitor"; + return entry.monitorEnabled === false ? "Resume monitor" : "Pause monitor"; + } + ) + ) + ); +}; + +export const SearchInspector = ({ ui, handlers }) => { + const savedSection = SavedResultsSection({ ui, handlers }); + const inspector = aside( + { + id: "search-inspector", + class: () => `search-inspector ${ui.inspectorOpen ? "is-open" : ""}`, + role: () => (ui.inspectorOverlay ? "dialog" : "complementary"), + "aria-modal": () => String(ui.inspectorOverlay && ui.inspectorOpen), + "aria-hidden": () => String(ui.inspectorOverlay && !ui.inspectorOpen), + "aria-label": "Search inspector", + onkeydown: handlers.handleInspectorKeydown, + }, + div( + { class: "search-inspector-header" }, + div( + { class: "search-inspector-tabs", role: "tablist", "aria-label": "Search inspector views" }, + button( + { + class: () => `search-inspector-tab ${ui.inspectorTab === "selected" ? "active" : ""}`, + role: "tab", + "aria-selected": () => String(ui.inspectorTab === "selected"), + onclick: () => (ui.inspectorTab = "selected"), + }, + "Selected" + ), + button( + { + class: () => `search-inspector-tab ${ui.inspectorTab === "saved" ? "active" : ""}`, + role: "tab", + "aria-selected": () => String(ui.inspectorTab === "saved"), + onclick: () => (ui.inspectorTab = "saved"), + }, + "Saved", + span({ class: "search-inspector-count" }, () => ui.savedResults.length) + ) + ), + button( + { + class: "search-inspector-close", + onclick: handlers.closeInspector, + "aria-label": "Close search inspector", + title: "Close inspector", + }, + Icons.X() + ) + ), + div( + { + class: () => `search-inspector-panel ${ui.inspectorTab === "selected" ? "active" : ""}`, + role: "tabpanel", + }, + () => { + const selected = handlers.getSelectedResult(); + if (!selected) { + return EmptyState({ + icon: Icons.Search(), + title: "NO RESULT SELECTED", + subtitle: "Select a result to inspect its path, value and monitor state", + }); + } + return SelectedResultSection({ result: selected, ui, handlers }); + } + ), + div( + { + class: () => `search-inspector-panel ${ui.inspectorTab === "saved" ? "active" : ""}`, + role: "tabpanel", + }, + savedSection + ) + ); + + van.derive(() => { + if (!ui.inspectorOverlay || !ui.inspectorOpen) return; + setTimeout(() => inspector.querySelector(".search-inspector-tab.active")?.focus(), 0); + }); + + return div( + { class: "search-inspector-layer" }, + button({ + type: "button", + class: () => `search-inspector-backdrop ${ui.inspectorOpen ? "is-open" : ""}`, + onclick: handlers.closeInspector, + tabindex: () => (ui.inspectorOpen ? 0 : -1), + "aria-label": "Close search inspector", + }), + inspector + ); +}; diff --git a/src/ui/components/views/search/workspaceUtils.js b/src/ui/components/views/search/workspaceUtils.js index f69367e6..ebc1cb14 100644 --- a/src/ui/components/views/search/workspaceUtils.js +++ b/src/ui/components/views/search/workspaceUtils.js @@ -1,6 +1,5 @@ const SEARCH_WORKSPACE_STORAGE_KEY = "searchWorkspace"; const SEARCH_WORKSPACE_VERSION = 2; -const SEARCH_FAVORITE_KEYS_STORAGE_KEY = "searchFavoriteKeys"; const DEFAULT_SELECTED_KEYS_LIMIT = 8; const entryFilterTextCache = new WeakMap(); @@ -9,31 +8,6 @@ export function uniqueStrings(items) { return [...new Set((items || []).filter((item) => typeof item === "string" && item))]; } -/** - * Load stored favorite keys. - * @returns {string[]|null} `null` when never stored (caller applies curated - * defaults); an array — possibly empty — once the user has set favorites. - */ -export function loadLocalFavoriteKeys() { - try { - const raw = localStorage.getItem(SEARCH_FAVORITE_KEYS_STORAGE_KEY); - if (raw === null) return null; - return uniqueStrings(JSON.parse(raw)); - } catch (err) { - console.error("[SearchWorkspace] Failed to load favorite keys:", err); - return null; - } -} - -/** Persist favorite keys (an empty array is a deliberate, preserved state). */ -export function saveLocalFavoriteKeys(keys) { - try { - localStorage.setItem(SEARCH_FAVORITE_KEYS_STORAGE_KEY, JSON.stringify(uniqueStrings(keys))); - } catch (err) { - console.error("[SearchWorkspace] Failed to save favorite keys:", err); - } -} - export function normalizeSavedEntry(entry) { if (!entry || typeof entry !== "object" || typeof entry.path !== "string" || !entry.path) { return null; @@ -117,14 +91,11 @@ export function saveSearchWorkspace(workspace) { } } -export function pickInitialSelectedKeys(allKeys, persistedKeys, favoriteKeys) { +export function pickInitialSelectedKeys(allKeys, persistedKeys) { const available = new Set(allKeys || []); const fromPersisted = uniqueStrings(persistedKeys).filter((key) => available.has(key)); if (fromPersisted.length > 0) return fromPersisted; - const fromFavorites = uniqueStrings(favoriteKeys).filter((key) => available.has(key)); - if (fromFavorites.length > 0) return fromFavorites.slice(0, DEFAULT_SELECTED_KEYS_LIMIT); - return (allKeys || []).slice(0, DEFAULT_SELECTED_KEYS_LIMIT); } diff --git a/src/ui/entry/index.html b/src/ui/entry/index.html index 393f3490..3ad05dce 100644 --- a/src/ui/entry/index.html +++ b/src/ui/entry/index.html @@ -3,12 +3,12 @@ - IDLEON // INJECTOR + Idleon Injector diff --git a/src/ui/entry/style.css b/src/ui/entry/style.css index ac989f02..6ba14012 100644 --- a/src/ui/entry/style.css +++ b/src/ui/entry/style.css @@ -38,3 +38,7 @@ @import url("../styles/function-input.css"); @import url("../styles/empty-state.css"); @import url("../styles/_search.css"); + +/* ATLAS APPLICATION SHELL */ +@import url("../styles/_atlas-shell.css"); +@import url("../styles/_activity-drawer.css"); diff --git a/src/ui/state/constants.js b/src/ui/state/constants.js index be9cd0d0..b542d40c 100644 --- a/src/ui/state/constants.js +++ b/src/ui/state/constants.js @@ -10,26 +10,31 @@ export const VIEWS = { id: "cheats-tab", label: "CHEATS", sidebarLabel: "CHEATS", + atlasLabel: "Cheats", }, ACCOUNT: { id: "options-account-tab", label: "ACCOUNT OPTIONS LIST", sidebarLabel: "ACCOUNT OPTIONS", + atlasLabel: "Account", }, CONFIG: { id: "config-tab", label: "CONFIGURATION", sidebarLabel: "CONFIG", + atlasLabel: "Config", }, SEARCH: { id: "search-tab", label: "GGA SEARCH", sidebarLabel: "SEARCH", + atlasLabel: "Search", }, DEVTOOLS: { id: "devtools-tab", label: "CHROMEDEBUG", sidebarLabel: "CHROMEDEBUG", + atlasLabel: "DevTools", }, }; @@ -50,28 +55,3 @@ export const CATEGORY_ORDER = [ "w7", "minigame", ]; - -/** - * Curated list of favorite GGA keys for quick access in Search view. - */ -export const FAVORITE_KEYS = [ - "OptionsListAccount", - "OptionsList", - "PlayerDATABASE", - "SkillLevels", - "SkillLevelsMAX", - "BundlesReceived", - "ChestQuantity", - "CurrenciesOwned", - "CustomLists", - "Exp0", - "GemItemsPurchased", - "ItemQuantity", - "KillsLeft2Advance", - "Lv0", - "Spelunk", - "Arcane", - "Bubba", - "Compass", - "Grimoire", -]; diff --git a/src/ui/state/store.js b/src/ui/state/store.js index 4c93d0c0..3bf3974a 100644 --- a/src/ui/state/store.js +++ b/src/ui/state/store.js @@ -38,9 +38,12 @@ const appState = vanX.reactive({ toast: { message: "", type: "", id: 0 }, notificationHistory: [], config: null, + configDirty: false, + connectionTransport: "disconnected", + activityDrawer: null, + sidebarMobileOpen: false, sidebarCollapsed: localStorage.getItem("sidebarCollapsed") === "true", configForcedPath: null, - cheatsViewMode: localStorage.getItem("cheatsViewMode") || "tabs", }); const dataState = vanX.reactive({ @@ -53,7 +56,7 @@ const dataState = vanX.reactive({ monitorValues: {}, }); -const MAX_NOTIFICATION_HISTORY = 10; +const MAX_NOTIFICATION_HISTORY = 100; let appInfoRequest = null; const Actions = { @@ -96,12 +99,14 @@ const SystemService = { // Check WebSocket connection first if (getConnectionStatus()) { appState.heartbeat = true; + appState.connectionTransport = "websocket"; return; } // Fall back to HTTP heartbeat check const alive = await API.checkHeartbeat(); appState.heartbeat = !!alive; + appState.connectionTransport = alive ? "http" : "disconnected"; }; check(); setInterval(check, 10000); @@ -422,9 +427,33 @@ const store = { localStorage.setItem("sidebarCollapsed", appState.sidebarCollapsed); }, - toggleCheatsViewMode: () => { - appState.cheatsViewMode = appState.cheatsViewMode === "list" ? "tabs" : "list"; - localStorage.setItem("cheatsViewMode", appState.cheatsViewMode); + setActiveTab: (viewId) => { + appState.activeTab = viewId; + appState.sidebarMobileOpen = false; + }, + + toggleMobileSidebar: () => { + appState.sidebarMobileOpen = !appState.sidebarMobileOpen; + }, + + closeMobileSidebar: () => { + appState.sidebarMobileOpen = false; + }, + + openActivityDrawer: (drawer) => { + appState.activityDrawer = drawer; + }, + + toggleActivityDrawer: (drawer) => { + appState.activityDrawer = appState.activityDrawer === drawer ? null : drawer; + }, + + closeActivityDrawer: () => { + appState.activityDrawer = null; + }, + + setConfigDirty: (isDirty) => { + appState.configDirty = !!isDirty; }, openExternalUrl: async (url) => { diff --git a/src/ui/styles/_account-pages.css b/src/ui/styles/_account-pages.css index f14a8d26..1872e9d3 100644 --- a/src/ui/styles/_account-pages.css +++ b/src/ui/styles/_account-pages.css @@ -21,6 +21,96 @@ gap: 5px; } +#options-account-tab .account-header { + min-height: 52px; + padding: 9px 14px; + border-bottom-color: #e2e8f0; + background: #ffffff; +} + +#options-account-tab .account-tab-header__title { + color: #0f172a; + font-size: 0.8125rem; + letter-spacing: 0.025em; +} + +#options-account-tab .account-tab-header__desc { + color: #64748b; + font-size: 0.75rem; +} + +#options-account-tab .account-list, +#options-account-tab .scrollable-panel { + padding: 10px; +} + +#options-account-tab .account-section { + gap: 7px; + padding: 10px; + border-color: #e2e8f0; + border-radius: 8px; + background: #ffffff; +} + +#options-account-tab .account-section__header { + border-bottom-color: #e2e8f0; +} + +#options-account-tab .account-section__title { + color: #4f46e5; + font-size: 0.6875rem; + letter-spacing: 0.08em; +} + +#options-account-tab .account-row, +#options-account-tab .feature-card { + border-color: #e2e8f0; + border-radius: 7px; + background: #ffffff; + box-shadow: 0 1px 1px rgba(15, 23, 42, 0.02); +} + +#options-account-tab .account-row { + min-height: 38px; + padding: 3px 10px; +} + +#options-account-tab .account-row .number-input-btn { + height: 28px; + padding-inline: 8px; +} + +#options-account-tab .account-row:hover, +#options-account-tab .feature-card:hover { + border-color: #c7d2fe; + background: #fafbff; +} + +#options-account-tab .account-row__index { + border-radius: 4px; + background: #f1f5f9; + color: #64748b; +} + +#options-account-tab .account-row__badge { + border-color: #c7d2fe; + border-radius: 999px; + background: #eef2ff; + color: #4f46e5; +} + +@media (max-width: 760px) { + #options-account-tab .account-header { + align-items: flex-start; + flex-direction: column; + } + + #options-account-tab .account-tab-header__actions { + width: 100%; + justify-content: flex-start; + } +} + .account-header { display: flex; align-items: center; diff --git a/src/ui/styles/_activity-drawer.css b/src/ui/styles/_activity-drawer.css new file mode 100644 index 00000000..26f79a41 --- /dev/null +++ b/src/ui/styles/_activity-drawer.css @@ -0,0 +1,215 @@ +/** + * Runtime Activity and Monitors drawer. + */ + +.atlas-activity-drawer { + flex: 0 0 0; + min-height: 0; + overflow: hidden; + color: #dfe4f2; + background: #090d1d; + border-top: 0 solid #273049; + transition: + flex-basis 0.2s ease, + border-width 0.2s ease; +} + +.atlas-activity-drawer.is-open { + flex-basis: clamp(180px, 28vh, 280px); + border-top-width: 1px; +} + +.atlas-drawer-tabs { + display: flex; + align-items: center; + height: 38px; + padding: 0 8px; + background: #ffffff; + border-bottom: 1px solid #dce2ec; +} + +.atlas-drawer-tab, +.atlas-drawer-close { + display: inline-flex; + align-items: center; + justify-content: center; + height: 30px; + color: #65738b; + background: transparent; + border: 0; + border-radius: 6px; + font-family: inherit; + font-size: 11px; + cursor: pointer; +} + +.atlas-drawer-tab { + gap: 6px; + padding: 0 10px; +} + +.atlas-drawer-tab.is-active { + color: #ffffff; + background: #10162a; +} + +.atlas-drawer-tab svg, +.atlas-drawer-close svg { + width: 14px; + height: 14px; +} + +.atlas-drawer-summary { + margin-left: auto; + color: #8a96ab; + font-family: var(--font-mono); + font-size: 9px; +} + +.atlas-drawer-close { + width: 30px; + margin-left: 8px; +} + +.atlas-drawer-close:hover { + color: #14213d; + background: #f0f3f8; +} + +.atlas-drawer-content { + height: calc(100% - 38px); + min-height: 0; +} + +.atlas-drawer-panel { + display: none; + height: 100%; + min-height: 0; + overflow: auto; +} + +.atlas-drawer-panel.is-active { + display: block; +} + +.atlas-drawer-empty { + display: flex; + align-items: center; + justify-content: center; + gap: 10px; + height: 100%; + padding: 24px; + color: #7f8aa3; + font-family: var(--font-mono); + font-size: 11px; + text-align: center; +} + +.atlas-inline-action { + padding: 5px 9px; + color: #c7c9ff; + background: rgba(103, 104, 245, 0.14); + border: 1px solid rgba(142, 143, 255, 0.25); + border-radius: 5px; + font-family: inherit; + font-size: 10px; + cursor: pointer; +} + +.atlas-activity-list, +.atlas-monitor-list { + min-width: 560px; + padding: 8px 12px 16px; +} + +.atlas-activity-row, +.atlas-monitor-row { + display: grid; + align-items: baseline; + min-height: 25px; + border-bottom: 1px solid rgba(255, 255, 255, 0.035); + font-family: var(--font-mono); + font-size: 10px; +} + +.atlas-activity-row { + grid-template-columns: 68px 56px minmax(0, 1fr); + gap: 10px; +} + +.atlas-activity-time { + color: #596882; +} + +.atlas-activity-kind { + color: #4bd5b1; + text-transform: uppercase; +} + +.atlas-activity-row.is-error .atlas-activity-kind, +.atlas-activity-row.is-error .atlas-activity-message { + color: #ff8298; +} + +.atlas-activity-message { + overflow: hidden; + color: #d7ddef; + text-overflow: ellipsis; + white-space: nowrap; +} + +.atlas-monitor-row { + grid-template-columns: 12px minmax(180px, 0.7fr) minmax(240px, 1fr); + gap: 10px; +} + +.atlas-monitor-status { + width: 6px; + height: 6px; + background: #3ed0a9; + border-radius: 50%; +} + +.atlas-monitor-row.has-error .atlas-monitor-status { + background: #ff6e88; +} + +.atlas-monitor-path, +.atlas-monitor-value { + overflow: hidden; + font-family: inherit; + text-overflow: ellipsis; + white-space: nowrap; +} + +.atlas-monitor-path { + color: #96a7ca; +} + +.atlas-monitor-value { + color: #e5e9f6; +} + +.atlas-monitor-row.has-error .atlas-monitor-value { + color: #ff8298; +} + +@media (max-width: 760px) { + .atlas-activity-drawer.is-open { + flex-basis: min(42vh, 300px); + } + + .atlas-drawer-summary { + display: none; + } + + .atlas-drawer-close { + margin-left: auto; + } +} + +@media (prefers-reduced-motion: reduce) { + .atlas-activity-drawer { + transition: none; + } +} diff --git a/src/ui/styles/_atlas-shell.css b/src/ui/styles/_atlas-shell.css new file mode 100644 index 00000000..f943e358 --- /dev/null +++ b/src/ui/styles/_atlas-shell.css @@ -0,0 +1,696 @@ +/** + * Application shell + * Dark global header, light workspace canvas, and responsive navigation. + */ + +:root { + --atlas-header-height: 48px; + --atlas-sidebar-width: 220px; + --atlas-sidebar-collapsed-width: 64px; + --atlas-header: #090b14; + --atlas-header-border: #1d2230; + --atlas-canvas: #f4f6fa; + --atlas-surface: #ffffff; + --atlas-surface-muted: #f8f9fc; + --atlas-border: #dce2ec; + --atlas-border-strong: #c7d0df; + --atlas-text: #14213d; + --atlas-text-muted: #66748d; + --atlas-text-soft: #8a96ab; + --atlas-accent: #5b5ce2; + --atlas-accent-soft: #ececff; + --atlas-success: #0aa575; + --atlas-danger: #d9435f; + --atlas-warning: #d58a08; +} + +body { + background: var(--atlas-canvas); +} + +.hud-background { + display: none; +} + +.app-layout { + position: relative; + display: flex; + flex-direction: column; + width: 100%; + height: 100vh; + height: 100dvh; + min-width: 320px; + overflow: hidden; + color: var(--atlas-text); + font-family: + Inter, + "Segoe UI", + system-ui, + -apple-system, + sans-serif; +} + +.atlas-header { + position: relative; + z-index: 3000; + flex: 0 0 var(--atlas-header-height); + display: grid; + grid-template-columns: minmax(230px, auto) minmax(120px, 1fr) auto; + align-items: center; + gap: 18px; + min-width: 0; + padding: 0 12px; + color: #f6f7fb; + background: var(--atlas-header); + border-bottom: 1px solid var(--atlas-header-border); +} + +.atlas-header-brand, +.atlas-header-actions, +.atlas-breadcrumb { + display: flex; + align-items: center; + min-width: 0; +} + +.atlas-header-brand { + gap: 8px; + font-size: 13px; + font-weight: 700; + white-space: nowrap; +} + +.atlas-brand-mark { + display: inline-flex; + align-items: center; + justify-content: center; + width: 26px; + height: 26px; + color: #ffffff; + background: #6768f5; + border-radius: 7px; +} + +.atlas-brand-mark svg { + width: 15px; + height: 15px; +} + +.atlas-brand-name { + letter-spacing: -0.01em; +} + +.atlas-mobile-menu { + display: none; + width: 32px; + height: 32px; + padding: 7px; + color: #dfe3ef; + background: transparent; + border: 1px solid #303647; + border-radius: 6px; + cursor: pointer; +} + +.atlas-mobile-menu > span { + display: flex; + flex-direction: column; + gap: 4px; +} + +.atlas-mobile-menu > span > span { + display: block; + width: 16px; + height: 1.5px; + background: currentColor; +} + +.atlas-breadcrumb { + gap: 7px; + overflow: hidden; + color: #8f99ae; + font-family: var(--font-mono); + font-size: 11px; + white-space: nowrap; +} + +.atlas-breadcrumb-current { + overflow: hidden; + color: #eef0f7; + text-overflow: ellipsis; +} + +.atlas-breadcrumb-separator { + width: 12px; + height: 12px; + flex: 0 0 auto; +} + +.atlas-header-actions { + justify-content: flex-end; + gap: 7px; +} + +.atlas-connection, +.atlas-dirty-indicator { + display: inline-flex; + align-items: center; + gap: 6px; + height: 30px; + padding: 0 9px; + border: 1px solid #293043; + border-radius: 7px; + font-size: 11px; + font-weight: 600; + white-space: nowrap; +} + +.atlas-connection.is-online { + color: #7ce8c4; + background: rgba(10, 165, 117, 0.1); + border-color: rgba(83, 214, 173, 0.2); +} + +.atlas-connection.is-offline { + color: #ff91a4; + background: rgba(217, 67, 95, 0.1); + border-color: rgba(255, 145, 164, 0.18); +} + +.atlas-connection-dot { + width: 6px; + height: 6px; + background: currentColor; + border-radius: 50%; +} + +.atlas-dirty-indicator { + display: none; + color: #ffd27d; + background: rgba(213, 138, 8, 0.1); + border-color: rgba(255, 210, 125, 0.2); +} + +.atlas-dirty-indicator.is-visible { + display: inline-flex; +} + +.atlas-header-button { + position: relative; + display: inline-flex; + align-items: center; + justify-content: center; + gap: 6px; + height: 30px; + padding: 0 9px; + color: #c8cede; + background: transparent; + border: 1px solid #293043; + border-radius: 7px; + font-family: inherit; + font-size: 11px; + font-weight: 600; + cursor: pointer; +} + +.atlas-header-button:hover, +.atlas-header-button.is-active, +.atlas-header-button.has-update { + color: #ffffff; + background: #181c29; + border-color: #41485d; +} + +.atlas-header-button svg { + width: 14px; + height: 14px; +} + +.atlas-version[aria-disabled="true"] { + cursor: default; +} + +.atlas-update-dot { + width: 6px; + height: 6px; + background: #ff91a4; + border-radius: 50%; +} + +.atlas-activity-count { + min-width: 16px; + height: 16px; + padding: 0 4px; + color: #ffffff; + background: #6265ec; + border-radius: 8px; + font-family: var(--font-mono); + font-size: 9px; + line-height: 16px; + text-align: center; +} + +.atlas-body { + position: relative; + display: flex; + flex: 1 1 auto; + min-width: 0; + min-height: 0; + overflow: hidden; +} + +.viewport.atlas-canvas { + --c-void: #f4f6fa; + --c-void-soft: #edf1f7; + --c-panel: #ffffff; + --c-panel-dim: #f8f9fc; + --c-panel-dark-dim: #f0f3f8; + --c-panel-hover: #f0f3fa; + --c-panel-95: rgba(255, 255, 255, 0.96); + --c-panel-98: rgba(255, 255, 255, 0.98); + --c-border: #dce2ec; + --c-border-strong: #c7d0df; + --c-text-main: #14213d; + --c-text-dim: #42526b; + --c-text-muted: #71809b; + --c-text: var(--c-text-main); + --c-accent: #5b5ce2; + --c-accent-hover: #4b4dcc; + --c-accent-dim: rgba(91, 92, 226, 0.1); + --c-accent-dim-solid: #ededfd; + --c-accent-glow: rgba(91, 92, 226, 0.22); + --c-accent-06: rgba(91, 92, 226, 0.06); + --c-accent-20: rgba(91, 92, 226, 0.2); + --c-accent-25: rgba(91, 92, 226, 0.25); + --c-accent-40: rgba(91, 92, 226, 0.4); + --c-success: #0aa575; + --c-warning: #d58a08; + --c-danger: #d9435f; + --c-success-10: rgba(10, 165, 117, 0.1); + --c-danger-05: rgba(217, 67, 95, 0.05); + --c-danger-10: rgba(217, 67, 95, 0.1); + --c-warning-10: rgba(213, 138, 8, 0.1); + --c-hover: rgba(20, 33, 61, 0.05); + --c-border-faint: rgba(20, 33, 61, 0.07); + --c-scrollbar-thumb: #b8c2d1; + flex: 1 1 auto; + min-width: 0; + min-height: 0; + padding-top: 0; + color: var(--atlas-text); + background: var(--atlas-canvas); +} + +#tab-content { + min-width: 0; + min-height: 0; +} + +.tab-pane { + padding: 20px; +} + +.tab-pane.active { + animation-duration: 0.18s; +} + +.atlas-sidebar { + position: relative; + z-index: 2100; + flex: 0 0 var(--atlas-sidebar-width); + width: var(--atlas-sidebar-width); + min-width: 0; + padding: 12px 10px 10px; + overflow: hidden; + color: var(--atlas-text); + background: var(--atlas-surface); + border-right: 1px solid var(--atlas-border); + backdrop-filter: none; + transition: + width 0.18s ease, + flex-basis 0.18s ease, + transform 0.2s ease; +} + +.atlas-sidebar.sidebar-collapsed, +.atlas-sidebar.is-responsive-rail { + flex-basis: var(--atlas-sidebar-collapsed-width); + width: var(--atlas-sidebar-collapsed-width); + padding: 12px 8px 10px; +} + +.atlas-sidebar-section-label, +.atlas-context-heading { + color: var(--atlas-text-soft); + font-size: 10px; + font-weight: 700; + letter-spacing: 0.09em; + text-transform: uppercase; +} + +.atlas-sidebar-section-label { + padding: 3px 8px 8px; +} + +.atlas-workspace-nav { + display: flex; + flex-direction: column; + gap: 2px; +} + +.atlas-nav-button { + display: flex; + align-items: center; + gap: 10px; + width: 100%; + min-height: 34px; + padding: 7px 8px; + overflow: hidden; + color: #52617a; + background: transparent; + border: 1px solid transparent; + border-radius: 7px; + font-family: inherit; + font-size: 12px; + font-weight: 600; + text-align: left; + text-decoration: none; + white-space: nowrap; + cursor: pointer; +} + +.atlas-nav-button:hover { + color: var(--atlas-text); + background: var(--atlas-surface-muted); + border-color: #edf0f5; +} + +.atlas-nav-button.active { + color: #494bc7; + background: var(--atlas-accent-soft); + border-color: #dddefd; + box-shadow: inset 2px 0 0 var(--atlas-accent); +} + +.atlas-nav-button svg { + flex: 0 0 auto; + width: 16px; + height: 16px; + opacity: 0.8; +} + +.atlas-nav-shortcut { + margin-left: auto; + color: #a0aabc; + font-family: var(--font-mono); + font-size: 9px; +} + +.atlas-sidebar-divider { + height: 1px; + margin: 12px 2px; + background: var(--atlas-border); +} + +.atlas-context-slot { + flex: 1 1 auto; + min-height: 0; + overflow: hidden; +} + +.atlas-context-placeholder { + display: flex; + flex-direction: column; + height: 100%; + min-height: 0; +} + +.atlas-context-heading { + display: flex; + align-items: center; + justify-content: space-between; + padding: 0 8px 8px; +} + +.atlas-context-empty { + padding: 7px 8px; + color: var(--atlas-text-soft); + font-size: 11px; + line-height: 1.45; +} + +.atlas-sidebar-footer { + flex: 0 0 auto; + padding-top: 10px; + border-top: 1px solid var(--atlas-border); +} + +.atlas-sidebar-controls { + display: flex; + gap: 6px; + margin-top: 5px; +} + +.atlas-shortcuts-button, +.atlas-sidebar .sidebar-toggle { + display: inline-flex; + align-items: center; + justify-content: center; + height: 32px; + margin: 0; + padding: 0 9px; + color: #66748d; + background: transparent; + border: 1px solid var(--atlas-border); + border-radius: 6px; + cursor: pointer; +} + +.atlas-shortcuts-button { + flex: 0 0 32px; +} + +.atlas-sidebar .sidebar-toggle { + flex: 1 1 auto; + gap: 7px; + width: auto; + font-family: inherit; + font-size: 11px; +} + +.atlas-shortcuts-button:hover, +.atlas-sidebar .sidebar-toggle:hover { + color: var(--atlas-accent); + background: var(--atlas-accent-soft); + border-color: #d6d7fb; +} + +.atlas-shortcuts-button svg, +.atlas-sidebar .sidebar-toggle svg { + width: 14px; + height: 14px; +} + +.atlas-sidebar:is(.sidebar-collapsed, .is-responsive-rail) .atlas-sidebar-section-label, +.atlas-sidebar:is(.sidebar-collapsed, .is-responsive-rail) .atlas-sidebar-divider, +.atlas-sidebar:is(.sidebar-collapsed, .is-responsive-rail) .atlas-context-slot, +.atlas-sidebar:is(.sidebar-collapsed, .is-responsive-rail) .atlas-nav-shortcut, +.atlas-sidebar:is(.sidebar-collapsed, .is-responsive-rail) .tab-label, +.atlas-sidebar:is(.sidebar-collapsed, .is-responsive-rail) .atlas-shortcuts-button { + display: none; +} + +.atlas-sidebar:is(.sidebar-collapsed, .is-responsive-rail) .atlas-nav-button, +.atlas-sidebar:is(.sidebar-collapsed, .is-responsive-rail) .sidebar-toggle { + justify-content: center; + padding-inline: 7px; +} + +.atlas-sidebar:is(.sidebar-collapsed, .is-responsive-rail) .atlas-sidebar-footer { + margin-top: auto; + border-top: 0; +} + +.atlas-sidebar:is(.sidebar-collapsed, .is-responsive-rail) .atlas-sidebar-controls { + display: block; +} + +.atlas-sidebar.is-responsive-rail .atlas-sidebar-controls { + display: none; +} + +.atlas-sidebar-backdrop { + display: none; +} + +.app-layout :is(button, a, input, select, textarea):focus-visible { + outline: 2px solid #7779f4; + outline-offset: 2px; +} + +@media (max-width: 1280px) { + .atlas-dirty-indicator { + max-width: 145px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } +} + +@media (max-width: 1023px) { + .atlas-header { + grid-template-columns: auto minmax(80px, 1fr) auto; + } + + .atlas-mobile-menu { + display: inline-flex; + } + + .atlas-sidebar, + .atlas-sidebar.sidebar-collapsed { + position: fixed; + top: var(--atlas-header-height); + bottom: 0; + left: 0; + z-index: 2600; + width: min(310px, 86vw); + padding: 14px 12px 12px; + visibility: hidden; + transform: translateX(-102%); + box-shadow: 18px 0 44px rgba(20, 33, 61, 0.18); + } + + .atlas-sidebar.is-mobile-open, + .atlas-sidebar.sidebar-collapsed.is-mobile-open { + visibility: visible; + transform: translateX(0); + } + + .atlas-sidebar.sidebar-collapsed .atlas-sidebar-section-label, + .atlas-sidebar.sidebar-collapsed .atlas-sidebar-divider, + .atlas-sidebar.sidebar-collapsed .atlas-context-slot, + .atlas-sidebar.sidebar-collapsed .atlas-nav-shortcut, + .atlas-sidebar.sidebar-collapsed .tab-label, + .atlas-sidebar.sidebar-collapsed .atlas-shortcuts-button { + display: initial; + } + + .atlas-sidebar.sidebar-collapsed .atlas-context-slot, + .atlas-sidebar.sidebar-collapsed .atlas-sidebar-divider { + display: block; + } + + .atlas-sidebar.sidebar-collapsed .atlas-workspace-nav { + display: flex; + } + + .atlas-sidebar.sidebar-collapsed .atlas-nav-button, + .atlas-sidebar.sidebar-collapsed .sidebar-toggle { + justify-content: flex-start; + padding-inline: 8px; + } + + .atlas-sidebar.sidebar-collapsed .atlas-sidebar-footer { + margin-top: 0; + border-top: 1px solid var(--atlas-border); + } + + .atlas-sidebar.sidebar-collapsed .atlas-sidebar-controls { + display: flex; + } + + .atlas-sidebar-backdrop { + position: fixed; + inset: var(--atlas-header-height) 0 0; + z-index: 2500; + display: block; + visibility: hidden; + padding: 0; + background: rgba(9, 11, 20, 0.36); + border: 0; + opacity: 0; + pointer-events: none; + transition: + opacity 0.2s ease, + visibility 0.2s ease; + } + + .atlas-sidebar-backdrop.is-visible { + visibility: visible; + opacity: 1; + pointer-events: auto; + } +} + +@media (max-width: 760px) { + .atlas-header { + grid-template-columns: minmax(0, 1fr) auto; + gap: 8px; + padding-inline: 8px; + } + + .atlas-breadcrumb, + .atlas-version, + .atlas-action-label { + display: none !important; + } + + .atlas-dirty-indicator.is-visible { + width: 30px; + padding: 0; + justify-content: center; + font-size: 0; + } + + .atlas-dirty-indicator > span { + font-size: 13px; + } + + .atlas-header-actions { + gap: 4px; + } + + .atlas-connection { + max-width: 108px; + padding-inline: 7px; + overflow: hidden; + text-overflow: ellipsis; + } + + .atlas-header-button { + width: 30px; + padding: 0; + } + + .atlas-activity-count { + position: absolute; + top: -5px; + right: -5px; + } + + .tab-pane { + padding: 12px; + } +} + +@media (max-width: 440px) { + .atlas-brand-name { + display: none; + } + + .atlas-connection { + width: 28px; + padding: 0; + font-size: 0; + justify-content: center; + } +} + +@media (prefers-reduced-motion: reduce) { + .atlas-sidebar, + .atlas-sidebar-backdrop, + .tab-pane.active { + transition: none; + animation: none; + } +} diff --git a/src/ui/styles/_search.css b/src/ui/styles/_search.css index 0c8ad497..59eecd61 100644 --- a/src/ui/styles/_search.css +++ b/src/ui/styles/_search.css @@ -59,10 +59,31 @@ .section-actions { display: flex; - gap: 0.5rem; + min-width: 0; + gap: 0.25rem; margin-left: auto; } +.search-keys-section .section-title { + min-width: 0; + flex: 1 1 auto; +} + +.search-keys-section .section-header { + flex-wrap: wrap; + row-gap: 6px; +} + +.search-keys-section .section-actions { + flex: 0 0 auto; +} + +.search-keys-section .section-actions .btn-small { + min-width: 0; + min-height: 28px; + padding-inline: 0.5rem; +} + /* Keys Section */ .keys-content { flex: 1; @@ -102,7 +123,7 @@ align-items: center; gap: 0.35rem; position: relative; - padding: 0.25rem 1.25rem 0.25rem 0.5rem; + padding: 0.25rem 0.5rem; border-radius: var(--radius-sm); cursor: pointer; transition: background-color 0.15s ease; @@ -136,76 +157,6 @@ text-overflow: ellipsis; } -.key-favorite-btn { - position: absolute; - right: 4px; - top: 50%; - transform: translateY(-50%); - width: 16px; - height: 16px; - padding: 0; - border: none; - border-radius: var(--radius-sm); - background: transparent; - color: var(--c-text-dim); - opacity: 0; - display: flex; - align-items: center; - justify-content: center; -} - -.key-favorite-btn .icon-base { - width: 0.7rem; - height: 0.7rem; -} - -.key-favorite-btn:hover { - opacity: 1; - color: var(--c-accent); - background: var(--c-white-05); -} - -.key-checkbox:hover .key-favorite-btn { - opacity: 0.9; -} - -.key-favorite-btn.active { - opacity: 1; - color: var(--c-accent); -} - -/* Expandable All Keys */ -.keys-group.expandable { - border-top: 1px solid var(--c-border); - padding-top: 0.75rem; -} - -.keys-group.expandable > summary { - cursor: pointer; - user-select: none; - list-style: none; -} - -.keys-group.expandable > summary::-webkit-details-marker { - display: none; -} - -.keys-group.expandable > summary::before { - content: ">"; - display: inline-block; - margin-right: 0.5rem; - transition: transform 0.2s ease; - font-size: 0.875rem; -} - -.keys-group.expandable[open] > summary::before { - transform: rotate(90deg); -} - -.keys-expand-content { - margin-top: 0.5rem; -} - .keys-filter { margin-bottom: 0.5rem; } @@ -793,3 +744,689 @@ min-height: 28px; } } + +/* Atlas search workbench --------------------------------------------------- */ + +#search-tab { + --c-panel: #ffffff; + --c-panel-dim: #f8fafc; + --c-panel-hover: #f1f5f9; + --c-border: #e2e8f0; + --c-border-strong: #cbd5e1; + --c-control-border-strong: #e2e8f0; + --c-text-main: #0f172a; + --c-text-dim: #475569; + --c-text-muted: #94a3b8; + --c-accent: #6366f1; + --c-accent-hover: #4f46e5; + --c-accent-dim: rgba(99, 102, 241, 0.08); + --c-accent-dim-solid: #eef2ff; + --c-accent-06: rgba(99, 102, 241, 0.06); + --c-accent-20: rgba(99, 102, 241, 0.2); + --c-accent-25: rgba(99, 102, 241, 0.25); + --c-success: #10b981; + --c-success-10: rgba(16, 185, 129, 0.1); + --c-warning: #f59e0b; + --c-danger: #f43f5e; + --c-white-05: rgba(15, 23, 42, 0.04); + --c-white-10: rgba(15, 23, 42, 0.07); + --font-display: var(--font-sans, "Inter", "Segoe UI", sans-serif); + padding: 0; + background: #f8fafc; + color: #0f172a; +} + +#search-tab .search-layout { + position: relative; + grid-template-columns: 224px minmax(420px, 1fr) 336px; + gap: 0; + background: #f8fafc; +} + +#search-tab .search-right-column { + grid-column: 2; + grid-row: 1; + grid-template-rows: auto minmax(0, 1fr); + gap: 0; + border-right: 1px solid #e2e8f0; +} + +#search-tab .search-keys-section, +#search-tab .search-input-section, +#search-tab .search-results-section, +#search-tab .saved-results-section { + border: 0; + border-radius: 0; + background: #ffffff; +} + +#search-tab .search-keys-section { + grid-column: 1; + grid-row: 1; + border-right: 1px solid #e2e8f0; +} + +#search-tab .search-input-section { + border-bottom: 1px solid #e2e8f0; +} + +#search-tab .section-header { + min-height: 42px; + padding: 7px 10px; + border-bottom-color: #e2e8f0; + background: #ffffff; +} + +#search-tab .section-title { + color: #64748b; + font-size: 0.6875rem; + font-weight: 700; + letter-spacing: 0.08em; +} + +#search-tab .search-input-content { + padding: 10px; + background: #ffffff; +} + +#search-tab .scan-type-row { + gap: 8px; + margin-bottom: 8px; +} + +#search-tab .scan-type-group { + gap: 4px; +} + +#search-tab .type-label, +#search-tab .selected-count, +#search-tab .keys-loading { + color: #64748b; +} + +#search-tab .keys-content, +#search-tab .results-content, +#search-tab .saved-results-content { + padding: 8px; + scrollbar-color: #cbd5e1 transparent; +} + +#search-tab .keys-footer { + padding: 7px 10px; + border-top-color: #e2e8f0; + background: #f8fafc; +} + +#search-tab .keys-group-header { + color: #4f46e5; + font-size: 0.6875rem; + letter-spacing: 0.08em; +} + +#search-tab .key-checkbox { + min-height: 30px; + border-radius: 6px; + color: #334155; + font-size: 0.75rem; +} + +#search-tab .key-checkbox:hover { + background: #f1f5f9; +} + +#search-tab .key-checkbox.checked { + background: #eef2ff; +} + +#search-tab .key-checkbox-label { + color: inherit; +} + +#search-tab .results-scope-badge { + border-color: #c7d2fe; + border-radius: 999px; + background: #eef2ff; + color: #4f46e5; +} + +#search-tab .search-result-item { + min-height: 36px; + height: auto; + padding: 6px 9px; + border-color: #e2e8f0; + border-radius: 7px; + background: #ffffff; + color: #475569; + cursor: pointer; + transition: + border-color 0.15s ease, + background 0.15s ease, + color 0.15s ease; +} + +#search-tab .search-result-item:hover, +#search-tab .search-result-item.is-selected { + border-color: #c7d2fe; + background: #eef2ff; + color: #312e81; +} + +#search-tab .search-result-item.is-selected { + box-shadow: inset 3px 0 #6366f1; +} + +#search-tab .result-path, +#search-tab .result-value, +#search-tab .result-equals { + font-size: 0.71875rem; +} + +#search-tab .result-value.type-number, +#search-tab .type-value.type-number { + color: #4f46e5; +} + +#search-tab .result-value.type-string, +#search-tab .type-value.type-string { + color: #047857; +} + +#search-tab .result-action-btn { + width: 26px; + min-height: 26px; + border-radius: 5px; + color: #64748b; +} + +#search-tab .search-result-item:focus-within .result-action-btn, +#search-tab .result-action-btn:focus-visible { + opacity: 1; +} + +#search-tab .result-action-btn.monitor-btn.active { + background: #ecfdf5; + color: #059669; +} + +#search-tab .saved-result-item { + align-items: stretch; + flex-wrap: wrap; + gap: 6px; + cursor: default; +} + +#search-tab .saved-result-item .result-path, +#search-tab .saved-result-body { + flex-basis: 100%; +} + +#search-tab .saved-result-item .result-equals { + display: none; +} + +#search-tab .saved-result-body { + align-items: flex-start; + flex-direction: column; + gap: 5px; +} + +#search-tab .saved-history { + width: 100%; + flex: 1 1 auto; + justify-content: flex-start; +} + +#search-tab .saved-result-item .result-actions { + width: 100%; + min-height: 28px; + justify-content: flex-end; + margin-left: 0; +} + +.search-pane-toolbar { + display: none; + min-height: 42px; + align-items: center; + justify-content: flex-end; + gap: 6px; + padding: 6px 10px; + border-bottom: 1px solid #e2e8f0; + background: #ffffff; +} + +.search-keys-toggle, +.search-inspector-toggle, +.search-keys-close, +.search-inspector-close { + min-height: 30px; + border: 1px solid #e2e8f0; + border-radius: 7px; + background: #ffffff; + color: #475569; + cursor: pointer; + font-size: 0.75rem; + font-weight: 600; +} + +.search-keys-toggle, +.search-inspector-toggle { + display: inline-flex; + align-items: center; + gap: 6px; + padding: 5px 8px; +} + +.search-toolbar-count, +.search-inspector-count { + display: inline-grid; + min-width: 18px; + height: 18px; + place-items: center; + border-radius: 999px; + background: #eef2ff; + color: #4f46e5; + font-family: var(--font-mono); + font-size: 0.625rem; +} + +.search-keys-close { + display: none; + width: 30px; + align-items: center; + justify-content: center; + padding: 0; +} + +.search-inspector-layer { + display: contents; +} + +.search-inspector { + grid-column: 3; + grid-row: 1; + display: flex; + min-width: 0; + min-height: 0; + flex-direction: column; + overflow: hidden; + background: #ffffff; +} + +.search-inspector-header { + display: flex; + min-height: 43px; + align-items: center; + gap: 8px; + padding: 6px 8px; + border-bottom: 1px solid #e2e8f0; +} + +.search-inspector-tabs { + display: flex; + flex: 1; + gap: 3px; +} + +.search-inspector-tab { + display: inline-flex; + min-height: 30px; + align-items: center; + gap: 6px; + padding: 5px 9px; + border: 0; + border-radius: 6px; + background: transparent; + color: #64748b; + cursor: pointer; + font-size: 0.71875rem; + font-weight: 600; +} + +.search-inspector-tab:hover { + background: #f1f5f9; + color: #0f172a; +} + +.search-inspector-tab.active { + background: #eef2ff; + color: #4338ca; +} + +.search-inspector-close { + display: none; + width: 30px; + align-items: center; + justify-content: center; + padding: 0; +} + +.search-inspector-close .icon-base, +.search-keys-close .icon-base { + width: 0.85rem; + height: 0.85rem; +} + +.search-inspector-panel { + display: none; + min-height: 0; + flex: 1; + overflow: hidden; +} + +.search-inspector-panel.active { + display: flex; + flex-direction: column; +} + +.search-inspector-panel > .saved-results-section { + height: 100%; +} + +.search-selected-result { + display: flex; + min-height: 0; + flex: 1; + flex-direction: column; + gap: 14px; + overflow-y: auto; + padding: 14px; +} + +.selected-result-heading { + display: flex; + flex-direction: column; + gap: 4px; +} + +.selected-result-kicker, +.selected-result-label { + color: #94a3b8; + font-size: 0.625rem; + font-weight: 700; + letter-spacing: 0.1em; +} + +.selected-result-path { + color: #0f172a; + font-family: var(--font-mono); + font-size: 0.75rem; + font-weight: 600; + overflow-wrap: anywhere; +} + +.selected-result-meta { + display: flex; + flex-direction: column; +} + +.selected-result-meta > div { + display: flex; + align-items: baseline; + justify-content: space-between; + gap: 12px; + padding: 7px 0; + border-bottom: 1px solid #f1f5f9; + color: #64748b; + font-size: 0.71875rem; +} + +.selected-result-meta > div > span:last-child { + color: #0f172a; + font-family: var(--font-mono); + text-align: right; +} + +.selected-result-value { + display: flex; + flex-direction: column; + gap: 6px; + padding: 10px; + border: 1px solid #e2e8f0; + border-radius: 8px; + background: #f8fafc; +} + +.selected-result-display { + color: #0f172a; + font-family: var(--font-mono); + font-size: 0.8125rem; + overflow-wrap: anywhere; +} + +.selected-result-edit-input { + width: 100%; +} + +.selected-result-history { + min-height: 56px; + padding: 8px; + border: 1px solid #e2e8f0; + border-radius: 8px; + background: #ffffff; +} + +.selected-result-history-empty { + color: #94a3b8; + font-size: 0.71875rem; + line-height: 1.45; +} + +.selected-result-sparkline, +.selected-result-sparkline .sparkline { + width: 100%; +} + +.selected-result-history-values { + display: flex; + gap: 4px; + overflow-x: auto; +} + +.selected-result-history-values span { + padding: 2px 5px; + border-radius: 4px; + background: #f1f5f9; + color: #64748b; + font-family: var(--font-mono); + font-size: 0.625rem; + white-space: nowrap; +} + +.selected-result-actions { + display: flex; + flex-direction: column; + gap: 7px; + margin-top: auto; +} + +.selected-result-edit-actions { + display: grid; + grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); + gap: 7px; +} + +.selected-result-actions button { + display: inline-flex; + min-height: 34px; + align-items: center; + justify-content: center; + gap: 6px; + font-size: 0.71875rem; +} + +.selected-result-actions .icon-base { + width: 0.85rem; + height: 0.85rem; +} + +.selected-monitor-action.active { + border-color: #a7f3d0; + background: #ecfdf5; + color: #047857; +} + +.search-inspector-backdrop, +.search-keys-backdrop { + display: none; +} + +#search-tab button:focus-visible, +#search-tab input:focus-visible, +#search-tab select:focus-visible, +#search-tab summary:focus-visible, +#search-tab .search-result-item:focus-visible { + outline: 2px solid #6366f1; + outline-offset: 2px; +} + +@media (max-width: 1279px) { + #search-tab .search-layout { + grid-template-columns: 224px minmax(0, 1fr); + } + + .search-pane-toolbar { + display: flex; + } + + .search-keys-toggle { + display: none; + } + + .search-inspector { + position: absolute; + inset: 0 0 0 auto; + width: min(420px, calc(100% - 24px)); + transform: translateX(102%); + visibility: hidden; + pointer-events: none; + box-shadow: -14px 0 32px rgba(15, 23, 42, 0.18); + transition: transform 0.2s ease; + z-index: 41; + } + + .search-inspector.is-open { + transform: translateX(0); + visibility: visible; + pointer-events: auto; + } + + .search-inspector-close { + display: inline-flex; + } + + .search-inspector-backdrop { + position: absolute; + inset: 0; + z-index: 40; + display: block; + border: 0; + background: rgba(15, 23, 42, 0.36); + opacity: 0; + pointer-events: none; + transition: opacity 0.2s ease; + } + + .search-inspector-backdrop.is-open { + opacity: 1; + pointer-events: auto; + } +} + +@media (max-width: 1023px) { + #search-tab .search-layout { + grid-template-columns: minmax(0, 1fr); + } + + #search-tab .search-right-column { + grid-column: 1; + } + + .search-pane-toolbar { + justify-content: space-between; + } + + .search-keys-toggle { + display: inline-flex; + } + + #search-tab .search-keys-section { + position: absolute; + inset: 0 auto 0 0; + display: flex; + width: min(300px, calc(100% - 24px)); + transform: translateX(-102%); + visibility: hidden; + pointer-events: none; + box-shadow: 14px 0 32px rgba(15, 23, 42, 0.18); + transition: transform 0.2s ease; + z-index: 31; + } + + #search-tab .search-keys-section.is-open { + transform: translateX(0); + visibility: visible; + pointer-events: auto; + } + + .search-keys-close { + display: inline-flex; + } + + .search-keys-backdrop { + position: absolute; + inset: 0; + z-index: 30; + display: block; + border: 0; + background: rgba(15, 23, 42, 0.36); + opacity: 0; + pointer-events: none; + transition: opacity 0.2s ease; + } + + .search-keys-backdrop.is-open { + opacity: 1; + pointer-events: auto; + } +} + +@media (max-width: 760px) { + #search-tab .scan-type-row, + #search-tab .search-input-row, + #search-tab .scan-value-inputs.has-secondary { + grid-template-columns: minmax(0, 1fr); + } + + #search-tab .search-btn-group { + justify-content: stretch; + } + + #search-tab .search-btn-group .search-btn { + min-width: 0; + flex: 1; + } + + #search-tab .search-result-item { + align-items: flex-start; + flex-wrap: wrap; + } + + #search-tab .search-result-item .result-path { + flex-basis: calc(100% - 18px); + } + + #search-tab .search-result-item .result-actions { + width: 100%; + min-height: 28px; + justify-content: flex-end; + } +} + +@media (prefers-reduced-motion: reduce) { + .search-inspector, + .search-inspector-backdrop, + #search-tab .search-keys-section, + .search-keys-backdrop { + transition: none; + } +} diff --git a/src/ui/styles/_world-tabs.css b/src/ui/styles/_world-tabs.css index bfa37898..223016ee 100644 --- a/src/ui/styles/_world-tabs.css +++ b/src/ui/styles/_world-tabs.css @@ -248,3 +248,207 @@ letter-spacing: 0.08em; margin: 0; } + +/* Atlas account workbench -------------------------------------------------- */ + +#options-account-tab { + --c-panel: #ffffff; + --c-panel-dim: #f8fafc; + --c-panel-hover: #f1f5f9; + --c-border: #e2e8f0; + --c-border-strong: #cbd5e1; + --c-text-main: #0f172a; + --c-text-dim: #475569; + --c-text-muted: #94a3b8; + --c-accent: #6366f1; + --c-accent-hover: #4f46e5; + --c-accent-dim: rgba(99, 102, 241, 0.08); + --c-accent-dim-solid: #eef2ff; + --c-accent-glow: rgba(99, 102, 241, 0.18); + --c-accent-06: rgba(99, 102, 241, 0.06); + --c-accent-20: rgba(99, 102, 241, 0.2); + --c-accent-25: rgba(99, 102, 241, 0.25); + --c-success: #10b981; + --c-warning: #f59e0b; + --c-danger: #f43f5e; + --c-success-10: rgba(16, 185, 129, 0.1); + --c-danger-05: rgba(244, 63, 94, 0.05); + --c-danger-10: rgba(244, 63, 94, 0.1); + --c-white-05: rgba(15, 23, 42, 0.05); + --c-white-10: rgba(15, 23, 42, 0.08); + --c-black-20: rgba(15, 23, 42, 0.06); + --c-black-40: rgba(15, 23, 42, 0.08); + --c-control-border-strong: #cbd5e1; + --c-control-thumb: #ffffff; + --font-display: var(--font-sans, "Inter", "Segoe UI", sans-serif); + padding: 0; + background: #f8fafc; + color: var(--c-text-main); +} + +.account-workspace-context { + display: flex; + height: 100%; + min-height: 0; + flex-direction: column; + overflow: hidden; +} + +.account-root-nav.account-sub-nav { + position: static; + display: flex; + min-height: 0; + flex: 1; + flex-direction: column; + flex-wrap: nowrap; + gap: 2px; + overflow-y: auto; + padding: 8px; + border: 0; + background: #ffffff; +} + +.account-root-nav .account-sub-tab-btn { + bottom: 0; + display: flex; + width: 100%; + min-width: 0; + min-height: 34px; + align-items: center; + flex-direction: row; + justify-content: flex-start; + padding: 7px 9px; + border: 0; + border-radius: 7px; + background: transparent; + color: #475569; + font-family: var(--font-display); + font-size: 0.75rem; + font-weight: 500; + letter-spacing: 0; + text-align: left; +} + +.account-root-nav .account-sub-tab-btn:hover { + background: #f1f5f9; + color: #0f172a; +} + +.account-root-nav .account-sub-tab-btn.active { + background: #eef2ff; + color: #4338ca; + font-weight: 650; +} + +.account-root-nav .account-sub-tab-btn.active::after { + top: 7px; + bottom: 7px; + left: 0; + width: 3px; + height: auto; + border-radius: 0 3px 3px 0; + background: var(--world-color, #6366f1); + box-shadow: none; +} + +.account-tree-label { + display: flex; + width: 100%; + min-width: 0; + align-items: center; + justify-content: flex-start; + gap: 8px; + text-align: left; +} + +.account-tree-label__text { + flex: 1; + overflow: hidden; + text-overflow: ellipsis; + text-align: left; + white-space: nowrap; +} + +.account-root-nav .world-tab-btn-num { + display: inline-grid; + width: 25px; + height: 20px; + flex: 0 0 25px; + place-items: center; + border-radius: 5px; + background: color-mix(in srgb, var(--world-color) 14%, #ffffff); + color: var(--world-color); + font-family: var(--font-mono); + font-size: 0.625rem; +} + +.account-sub-tab-content { + width: 100%; + height: 100%; + background: #f8fafc; +} + +#options-account-tab .world-sub-nav, +#options-account-tab .account-page-nav, +#options-account-tab .account-nested-sub-nav { + gap: 2px; + padding: 7px 10px; + border-bottom-color: var(--c-border); + background: #ffffff; +} + +#options-account-tab .world-sub-nav .account-sub-tab-btn, +#options-account-tab .account-page-nav .account-sub-tab-btn, +#options-account-tab .account-nested-sub-nav .account-sub-tab-btn { + bottom: 0; + min-height: 30px; + padding: 6px 10px; + border: 0; + border-radius: 6px; + background: transparent; + color: #64748b; + font-family: var(--font-display); + font-size: 0.6875rem; + font-weight: 600; + letter-spacing: 0.025em; +} + +#options-account-tab .world-sub-nav .account-sub-tab-btn:hover, +#options-account-tab .account-page-nav .account-sub-tab-btn:hover, +#options-account-tab .account-nested-sub-nav .account-sub-tab-btn:hover { + background: #f1f5f9; + color: #0f172a; +} + +#options-account-tab .world-sub-nav .account-sub-tab-btn.active, +#options-account-tab .account-page-nav .account-sub-tab-btn.active, +#options-account-tab .account-nested-sub-nav .account-sub-tab-btn.active { + background: color-mix(in srgb, var(--world-color, #6366f1) 10%, #ffffff); + color: color-mix(in srgb, var(--world-color, #6366f1) 78%, #0f172a); +} + +#options-account-tab .world-sub-nav .account-sub-tab-btn.active::after, +#options-account-tab .account-page-nav .account-sub-tab-btn.active::after, +#options-account-tab .account-nested-sub-nav .account-sub-tab-btn.active::after { + top: auto; + bottom: 0; + height: 2px; + border-radius: 2px; + box-shadow: none; +} + +#options-account-tab button:focus-visible, +#options-account-tab input:focus-visible, +#options-account-tab select:focus-visible, +#options-account-tab summary:focus-visible { + outline: 2px solid #6366f1; + outline-offset: 2px; +} + +@media (prefers-reduced-motion: reduce) { + .account-sub-tab-pane.active, + .world-sub-pane.active { + animation: none; + transition: none; + } +} diff --git a/src/ui/styles/cheats.css b/src/ui/styles/cheats.css index 352dec87..bd4d8815 100644 --- a/src/ui/styles/cheats.css +++ b/src/ui/styles/cheats.css @@ -3,15 +3,6 @@ * Grid layout, categories, cheat items, quick access, favorites */ -/* --- CHEATS GRID --- */ -.grid-layout { - display: grid; - grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); - gap: 15px; - padding-bottom: 40px; - align-items: start; -} - /* --- CHEAT CATEGORY --- */ .cheat-category { background: var(--c-panel); @@ -61,319 +52,843 @@ border-top: 1px solid var(--c-border); } -/* --- CHEAT ITEM --- */ -.cheat-item-container { - display: flex; - gap: 8px; - position: relative; +/* --- ATLAS CHEAT WORKBENCH --- */ +#cheats-tab.atlas-cheats-pane { + padding: 0; + min-width: 0; + color: #172033; + background: #f7f9fd; } -.cheat-input { - width: 80px; - flex: none; - text-align: center; +#cheats-tab.atlas-cheats-pane.active { + animation: none; } -.cheat-button { - flex: 1; - background: var(--c-panel); - border: 1px solid var(--c-control-border-strong); - color: var(--c-text-dim); - padding: 0 12px; - height: 40px; - text-align: left; +.atlas-cheats-workbench { position: relative; + display: grid; + grid-template-columns: minmax(440px, 1fr) 330px; + width: 100%; + height: 100%; + min-width: 0; overflow: hidden; + background: #f7f9fd; +} + +.atlas-cheat-table, +.atlas-cheat-inspector { + min-width: 0; + min-height: 0; + background: #fff; +} + +.atlas-cheat-context { display: flex; + height: 100%; + min-height: 0; + flex-direction: column; + overflow: hidden; +} + +.atlas-tree-heading { + margin: 0 8px 6px; + color: #8795b1; + font-size: 0.68rem; + font-weight: 750; + letter-spacing: 0.08em; +} + +.atlas-category-heading { + margin-top: 22px; +} + +.atlas-category-scopes { + flex: 1; + min-height: 0; + overflow-y: auto; + padding-bottom: 8px; +} + +.atlas-scope-button { + display: grid; + grid-template-columns: 18px minmax(0, 1fr) auto; align-items: center; + width: 100%; + min-height: 34px; + padding: 6px 9px; + border: 0; + border-radius: 7px; + color: #42506a; + background: transparent; + text-align: left; + font-size: 0.78rem; + text-transform: none; + letter-spacing: normal; } -.cheat-button:hover { - color: var(--c-accent); - border-color: var(--c-accent); - background: var(--c-accent-dim-solid); +.atlas-scope-button:hover { + color: #172033; + background: #f1f4fa; } -/* --- QUICK ACCESS SECTION (Favorites/Recent) --- */ -.quick-access-section { - margin-bottom: 20px; - padding-bottom: 20px; - border-bottom: 1px solid var(--c-border); +.atlas-scope-button.is-active { + color: #4f46e5; + background: #eef0ff; + font-weight: 700; } -.quick-access-group { - margin-bottom: 15px; +.atlas-scope-icon { + display: inline-flex; + color: currentColor; } -.quick-access-group:last-child { - margin-bottom: 0; +.atlas-scope-icon svg { + width: 14px; + height: 14px; } -.quick-access-header { - font-size: 0.875rem; - color: var(--c-text-dim); - letter-spacing: 0.1em; - margin-bottom: 8px; - font-weight: 600; +.atlas-scope-label { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.atlas-scope-count { + color: #94a0b7; + font-family: var(--font-mono); + font-size: 0.67rem; } -.quick-access-items { +.atlas-category-scopes .atlas-scope-button { + grid-template-columns: 9px minmax(0, 1fr) auto; +} + +.atlas-category-scopes .atlas-scope-button::before { + width: 7px; + height: 7px; + border-radius: 50%; + background: #61aef4; + content: ""; +} + +.atlas-category-scopes .atlas-scope-button:nth-child(4n + 2)::before { + background: #f5b423; +} + +.atlas-category-scopes .atlas-scope-button:nth-child(4n + 3)::before { + background: #9a7cf7; +} + +.atlas-category-scopes .atlas-scope-button:nth-child(4n)::before { + background: #35c894; +} + +.atlas-cheat-table { + display: grid; + grid-template-rows: auto auto minmax(0, 1fr); + border-right: 1px solid #dce3ef; + outline: none; +} + +.atlas-cheat-table:focus-visible { + box-shadow: inset 0 0 0 2px #6366f1; +} + +.atlas-cheat-toolbar { + display: flex; + align-items: center; + gap: 10px; + padding: 8px 12px; + border-bottom: 1px solid #dce3ef; + background: #fbfcff; +} + +.atlas-cheat-search { display: flex; - flex-wrap: wrap; + align-items: center; gap: 8px; + flex: 1; + min-width: 160px; + height: 34px; + padding: 0 10px; + border: 1px solid #d6deeb; + border-radius: 7px; + color: #8492ad; + background: #fff; } -.quick-access-btn { - background: var(--c-accent-dim-solid); - border: 1px solid var(--c-accent); - color: var(--c-accent); +.atlas-cheat-search:focus-within { + border-color: #7778ed; + box-shadow: 0 0 0 3px rgb(99 102 241 / 10%); +} + +.atlas-cheat-search svg { + flex: none; + width: 15px; + height: 15px; +} + +.atlas-cheat-search input { + flex: 1; + min-width: 0; + width: auto; + height: 100%; padding: 0; - font-size: 0.875rem; - cursor: pointer; - transition: all 0.2s; - display: flex; - align-items: stretch; - gap: 0; + border: 0; + outline: 0; + color: #22304a; + background: transparent; + font-size: 0.78rem; } -.quick-access-btn.is-favorite-btn { - padding-right: 0; +.atlas-cheat-search input:focus { + border: 0; + box-shadow: none; + background: transparent; } -.quick-access-btn-text { - padding: 6px 12px; - display: flex; - align-items: center; +/* The search wrapper owns the focus ring; avoid a second, offset ring on its input. */ +.app-layout .atlas-cheat-search input:focus-visible { + outline: none; + outline-offset: 0; } -.quick-access-btn.is-favorite-btn .quick-access-btn-text { - padding-right: 8px; +.atlas-cheat-search input::placeholder { + color: #91a0bc; } -.quick-access-btn:hover { - background: var(--c-accent); - color: var(--c-black); +.atlas-row-count, +.atlas-table-hint { + flex: none; + color: #8290ad; + font-family: var(--font-mono); + font-size: 0.65rem; } -.quick-access-remove-icon { +.atlas-cheat-pagination { display: flex; + flex: none; + align-items: center; + gap: 5px; + color: #8290ad; + font-family: var(--font-mono); + font-size: 0.65rem; +} + +.atlas-cheat-pagination button { + display: inline-flex; align-items: center; justify-content: center; - padding: 0 8px; - align-self: stretch; + width: 26px; + height: 26px; + padding: 0; + border: 1px solid #d4dce9; + border-radius: 6px; + color: #52617b; + background: #fff; +} + +.atlas-cheat-pagination button:not(:disabled):hover { + border-color: #7475e9; + color: #4f46e5; +} + +.atlas-cheat-pagination button:disabled { opacity: 0.4; - transition: all 0.2s; - border-left: 1px solid var(--c-accent-20); } -.quick-access-btn:hover .quick-access-remove-icon { - border-left-color: var(--c-black-20); - opacity: 0.7; +.atlas-cheat-pagination svg { + width: 13px; + height: 13px; } -.quick-access-remove-icon:hover { - color: var(--c-danger) !important; - background: var(--c-black-10); - opacity: 1 !important; +.atlas-table-hint { + padding-left: 10px; + border-left: 1px solid #dce3ef; } -.quick-access-item { - display: flex; +.atlas-inspector-toggle, +.atlas-inspector-close, +.atlas-inspector-backdrop { + display: none; +} + +.atlas-cheat-table-head, +.atlas-cheat-row { + display: grid; + grid-template-columns: minmax(185px, 1.35fr) minmax(180px, 1.2fr) minmax(80px, 0.55fr) 126px; align-items: center; } -.quick-access-empty { - font-size: 0.875rem; - color: var(--c-text-muted); - font-style: italic; - padding: 4px 0; +.atlas-cheat-table-head { + min-height: 28px; + padding: 0 12px; + border-bottom: 1px solid #dce3ef; + color: #8a98b3; + background: #f7f9fd; + font-size: 0.63rem; + font-weight: 700; + letter-spacing: 0.05em; + text-transform: uppercase; } -/* --- FAVORITE BUTTON --- */ -.favorite-btn { - background: transparent; - border: none; - color: var(--c-text-dim); - cursor: pointer; - padding: 4px 8px; - font-size: 1rem; - opacity: 0.3; - transition: all 0.2s; - flex-shrink: 0; - display: flex; - align-items: center; - justify-content: center; +.atlas-cheat-table-head > span, +.atlas-cheat-row > * { + min-width: 0; + padding-right: 12px; } -.favorite-btn:hover { - opacity: 1; - color: var(--c-accent); +.atlas-cheat-table-head > span:last-child, +.atlas-cheat-row > *:last-child { + padding-right: 0; } -.favorite-btn.is-favorite { - opacity: 1; - color: var(--c-accent); +.atlas-cheat-table-body { + min-height: 0; + overflow-y: auto; + scrollbar-color: #c6cfde transparent; +} + +.atlas-cheat-row-list { + min-height: 100%; +} + +.atlas-cheat-row { + position: relative; + min-height: 42px; + padding: 0 12px; + border-bottom: 1px solid #e8edf5; + cursor: default; + font-size: 0.75rem; + transition: background 100ms ease; } -/* --- CHEAT CONFIG ICON (inside cheat button) --- */ -.cheat-button.has-config { +.atlas-cheat-row:hover { + background: #f7f9fd; +} + +.atlas-cheat-row.is-selected { + background: #eef0ff; + box-shadow: inset 3px 0 #6366f1; +} + +.atlas-cheat-row.feedback-success { + box-shadow: inset 3px 0 #20b77b; +} + +.atlas-cheat-row.feedback-error { + box-shadow: inset 3px 0 #e65468; +} + +.atlas-cheat-command-cell, +.atlas-cheat-state-cell { display: flex; align-items: center; - gap: 8px; + gap: 9px; } -.cheat-config-icon { +.atlas-cheat-glyph { display: inline-flex; - align-items: center; - justify-content: center; - padding: 0 12px; - height: 100%; - opacity: 0.5; - transition: all 0.2s; - flex-shrink: 0; - cursor: pointer; - border-left: 1px solid var(--c-white-05); - margin-right: -12px; /* Pull into button padding area */ - font-size: 1.2rem; /* Increased from default ~1rem */ + flex: none; + color: #f47d45; } -.cheat-config-icon:hover { - opacity: 1; - background: var(--c-white-10); - color: var(--c-accent); +.atlas-cheat-glyph svg { + width: 13px; + height: 13px; } -.cheat-button-text { - flex: 1; - text-align: left; +.atlas-cheat-command-copy { + display: flex; + flex-direction: column; + min-width: 0; +} + +.atlas-cheat-command, +.atlas-cheat-description, +.atlas-cheat-category { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } -.control-bar { - margin-bottom: 20px; - position: sticky; - top: 0; - z-index: 1001; - background: var(--c-panel); - padding-bottom: 10px; - display: flex; - gap: 10px; +.atlas-cheat-command { + color: #142039; + font-weight: 650; } -.config-drawer-toggle { - flex: none; - width: 42px; - background: var(--c-black-30); - border: 1px solid var(--c-border); - color: var(--c-text-dim); - cursor: pointer; +.atlas-cheat-saved-value { + color: #7c8ba8; + font-size: 0.63rem; +} + +.atlas-cheat-description { + color: #53617b; +} + +.atlas-cheat-category { + color: #64738e; + text-transform: capitalize; +} + +.atlas-cheat-config-link, +.atlas-cheat-favorite { display: inline-flex; align-items: center; justify-content: center; - font-size: 1.2rem; + flex: none; + width: 25px; + height: 25px; padding: 0; - transition: all 0.2s; + border: 0; + color: #a0abc0; + background: transparent; } -.config-drawer-toggle svg { - width: 1em; - height: 1em; +.atlas-cheat-config-link:hover, +.atlas-cheat-favorite:hover { + color: #5d61df; + background: #e7e9ff; } -.config-drawer-toggle:hover { - color: var(--c-text-main); - border-color: var(--c-accent-25); - background: var(--c-accent-06); +.atlas-cheat-config-link svg, +.atlas-cheat-favorite svg { + width: 13px; + height: 13px; } -.config-drawer-toggle.active { - color: var(--c-accent); - border-color: var(--c-accent); - background: var(--c-accent-dim-solid); +.atlas-cheat-favorite.is-favorite { + color: #f4a40f; } -/* --- VIEW MODE TOGGLE --- */ -.view-mode-toggle { - flex: none; - width: 42px; - background: var(--c-black-30); - border: 1px solid var(--c-border); - color: var(--c-text-dim); - cursor: pointer; +.atlas-cheat-state-cell { + justify-content: flex-end; +} + +.atlas-cheat-run { + min-width: 54px; + min-height: 27px; + padding: 4px 9px; + border: 1px solid #d6deeb; + border-radius: 6px; + color: #25324c; + background: #fff; + font-size: 0.67rem; + text-transform: none; + letter-spacing: normal; +} + +.atlas-cheat-run:hover:not(:disabled) { + border-color: #7475e9; + color: #5153d5; + background: #f3f3ff; +} + +.atlas-cheat-run:disabled { + color: #9aa6ba; + background: #f2f4f8; +} + +.atlas-cheat-switch { + position: relative; + width: 35px; + height: 20px; + padding: 2px; + border: 1px solid #d5dce8; + border-radius: 12px; + background: #edf0f5; +} + +.atlas-cheat-switch-thumb { + display: block; + width: 14px; + height: 14px; + border-radius: 50%; + background: #fff; + box-shadow: 0 1px 3px rgb(30 41 59 / 25%); + transition: transform 130ms ease; +} + +.atlas-cheat-switch.is-on { + border-color: #6668e8; + background: #6869ed; +} + +.atlas-cheat-switch.is-on .atlas-cheat-switch-thumb { + transform: translateX(15px); +} + +.atlas-cheat-inspector { + overflow-y: auto; + outline: 0; +} + +.atlas-inspector-content { + min-height: 100%; +} + +.atlas-inspector-header { + display: grid; + grid-template-columns: 40px minmax(0, 1fr) auto; + align-items: center; + gap: 11px; + padding: 16px 14px; + border-bottom: 1px solid #dce3ef; +} + +.atlas-inspector-header-actions { display: flex; align-items: center; + justify-content: flex-end; + gap: 2px; +} + +.atlas-inspector-icon { + display: inline-flex; + align-items: center; justify-content: center; - font-size: 1.2rem; - transition: all 0.2s; - border-radius: 4px; /* Optional rounded corners */ + width: 40px; + height: 40px; + border-radius: 11px; + color: #f26e36; + background: #e8f6fb; } -.view-mode-toggle:hover { - color: var(--c-text-main); - border-color: var(--c-text-dim); +.atlas-inspector-icon svg { + width: 18px; + height: 18px; } -/* --- TABS MODE --- */ -.tabs-bar { +.atlas-inspector-title { display: flex; - overflow-x: auto; - gap: 5px; - margin-bottom: 15px; - padding-bottom: 5px; - /* Scrollbar styling */ - scrollbar-width: thin; - scrollbar-color: var(--c-border) transparent; + flex-direction: column; + gap: 4px; + min-width: 0; } -.tabs-bar::-webkit-scrollbar { - height: 4px; -} -.tabs-bar::-webkit-scrollbar-thumb { - background: var(--c-border); - border-radius: 2px; +.atlas-inspector-title > span { + overflow: hidden; + color: #111c33; + font-size: 0.88rem; + font-weight: 750; + text-overflow: ellipsis; + white-space: nowrap; } -.tab-btn { - background: var(--c-panel); - border: 1px solid var(--c-border); - color: var(--c-text-dim); - padding: 8px 16px; - cursor: pointer; +.atlas-inspector-title code { + overflow: hidden; + color: #667590; + font-size: 0.65rem; + text-overflow: ellipsis; white-space: nowrap; - border-radius: 100px; /* Pill shape */ - transition: all 0.2s; - font-size: 0.9rem; } -.tab-btn:hover { - background: var(--c-accent-dim-solid); - border-color: var(--c-accent-dim-solid); - color: var(--c-text-main); +.atlas-inspector-tabs { + display: flex; + gap: 4px; + padding: 8px 12px; + border-bottom: 1px solid #dce3ef; } -.tab-btn.active { - background: var(--c-accent-dim-solid); - border-color: var(--c-accent); - color: var(--c-accent); +.atlas-inspector-tabs button { + padding: 6px 10px; + border: 0; + border-radius: 6px; + color: #5c6a84; + background: transparent; + font-size: 0.69rem; + text-transform: none; + letter-spacing: normal; +} + +.atlas-inspector-tabs button.is-active { + color: #172033; + background: #eef1f6; + font-weight: 700; +} + +.atlas-inspector-tabs button:disabled { + opacity: 0.42; +} + +.atlas-inspector-pane { + padding: 14px; +} + +.atlas-inspector-description { + margin-bottom: 14px; + color: #41506c; + font-size: 0.76rem; + line-height: 1.55; +} + +.atlas-inspector-field { + display: flex; + flex-direction: column; + gap: 6px; + margin-bottom: 10px; + color: #61708c; + font-size: 0.68rem; + font-weight: 650; +} + +.atlas-inspector-field input { + width: 100%; + height: 34px; + border: 1px solid #d4dce9; + border-radius: 6px; + color: #172033; + background: #fff; +} + +.atlas-inspector-run { + width: 100%; + min-height: 36px; + margin-bottom: 14px; + border: 0; + border-radius: 7px; + color: #fff; + background: #111a30; + text-transform: none; + letter-spacing: normal; +} + +.atlas-inspector-run:hover:not(:disabled) { + background: #293552; +} + +.atlas-inspector-run:disabled { + color: #7f8ca4; + background: #e8ecf2; +} + +.atlas-inspector-facts { + border-top: 1px solid #e3e8f0; +} + +.atlas-inspector-facts > div { + display: grid; + grid-template-columns: 90px minmax(0, 1fr); + gap: 10px; + min-height: 38px; + padding: 9px 0; + border-bottom: 1px solid #e9edf4; + color: #15203a; + font-size: 0.69rem; +} + +.atlas-inspector-facts > div > :first-child { + color: #6f7d97; +} + +.atlas-inspector-facts > div > :last-child { + overflow-wrap: anywhere; + text-align: right; +} + +.atlas-linked-config-path { + margin-bottom: 10px; + color: #7a88a4; + font-family: var(--font-mono); + font-size: 0.64rem; + overflow-wrap: anywhere; } -.tab-content { +.atlas-linked-config-tree { display: flex; flex-direction: column; gap: 8px; - animation: fadeIn 0.2s ease-out; } -@keyframes fadeIn { - from { +.atlas-open-full-config { + display: flex; + align-items: center; + justify-content: space-between; + width: 100%; + margin: 12px 0; + padding: 8px 10px; + border: 1px solid #d4dce9; + border-radius: 6px; + color: #3e4d68; + background: #fff; + font-size: 0.68rem; + text-transform: none; + letter-spacing: normal; +} + +.atlas-open-full-config svg { + width: 14px; + height: 14px; +} + +.atlas-inspector-config .cheat-category, +.atlas-inspector-config .config-item { + border-color: #dce3ef; + color: #172033; + background: #fff; +} + +.atlas-inspector-config .cheat-category-content { + padding: 8px; + border-color: #dce3ef; +} + +.atlas-inspector-config .cheat-category summary { + padding: 8px 10px; + color: #41506c; + background: #f7f9fd; + font-size: 0.69rem; +} + +.atlas-inspector-config .config-item { + gap: 7px; + padding: 9px; +} + +.atlas-inspector-config .config-item-header { + display: grid; + grid-template-areas: + "key reset" + "description description"; + grid-template-columns: minmax(0, 1fr) auto; + align-items: start; + gap: 3px 8px; + margin: 0; +} + +.atlas-inspector-config .config-item-header > label { + grid-area: key; + min-width: 0; +} + +.atlas-inspector-config .config-description { + grid-area: description; + overflow: visible; + padding: 0; + color: #63718a; + font-size: 0.68rem; + line-height: 1.4; + text-overflow: clip; + white-space: normal; +} + +.atlas-inspector-config .config-reset-btn { + grid-area: reset; + padding: 3px 6px; +} + +.atlas-inspector-config .number-input-wrapper { + min-height: 30px; +} + +.atlas-inspector-config .number-input-btn { + height: 30px; + padding: 0 8px; +} + +.atlas-inspector-config .config-item input[type="text"], +.atlas-inspector-config .config-item input[type="number"] { + color: #172033; + background: #fff; +} + +@media (max-width: 1280px) { + .atlas-cheats-workbench { + grid-template-columns: minmax(400px, 1fr) 300px; + } + + .atlas-table-hint { + display: none; + } + + .atlas-cheat-table-head, + .atlas-cheat-row { + grid-template-columns: minmax(170px, 1.3fr) minmax(150px, 1fr) 80px 116px; + } +} + +@media (max-width: 1023px) { + .atlas-cheats-workbench { + grid-template-columns: minmax(360px, 1fr); + } + + .atlas-cheat-inspector { + position: fixed; + top: var(--atlas-header-height); + right: 0; + bottom: 0; + z-index: 2300; + width: min(360px, calc(100vw - 24px)); + visibility: hidden; + border-left: 1px solid #dce3ef; + transform: translateX(102%); + box-shadow: -12px 0 30px rgb(30 41 59 / 16%); + pointer-events: none; + transition: + transform 160ms ease, + visibility 160ms ease; + } + + .atlas-cheat-inspector.is-open { + visibility: visible; + transform: translateX(0); + pointer-events: auto; + } + + .atlas-inspector-toggle { + display: inline-flex; + align-items: center; + justify-content: center; + flex: none; + min-height: 28px; + padding: 4px 8px; + border: 1px solid #d6deeb; + border-radius: 6px; + color: #4f52cf; + background: #fff; + font-size: 0.67rem; + text-transform: none; + letter-spacing: normal; + } + + .atlas-inspector-close { + display: inline-flex; + align-items: center; + justify-content: center; + width: 28px; + height: 28px; + padding: 0; + border: 0; + border-radius: 6px; + color: #7886a0; + background: transparent; + } + + .atlas-inspector-close svg { + width: 15px; + height: 15px; + } + + .atlas-inspector-backdrop { + position: fixed; + inset: var(--atlas-header-height) 0 0; + z-index: 2200; + display: block; + visibility: hidden; + padding: 0; + border: 0; + background: rgb(20 33 61 / 18%); opacity: 0; - transform: translateY(5px); + pointer-events: none; + transition: + opacity 160ms ease, + visibility 160ms ease; } - to { + + .atlas-inspector-backdrop.is-visible { + visibility: visible; opacity: 1; - transform: translateY(0); + pointer-events: auto; } } diff --git a/src/ui/styles/config.css b/src/ui/styles/config.css index 8d2f8a03..3868a595 100644 --- a/src/ui/styles/config.css +++ b/src/ui/styles/config.css @@ -268,3 +268,194 @@ background: var(--c-white-10); border-radius: 4px; } + +/* --- ATLAS CONFIG WORKSPACE --- */ +#config-tab.config-layout { + color: var(--atlas-text, #14213d); + background: var(--atlas-canvas, #f4f6fa); +} + +#config-tab.config-layout:not(.drawer-open) { + padding: 18px 22px; +} + +#config-tab .sub-nav { + gap: 4px; + margin-bottom: 14px; + padding: 6px; + border: 1px solid var(--atlas-border, #dce2ec); + border-radius: 8px; + background: var(--atlas-surface, #fff); +} + +#config-tab .config-sub-tab-button { + padding: 7px 12px; + border-radius: 6px; + color: var(--atlas-text-muted, #66748d); + font-size: 0.7rem; + text-transform: none; + letter-spacing: normal; +} + +#config-tab .config-sub-tab-button.active { + color: var(--atlas-text, #14213d); + background: var(--atlas-surface-muted, #f8f9fc); +} + +#config-tab .config-sub-tab-button.active::after { + display: none; +} + +#config-tab .panel-section { + padding: 12px; + border: 1px solid var(--atlas-border, #dce2ec); + border-radius: 8px; + background: var(--atlas-surface, #fff); +} + +#config-tab .config-filter-label { + color: var(--atlas-text-muted, #66748d); + font-size: 0.67rem; +} + +#config-tab .cheat-category { + overflow: hidden; + border-color: var(--atlas-border, #dce2ec); + border-left: 1px solid var(--atlas-border, #dce2ec); + border-radius: 7px; + color: var(--atlas-text, #14213d); + background: var(--atlas-surface, #fff); +} + +#config-tab .cheat-category[open] { + border-left: 3px solid var(--atlas-accent, #5b5ce2); +} + +#config-tab .cheat-category summary { + padding: 10px 12px; + color: var(--atlas-text, #14213d); + background: var(--atlas-surface-muted, #f8f9fc); + font-size: 0.76rem; + text-transform: none; +} + +#config-tab .cheat-category-content { + gap: 7px; + padding: 10px; + border-color: var(--atlas-border, #dce2ec); +} + +#config-tab .config-item { + padding: 12px; + border-color: var(--atlas-border, #dce2ec); + border-radius: 7px; + color: var(--atlas-text, #14213d); + background: var(--atlas-surface, #fff); +} + +#config-tab .config-item.modified-config { + border-left: 3px solid var(--atlas-accent, #5b5ce2); + background: var(--atlas-accent-soft, #ececff); +} + +#config-tab .config-item label, +#config-tab .config-description { + color: var(--atlas-text-muted, #66748d); +} + +#config-tab .action-bar { + align-items: center; + gap: 10px; + padding: 10px 12px; + border: 1px solid var(--atlas-border, #dce2ec); + border-radius: 8px; + background: var(--atlas-surface, #fff); + box-shadow: 0 -8px 22px rgb(20 33 61 / 7%); +} + +.atlas-config-actions { + display: flex; + align-items: center; + gap: 8px; + min-width: 0; +} + +.atlas-config-dirty-state { + display: flex; + align-items: center; + gap: 5px; +} + +.atlas-config-status-chip { + display: inline-flex; + align-items: center; + justify-content: center; + min-inline-size: 130px; + min-height: 24px; + padding: 3px 7px; + border: 1px solid #dce2ec; + border-radius: 12px; + color: #70809b; + background: #f7f9fc; + font-size: 0.61rem; + white-space: nowrap; +} + +.atlas-config-status-chip.is-dirty { + border-color: #efcb84; + color: #9b6500; + background: #fff8e8; +} + +.atlas-config-actions .btn-primary, +.atlas-config-actions .btn-secondary { + min-height: 30px; + padding: 6px 10px; + border-radius: 6px; + font-size: 0.65rem; + white-space: nowrap; +} + +.atlas-config-actions .btn-primary { + color: #fff; + background: var(--atlas-accent, #5b5ce2); +} + +.atlas-config-actions .btn-secondary { + border-color: #c7d0df; + color: #34435e; + background: #fff; +} + +.atlas-config-actions button:disabled { + opacity: 0.48; + cursor: not-allowed; + transform: none; + box-shadow: none; +} + +.atlas-config-actions.is-compact { + align-items: stretch; + flex-direction: column; +} + +.atlas-config-actions.is-compact .atlas-config-dirty-state { + display: grid; + grid-template-columns: 1fr; +} + +.atlas-config-actions.is-compact .atlas-config-status-chip { + justify-content: center; +} + +@media (max-width: 980px) { + #config-tab .action-bar, + .atlas-config-actions { + align-items: stretch; + flex-wrap: wrap; + } + + .atlas-config-dirty-state { + flex-basis: 100%; + } +} diff --git a/src/ui/styles/devtools.css b/src/ui/styles/devtools.css index 4c4892ad..c590afe2 100644 --- a/src/ui/styles/devtools.css +++ b/src/ui/styles/devtools.css @@ -4,23 +4,102 @@ */ .devtools-popout-title { - font-size: 24px; - margin-bottom: 20px; + margin-bottom: 8px; + color: #0f172a; + font-size: 1.125rem; + font-weight: 700; + letter-spacing: -0.02em; +} + +#devtools-tab.devtools-workspace { + padding: 0; + background: #ffffff; +} + +#devtools-tab.devtools-workspace .terminal-wrapper { + flex: 1 1 auto; + width: 100%; + height: 100%; + min-width: 0; + min-height: 0; + overflow: hidden; + background: #ffffff; +} + +.devtools-workspace #devtools-iframe { + width: 100%; + height: 100%; + border: 0; + background: #ffffff; +} + +.devtools-popout-card { + width: min(520px, calc(100% - 32px)); + margin: auto; + padding: 28px; + border: 1px solid #e2e8f0; + border-radius: 12px; + background: #ffffff; + box-shadow: 0 18px 45px rgba(15, 23, 42, 0.08); + color: #64748b; + font-family: var(--font-sans, "Inter", "Segoe UI", sans-serif); + font-size: 0.8125rem; + line-height: 1.55; + text-align: center; +} + +.devtools-popout-kicker { + margin-bottom: 5px; + color: #6366f1; + font-size: 0.625rem; + font-weight: 750; + letter-spacing: 0.12em; } .devtools-actions { - margin: 20px auto 10px; - display: flex; - flex-direction: column; - align-items: center; - gap: 10px; + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 8px; + margin: 20px auto 0; +} + +.devtools-actions button { + min-height: 36px; + border-radius: 8px; + font-size: 0.75rem; } .devtools-error { - color: var(--c-danger); - margin-top: 10px; + margin-top: 12px; + color: #e11d48; } #devtools-message.is-error { - color: var(--c-danger); + color: #e11d48; +} + +.devtools-workspace #devtools-message { + display: grid; + min-height: 100%; + place-items: center; + padding: 24px; + background: #f8fafc; + color: #64748b; + font-family: var(--font-mono); + font-size: 0.75rem; +} + +.devtools-workspace button:focus-visible { + outline: 2px solid #6366f1; + outline-offset: 2px; +} + +@media (max-width: 760px) { + .devtools-popout-card { + padding: 20px; + } + + .devtools-actions { + grid-template-columns: minmax(0, 1fr); + } } diff --git a/src/ui/styles/tabs/w3/_cogs.css b/src/ui/styles/tabs/w3/_cogs.css index 7cb67d74..ae9de59a 100644 --- a/src/ui/styles/tabs/w3/_cogs.css +++ b/src/ui/styles/tabs/w3/_cogs.css @@ -315,17 +315,30 @@ .cogs-cog-stat-input { width: 96px; min-width: 96px; - padding: 3px 6px; + min-height: 30px; + padding: 4px 7px; + border: 1px solid #dce2ec; + border-radius: 6px; + color: #14213d; + background: #ffffff; font-family: var(--font-mono); - font-size: 0.875rem; - background: var(--c-panel); - border: 1px solid var(--c-border); - color: var(--c-text); + font-size: 0.8125rem; + box-shadow: none; } -.cogs-cog-stat-input:focus { +.cogs-popup .cogs-cog-stat-input:focus { outline: none; - border-color: var(--c-border-strong); + border-color: #7779f4 !important; + background: #ffffff !important; + box-shadow: 0 0 0 2px rgb(119 121 244 / 14%) !important; +} + +.cogs-popup .cogs-cog-stat-input:focus-visible { + outline: none; + outline-offset: 0; + border-color: #7779f4 !important; + background: #ffffff !important; + box-shadow: 0 0 0 2px rgb(119 121 244 / 14%) !important; } .cogs-cog-stat-set-btn { diff --git a/src/ui/styles/tooltip.css b/src/ui/styles/tooltip.css index 9b0506ac..6eeb3ca6 100644 --- a/src/ui/styles/tooltip.css +++ b/src/ui/styles/tooltip.css @@ -7,17 +7,20 @@ .tooltip-fixed { position: fixed; z-index: 10000; - padding: 6px 10px; - background: var(--c-panel); - border: 1px solid var(--c-accent); - color: var(--c-text-main); - font-size: 0.875rem; - font-family: var(--font-mono); + max-width: min(320px, calc(100vw - 16px)); + padding: 8px 10px; + border: 1px solid rgba(20, 33, 61, 0.14); + border-radius: 7px; + background: #14213d; + color: #ffffff; + font-size: 0.75rem; + font-weight: 600; + font-family: var(--font-sans, "Inter", "Segoe UI", sans-serif); + letter-spacing: 0.01em; white-space: pre-wrap; - max-width: 300px; - line-height: 1.35; + line-height: 1.4; text-align: left; - box-shadow: 0 4px 12px var(--c-black-50); + box-shadow: 0 10px 24px rgba(20, 33, 61, 0.2); pointer-events: none; opacity: 0; visibility: hidden; @@ -49,3 +52,32 @@ .tooltip-fixed.tooltip-right { transform: translateY(-50%); } + +.tooltip-fixed::after { + position: absolute; + width: 8px; + height: 8px; + background: #14213d; + content: ""; + transform: rotate(45deg); +} + +.tooltip-fixed.tooltip-top::after { + bottom: -5px; + left: calc(50% - 4px); +} + +.tooltip-fixed.tooltip-bottom::after { + top: -5px; + left: calc(50% - 4px); +} + +.tooltip-fixed.tooltip-left::after { + top: calc(50% - 4px); + right: -5px; +} + +.tooltip-fixed.tooltip-right::after { + top: calc(50% - 4px); + left: -5px; +} From 46072bad82e489ef4f9dd360583325e57a849ce4 Mon Sep 17 00:00:00 2001 From: Arnold W Date: Wed, 29 Jul 2026 20:52:33 +0200 Subject: [PATCH 02/32] fix(ui): polish Atlas workspace --- README.md | 6 +- architect.md | 39 ++++++ docs/UI.png | Bin 883621 -> 101644 bytes docs/ui.md | 62 +++++----- package.json | 3 +- src/ui/components/App.js | 6 +- src/ui/components/AtlasHeader.js | 2 +- src/ui/components/CheatItem.js | 8 ++ src/ui/components/NotificationHistory.js | 71 ----------- src/ui/components/Sidebar.js | 9 -- src/ui/components/Toast.js | 3 + src/ui/components/views/Cheats.js | 1 - src/ui/components/views/Search.js | 24 +++- src/ui/components/views/search/sections.js | 67 +++++++++-- .../components/views/search/workspaceUtils.js | 25 +++- src/ui/entry/style.css | 1 - src/ui/state/constants.js | 22 ++++ src/ui/styles/_account-pages.css | 10 +- src/ui/styles/_activity-drawer.css | 16 +-- src/ui/styles/_atlas-shell.css | 36 +++--- src/ui/styles/_notificationHistory.css | 111 ------------------ src/ui/styles/_search.css | 74 ++++++++---- src/ui/styles/_world-tabs.css | 8 +- src/ui/styles/cheats.css | 64 +++++----- src/ui/styles/config.css | 14 +-- src/ui/styles/devtools.css | 2 +- src/ui/styles/toast.css | 13 +- tests/atlas-ui-compat.mjs | 78 ++++++++++++ 28 files changed, 431 insertions(+), 344 deletions(-) create mode 100644 architect.md delete mode 100644 src/ui/components/NotificationHistory.js delete mode 100644 src/ui/components/views/Cheats.js delete mode 100644 src/ui/styles/_notificationHistory.css create mode 100644 tests/atlas-ui-compat.mjs diff --git a/README.md b/README.md index 5dd91126..81e24154 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,8 @@ Need help or want to share feedback? Join the community on Discord: - **Steam/Web Injection**: Injects JavaScript into the Steam client or web session using a configurable Chromium-based browser profile. - **Web Dashboard ([VanJS](https://vanjs.org/))**: Local UI at - `http://localhost:8080` for cheats, state inspection, and DevTools. + `http://localhost:8080` with Atlas workspaces for cheats, account editing, + configuration, Search, and DevTools. - **Live State Sync**: WebSocket updates keep cheat state in sync without polling. - **Value Monitor**: Track in-game values with history in the Web UI. @@ -64,7 +65,8 @@ The recommended way to interact is via the [VanJS](https://vanjs.org/)-powered W - Toggle cheats on/off. - View active cheat status. - Modify account configs. - - Monitor specific game values (manual path or from Search). + - Save and monitor game values from Search. + - Review success/error activity without leaving the active workspace. - Access Chrome DevTools. - Apply config changes to RAM or save them to disk. diff --git a/architect.md b/architect.md new file mode 100644 index 00000000..0d35bbfb --- /dev/null +++ b/architect.md @@ -0,0 +1,39 @@ +# Atlas UI Compatibility Refactor + +## Objective + +Keep the Atlas visual migration while restoring user-facing behavior that the +previous UI already guaranteed. Remove only compatibility wrappers that no +longer own behavior. + +## Stable contracts + +1. Every `store.notify()` call produces immediate toast feedback and remains in + Activity history. +2. Search key favorites use curated defaults until the user saves a preference; + custom and deliberately empty favorite lists persist in `localStorage`. +3. Search initially selects persisted keys, then available favorites, then the + first eight available keys. +4. Cheat table rows can be selected with pointer or keyboard without changing + execution semantics. +5. Controls that cannot act are disabled or removed rather than presented as + inert buttons. +6. Atlas remains the sole implementation of the Cheats workspace; compatibility + forwarding modules and the replaced notification dropdown are not retained. + +## Boundaries + +- Preserve the current VanJS architecture, API routes, workspace IDs, storage + keys, command execution behavior, and config draft model. +- Reuse the existing Toast and Activity drawer instead of adding another + notification abstraction. +- Keep `src/ui/vendor/vanHelpers.js` outside this change because it was excluded + from the Atlas product commit and is not imported by the application. + +## Verification + +`npm run test:ui-compat` is the backward-compatibility harness. It exercises the +pure Search persistence helpers and verifies the source-level integration +contracts for Toast mounting, keyboard-selectable cheat rows, actionable header +controls, and removal of dead wrappers. The normal `npm run validate` command +also runs this harness. diff --git a/docs/UI.png b/docs/UI.png index 0718f497228dd2758d4dad32930483ddd0e2bc54..1fc620f34a564d2f6bba946ec758daaff28f5e2d 100644 GIT binary patch literal 101644 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�ER~^A<(>6{dy?i4-3z&llIoj1A-9 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 m8i8=zAJqr?yN@*1@1Tsbb43}ser87ALQ+&tr1N literal 883621 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�uG*P9{|uqQQDS+0*wiS{jD%FhcXmd?Gj6 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

7Dy5E8UakQ`obmn*f}vw)1RxS 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%0Ab~ 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 z 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

+%(9c-d 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

bZKRAMooF&`rO_X78~D^vu{LGNdZaUl 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 E0isNPbN~PV diff --git a/docs/ui.md b/docs/ui.md index 0928a443..5a1e4c84 100644 --- a/docs/ui.md +++ b/docs/ui.md @@ -6,7 +6,7 @@ How the VanJS-based UI is structured, syncs to the backend, and how to extend it - `src/ui/entry/`: HTML entry point and CSS imports. - `src/ui/components/`: UI building blocks and view containers. -- `src/ui/components/views/`: Cheats, Config, Account, Search, Monitor, DevTools tabs. +- `src/ui/components/views/`: Cheats, Config, Account, Search, and DevTools workspaces. - `src/ui/services/`: API and WebSocket clients. - `src/ui/state/`: Reactive store and constants. - `src/ui/styles/`: CSS partials (imported by `entry/style.css`). @@ -27,7 +27,7 @@ van.add(document.body, App()); `src/ui/entry/style.css` is the CSS entry. Add new partials in `src/ui/styles/` and import there. -`src/ui/components/App.js` initializes heartbeat monitoring, keyboard shortcuts, and mounts the tab content. +`src/ui/components/App.js` initializes heartbeat monitoring and keyboard shortcuts, mounts workspace content, and keeps global Toast, Activity, and update surfaces available. ## State management @@ -35,16 +35,16 @@ van.add(document.body, App()); State buckets: -- `store.app`: UI state (active tab, loading state, heartbeat, toast, view mode). +- `store.app`: UI state (active workspace, loading state, heartbeat, toast, drawers, and update state). - `store.data`: data from the backend (cheats, config, account options, cheat states, monitor values). Notable `store.app` UI flags include `configForcedPath` (focused config path from cheat gear icon) and `configDrawerOpen` (side drawer state while on Cheats). Persisted UI settings: -- Sidebar collapsed state and cheat view mode (tabs/list) are stored in `localStorage`. -- Favorites and recents are stored in `localStorage` via the Cheats view. -- Config drawer open/closed state is session-only (not persisted). +- Sidebar collapsed state is stored in `localStorage`. +- Cheat favorites, recent commands, Search key favorites, selected Search keys, and saved Search results are stored in `localStorage`. +- Config, Activity, Search key, and Search inspector drawers are session-only. Core flows: @@ -83,20 +83,18 @@ WebSocket client auto-reconnects every 10s in all runtimes. ### Cheats view -`src/ui/components/views/Cheats.js` is the main cheat explorer. +`src/ui/components/views/AtlasCheats.js` is the main cheat explorer. Features: -- Favorites and recents stored in `localStorage`. -- Quick-access section surfaces favorites and recents for one-click execution. -- Categories ordered by `CATEGORY_ORDER` in `src/ui/state/constants.js`. -- `SearchBar` filters by command value or description. -- Supports list and tab layouts (stored in `store.app.cheatsViewMode`). -- Tabs view paginates with "Load more" (50 items per page). -- List view uses lazy `

` categories, auto-expands on search. -- Parameterized cheats render inline input ("Val"); missing values block execution. -- Favorites support parameterized commands by storing full action string. -- Includes a Config drawer toggle so Cheat commands stay visible while editing Config side-by-side. +- Scope navigation covers all, active, favorite, recent, and category-filtered commands. +- The command table filters by command, description, or category and paginates at 50 rows. +- Row selection is available by pointer, Enter/Space, and table Arrow/J/K navigation. +- Execution remains separate from selection; stateful commands use switches and one-shot commands use Run. +- Parameterized commands collect their value in the inspector and block execution until it is supplied. +- Favorites and recents preserve complete parameterized command strings in `localStorage`. +- The inspector exposes command details and linked config without hiding the command table. +- Linked config can also open the shared Config drawer beside the Cheats workspace. Useful helpers: @@ -106,18 +104,19 @@ Useful helpers: ### Config view -`src/ui/components/views/Config.js` edits `startupCheats`, `cheatConfig`, and `injectorConfig`. +`src/ui/components/views/Config.js` edits `startupCheats`, `cheatConfig`, and `injectorConfig` through the shared draft in `views/config/configDraft.js`. Key behaviors: -- Builds a local `draft` via `vanX.reactive` to avoid direct edits on live config. +- Uses one reactive draft and separate RAM/disk baselines to avoid direct edits on live config. - Sub-tabs: Cheat Config, Startup Cheats, Injector Config. - Startup Cheats auto-show a separate `Value` input when a selected command has `needsParam`. - Supports category filtering and search on cheat config keys. - Uses `ConfigNode` to recursively render object trees. - Uses forced-path mode when coming from Cheats gear icon, with "SHOWING" banner. - Can run as a right-side drawer while Cheats stays open; close from drawer header or toggle button in Cheats. -- Saves apply to RAM (`/api/config/update`) or persist to disk (`/api/config/save`). +- Saves explicitly apply the cheat config to RAM (`/api/config/update`) or persist the full draft to disk (`/api/config/save`). +- `Ctrl+S` invokes the active workspace's disk-save handler when one is registered. - Injector config shows "restart required" warning banner. Function values (like `(t) => t * 2`) are edited through `FunctionInput`: @@ -148,25 +147,26 @@ Save behavior: Features: - **Key Whitelist**: Select top-level game attribute categories to search (e.g., `PlayerDATABASE`, `SkillLevels`). -- **Favorites**: Quick-select common data categories. +- **Favorites**: Curated defaults and user-edited key favorites persist independently; an intentionally empty list stays empty. - **Value Matching**: - Supports strings (case-insensitive contains). - Supports numbers (exact or rounding tolerance for floats). - Supports ranges (e.g., `100-200`). - Supports `true`, `false`, `null`, `undefined`. -- **Path Copying**: Clicking a result copies the full Haxe access path to clipboard. -- **Send to Monitor**: The eye icon subscribes the path in the Monitor view. +- **Result inspector**: Selecting a result exposes its path, value editor, and monitor state. +- **Path Copying**: Copy actions produce the full Haxe access path and immediate toast feedback. +- **Saved monitors**: Saved results can subscribe or pause their live monitor in the Search inspector. - **Performance**: "Load more" pattern handles large result sets without freezing. -### Monitor view +### Activity drawer -`src/ui/components/views/Monitor.js` tracks values over WebSocket and displays history. +`src/ui/components/ActivityDrawer.js` keeps notifications and active value monitors available from every workspace. Features: -- Add watchers by entering a path (e.g., `gga.GemsOwned`) or sending a Search result. -- Shows current value and last 10 updates per watch. -- Remove watchers with Unwatch action. +- Activity lists the same success and error events shown immediately by Toast. +- Monitors show current values and recent updates received over WebSocket. +- Monitor subscriptions are owned by saved Search results and can be paused or removed there. ### DevTools view @@ -180,10 +180,12 @@ Features: Common components in `src/ui/components/`: -- `Sidebar`: tab navigation and quick actions. +- `AtlasHeader` + `Sidebar`: global status, workspace navigation, and workspace-specific context. +- `WorkspaceContext`: contextual navigation and the active workspace save contract. +- `ActivityDrawer`: notification history and live monitor output. - `SearchBar`: shared filter input used by Cheats and Account. - `ConfigNode`: recursive config renderer with tooltips. -- `Toast` + `Tooltip`: global UI helpers. +- `Toast` + `Tooltip`: global immediate feedback helpers. Typical component pattern: diff --git a/package.json b/package.json index 945dc986..e7e2c3c2 100644 --- a/package.json +++ b/package.json @@ -8,9 +8,10 @@ "start": "node src/main.js", "build:cheats": "rollup -c", "watch:cheats": "rollup -c --watch", + "test:ui-compat": "node --test tests/atlas-ui-compat.mjs", "format": "prettier --write .", "format:check": "prettier --check .", - "validate": "npm run build:cheats && node --check cheats.js config.js && npx eslint . && node -e \"require('./src/ui/config/optionsAccountSchema.json')\"", + "validate": "npm run build:cheats && npm run test:ui-compat && node --check cheats.js config.js && npx eslint . && node -e \"require('./src/ui/config/optionsAccountSchema.json')\"", "build": "npm run build:cheats && pkg . -t node18-win-x64 --compress Gzip --output InjectCheatsUI.exe", "build-unix": "npm run build:cheats && pkg . -t node18-linux-x64 --compress Gzip --output InjectCheatsUI-linux", "build-macos-x64": "npm run build:cheats && pkg . -t node18-macos-x64 --compress Gzip --output InjectCheatsUI-macos-x64", diff --git a/src/ui/components/App.js b/src/ui/components/App.js index 72c5012f..d7fdf33e 100644 --- a/src/ui/components/App.js +++ b/src/ui/components/App.js @@ -7,9 +7,10 @@ import { Sidebar, SidebarBackdrop } from "./Sidebar.js"; import { AtlasHeader } from "./AtlasHeader.js"; import { ActivityDrawer } from "./ActivityDrawer.js"; import { invokeWorkspaceSave } from "./WorkspaceContext.js"; +import { Toast } from "./Toast.js"; import { TooltipContainer } from "./Tooltip.js"; import { UpdateModal } from "./UpdateModal.js"; -import { Cheats } from "./views/Cheats.js"; +import { AtlasCheats } from "./views/AtlasCheats.js"; import { Config } from "./views/Config.js"; import { Account } from "./views/Account.js"; import { DevTools } from "./views/DevTools.js"; @@ -18,7 +19,7 @@ import { Search } from "./views/Search.js"; const { div, main } = van.tags; const viewFactories = { - [VIEWS.CHEATS.id]: Cheats, + [VIEWS.CHEATS.id]: AtlasCheats, [VIEWS.CONFIG.id]: Config, [VIEWS.ACCOUNT.id]: Account, [VIEWS.DEVTOOLS.id]: DevTools, @@ -106,6 +107,7 @@ export const App = () => { main({ class: "viewport atlas-canvas" }, tabContent, ActivityDrawer()), SidebarBackdrop() ), + Toast(), UpdateModal(), TooltipContainer() ); diff --git a/src/ui/components/AtlasHeader.js b/src/ui/components/AtlasHeader.js index 4aa35e0c..c0eb0511 100644 --- a/src/ui/components/AtlasHeader.js +++ b/src/ui/components/AtlasHeader.js @@ -64,7 +64,7 @@ export const AtlasHeader = () => onclick: () => { if (store.app.updateInfo?.updateAvailable) store.openUpdateModal(); }, - "aria-disabled": () => String(!store.app.updateInfo?.updateAvailable), + disabled: () => !store.app.updateInfo?.updateAvailable, title: () => store.app.updateInfo?.updateAvailable ? "Update available" diff --git a/src/ui/components/CheatItem.js b/src/ui/components/CheatItem.js index 3e151e5c..3da93f9f 100644 --- a/src/ui/components/CheatItem.js +++ b/src/ui/components/CheatItem.js @@ -96,9 +96,17 @@ export const CheatItem = ({ getStateInfo(cheat.value).active ? "is-active" : "" } ${feedback.val ? `feedback-${feedback.val}` : ""}`, role: "row", + tabindex: "0", "aria-selected": () => String(selected()), + "aria-label": `${entry.action || cheat.value}: ${cheat.message || "No description provided"}`, "data-cheat-row": entry.id, onclick: () => onSelect(entry), + onkeydown: (event) => { + if (event.target !== event.currentTarget) return; + if (event.key !== "Enter" && event.key !== " ") return; + event.preventDefault(); + onSelect(entry); + }, }, div( { class: "atlas-cheat-command-cell", role: "cell" }, diff --git a/src/ui/components/NotificationHistory.js b/src/ui/components/NotificationHistory.js deleted file mode 100644 index 22842fff..00000000 --- a/src/ui/components/NotificationHistory.js +++ /dev/null @@ -1,71 +0,0 @@ -import van from "../vendor/van-1.6.0.js"; -import store from "../state/store.js"; -import { Icons } from "../assets/icons.js"; - -const { div, button, span } = van.tags; - -const formatTime = (timestamp) => { - const date = new Date(timestamp); - return date.toLocaleTimeString("en-US", { - hour12: false, - hour: "2-digit", - minute: "2-digit", - second: "2-digit", - }); -}; - -export const NotificationHistory = () => { - const isOpen = van.state(false); - - const toggleDropdown = (e) => { - e.stopPropagation(); - isOpen.val = !isOpen.val; - }; - - const handleClickOutside = (e) => { - if (isOpen.val && !e.target.closest(".notification-history")) { - isOpen.val = false; - } - }; - - document.addEventListener("click", handleClickOutside); - - return div( - { class: "notification-history" }, - button( - { - class: "notification-history-toggle", - onclick: toggleDropdown, - "aria-label": "Notification history", - title: "Notification history", - }, - Icons.Bell() - ), - () => { - if (!isOpen.val) return span({ style: "display: none;" }); - - const history = store.app.notificationHistory; - - if (history.length === 0) { - return div( - { class: "notification-history-dropdown" }, - div({ class: "notification-history-empty" }, "No notifications yet") - ); - } - - return div( - { class: "notification-history-dropdown" }, - ...history.map((notification) => - div( - { - class: `notification-history-item ${notification.type === "error" ? "is-error" : "is-success"}`, - }, - span({ class: "notification-history-indicator" }), - span({ class: "notification-history-message" }, notification.message), - span({ class: "notification-history-time" }, formatTime(notification.id)) - ) - ) - ); - } - ); -}; diff --git a/src/ui/components/Sidebar.js b/src/ui/components/Sidebar.js index e832d311..b440c68f 100644 --- a/src/ui/components/Sidebar.js +++ b/src/ui/components/Sidebar.js @@ -100,15 +100,6 @@ export const Sidebar = () => { ), div( { class: "atlas-sidebar-controls" }, - button( - { - class: "atlas-shortcuts-button", - type: "button", - title: "Shortcuts: 1-5 switch workspaces, / focuses search, Ctrl+S saves, Esc closes overlays", - "aria-label": "Keyboard shortcuts", - }, - Icons.Keyboard() - ), button( { class: "sidebar-toggle", diff --git a/src/ui/components/Toast.js b/src/ui/components/Toast.js index 832cbcba..3ee9a33a 100644 --- a/src/ui/components/Toast.js +++ b/src/ui/components/Toast.js @@ -30,6 +30,9 @@ export const Toast = () => { return div( { id: "status-message", + role: "status", + "aria-live": "polite", + "aria-atomic": "true", class: () => { const typeClass = store.app.toast.type === "error" ? "status-error" : "status-success"; const fadeClass = isFading.val ? "fade-out" : ""; diff --git a/src/ui/components/views/Cheats.js b/src/ui/components/views/Cheats.js deleted file mode 100644 index d7e9eb7a..00000000 --- a/src/ui/components/views/Cheats.js +++ /dev/null @@ -1 +0,0 @@ -export { AtlasCheats as Cheats } from "./AtlasCheats.js"; diff --git a/src/ui/components/views/Search.js b/src/ui/components/views/Search.js index 667d8820..581c1d3b 100644 --- a/src/ui/components/views/Search.js +++ b/src/ui/components/views/Search.js @@ -1,6 +1,7 @@ import van from "../../vendor/van-1.6.0.js"; import vanX from "../../vendor/van-x-0.6.3.js"; import store from "../../state/store.js"; +import { FAVORITE_KEYS } from "../../state/constants.js"; import { detectQueryType } from "../../utils/index.js"; import { NEW_SCAN_TYPES, @@ -27,6 +28,8 @@ import { } from "./search/valueUtils.js"; import { uniqueStrings, + loadLocalFavoriteKeys, + saveLocalFavoriteKeys, normalizeSavedEntry, loadSearchWorkspace, buildSearchWorkspace, @@ -41,12 +44,14 @@ const { div, button, span } = van.tags; export const Search = () => { const restoredWorkspace = loadSearchWorkspace() || {}; + const localFavoriteKeys = loadLocalFavoriteKeys(); const inspectorOverlayQuery = window.matchMedia("(max-width: 1279px)"); const keysOverlayQuery = window.matchMedia("(max-width: 1023px)"); const initialSearchQuery = ""; const ui = vanX.reactive({ allKeys: [], + favoriteKeys: uniqueStrings(localFavoriteKeys ?? FAVORITE_KEYS), selectedKeys: uniqueStrings(restoredWorkspace.selectedKeys), searchQuery: initialSearchQuery, searchQuery2: "", @@ -101,8 +106,11 @@ export const Search = () => { } }); + const getValidFavorites = () => uniqueStrings(ui.favoriteKeys).filter((key) => ui.allKeys.includes(key)); + const getFilteredKeys = () => { - let keys = ui.allKeys; + const favorites = new Set(getValidFavorites()); + let keys = ui.allKeys.filter((key) => !favorites.has(key)); if (ui.allKeysFilter) { const filter = ui.allKeysFilter.toLowerCase(); keys = keys.filter((k) => k.toLowerCase().includes(filter)); @@ -225,6 +233,10 @@ export const Search = () => { saveSearchWorkspace(buildSearchWorkspace(ui)); }); + van.derive(() => { + saveLocalFavoriteKeys(ui.favoriteKeys); + }); + van.derive(() => { ui.savedResults; store.data.monitorValues; @@ -284,6 +296,7 @@ export const Search = () => { }; const handlers = { + getValidFavorites, getFilteredKeys, areAllSelected, getFilteredResults, @@ -348,6 +361,13 @@ export const Search = () => { ui.selectedKeys = []; }, + isFavoriteKey: (keyName) => ui.favoriteKeys.includes(keyName), + toggleFavoriteKey: (keyName) => { + ui.favoriteKeys = ui.favoriteKeys.includes(keyName) + ? ui.favoriteKeys.filter((key) => key !== keyName) + : [...ui.favoriteKeys, keyName]; + }, + handleResultsFilterInput: (e) => { const value = e.target.value; @@ -758,7 +778,7 @@ export const Search = () => { try { const allKeys = await store.fetchGgaKeys(); ui.allKeys = allKeys; - ui.selectedKeys = pickInitialSelectedKeys(allKeys, restoredWorkspace.selectedKeys); + ui.selectedKeys = pickInitialSelectedKeys(allKeys, restoredWorkspace.selectedKeys, getValidFavorites()); } catch (err) { ui.error = err.message || "Failed to load GGA keys"; } finally { diff --git a/src/ui/components/views/search/sections.js b/src/ui/components/views/search/sections.js index fcee9da3..e0559281 100644 --- a/src/ui/components/views/search/sections.js +++ b/src/ui/components/views/search/sections.js @@ -23,17 +23,33 @@ import { createStaticRowReconciler } from "../account/accountShared.js"; const { div, input, button, span, label, select, option, aside } = van.tags; -const KeyCheckbox = ({ keyName, selectedKeys, onChange }) => { +const KeyCheckbox = ({ keyName, selectedKeys, onChange, isFavorite, onToggleFavorite }) => { const isChecked = () => selectedKeys.includes(keyName); + const favorite = () => isFavorite(keyName); - return label( + return div( { class: () => `key-checkbox ${isChecked() ? "checked" : ""}`, title: keyName }, - input({ - type: "checkbox", - checked: isChecked, - onchange: (e) => onChange(keyName, e.target.checked), - }), - span({ class: "key-checkbox-label" }, keyName) + label( + { class: "key-checkbox-select" }, + input({ + type: "checkbox", + checked: isChecked, + onchange: (e) => onChange(keyName, e.target.checked), + }), + span({ class: "key-checkbox-label" }, keyName) + ), + button( + { + type: "button", + class: () => `key-favorite-btn ${favorite() ? "active" : ""}`, + title: () => (favorite() ? "Remove from favorites" : "Add to favorites"), + "aria-label": () => + `${favorite() ? "Remove" : "Add"} ${keyName} ${favorite() ? "from" : "to"} favorites`, + "aria-pressed": () => String(favorite()), + onclick: () => onToggleFavorite(keyName), + }, + Icons.Star() + ) ); }; @@ -215,6 +231,15 @@ export const KeysSection = ({ ui, handlers }) => }, () => (handlers.areAllSelected() ? "NONE" : "ALL") ), + button( + { + class: "btn-secondary btn-small", + onclick: () => handlers.selectKeys(handlers.getValidFavorites()), + disabled: () => handlers.getValidFavorites().length === 0, + title: "Select favorite keys", + }, + "FAV" + ), button( { class: "btn-secondary btn-small", onclick: handlers.clearSelection, title: "Clear selection" }, "CLEAR" @@ -234,7 +259,29 @@ export const KeysSection = ({ ui, handlers }) => { class: "keys-content scroll-container" }, div( { class: "keys-group" }, - div({ class: "keys-group-header" }, () => `ALL KEYS (${handlers.getFilteredKeys().length})`), + div({ class: "keys-group-header" }, () => `FAVORITES (${handlers.getValidFavorites().length})`), + () => { + const favorites = handlers.getValidFavorites(); + if (ui.isLoading) return div({ class: "keys-loading" }, "Loading"); + if (favorites.length === 0) return div({ class: "keys-loading" }, "No favorite keys"); + + return div( + { class: "keys-grid" }, + ...favorites.map((key) => + KeyCheckbox({ + keyName: key, + selectedKeys: ui.selectedKeys, + onChange: handlers.handleKeyChange, + isFavorite: handlers.isFavoriteKey, + onToggleFavorite: handlers.toggleFavoriteKey, + }) + ) + ); + } + ), + div( + { class: "keys-group" }, + div({ class: "keys-group-header" }, () => `OTHER KEYS (${handlers.getFilteredKeys().length})`), div( { class: "keys-filter" }, input({ @@ -258,6 +305,8 @@ export const KeysSection = ({ ui, handlers }) => keyName: key, selectedKeys: ui.selectedKeys, onChange: handlers.handleKeyChange, + isFavorite: handlers.isFavoriteKey, + onToggleFavorite: handlers.toggleFavoriteKey, }) ) ); diff --git a/src/ui/components/views/search/workspaceUtils.js b/src/ui/components/views/search/workspaceUtils.js index ebc1cb14..ba2d1b36 100644 --- a/src/ui/components/views/search/workspaceUtils.js +++ b/src/ui/components/views/search/workspaceUtils.js @@ -1,4 +1,5 @@ const SEARCH_WORKSPACE_STORAGE_KEY = "searchWorkspace"; +const SEARCH_FAVORITE_KEYS_STORAGE_KEY = "searchFavoriteKeys"; const SEARCH_WORKSPACE_VERSION = 2; const DEFAULT_SELECTED_KEYS_LIMIT = 8; const entryFilterTextCache = new WeakMap(); @@ -8,6 +9,25 @@ export function uniqueStrings(items) { return [...new Set((items || []).filter((item) => typeof item === "string" && item))]; } +export function loadLocalFavoriteKeys() { + try { + const raw = localStorage.getItem(SEARCH_FAVORITE_KEYS_STORAGE_KEY); + if (raw === null) return null; + return uniqueStrings(JSON.parse(raw)); + } catch (err) { + console.error("[SearchWorkspace] Failed to load favorite keys:", err); + return null; + } +} + +export function saveLocalFavoriteKeys(keys) { + try { + localStorage.setItem(SEARCH_FAVORITE_KEYS_STORAGE_KEY, JSON.stringify(uniqueStrings(keys))); + } catch (err) { + console.error("[SearchWorkspace] Failed to save favorite keys:", err); + } +} + export function normalizeSavedEntry(entry) { if (!entry || typeof entry !== "object" || typeof entry.path !== "string" || !entry.path) { return null; @@ -91,11 +111,14 @@ export function saveSearchWorkspace(workspace) { } } -export function pickInitialSelectedKeys(allKeys, persistedKeys) { +export function pickInitialSelectedKeys(allKeys, persistedKeys, favoriteKeys = []) { const available = new Set(allKeys || []); const fromPersisted = uniqueStrings(persistedKeys).filter((key) => available.has(key)); if (fromPersisted.length > 0) return fromPersisted; + const fromFavorites = uniqueStrings(favoriteKeys).filter((key) => available.has(key)); + if (fromFavorites.length > 0) return fromFavorites.slice(0, DEFAULT_SELECTED_KEYS_LIMIT); + return (allKeys || []).slice(0, DEFAULT_SELECTED_KEYS_LIMIT); } diff --git a/src/ui/entry/style.css b/src/ui/entry/style.css index 6ba14012..7da28e71 100644 --- a/src/ui/entry/style.css +++ b/src/ui/entry/style.css @@ -32,7 +32,6 @@ @import url("../styles/startup-cheats.css"); @import url("../styles/modal.css"); @import url("../styles/toast.css"); -@import url("../styles/_notificationHistory.css"); @import url("../styles/tooltip.css"); @import url("../styles/number-input.css"); @import url("../styles/function-input.css"); diff --git a/src/ui/state/constants.js b/src/ui/state/constants.js index b542d40c..e37d5f16 100644 --- a/src/ui/state/constants.js +++ b/src/ui/state/constants.js @@ -55,3 +55,25 @@ export const CATEGORY_ORDER = [ "w7", "minigame", ]; + +export const FAVORITE_KEYS = [ + "OptionsListAccount", + "OptionsList", + "PlayerDATABASE", + "SkillLevels", + "SkillLevelsMAX", + "BundlesReceived", + "ChestQuantity", + "CurrenciesOwned", + "CustomLists", + "Exp0", + "GemItemsPurchased", + "ItemQuantity", + "KillsLeft2Advance", + "Lv0", + "Spelunk", + "Arcane", + "Bubba", + "Compass", + "Grimoire", +]; diff --git a/src/ui/styles/_account-pages.css b/src/ui/styles/_account-pages.css index 1872e9d3..f698efba 100644 --- a/src/ui/styles/_account-pages.css +++ b/src/ui/styles/_account-pages.css @@ -58,7 +58,7 @@ #options-account-tab .account-section__title { color: #4f46e5; - font-size: 0.6875rem; + font-size: 0.75rem; letter-spacing: 0.08em; } @@ -76,7 +76,7 @@ } #options-account-tab .account-row .number-input-btn { - height: 28px; + height: 32px; padding-inline: 8px; } @@ -546,7 +546,7 @@ .account-btn { padding: 0 12px; - height: 30px; + height: 32px; font-size: 0.875rem; font-family: var(--font-display); letter-spacing: 0.04em; @@ -688,7 +688,7 @@ .tier-card__select { padding: 0 6px; - height: 28px; + height: 32px; width: 100%; font-size: 0.875rem; font-family: var(--font-display); @@ -751,7 +751,7 @@ .account-setall-row__select { padding: 0 8px; - height: 30px; + height: 32px; font-size: 0.875rem; font-family: var(--font-display); } diff --git a/src/ui/styles/_activity-drawer.css b/src/ui/styles/_activity-drawer.css index 26f79a41..3ad3ebd8 100644 --- a/src/ui/styles/_activity-drawer.css +++ b/src/ui/styles/_activity-drawer.css @@ -33,13 +33,13 @@ display: inline-flex; align-items: center; justify-content: center; - height: 30px; + height: 32px; color: #65738b; background: transparent; border: 0; border-radius: 6px; font-family: inherit; - font-size: 11px; + font-size: 12px; cursor: pointer; } @@ -63,11 +63,11 @@ margin-left: auto; color: #8a96ab; font-family: var(--font-mono); - font-size: 9px; + font-size: 12px; } .atlas-drawer-close { - width: 30px; + width: 32px; margin-left: 8px; } @@ -101,7 +101,7 @@ padding: 24px; color: #7f8aa3; font-family: var(--font-mono); - font-size: 11px; + font-size: 12px; text-align: center; } @@ -112,7 +112,7 @@ border: 1px solid rgba(142, 143, 255, 0.25); border-radius: 5px; font-family: inherit; - font-size: 10px; + font-size: 12px; cursor: pointer; } @@ -126,10 +126,10 @@ .atlas-monitor-row { display: grid; align-items: baseline; - min-height: 25px; + min-height: 32px; border-bottom: 1px solid rgba(255, 255, 255, 0.035); font-family: var(--font-mono); - font-size: 10px; + font-size: 12px; } .atlas-activity-row { diff --git a/src/ui/styles/_atlas-shell.css b/src/ui/styles/_atlas-shell.css index f943e358..6fed3f3f 100644 --- a/src/ui/styles/_atlas-shell.css +++ b/src/ui/styles/_atlas-shell.css @@ -130,7 +130,7 @@ body { overflow: hidden; color: #8f99ae; font-family: var(--font-mono); - font-size: 11px; + font-size: 12px; white-space: nowrap; } @@ -156,11 +156,11 @@ body { display: inline-flex; align-items: center; gap: 6px; - height: 30px; + height: 32px; padding: 0 9px; border: 1px solid #293043; border-radius: 7px; - font-size: 11px; + font-size: 12px; font-weight: 600; white-space: nowrap; } @@ -201,14 +201,14 @@ body { align-items: center; justify-content: center; gap: 6px; - height: 30px; + height: 32px; padding: 0 9px; color: #c8cede; background: transparent; border: 1px solid #293043; border-radius: 7px; font-family: inherit; - font-size: 11px; + font-size: 12px; font-weight: 600; cursor: pointer; } @@ -226,8 +226,9 @@ body { height: 14px; } -.atlas-version[aria-disabled="true"] { +.atlas-version:disabled { cursor: default; + opacity: 0.72; } .atlas-update-dot { @@ -245,7 +246,7 @@ body { background: #6265ec; border-radius: 8px; font-family: var(--font-mono); - font-size: 9px; + font-size: 12px; line-height: 16px; text-align: center; } @@ -342,7 +343,7 @@ body { .atlas-sidebar-section-label, .atlas-context-heading { color: var(--atlas-text-soft); - font-size: 10px; + font-size: 12px; font-weight: 700; letter-spacing: 0.09em; text-transform: uppercase; @@ -403,7 +404,7 @@ body { margin-left: auto; color: #a0aabc; font-family: var(--font-mono); - font-size: 9px; + font-size: 12px; } .atlas-sidebar-divider { @@ -435,7 +436,7 @@ body { .atlas-context-empty { padding: 7px 8px; color: var(--atlas-text-soft); - font-size: 11px; + font-size: 12px; line-height: 1.45; } @@ -451,7 +452,6 @@ body { margin-top: 5px; } -.atlas-shortcuts-button, .atlas-sidebar .sidebar-toggle { display: inline-flex; align-items: center; @@ -466,26 +466,20 @@ body { cursor: pointer; } -.atlas-shortcuts-button { - flex: 0 0 32px; -} - .atlas-sidebar .sidebar-toggle { flex: 1 1 auto; gap: 7px; width: auto; font-family: inherit; - font-size: 11px; + font-size: 12px; } -.atlas-shortcuts-button:hover, .atlas-sidebar .sidebar-toggle:hover { color: var(--atlas-accent); background: var(--atlas-accent-soft); border-color: #d6d7fb; } -.atlas-shortcuts-button svg, .atlas-sidebar .sidebar-toggle svg { width: 14px; height: 14px; @@ -495,8 +489,7 @@ body { .atlas-sidebar:is(.sidebar-collapsed, .is-responsive-rail) .atlas-sidebar-divider, .atlas-sidebar:is(.sidebar-collapsed, .is-responsive-rail) .atlas-context-slot, .atlas-sidebar:is(.sidebar-collapsed, .is-responsive-rail) .atlas-nav-shortcut, -.atlas-sidebar:is(.sidebar-collapsed, .is-responsive-rail) .tab-label, -.atlas-sidebar:is(.sidebar-collapsed, .is-responsive-rail) .atlas-shortcuts-button { +.atlas-sidebar:is(.sidebar-collapsed, .is-responsive-rail) .tab-label { display: none; } @@ -570,8 +563,7 @@ body { .atlas-sidebar.sidebar-collapsed .atlas-sidebar-divider, .atlas-sidebar.sidebar-collapsed .atlas-context-slot, .atlas-sidebar.sidebar-collapsed .atlas-nav-shortcut, - .atlas-sidebar.sidebar-collapsed .tab-label, - .atlas-sidebar.sidebar-collapsed .atlas-shortcuts-button { + .atlas-sidebar.sidebar-collapsed .tab-label { display: initial; } diff --git a/src/ui/styles/_notificationHistory.css b/src/ui/styles/_notificationHistory.css deleted file mode 100644 index 929a9050..00000000 --- a/src/ui/styles/_notificationHistory.css +++ /dev/null @@ -1,111 +0,0 @@ -/** - * Notification History Dropdown - */ - -.notification-history { - position: relative; - display: flex; - align-items: center; - margin-right: 10px; - transition: - opacity 0.2s ease, - max-width 0.2s ease; -} - -.notification-history-toggle { - background: transparent; - border: none; - color: var(--c-text-muted); - cursor: pointer; - padding: 6px; - display: flex; - align-items: center; - justify-content: center; - border-radius: 4px; - transition: - color 0.2s ease, - background 0.2s ease; -} - -.notification-history-toggle:hover { - color: var(--c-accent); - background: var(--c-warning-10); -} - -.notification-history-toggle svg { - width: 20px; - height: 20px; -} - -.notification-history-dropdown { - position: absolute; - top: calc(100% + 12px); - right: -100px; - min-width: 300px; - max-width: 350px; - background: var(--c-panel-98); - border: 1px solid var(--c-border); - border-radius: 6px; - box-shadow: 0 10px 40px var(--c-black-60); - z-index: 9999; - max-height: 400px; - overflow-y: auto; -} - -.notification-history-empty { - padding: 20px; - text-align: center; - color: var(--c-text-muted); - font-family: var(--font-mono); - font-size: 0.875rem; -} - -.notification-history-item { - display: flex; - align-items: flex-start; - gap: 10px; - padding: 10px 12px; - border-bottom: 1px solid var(--c-border); - font-family: var(--font-mono); - font-size: 0.875rem; -} - -.notification-history-item:last-child { - border-bottom: none; -} - -.notification-history-indicator { - flex-shrink: 0; - width: 8px; - height: 8px; - border-radius: 50%; - margin-top: 4px; -} - -.notification-history-item.is-success .notification-history-indicator { - background: var(--c-success); - box-shadow: 0 0 6px var(--c-success); -} - -.notification-history-item.is-error .notification-history-indicator { - background: var(--c-danger); - box-shadow: 0 0 6px var(--c-danger); -} - -.notification-history-message { - flex: 1; - color: var(--c-text-main); - word-break: break-word; - line-height: 1.4; -} - -.notification-history-item.is-error .notification-history-message { - color: var(--c-danger-soft-text); -} - -.notification-history-time { - flex-shrink: 0; - color: var(--c-text-muted); - font-size: 0.875rem; - opacity: 0.7; -} diff --git a/src/ui/styles/_search.css b/src/ui/styles/_search.css index 59eecd61..7923621a 100644 --- a/src/ui/styles/_search.css +++ b/src/ui/styles/_search.css @@ -125,11 +125,43 @@ position: relative; padding: 0.25rem 0.5rem; border-radius: var(--radius-sm); - cursor: pointer; transition: background-color 0.15s ease; font-size: 0.875rem; } +.key-checkbox-select { + display: flex; + align-items: center; + min-width: 0; + flex: 1 1 auto; + gap: 0.35rem; + cursor: pointer; +} + +.key-favorite-btn { + display: inline-flex; + align-items: center; + justify-content: center; + flex: 0 0 32px; + width: 32px; + height: 32px; + padding: 0; + border: 0; + color: #94a3b8; + background: transparent; +} + +.key-favorite-btn:hover, +.key-favorite-btn.active { + color: #d58a08; + background: #fff7df; +} + +.key-favorite-btn .icon-base { + width: 14px; + height: 14px; +} + .key-checkbox:hover { background: var(--c-panel-hover); } @@ -741,7 +773,7 @@ margin-left: 0; width: 100%; justify-content: flex-end; - min-height: 28px; + min-height: 32px; } } @@ -819,7 +851,7 @@ #search-tab .section-title { color: #64748b; - font-size: 0.6875rem; + font-size: 0.75rem; font-weight: 700; letter-spacing: 0.08em; } @@ -859,12 +891,12 @@ #search-tab .keys-group-header { color: #4f46e5; - font-size: 0.6875rem; + font-size: 0.75rem; letter-spacing: 0.08em; } #search-tab .key-checkbox { - min-height: 30px; + min-height: 36px; border-radius: 6px; color: #334155; font-size: 0.75rem; @@ -918,7 +950,7 @@ #search-tab .result-path, #search-tab .result-value, #search-tab .result-equals { - font-size: 0.71875rem; + font-size: 0.75rem; } #search-tab .result-value.type-number, @@ -932,8 +964,8 @@ } #search-tab .result-action-btn { - width: 26px; - min-height: 26px; + width: 32px; + min-height: 32px; border-radius: 5px; color: #64748b; } @@ -978,7 +1010,7 @@ #search-tab .saved-result-item .result-actions { width: 100%; - min-height: 28px; + min-height: 32px; justify-content: flex-end; margin-left: 0; } @@ -998,7 +1030,7 @@ .search-inspector-toggle, .search-keys-close, .search-inspector-close { - min-height: 30px; + min-height: 32px; border: 1px solid #e2e8f0; border-radius: 7px; background: #ffffff; @@ -1026,12 +1058,12 @@ background: #eef2ff; color: #4f46e5; font-family: var(--font-mono); - font-size: 0.625rem; + font-size: 0.75rem; } .search-keys-close { display: none; - width: 30px; + width: 32px; align-items: center; justify-content: center; padding: 0; @@ -1069,7 +1101,7 @@ .search-inspector-tab { display: inline-flex; - min-height: 30px; + min-height: 32px; align-items: center; gap: 6px; padding: 5px 9px; @@ -1078,7 +1110,7 @@ background: transparent; color: #64748b; cursor: pointer; - font-size: 0.71875rem; + font-size: 0.75rem; font-weight: 600; } @@ -1094,7 +1126,7 @@ .search-inspector-close { display: none; - width: 30px; + width: 32px; align-items: center; justify-content: center; padding: 0; @@ -1141,7 +1173,7 @@ .selected-result-kicker, .selected-result-label { color: #94a3b8; - font-size: 0.625rem; + font-size: 0.75rem; font-weight: 700; letter-spacing: 0.1em; } @@ -1167,7 +1199,7 @@ padding: 7px 0; border-bottom: 1px solid #f1f5f9; color: #64748b; - font-size: 0.71875rem; + font-size: 0.75rem; } .selected-result-meta > div > span:last-child { @@ -1207,7 +1239,7 @@ .selected-result-history-empty { color: #94a3b8; - font-size: 0.71875rem; + font-size: 0.75rem; line-height: 1.45; } @@ -1228,7 +1260,7 @@ background: #f1f5f9; color: #64748b; font-family: var(--font-mono); - font-size: 0.625rem; + font-size: 0.75rem; white-space: nowrap; } @@ -1251,7 +1283,7 @@ align-items: center; justify-content: center; gap: 6px; - font-size: 0.71875rem; + font-size: 0.75rem; } .selected-result-actions .icon-base { @@ -1417,7 +1449,7 @@ #search-tab .search-result-item .result-actions { width: 100%; - min-height: 28px; + min-height: 32px; justify-content: flex-end; } } diff --git a/src/ui/styles/_world-tabs.css b/src/ui/styles/_world-tabs.css index 223016ee..656ba1f6 100644 --- a/src/ui/styles/_world-tabs.css +++ b/src/ui/styles/_world-tabs.css @@ -371,7 +371,7 @@ .account-root-nav .world-tab-btn-num { display: inline-grid; - width: 25px; + width: 36px; height: 20px; flex: 0 0 25px; place-items: center; @@ -379,7 +379,7 @@ background: color-mix(in srgb, var(--world-color) 14%, #ffffff); color: var(--world-color); font-family: var(--font-mono); - font-size: 0.625rem; + font-size: 0.75rem; } .account-sub-tab-content { @@ -401,14 +401,14 @@ #options-account-tab .account-page-nav .account-sub-tab-btn, #options-account-tab .account-nested-sub-nav .account-sub-tab-btn { bottom: 0; - min-height: 30px; + min-height: 32px; padding: 6px 10px; border: 0; border-radius: 6px; background: transparent; color: #64748b; font-family: var(--font-display); - font-size: 0.6875rem; + font-size: 0.75rem; font-weight: 600; letter-spacing: 0.025em; } diff --git a/src/ui/styles/cheats.css b/src/ui/styles/cheats.css index bd4d8815..ff6640d6 100644 --- a/src/ui/styles/cheats.css +++ b/src/ui/styles/cheats.css @@ -93,7 +93,7 @@ .atlas-tree-heading { margin: 0 8px 6px; color: #8795b1; - font-size: 0.68rem; + font-size: 0.75rem; font-weight: 750; letter-spacing: 0.08em; } @@ -156,7 +156,7 @@ .atlas-scope-count { color: #94a0b7; font-family: var(--font-mono); - font-size: 0.67rem; + font-size: 0.75rem; } .atlas-category-scopes .atlas-scope-button { @@ -262,7 +262,7 @@ flex: none; color: #8290ad; font-family: var(--font-mono); - font-size: 0.65rem; + font-size: 0.75rem; } .atlas-cheat-pagination { @@ -272,15 +272,15 @@ gap: 5px; color: #8290ad; font-family: var(--font-mono); - font-size: 0.65rem; + font-size: 0.75rem; } .atlas-cheat-pagination button { display: inline-flex; align-items: center; justify-content: center; - width: 26px; - height: 26px; + width: 32px; + height: 32px; padding: 0; border: 1px solid #d4dce9; border-radius: 6px; @@ -321,12 +321,12 @@ } .atlas-cheat-table-head { - min-height: 28px; + min-height: 32px; padding: 0 12px; border-bottom: 1px solid #dce3ef; color: #8a98b3; background: #f7f9fd; - font-size: 0.63rem; + font-size: 0.75rem; font-weight: 700; letter-spacing: 0.05em; text-transform: uppercase; @@ -355,11 +355,11 @@ .atlas-cheat-row { position: relative; - min-height: 42px; + min-height: 52px; padding: 0 12px; border-bottom: 1px solid #e8edf5; cursor: default; - font-size: 0.75rem; + font-size: 0.8125rem; transition: background 100ms ease; } @@ -419,11 +419,17 @@ .atlas-cheat-saved-value { color: #7c8ba8; - font-size: 0.63rem; + font-size: 0.75rem; } .atlas-cheat-description { color: #53617b; + display: -webkit-box; + overflow: hidden; + line-height: 1.35; + white-space: normal; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; } .atlas-cheat-category { @@ -437,8 +443,8 @@ align-items: center; justify-content: center; flex: none; - width: 25px; - height: 25px; + width: 32px; + height: 32px; padding: 0; border: 0; color: #a0abc0; @@ -467,13 +473,13 @@ .atlas-cheat-run { min-width: 54px; - min-height: 27px; + min-height: 32px; padding: 4px 9px; border: 1px solid #d6deeb; border-radius: 6px; color: #25324c; background: #fff; - font-size: 0.67rem; + font-size: 0.75rem; text-transform: none; letter-spacing: normal; } @@ -578,7 +584,7 @@ .atlas-inspector-title code { overflow: hidden; color: #667590; - font-size: 0.65rem; + font-size: 0.75rem; text-overflow: ellipsis; white-space: nowrap; } @@ -596,7 +602,7 @@ border-radius: 6px; color: #5c6a84; background: transparent; - font-size: 0.69rem; + font-size: 0.75rem; text-transform: none; letter-spacing: normal; } @@ -628,7 +634,7 @@ gap: 6px; margin-bottom: 10px; color: #61708c; - font-size: 0.68rem; + font-size: 0.75rem; font-weight: 650; } @@ -674,7 +680,7 @@ padding: 9px 0; border-bottom: 1px solid #e9edf4; color: #15203a; - font-size: 0.69rem; + font-size: 0.75rem; } .atlas-inspector-facts > div > :first-child { @@ -690,7 +696,7 @@ margin-bottom: 10px; color: #7a88a4; font-family: var(--font-mono); - font-size: 0.64rem; + font-size: 0.75rem; overflow-wrap: anywhere; } @@ -711,7 +717,7 @@ border-radius: 6px; color: #3e4d68; background: #fff; - font-size: 0.68rem; + font-size: 0.75rem; text-transform: none; letter-spacing: normal; } @@ -737,7 +743,7 @@ padding: 8px 10px; color: #41506c; background: #f7f9fd; - font-size: 0.69rem; + font-size: 0.75rem; } .atlas-inspector-config .config-item { @@ -766,7 +772,7 @@ overflow: visible; padding: 0; color: #63718a; - font-size: 0.68rem; + font-size: 0.75rem; line-height: 1.4; text-overflow: clip; white-space: normal; @@ -778,11 +784,11 @@ } .atlas-inspector-config .number-input-wrapper { - min-height: 30px; + min-height: 32px; } .atlas-inspector-config .number-input-btn { - height: 30px; + height: 32px; padding: 0 8px; } @@ -840,13 +846,13 @@ align-items: center; justify-content: center; flex: none; - min-height: 28px; + min-height: 32px; padding: 4px 8px; border: 1px solid #d6deeb; border-radius: 6px; color: #4f52cf; background: #fff; - font-size: 0.67rem; + font-size: 0.75rem; text-transform: none; letter-spacing: normal; } @@ -855,8 +861,8 @@ display: inline-flex; align-items: center; justify-content: center; - width: 28px; - height: 28px; + width: 32px; + height: 32px; padding: 0; border: 0; border-radius: 6px; diff --git a/src/ui/styles/config.css b/src/ui/styles/config.css index 3868a595..c354b9e5 100644 --- a/src/ui/styles/config.css +++ b/src/ui/styles/config.css @@ -206,8 +206,8 @@ display: inline-flex; align-items: center; justify-content: center; - width: 30px; - height: 30px; + width: 32px; + height: 32px; border: 1px solid var(--c-border); background: transparent; color: var(--c-text-dim); @@ -315,7 +315,7 @@ #config-tab .config-filter-label { color: var(--atlas-text-muted, #66748d); - font-size: 0.67rem; + font-size: 0.75rem; } #config-tab .cheat-category { @@ -391,13 +391,13 @@ align-items: center; justify-content: center; min-inline-size: 130px; - min-height: 24px; + min-height: 32px; padding: 3px 7px; border: 1px solid #dce2ec; border-radius: 12px; color: #70809b; background: #f7f9fc; - font-size: 0.61rem; + font-size: 0.75rem; white-space: nowrap; } @@ -409,10 +409,10 @@ .atlas-config-actions .btn-primary, .atlas-config-actions .btn-secondary { - min-height: 30px; + min-height: 32px; padding: 6px 10px; border-radius: 6px; - font-size: 0.65rem; + font-size: 0.75rem; white-space: nowrap; } diff --git a/src/ui/styles/devtools.css b/src/ui/styles/devtools.css index c590afe2..3ec445f6 100644 --- a/src/ui/styles/devtools.css +++ b/src/ui/styles/devtools.css @@ -51,7 +51,7 @@ .devtools-popout-kicker { margin-bottom: 5px; color: #6366f1; - font-size: 0.625rem; + font-size: 0.75rem; font-weight: 750; letter-spacing: 0.12em; } diff --git a/src/ui/styles/toast.css b/src/ui/styles/toast.css index 4164dce7..8fc95cd3 100644 --- a/src/ui/styles/toast.css +++ b/src/ui/styles/toast.css @@ -6,21 +6,22 @@ /* --- TOAST MESSAGES --- */ #status-message { position: fixed; - bottom: 55px; - left: 0px; + right: 16px; + bottom: 16px; background: var(--c-panel-95); border: 1px solid var(--c-border); color: var(--c-text-main); - padding: 15px 20px; - width: calc(var(--nav-width)); - max-width: calc(var(--nav-width)); + padding: 12px 16px; + width: min(360px, calc(100vw - 32px)); + max-width: 360px; backdrop-filter: blur(10px); z-index: 10000; display: none; opacity: 1; box-shadow: 0 10px 30px var(--c-black-50); font-family: var(--font-mono); - font-size: 0.875rem; + font-size: 0.8125rem; + line-height: 1.5; transition: opacity 0.3s ease; } diff --git a/tests/atlas-ui-compat.mjs b/tests/atlas-ui-compat.mjs new file mode 100644 index 00000000..f6d0a973 --- /dev/null +++ b/tests/atlas-ui-compat.mjs @@ -0,0 +1,78 @@ +import assert from "node:assert/strict"; +import { Buffer } from "node:buffer"; +import { access, readFile } from "node:fs/promises"; +import path from "node:path"; +import test from "node:test"; +import { fileURLToPath } from "node:url"; + +const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), ".."); +const read = (relativePath) => readFile(path.join(root, relativePath), "utf8"); + +const createStorage = (initial = {}) => { + const values = new Map(Object.entries(initial)); + return { + getItem: (key) => (values.has(key) ? values.get(key) : null), + setItem: (key, value) => values.set(key, String(value)), + value: (key) => values.get(key), + }; +}; + +const loadWorkspaceUtils = async (storage) => { + globalThis.localStorage = storage; + const source = await read("src/ui/components/views/search/workspaceUtils.js"); + const encoded = Buffer.from(source).toString("base64"); + return import(`data:text/javascript;base64,${encoded}#${Math.random()}`); +}; + +test("Search favorites preserve unset, empty, and custom storage states", async () => { + const unsetStorage = createStorage(); + const unset = await loadWorkspaceUtils(unsetStorage); + assert.equal(unset.loadLocalFavoriteKeys(), null); + + const emptyStorage = createStorage({ searchFavoriteKeys: "[]" }); + const empty = await loadWorkspaceUtils(emptyStorage); + assert.deepEqual(empty.loadLocalFavoriteKeys(), []); + + const customStorage = createStorage(); + const custom = await loadWorkspaceUtils(customStorage); + custom.saveLocalFavoriteKeys(["PlayerDATABASE", "PlayerDATABASE", "SkillLevels"]); + assert.equal(customStorage.value("searchFavoriteKeys"), '["PlayerDATABASE","SkillLevels"]'); +}); + +test("Search selection fallback prefers persisted keys, then favorites", async () => { + const utils = await loadWorkspaceUtils(createStorage()); + const all = ["A", "B", "C", "D"]; + assert.deepEqual(utils.pickInitialSelectedKeys(all, ["D"], ["B", "C"]), ["D"]); + assert.deepEqual(utils.pickInitialSelectedKeys(all, [], ["C", "missing", "B"]), ["C", "B"]); + assert.deepEqual(utils.pickInitialSelectedKeys(all, [], []), all); +}); + +test("Atlas keeps immediate notifications and keyboard row selection", async () => { + const [app, cheatItem] = await Promise.all([ + read("src/ui/components/App.js"), + read("src/ui/components/CheatItem.js"), + ]); + + assert.match(app, /import \{ Toast \} from "\.\/Toast\.js";/); + assert.match(app, /Toast\(\)/); + assert.match(cheatItem, /tabindex: "0"/); + assert.match(cheatItem, /event\.key !== "Enter" && event\.key !== " "/); +}); + +test("Atlas exposes no inert controls or dead compatibility wrappers", async () => { + const [header, sidebar] = await Promise.all([ + read("src/ui/components/AtlasHeader.js"), + read("src/ui/components/Sidebar.js"), + ]); + + assert.match(header, /disabled: \(\) => !store\.app\.updateInfo\?\.updateAvailable/); + assert.doesNotMatch(sidebar, /atlas-shortcuts-button/); + + for (const relativePath of [ + "src/ui/components/NotificationHistory.js", + "src/ui/components/views/Cheats.js", + "src/ui/styles/_notificationHistory.css", + ]) { + await assert.rejects(access(path.join(root, relativePath))); + } +}); From 19f0b514057397472e2c87113260432455abfb3c Mon Sep 17 00:00:00 2001 From: Arnold W Date: Thu, 30 Jul 2026 00:12:43 +0200 Subject: [PATCH 03/32] refactor(ui): simplify Atlas workspace --- architect.md | 39 --- docs/ui.md | 8 +- src/ui/components/App.js | 4 +- src/ui/components/AtlasHeader.js | 2 +- src/ui/components/Sidebar.js | 9 +- src/ui/components/WorkspaceContext.js | 33 -- src/ui/components/views/AtlasCheats.js | 11 +- src/ui/components/views/Config.js | 11 +- src/ui/entry/style.css | 1 - src/ui/state/constants.js | 20 +- src/ui/state/store.js | 36 -- src/ui/styles/_atlas-shell.css | 2 + src/ui/styles/sidebar.css | 451 ------------------------- tests/atlas-ui-compat.mjs | 75 ++-- 14 files changed, 40 insertions(+), 662 deletions(-) delete mode 100644 architect.md delete mode 100644 src/ui/styles/sidebar.css diff --git a/architect.md b/architect.md deleted file mode 100644 index 0d35bbfb..00000000 --- a/architect.md +++ /dev/null @@ -1,39 +0,0 @@ -# Atlas UI Compatibility Refactor - -## Objective - -Keep the Atlas visual migration while restoring user-facing behavior that the -previous UI already guaranteed. Remove only compatibility wrappers that no -longer own behavior. - -## Stable contracts - -1. Every `store.notify()` call produces immediate toast feedback and remains in - Activity history. -2. Search key favorites use curated defaults until the user saves a preference; - custom and deliberately empty favorite lists persist in `localStorage`. -3. Search initially selects persisted keys, then available favorites, then the - first eight available keys. -4. Cheat table rows can be selected with pointer or keyboard without changing - execution semantics. -5. Controls that cannot act are disabled or removed rather than presented as - inert buttons. -6. Atlas remains the sole implementation of the Cheats workspace; compatibility - forwarding modules and the replaced notification dropdown are not retained. - -## Boundaries - -- Preserve the current VanJS architecture, API routes, workspace IDs, storage - keys, command execution behavior, and config draft model. -- Reuse the existing Toast and Activity drawer instead of adding another - notification abstraction. -- Keep `src/ui/vendor/vanHelpers.js` outside this change because it was excluded - from the Atlas product commit and is not imported by the application. - -## Verification - -`npm run test:ui-compat` is the backward-compatibility harness. It exercises the -pure Search persistence helpers and verifies the source-level integration -contracts for Toast mounting, keyboard-selectable cheat rows, actionable header -controls, and removal of dead wrappers. The normal `npm run validate` command -also runs this harness. diff --git a/docs/ui.md b/docs/ui.md index 5a1e4c84..c68a39f8 100644 --- a/docs/ui.md +++ b/docs/ui.md @@ -98,9 +98,9 @@ Features: Useful helpers: -- `store.executeCheat(action, message)` triggers `/api/toggle` and shows toast feedback. +- `API.executeCheatAction(action)` triggers `/api/toggle`; Atlas records the result through `store.notify()`. - `store.navigateToCheatConfig(cheatValue)` focuses Config for that cheat path (opens the side drawer when on Cheats, otherwise switches to full Config tab). -- `store.getActiveCheats()` flattens active cheat state into a display list. +- `store.data.activeCheatStates` receives WebSocket state updates that Atlas flattens for its switches and Active scope. ### Config view @@ -116,7 +116,7 @@ Key behaviors: - Uses forced-path mode when coming from Cheats gear icon, with "SHOWING" banner. - Can run as a right-side drawer while Cheats stays open; close from drawer header or toggle button in Cheats. - Saves explicitly apply the cheat config to RAM (`/api/config/update`) or persist the full draft to disk (`/api/config/save`). -- `Ctrl+S` invokes the active workspace's disk-save handler when one is registered. +- `Ctrl+S` saves the shared config draft from the Cheats or Config workspace. - Injector config shows "restart required" warning banner. Function values (like `(t) => t * 2`) are edited through `FunctionInput`: @@ -181,7 +181,7 @@ Features: Common components in `src/ui/components/`: - `AtlasHeader` + `Sidebar`: global status, workspace navigation, and workspace-specific context. -- `WorkspaceContext`: contextual navigation and the active workspace save contract. +- `WorkspaceContext`: contextual navigation supplied by the active workspace. - `ActivityDrawer`: notification history and live monitor output. - `SearchBar`: shared filter input used by Cheats and Account. - `ConfigNode`: recursive config renderer with tooltips. diff --git a/src/ui/components/App.js b/src/ui/components/App.js index d7fdf33e..7081ba0e 100644 --- a/src/ui/components/App.js +++ b/src/ui/components/App.js @@ -6,7 +6,7 @@ import { VIEWS } from "../state/constants.js"; import { Sidebar, SidebarBackdrop } from "./Sidebar.js"; import { AtlasHeader } from "./AtlasHeader.js"; import { ActivityDrawer } from "./ActivityDrawer.js"; -import { invokeWorkspaceSave } from "./WorkspaceContext.js"; +import { saveConfigDraft } from "./views/config/configDraft.js"; import { Toast } from "./Toast.js"; import { TooltipContainer } from "./Tooltip.js"; import { UpdateModal } from "./UpdateModal.js"; @@ -45,7 +45,7 @@ export const App = () => { if ((e.ctrlKey || e.metaKey) && e.key.toLowerCase() === "s") { e.preventDefault(); - invokeWorkspaceSave(store.app.activeTab); + if ([VIEWS.CHEATS.id, VIEWS.CONFIG.id].includes(store.app.activeTab)) saveConfigDraft("disk"); return; } diff --git a/src/ui/components/AtlasHeader.js b/src/ui/components/AtlasHeader.js index c0eb0511..fd895c0d 100644 --- a/src/ui/components/AtlasHeader.js +++ b/src/ui/components/AtlasHeader.js @@ -31,7 +31,7 @@ export const AtlasHeader = () => { class: "atlas-breadcrumb", "aria-label": "Current workspace" }, span({ class: "atlas-breadcrumb-root" }, "Workspace"), Icons.ChevronRight({ class: "atlas-breadcrumb-separator" }), - span({ class: "atlas-breadcrumb-current" }, () => activeView().atlasLabel || activeView().sidebarLabel) + span({ class: "atlas-breadcrumb-current" }, () => activeView().label) ), div( { class: "atlas-header-actions" }, diff --git a/src/ui/components/Sidebar.js b/src/ui/components/Sidebar.js index b440c68f..f7e9a140 100644 --- a/src/ui/components/Sidebar.js +++ b/src/ui/components/Sidebar.js @@ -19,10 +19,7 @@ const DefaultWorkspaceContext = (viewId) => { return div( { class: "atlas-context-placeholder" }, div({ class: "atlas-context-heading" }, "Context"), - div( - { class: "atlas-context-empty" }, - `${view?.atlasLabel || view?.sidebarLabel || "Workspace"} controls are available in the main view.` - ) + div({ class: "atlas-context-empty" }, `${view?.label || "Workspace"} controls are available in the main view.`) ); }; @@ -70,10 +67,10 @@ export const Sidebar = () => { type: "button", onclick: () => store.setActiveTab(view.id), "aria-current": () => (store.app.activeTab === view.id ? "page" : "false"), - title: `${view.atlasLabel || view.sidebarLabel} (${index + 1})`, + title: `${view.label} (${index + 1})`, }, Icon(), - span({ class: "tab-label" }, view.atlasLabel || view.sidebarLabel), + span({ class: "tab-label" }, view.label), span({ class: "atlas-nav-shortcut", "aria-hidden": "true" }, index + 1) ); }) diff --git a/src/ui/components/WorkspaceContext.js b/src/ui/components/WorkspaceContext.js index dd675255..ab6a908c 100644 --- a/src/ui/components/WorkspaceContext.js +++ b/src/ui/components/WorkspaceContext.js @@ -4,7 +4,6 @@ import store from "../state/store.js"; const { div } = van.tags; const renderers = new Map(); -const saveHandlers = new Map(); const revision = van.state(0); /** @@ -30,38 +29,6 @@ export const registerWorkspaceContext = (viewId, renderer) => { }; }; -/** - * Register the save action for a workspace-owned draft or inspector. - * This is the integration point used by the global Ctrl+S shortcut. - * - * @param {string} viewId - Workspace ID from VIEWS. - * @param {() => void|Promise} handler - Workspace save action. - * @returns {() => void} Unregister callback. - */ -export const registerWorkspaceSaveHandler = (viewId, handler) => { - if (!viewId || typeof handler !== "function") { - throw new TypeError("Workspace save action requires a view ID and handler"); - } - - saveHandlers.set(viewId, handler); - return () => { - if (saveHandlers.get(viewId) === handler) saveHandlers.delete(viewId); - }; -}; - -/** - * Invoke the active workspace save action when one is registered. - * - * @param {string} viewId - Workspace ID from VIEWS. - * @returns {boolean} Whether a workspace save action was invoked. - */ -export const invokeWorkspaceSave = (viewId) => { - const handler = saveHandlers.get(viewId); - if (!handler) return false; - handler(); - return true; -}; - /** * Render the active workspace's registered context, or the supplied fallback. * diff --git a/src/ui/components/views/AtlasCheats.js b/src/ui/components/views/AtlasCheats.js index f9f7c8a9..bb9456c0 100644 --- a/src/ui/components/views/AtlasCheats.js +++ b/src/ui/components/views/AtlasCheats.js @@ -9,15 +9,9 @@ import { Loader } from "../Loader.js"; import { EmptyState } from "../EmptyState.js"; import { CheatItem } from "../CheatItem.js"; import { ConfigNode } from "../config/ConfigNode.js"; -import { registerWorkspaceContext, registerWorkspaceSaveHandler } from "../WorkspaceContext.js"; +import { registerWorkspaceContext } from "../WorkspaceContext.js"; import { ConfigActions } from "./config/ConfigActions.js"; -import { - buildConfigPathTemplate, - configDraftReady, - getConfigDraft, - getConfigPathData, - saveConfigDraft, -} from "./config/configDraft.js"; +import { buildConfigPathTemplate, configDraftReady, getConfigDraft, getConfigPathData } from "./config/configDraft.js"; const { div, button, span, input, code } = van.tags; @@ -131,7 +125,6 @@ export const AtlasCheats = () => { }); if (store.data.cheats.length === 0) store.loadCheats(); - registerWorkspaceSaveHandler(VIEWS.CHEATS.id, () => saveConfigDraft("disk")); const stateMap = van.derive(() => flattenCheatStates(store.data.activeCheatStates)); diff --git a/src/ui/components/views/Config.js b/src/ui/components/views/Config.js index f3bee319..bc604246 100644 --- a/src/ui/components/views/Config.js +++ b/src/ui/components/views/Config.js @@ -1,21 +1,13 @@ import van from "../../vendor/van-1.6.0.js"; import store from "../../state/store.js"; -import { VIEWS } from "../../state/constants.js"; import { Loader } from "../Loader.js"; import { EmptyState } from "../EmptyState.js"; import { ConfigNode } from "../config/ConfigNode.js"; import { StartupCheats, AddCheatSearchBar } from "../config/StartupCheats.js"; import { SearchBar } from "../SearchBar.js"; import { Icons } from "../../assets/icons.js"; -import { registerWorkspaceSaveHandler } from "../WorkspaceContext.js"; import { ConfigActions } from "./config/ConfigActions.js"; -import { - buildConfigPathTemplate, - configDraftReady, - getConfigDraft, - getConfigPathData, - saveConfigDraft, -} from "./config/configDraft.js"; +import { buildConfigPathTemplate, configDraftReady, getConfigDraft, getConfigPathData } from "./config/configDraft.js"; const { div, button, select, option, label, span } = van.tags; @@ -27,7 +19,6 @@ export const Config = () => { let addCheatFn = null; getConfigDraft(); - registerWorkspaceSaveHandler(VIEWS.CONFIG.id, () => saveConfigDraft("disk")); // Handle forced config path navigation from Cheats tab van.derive(() => { diff --git a/src/ui/entry/style.css b/src/ui/entry/style.css index 7da28e71..746d1f7c 100644 --- a/src/ui/entry/style.css +++ b/src/ui/entry/style.css @@ -15,7 +15,6 @@ @import url("../styles/_utilities.css"); /* COMPONENTS */ -@import url("../styles/sidebar.css"); @import url("../styles/cheats.css"); @import url("../styles/config.css"); @import url("../styles/_world-tabs.css"); diff --git a/src/ui/state/constants.js b/src/ui/state/constants.js index e37d5f16..4456260b 100644 --- a/src/ui/state/constants.js +++ b/src/ui/state/constants.js @@ -8,33 +8,23 @@ export const VIEWS = { CHEATS: { id: "cheats-tab", - label: "CHEATS", - sidebarLabel: "CHEATS", - atlasLabel: "Cheats", + label: "Cheats", }, ACCOUNT: { id: "options-account-tab", - label: "ACCOUNT OPTIONS LIST", - sidebarLabel: "ACCOUNT OPTIONS", - atlasLabel: "Account", + label: "Account", }, CONFIG: { id: "config-tab", - label: "CONFIGURATION", - sidebarLabel: "CONFIG", - atlasLabel: "Config", + label: "Config", }, SEARCH: { id: "search-tab", - label: "GGA SEARCH", - sidebarLabel: "SEARCH", - atlasLabel: "Search", + label: "Search", }, DEVTOOLS: { id: "devtools-tab", - label: "CHROMEDEBUG", - sidebarLabel: "CHROMEDEBUG", - atlasLabel: "DevTools", + label: "DevTools", }, }; diff --git a/src/ui/state/store.js b/src/ui/state/store.js index 3bf3974a..f732c4b8 100644 --- a/src/ui/state/store.js +++ b/src/ui/state/store.js @@ -232,40 +232,6 @@ const CheatService = { closeConfigDrawer: () => { appState.configDrawerOpen = false; }, - - executeCheat: async (action, message) => { - try { - const result = await API.executeCheatAction(action); - Actions.notify(`Cheat ${result.result || "Success"}`); - FavoritesService.addToRecent(action); - // Note: Cheat states are now updated via WebSocket push from server - // No need for manual loadCheatStates() call - } catch (e) { - Actions.notify(`Error executing '${message}': ${e.message}`, "error"); - } - }, -}; - -const getActiveCheats = (states) => { - const activeCheats = []; - - const normalizeKey = (key) => (key.endsWith("s") ? key.slice(0, -1) : key); - - for (const key in states) { - const value = states[key]; - - if (typeof value === "object" && value !== null) { - for (const subKey in value) { - if (value[subKey] === true) { - activeCheats.push(`${normalizeKey(key)} ${subKey}`); - } - } - } else if (value === true) { - activeCheats.push(normalizeKey(key)); - } - } - - return activeCheats; }; const CheatStateService = { @@ -401,14 +367,12 @@ const store = { applyUpdate: SystemService.applyUpdate, loadCheats: CheatService.loadCheats, - executeCheat: CheatService.executeCheat, hasConfigEntry: CheatService.hasConfigEntry, navigateToCheatConfig: CheatService.navigateToCheatConfig, clearForcedConfigPath: CheatService.clearForcedConfigPath, openConfigDrawer: CheatService.openConfigDrawer, closeConfigDrawer: CheatService.closeConfigDrawer, loadCheatStates: CheatStateService.loadCheatStates, - getActiveCheats: () => getActiveCheats(dataState.activeCheatStates), loadConfig: ConfigService.loadConfig, saveConfig: ConfigService.saveConfig, diff --git a/src/ui/styles/_atlas-shell.css b/src/ui/styles/_atlas-shell.css index 6fed3f3f..a5576cd2 100644 --- a/src/ui/styles/_atlas-shell.css +++ b/src/ui/styles/_atlas-shell.css @@ -316,6 +316,8 @@ body { } .atlas-sidebar { + display: flex; + flex-direction: column; position: relative; z-index: 2100; flex: 0 0 var(--atlas-sidebar-width); diff --git a/src/ui/styles/sidebar.css b/src/ui/styles/sidebar.css deleted file mode 100644 index e1c7364e..00000000 --- a/src/ui/styles/sidebar.css +++ /dev/null @@ -1,451 +0,0 @@ -/** - * Sidebar Component - * Brand, navigation menu, tabs, active cheats, system status - */ - -/* --- SIDEBAR --- */ -.sidebar { - width: var(--nav-width); - background: var(--c-sidebar-bg); - border-right: 1px solid var(--c-border); - display: flex; - flex-direction: column; - padding: 20px; - z-index: 2000; - backdrop-filter: blur(10px); - transition: - width 0.2s var(--ease-tech), - padding 0.2s var(--ease-tech); - overflow: visible; -} - -.sidebar-collapsed { - width: 60px; - padding: 20px 10px; -} - -.sidebar-collapsed .brand { - justify-content: center; - gap: 0; - padding-bottom: 10px; - margin-bottom: 10px; -} - -.sidebar-collapsed .brand-main { - justify-content: center; - gap: 0; -} - -.sidebar-collapsed .tab-button, -.sidebar-collapsed .system-status { - justify-content: center; - gap: 0; - padding: 12px; -} - -.tab-button svg, -.brand-logo svg, -.status-dot { - flex-shrink: 0; - display: block; -} - -/* Sidebar elements smooth transition */ -.brand-text, -.tab-label, -#system-status-text { - transition: - opacity 0.2s var(--ease-tech), - max-width 0.2s var(--ease-tech), - margin 0.2s var(--ease-tech), - padding 0.2s var(--ease-tech); - opacity: 1; - max-width: 200px; - white-space: nowrap; - overflow: hidden; - display: inline-block; - vertical-align: middle; -} - -.sidebar-collapsed .brand-text, -.sidebar-collapsed .tab-label, -.sidebar-collapsed #system-status-text, -.sidebar-collapsed .notification-history { - opacity: 0; - max-width: 0; - margin: 0 !important; - padding: 0 !important; - pointer-events: none; -} - -.brand-version { - transition: - opacity 0.2s var(--ease-tech), - max-height 0.2s var(--ease-tech), - margin 0.2s var(--ease-tech), - padding 0.2s var(--ease-tech); -} - -.brand-version-hidden { - opacity: 0; - max-height: 0; - margin: 0 !important; - padding: 0 !important; - pointer-events: none; - overflow: hidden; -} - -.sidebar-collapsed .brand-version { - opacity: 0; - max-height: 0; - margin: 0 !important; - padding: 0 !important; - pointer-events: none; - overflow: hidden; -} - -.sidebar-toggle { - background: transparent; - border: 1px solid var(--c-border); - color: var(--c-text-dim); - padding: 8px 10px; - margin-top: 10px; - cursor: pointer; - font-size: 0.9rem; - width: 100%; - transition: all 0.2s; - display: flex; - align-items: center; - justify-content: center; -} - -.sidebar-toggle:hover { - border-color: var(--c-accent); - color: var(--c-accent); -} - -/* --- BRAND --- */ -.brand { - padding-bottom: 20px; - margin-bottom: 20px; - border-bottom: 1px solid var(--c-border); - display: flex; - align-items: center; - justify-content: space-between; -} - -.brand-main { - display: flex; - align-items: center; - gap: 12px; -} - -.brand-logo { - font-size: 28px; - color: var(--c-accent); - text-shadow: 0 0 15px var(--c-accent-glow); -} - -.brand-text { - font-size: 1.2rem; - font-weight: 700; - line-height: 1; - display: flex; - flex-direction: column; -} - -.brand-text .highlight { - font-size: 0.875rem; - color: var(--c-accent); - letter-spacing: 0.2em; -} - -.brand-version { - margin-top: 6px; - font-size: 0.875rem; - color: var(--c-text-dim); - font-family: var(--font-mono); - font-weight: 500; - letter-spacing: 0.12em; -} - -.brand-version-button { - appearance: none; - background: transparent; - border: 0; - color: inherit; - display: inline-flex; - align-items: center; - gap: 7px; - padding: 0; - font: inherit; - letter-spacing: inherit; - text-transform: none; - cursor: default; -} - -.brand-version-button.has-update { - cursor: pointer; -} - -.brand-version-button.has-update:hover { - color: var(--c-danger-soft-text); -} - -.update-ready-dot { - width: 7px; - height: 7px; - border-radius: 50%; - background: var(--c-danger); - box-shadow: 0 0 8px var(--c-danger); - animation: updateDotFlash 1s infinite; - flex: 0 0 auto; -} - -/* --- NAVIGATION MENU --- */ -.nav-menu { - display: flex; - flex-direction: column; - gap: 5px; -} - -.tab-button { - display: flex; - align-items: center; - gap: 12px; - padding: 12px 16px; - background: transparent; - border: 1px solid transparent; - color: var(--c-text-dim); - font-family: var(--font-display); - font-size: 1rem; - font-weight: 600; - letter-spacing: 0.05em; - cursor: pointer; - transition: all 0.2s var(--ease-tech); - border-radius: var(--radius-sm); - text-decoration: none; -} - -.github-link:hover { - color: var(--c-white) !important; - background: var(--c-white-10) !important; -} - -.tab-button svg { - width: 18px; - height: 18px; - opacity: 0.5; - transition: 0.2s; -} - -.tab-button:hover { - color: var(--c-text-main); - background: var(--c-white-03); -} - -.tab-button:hover svg { - opacity: 1; -} - -.tab-button.active { - background: var(--c-accent-dim); - border-color: var(--c-accent-20); - color: var(--c-accent); - box-shadow: inset 2px 0 0 var(--c-accent); -} - -.tab-button.active svg { - opacity: 1; - filter: drop-shadow(0 0 4px var(--c-accent)); -} - -/* --- ACTIVE CHEATS --- */ -.active-cheats { - margin-top: 15px; - padding-top: 15px; - border-top: 1px solid var(--c-border); - flex: 1; - min-height: 0; - display: flex; - flex-direction: column; - transition: - opacity 0.2s var(--ease-tech), - max-height 0.2s var(--ease-tech); - overflow: hidden; -} - -.sidebar-collapsed .active-cheats { - opacity: 0; - max-height: 0; - pointer-events: none; -} - -.active-cheats-header { - font-size: 0.875rem; - color: var(--c-text-dim); - letter-spacing: 0.1em; - margin-bottom: 10px; - font-weight: 600; -} - -.active-cheats-list { - display: flex; - flex-direction: column; - gap: 4px; - overflow-y: auto; - flex: 1; - scrollbar-width: thin; - scrollbar-color: var(--c-border) transparent; -} - -.active-cheat-item { - font-size: 0.875rem; - font-family: var(--font-mono); - color: var(--c-accent); - padding: 4px 8px; - background: var(--c-accent-dim); - border-left: 2px solid var(--c-accent); - min-height: 22px; - flex-shrink: 0; - line-height: 1.2; - cursor: pointer; - transition: all 0.2s; - display: flex; - align-items: center; -} - -.active-cheat-text { - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - flex: 1; -} - -.active-cheat-item:hover { - filter: brightness(1.2); - box-shadow: 0 0 8px var(--c-accent-dim); -} - -.no-active-cheats { - font-size: 0.875rem; - font-family: var(--font-mono); - color: var(--c-text-muted); - font-style: italic; -} - -/* --- SYSTEM STATUS --- */ -.system-status { - margin-top: auto; - padding-top: 20px; - border-top: 1px solid var(--c-border); - display: flex; - align-items: center; - gap: 10px; - font-size: 0.875rem; - color: var(--c-success); - font-family: var(--font-mono); -} - -.system-shortcuts-button { - margin-left: auto; - width: 28px; - height: 28px; - padding: 0; - border-radius: var(--radius-sm); - border: 1px solid var(--c-border); - background: transparent; - color: var(--c-text-dim); - display: inline-flex; - align-items: center; - justify-content: center; - cursor: pointer; - transition: - color 0.2s var(--ease-tech), - border-color 0.2s var(--ease-tech), - background 0.2s var(--ease-tech); -} - -.system-actions { - margin-left: auto; - display: flex; - align-items: center; - gap: 6px; -} - -.system-theme-picker { - width: 28px; - height: 28px; - padding: 2px; - border-radius: var(--radius-sm); - border: 1px solid var(--c-border); - background: transparent; - color: var(--c-text-dim); - cursor: pointer; - appearance: none; - -webkit-appearance: none; - transition: - border-color 0.2s var(--ease-tech), - background 0.2s var(--ease-tech); -} - -.system-theme-picker::-webkit-color-swatch-wrapper { - padding: 0; -} - -.system-theme-picker::-webkit-color-swatch, -.system-theme-picker::-moz-color-swatch { - border: none; - border-radius: 1px; -} - -.system-theme-picker:hover { - border-color: var(--c-accent-25); - background: var(--c-accent-06); -} - -.system-shortcuts-button svg { - width: 16px; - height: 16px; - opacity: 0.8; -} - -.system-shortcuts-button:hover { - border-color: var(--c-accent-25); - background: var(--c-accent-06); - color: var(--c-accent); -} - -.sidebar-collapsed .system-actions { - display: none; -} - -.sidebar-collapsed .system-shortcuts-button { - display: none; -} - -.status-dot { - width: 6px; - height: 6px; - border-radius: 50%; -} - -.status-dot.is-online { - background: var(--c-success); - box-shadow: 0 0 6px var(--c-success); - animation: pulse 2s infinite; -} - -.status-dot.is-offline { - background: var(--c-danger); - box-shadow: 0 0 6px var(--c-danger); - animation: none; -} - -#system-status-text.is-online { - color: var(--c-success); -} - -#system-status-text.is-offline { - color: var(--c-danger); -} diff --git a/tests/atlas-ui-compat.mjs b/tests/atlas-ui-compat.mjs index f6d0a973..a1ef64b7 100644 --- a/tests/atlas-ui-compat.mjs +++ b/tests/atlas-ui-compat.mjs @@ -1,12 +1,15 @@ import assert from "node:assert/strict"; -import { Buffer } from "node:buffer"; -import { access, readFile } from "node:fs/promises"; -import path from "node:path"; +import { readFile } from "node:fs/promises"; import test from "node:test"; -import { fileURLToPath } from "node:url"; +import { URL } from "node:url"; -const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), ".."); -const read = (relativePath) => readFile(path.join(root, relativePath), "utf8"); +const workspaceUtilsSource = await readFile( + new URL("../src/ui/components/views/search/workspaceUtils.js", import.meta.url), + "utf8" +); +const { loadLocalFavoriteKeys, pickInitialSelectedKeys, saveLocalFavoriteKeys } = await import( + `data:text/javascript,${encodeURIComponent(workspaceUtilsSource)}` +); const createStorage = (initial = {}) => { const values = new Map(Object.entries(initial)); @@ -17,62 +20,24 @@ const createStorage = (initial = {}) => { }; }; -const loadWorkspaceUtils = async (storage) => { - globalThis.localStorage = storage; - const source = await read("src/ui/components/views/search/workspaceUtils.js"); - const encoded = Buffer.from(source).toString("base64"); - return import(`data:text/javascript;base64,${encoded}#${Math.random()}`); -}; - -test("Search favorites preserve unset, empty, and custom storage states", async () => { +test("Search favorites preserve unset, empty, and custom storage states", () => { const unsetStorage = createStorage(); - const unset = await loadWorkspaceUtils(unsetStorage); - assert.equal(unset.loadLocalFavoriteKeys(), null); + globalThis.localStorage = unsetStorage; + assert.equal(loadLocalFavoriteKeys(), null); const emptyStorage = createStorage({ searchFavoriteKeys: "[]" }); - const empty = await loadWorkspaceUtils(emptyStorage); - assert.deepEqual(empty.loadLocalFavoriteKeys(), []); + globalThis.localStorage = emptyStorage; + assert.deepEqual(loadLocalFavoriteKeys(), []); const customStorage = createStorage(); - const custom = await loadWorkspaceUtils(customStorage); - custom.saveLocalFavoriteKeys(["PlayerDATABASE", "PlayerDATABASE", "SkillLevels"]); + globalThis.localStorage = customStorage; + saveLocalFavoriteKeys(["PlayerDATABASE", "PlayerDATABASE", "SkillLevels"]); assert.equal(customStorage.value("searchFavoriteKeys"), '["PlayerDATABASE","SkillLevels"]'); }); -test("Search selection fallback prefers persisted keys, then favorites", async () => { - const utils = await loadWorkspaceUtils(createStorage()); +test("Search selection fallback prefers persisted keys, then favorites", () => { const all = ["A", "B", "C", "D"]; - assert.deepEqual(utils.pickInitialSelectedKeys(all, ["D"], ["B", "C"]), ["D"]); - assert.deepEqual(utils.pickInitialSelectedKeys(all, [], ["C", "missing", "B"]), ["C", "B"]); - assert.deepEqual(utils.pickInitialSelectedKeys(all, [], []), all); -}); - -test("Atlas keeps immediate notifications and keyboard row selection", async () => { - const [app, cheatItem] = await Promise.all([ - read("src/ui/components/App.js"), - read("src/ui/components/CheatItem.js"), - ]); - - assert.match(app, /import \{ Toast \} from "\.\/Toast\.js";/); - assert.match(app, /Toast\(\)/); - assert.match(cheatItem, /tabindex: "0"/); - assert.match(cheatItem, /event\.key !== "Enter" && event\.key !== " "/); -}); - -test("Atlas exposes no inert controls or dead compatibility wrappers", async () => { - const [header, sidebar] = await Promise.all([ - read("src/ui/components/AtlasHeader.js"), - read("src/ui/components/Sidebar.js"), - ]); - - assert.match(header, /disabled: \(\) => !store\.app\.updateInfo\?\.updateAvailable/); - assert.doesNotMatch(sidebar, /atlas-shortcuts-button/); - - for (const relativePath of [ - "src/ui/components/NotificationHistory.js", - "src/ui/components/views/Cheats.js", - "src/ui/styles/_notificationHistory.css", - ]) { - await assert.rejects(access(path.join(root, relativePath))); - } + assert.deepEqual(pickInitialSelectedKeys(all, ["D"], ["B", "C"]), ["D"]); + assert.deepEqual(pickInitialSelectedKeys(all, [], ["C", "missing", "B"]), ["C", "B"]); + assert.deepEqual(pickInitialSelectedKeys(all, [], []), all); }); From f54b1a11055abe70e770f81de1bad7d3fc395a72 Mon Sep 17 00:00:00 2001 From: Arnold W Date: Thu, 30 Jul 2026 00:51:12 +0200 Subject: [PATCH 04/32] refactor(ui): trim Atlas abstractions --- src/modules/server/apiRoutes.js | 1 - src/ui/components/WorkspaceContext.js | 12 +-------- src/ui/components/views/AtlasCheats.js | 36 ++++++++++---------------- src/ui/state/store.js | 21 --------------- 4 files changed, 14 insertions(+), 56 deletions(-) diff --git a/src/modules/server/apiRoutes.js b/src/modules/server/apiRoutes.js index db8f3762..1e9433a8 100644 --- a/src/modules/server/apiRoutes.js +++ b/src/modules/server/apiRoutes.js @@ -324,7 +324,6 @@ function setupApiRoutes(app, context, client, config) { message: "Live cheat configuration updated successfully", details: gameUpdateDetails, appliedToGame: true, - ramBaseline: ramConfigBaseline, }); } catch (apiError) { log.error("Error in /api/config/update:", apiError); diff --git a/src/ui/components/WorkspaceContext.js b/src/ui/components/WorkspaceContext.js index ab6a908c..70bc7459 100644 --- a/src/ui/components/WorkspaceContext.js +++ b/src/ui/components/WorkspaceContext.js @@ -12,21 +12,11 @@ const revision = van.state(0); * * @param {string} viewId - Workspace ID from VIEWS. * @param {() => HTMLElement} renderer - Creates the contextual navigation node. - * @returns {() => void} Unregister callback. + * @returns {void} */ export const registerWorkspaceContext = (viewId, renderer) => { - if (!viewId || typeof renderer !== "function") { - throw new TypeError("Workspace context requires a view ID and renderer"); - } - renderers.set(viewId, renderer); revision.val += 1; - - return () => { - if (renderers.get(viewId) !== renderer) return; - renderers.delete(viewId); - revision.val += 1; - }; }; /** diff --git a/src/ui/components/views/AtlasCheats.js b/src/ui/components/views/AtlasCheats.js index bb9456c0..552d3ecc 100644 --- a/src/ui/components/views/AtlasCheats.js +++ b/src/ui/components/views/AtlasCheats.js @@ -89,19 +89,6 @@ const resolveStoredAction = (action, cheats) => { }; }; -const ScopeButton = ({ id, label, count, activeScope, onSelect, icon = null }) => - button( - { - type: "button", - class: () => `atlas-scope-button ${activeScope() === id ? "is-active" : ""}`, - "aria-current": () => (activeScope() === id ? "page" : null), - onclick: () => onSelect(id), - }, - icon ? span({ class: "atlas-scope-icon", "aria-hidden": "true" }, icon) : null, - span({ class: "atlas-scope-label" }, label), - span({ class: "atlas-scope-count" }, count) - ); - /** * Atlas dense cheat browser with explicit selection, execution, and config editing. * @returns {Element} @@ -204,6 +191,19 @@ export const AtlasCheats = () => { ui.page = 0; }; + const ScopeButton = ({ id, label, count, icon = null }) => + button( + { + type: "button", + class: () => `atlas-scope-button ${ui.scope === id ? "is-active" : ""}`, + "aria-current": () => (ui.scope === id ? "page" : null), + onclick: () => selectScope(id), + }, + icon ? span({ class: "atlas-scope-icon", "aria-hidden": "true" }, icon) : null, + span({ class: "atlas-scope-label" }, label), + span({ class: "atlas-scope-count" }, count) + ); + const selectedEntry = van.derive(() => { const selected = visibleRows.val.find((entry) => entry.action === ui.selectedAction); return selected || visibleRows.val[0] || null; @@ -316,32 +316,24 @@ export const AtlasCheats = () => { id: "all", label: "All cheats", count: () => store.data.cheats.length, - activeScope: () => ui.scope, - onSelect: selectScope, icon: Icons.Cheats(), }), ScopeButton({ id: "active", label: "Active", count: () => [...stateMap.val.values()].filter(Boolean).length, - activeScope: () => ui.scope, - onSelect: selectScope, icon: Icons.Lightning(), }), ScopeButton({ id: "favorites", label: "Favorites", count: () => store.data.favoriteCheats.length, - activeScope: () => ui.scope, - onSelect: selectScope, icon: Icons.Star(), }), ScopeButton({ id: "recent", label: "Recent", count: () => store.data.recentCheats.length, - activeScope: () => ui.scope, - onSelect: selectScope, icon: Icons.Refresh(), }), div({ class: "atlas-tree-heading atlas-category-heading" }, "CATEGORIES"), @@ -352,8 +344,6 @@ export const AtlasCheats = () => { id: `category:${category}`, label: category, count: () => matchingCategoryCounts.val.get(category) || 0, - activeScope: () => ui.scope, - onSelect: selectScope, }) ) ) diff --git a/src/ui/state/store.js b/src/ui/state/store.js index f732c4b8..04c36dbf 100644 --- a/src/ui/state/store.js +++ b/src/ui/state/store.js @@ -225,10 +225,6 @@ const CheatService = { appState.configForcedPath = null; }, - openConfigDrawer: () => { - appState.configDrawerOpen = true; - }, - closeConfigDrawer: () => { appState.configDrawerOpen = false; }, @@ -284,21 +280,6 @@ const ConfigService = { appState.isLoading = false; } }, - - saveConfig: async (newConfig, isPersistent) => { - try { - // Strip Proxies via JSON cycle to prevent reactive leaks - const cleanConfig = JSON.parse(JSON.stringify(newConfig)); - - const result = isPersistent - ? await API.saveConfigFile(cleanConfig) - : await API.updateSessionConfig(cleanConfig); - - Actions.notify(result.message || (isPersistent ? "SAVED TO DISK" : "RAM UPDATED")); - } catch (e) { - Actions.notify(e.message, "error"); - } - }, }; const AccountService = { @@ -370,12 +351,10 @@ const store = { hasConfigEntry: CheatService.hasConfigEntry, navigateToCheatConfig: CheatService.navigateToCheatConfig, clearForcedConfigPath: CheatService.clearForcedConfigPath, - openConfigDrawer: CheatService.openConfigDrawer, closeConfigDrawer: CheatService.closeConfigDrawer, loadCheatStates: CheatStateService.loadCheatStates, loadConfig: ConfigService.loadConfig, - saveConfig: ConfigService.saveConfig, loadAccountOptions: AccountService.loadAccountOptions, From c6e2595425acb5cde8a1a330fe8b31fc8e113dea Mon Sep 17 00:00:00 2001 From: Arnold W Date: Thu, 30 Jul 2026 03:51:27 +0200 Subject: [PATCH 05/32] refactor: remove unused abstractions --- docs/account-pages.md | 21 ++-- src/cheats/api/search.js | 10 -- src/cheats/core/globals.js | 19 +--- src/cheats/core/setup.js | 2 +- src/cheats/core/state.js | 7 -- src/cheats/helpers/bundles.js | 9 -- src/cheats/helpers/obolRolling.js | 10 +- src/cheats/ui/overlay.js | 20 ---- src/modules/autoUpdater.js | 48 +------- src/modules/config/configManager.js | 4 +- src/modules/server/wsServer.js | 57 ---------- src/modules/updateChecker.js | 80 +++++-------- src/modules/utils/logger.js | 9 -- src/modules/utils/objectUtils.js | 15 +-- src/ui/components/views/account/TasksTab.js | 7 +- src/ui/components/views/account/W1Tab.js | 31 +---- src/ui/components/views/account/W2Tab.js | 66 +---------- src/ui/components/views/account/W3Tab.js | 60 +--------- src/ui/components/views/account/W4Tab.js | 29 +---- src/ui/components/views/account/W5Tab.js | 31 +---- src/ui/components/views/account/W6Tab.js | 31 +---- src/ui/components/views/account/W7Tab.js | 31 +---- .../account/components/AccountPageShell.js | 105 ----------------- .../account/components/AccountTabHeader.js | 22 ---- .../components/PersistentAccountListPage.js | 70 +++++++++--- src/ui/components/views/account/tabShared.js | 106 ++++++++++-------- .../views/account/w4/BreedingTab.js | 30 +---- .../components/views/account/w4/CookingTab.js | 30 +---- src/ui/components/views/account/w4/LabTab.js | 30 +---- .../views/account/w5/DivinityTab.js | 32 +----- .../components/views/account/w5/GamingTab.js | 32 +----- src/ui/components/views/account/w5/HoleTab.js | 32 +----- .../components/views/account/w5/SailingTab.js | 32 +----- .../components/views/account/w6/FarmingTab.js | 32 +----- .../views/account/w6/SneakingTab.js | 32 +----- .../views/account/w6/SummoningTab.js | 32 +----- .../components/views/account/w7/GalleryTab.js | 32 +----- .../views/account/w7/ResearchTab.js | 32 +----- .../views/account/w7/SpelunkingTab.js | 32 +----- .../components/views/account/w7/SushiTab.js | 32 +----- src/ui/components/views/search/sections.js | 2 +- src/ui/services/ws.js | 17 --- src/ui/styles/_account-pages.css | 5 - src/ui/styles/_world-tabs.css | 59 ---------- src/ui/styles/tabs/w3/_construction.css | 0 src/ui/styles/tabs/w3/_index.css | 1 - src/ui/utils/functionParser.js | 17 --- 47 files changed, 215 insertions(+), 1228 deletions(-) delete mode 100644 src/ui/components/views/account/components/AccountPageShell.js delete mode 100644 src/ui/components/views/account/components/AccountTabHeader.js delete mode 100644 src/ui/styles/tabs/w3/_construction.css diff --git a/docs/account-pages.md b/docs/account-pages.md index fe594459..ee9f5365 100644 --- a/docs/account-pages.md +++ b/docs/account-pages.md @@ -13,7 +13,7 @@ Read these files before adding or changing an Account feature tab: - `src/ui/components/views/account/W1Tab.js` ... `W7Tab.js` World tab shells and sub-tab registries. - `src/ui/components/views/account/tabShared.js` - Shared tab navigation, lazy panes, persistent panes, and coming-soon placeholders. + Shared world/nested tab factories, tab navigation, lazy panes, and persistent panes. - `src/ui/components/views/account/accountLoadPolicy.js` `useAccountLoad()` for standardized load state and load failure logging. - `src/ui/components/views/account/accountShared.js` @@ -24,8 +24,7 @@ Read these files before adding or changing an Account feature tab: Current structure: - Top-level Account tabs include Account Options, Upgrade Vault, and W1-W7. -- W1-W3 contain implemented feature tabs. -- W4-W7 currently use `createWorldComingSoonTab(...)`. +- W1-W7 contain implemented feature tabs. - W2 has a nested Alchemy panel: Brewing, Liquid, Vials, Pay 2 Win, Sigils. - W3 has a nested Construction panel: Buildings, Cogs. @@ -34,8 +33,7 @@ Current structure: ### Page chrome - Prefer `PersistentAccountListPage(...)` for most editable Account features. -- Use `AccountPageShell(...)` directly only when the wrapper needs behavior not exposed by `PersistentAccountListPage`. -- Use `AccountTabHeader`, `RefreshButton`, `WarningBanner`, `NoticeBanner`, `AccountSection`, and `AccountRow` before adding tab-local chrome. +- Use `RefreshButton`, `WarningBanner`, `NoticeBanner`, `AccountSection`, and `AccountRow` before adding tab-local chrome. - Keep tab-specific selectors out of shared CSS unless they define a reusable primitive. ### Loading @@ -107,7 +105,7 @@ export const MyFeatureTab = () => { Use when the tab is small, mostly read-only, and remounting content after load is acceptable. -Use `AccountPageShell` with `loadState` and `renderBody`, or pass a small reactive `body` to `PersistentAccountListPage` when the surrounding page should still use persistent Account chrome. +Pass a small reactive `body` to `PersistentAccountListPage` when the surrounding page should keep persistent Account chrome. ### Pattern C: Cached collection or card UI @@ -194,7 +192,7 @@ Prefer `EditableNumberRow` when this pattern fits; it already handles draft text 1. Find the nested registry, such as `ALCHEMY_SUBTABS` in `W2Tab.js` or `CONSTRUCTION_SUBTABS` in `W3Tab.js`. 2. Add the new tab to that nested array. -3. Reuse the existing `renderTabNav(...)` and `renderLazyPanes(...)` panel structure. +3. Keep the registry wired through the existing `createNestedTab(...)` component. 4. Keep panel-specific CSS near the world's existing tab CSS. ### Add a top-level Account tab @@ -208,13 +206,8 @@ Prefer `EditableNumberRow` when this pattern fits; it already handles draft text 1. Create `src/ui/components/views/account/WNTab.js`. 2. Register it in `src/ui/components/views/Account.js` with `isWorld: true` and `worldNum`. -3. Add world-specific styles and imports. -4. If the world is not implemented yet, prefer `createWorldComingSoonTab(...)`. - -### Placeholder behavior - -- For unimplemented sub-tabs, use `component: null` and `createComingSoonPlaceholder(...)`. -- Do not attach write behavior or load behavior to placeholders. +3. Define its sub-tab registry and export it with `createWorldTab(...)`. +4. Add world-specific styles and imports. ## 7) CSS rules diff --git a/src/cheats/api/search.js b/src/cheats/api/search.js index 4f2e3c88..c4a515d9 100644 --- a/src/cheats/api/search.js +++ b/src/cheats/api/search.js @@ -264,13 +264,3 @@ export function searchGga(query, keys, options = null) { return { results, totalCount: results.length, truncated }; } - -/** - * Classify a query string into a value type (any/range/number/string/etc.). - * @param {string} query - * @returns {string} The detected type tag - */ -export function detectQueryType(query) { - const parsed = parseQuery(query); - return parsed.type; -} diff --git a/src/cheats/core/globals.js b/src/cheats/core/globals.js index 696d2341..f45b01d2 100644 --- a/src/cheats/core/globals.js +++ b/src/cheats/core/globals.js @@ -9,7 +9,7 @@ * The Stencyl game engine reference. * @type {object|null} */ -export let bEngine = null; +let bEngine = null; /** * Game attributes map from the game. @@ -134,22 +134,6 @@ export function registerCommonVariables(context) { }); } -/** - * Get the current game context. - * @returns {object|null} - */ -export function getGameContext() { - return gameContext; -} - -/** - * Check if game globals are initialized. - * @returns {boolean} - */ -export function isGameReady() { - return bEngine !== null && itemDefs !== null; -} - // Individual accessor functions for backwards compatibility export const getBEngine = () => bEngine; export const getItemDefs = () => itemDefs; @@ -157,5 +141,4 @@ export const getMonsterDefs = () => monsterDefs; export const getCList = () => cList; export const getBehavior = () => behavior; export const getEvents = () => events; -export const getActorModel = () => ActorModel; export const getGGA = () => gga; diff --git a/src/cheats/core/setup.js b/src/cheats/core/setup.js index 55f04a60..4791a50a 100644 --- a/src/cheats/core/setup.js +++ b/src/cheats/core/setup.js @@ -65,6 +65,6 @@ export async function setup() { * * @returns {string[]} Array of result messages */ -export function runStartupCheats() { +function runStartupCheats() { return startupCheats.map((c) => cheat(c, gameContext)); } diff --git a/src/cheats/core/state.js b/src/cheats/core/state.js index 8d1a26c4..26983d15 100644 --- a/src/cheats/core/state.js +++ b/src/cheats/core/state.js @@ -71,10 +71,3 @@ export let setupDone = false; export function markSetupDone() { setupDone = true; } - -/** - * Reset setup state (used for re-initialization). - */ -export function resetSetupState() { - setupDone = false; -} diff --git a/src/cheats/helpers/bundles.js b/src/cheats/helpers/bundles.js index 8629259a..3e89d34a 100644 --- a/src/cheats/helpers/bundles.js +++ b/src/cheats/helpers/bundles.js @@ -25,12 +25,3 @@ export function getAllBundles() { return allBundles; } - -/** - * Get a map from bundle code to display name. - * - * @returns {Map} Map of bundleCode -> displayName - */ -export function getBundleCodeToNameMap() { - return new Map(getAllBundles().map(([name, code]) => [code, name])); -} diff --git a/src/cheats/helpers/obolRolling.js b/src/cheats/helpers/obolRolling.js index 4dc07f42..87a35a05 100644 --- a/src/cheats/helpers/obolRolling.js +++ b/src/cheats/helpers/obolRolling.js @@ -39,21 +39,21 @@ export function rollAllObols(force = false) { /** * Roll personal obols to perfect stats. */ -export function rollPersonalObols() { +function rollPersonalObols() { rollPerfectObols(gga.ObolEquippedOrder[0], gga.ObolEquippedMap[0], gga.CharacterClass); } /** * Roll family obols to perfect stats. */ -export function rollFamilyObols() { +function rollFamilyObols() { rollPerfectObols(gga.ObolEquippedOrder[1], gga.ObolEquippedMap[1], gga.CharacterClass); } /** * Roll all characters' obols to perfect stats. */ -export function rollAllCharactersObols() { +function rollAllCharactersObols() { Object.values(gga.PlayerDATABASE.h).forEach((player) => { rollPerfectObols(player.h.ObolEquippedOrder, player.h.ObolEquippedMap, player.h.CharacterClass); }); @@ -62,7 +62,7 @@ export function rollAllCharactersObols() { /** * Roll inventory obols to perfect stats. */ -export function rollInventoryObols() { +function rollInventoryObols() { const inventoryOrder = gga.ObolInventoryOrder; const inventoryMap = gga.ObolInventoryMap; const characterClass = gga.CharacterClass; @@ -79,7 +79,7 @@ export function rollInventoryObols() { * @param {Array} obolMap - Array of obol stat maps * @param {number} characterClass - The character class ID */ -export function rollPerfectObols(obolOrder, obolMap, characterClass) { +function rollPerfectObols(obolOrder, obolMap, characterClass) { const primaryStat = getPrimaryStat(characterClass); const preferredStat = cheatConfig.wide.perfectobols.preferredstat === "PRIMARY" diff --git a/src/cheats/ui/overlay.js b/src/cheats/ui/overlay.js index 0b92f0dc..b6414d1e 100644 --- a/src/cheats/ui/overlay.js +++ b/src/cheats/ui/overlay.js @@ -145,23 +145,3 @@ export function injectWebUI() { uiContainer.appendChild(toggleBtn); document.body.appendChild(uiContainer); } - -/** - * Check if the UI is currently expanded. - * @returns {boolean} - */ -export function isUIExpanded() { - return isUiExpanded; -} - -/** - * Toggle the UI visibility. - */ -export function toggleUI() { - if (uiContainer) { - const toggleBtn = document.getElementById("cheat-ui-toggle"); - if (toggleBtn) { - toggleBtn.click(); - } - } -} diff --git a/src/modules/autoUpdater.js b/src/modules/autoUpdater.js index 73fb13bc..9dab8f1e 100644 --- a/src/modules/autoUpdater.js +++ b/src/modules/autoUpdater.js @@ -1,5 +1,3 @@ -const https = require("https"); -const http = require("http"); const fs = require("fs"); const path = require("path"); const os = require("os"); @@ -9,7 +7,6 @@ const { createLogger } = require("./utils/logger"); const log = createLogger("AutoUpdater"); -const MAX_REDIRECTS = 5; const UPDATE_FILES = ["cheats.js", "config.js"]; const RELEASE_ARCHIVES = { win32: [{ name: "InjectCheatsUI-Windows.zip" }], @@ -24,48 +21,15 @@ const RELEASE_ARCHIVES = { * Download a file from a URL, following HTTP redirects. * @param {string} url - URL to download * @param {string} destPath - Local file path to write to - * @param {number} [redirectCount=0] - Current redirect depth * @returns {Promise} */ -function downloadFile(url, destPath, redirectCount = 0) { - return new Promise((resolve, reject) => { - if (redirectCount > MAX_REDIRECTS) { - return reject(new Error("Too many redirects")); - } - - const requestUrl = new URL(url); - const options = { - hostname: requestUrl.hostname, - path: requestUrl.pathname + requestUrl.search, - method: "GET", - headers: { "User-Agent": "Idleon-Injector-AutoUpdater" }, - }; - - const handler = (res) => { - if (res.statusCode >= 300 && res.statusCode < 400 && res.headers.location) { - res.resume(); - return resolve(downloadFile(res.headers.location, destPath, redirectCount + 1)); - } - - if (res.statusCode !== 200) { - res.resume(); - return reject(new Error(`Download failed with status ${res.statusCode}`)); - } - - const file = fs.createWriteStream(destPath); - res.pipe(file); - file.on("finish", () => file.close(resolve)); - file.on("error", (err) => { - fs.unlink(destPath, () => {}); - reject(err); - }); - }; - - const transport = requestUrl.protocol === "https:" ? https : http; - const req = transport.request(options, handler); - req.on("error", reject); - req.end(); +async function downloadFile(url, destPath) { + const response = await fetch(url, { + headers: { "User-Agent": "Idleon-Injector-AutoUpdater" }, }); + if (!response.ok) throw new Error(`Download failed with status ${response.status}`); + + await fs.promises.writeFile(destPath, Buffer.from(await response.arrayBuffer())); } /** diff --git a/src/modules/config/configManager.js b/src/modules/config/configManager.js index 133ae1ab..8c4b2f2f 100644 --- a/src/modules/config/configManager.js +++ b/src/modules/config/configManager.js @@ -6,7 +6,7 @@ * interface for all configuration-related operations throughout the application. */ -const { deepClone, union, deepMerge } = require("../utils/objectUtils"); +const { deepClone, deepMerge } = require("../utils/objectUtils"); const { validateConfig } = require("../utils/helpers"); const { getRuntimePath } = require("../utils/runtimePaths"); const os = require("os"); @@ -46,7 +46,7 @@ function loadConfiguration() { if (customConfig.startupCheats) { if (Array.isArray(customConfig.startupCheats)) { - config.startupCheats = union(config.startupCheats, customConfig.startupCheats); + config.startupCheats = [...new Set([...config.startupCheats, ...customConfig.startupCheats])]; } else { log.error("startupCheats must be an array, received '" + typeof customConfig.startupCheats + "'"); } diff --git a/src/modules/server/wsServer.js b/src/modules/server/wsServer.js index 6d206408..181aca3f 100644 --- a/src/modules/server/wsServer.js +++ b/src/modules/server/wsServer.js @@ -625,64 +625,7 @@ function broadcastMonitorState() { } } -/** - * Gets the number of connected WebSocket clients - * @returns {number} Number of connected clients - */ -function getConnectedClients() { - return clients.size; -} - -/** - * Closes the WebSocket server and all connections - */ -function closeWebSocket() { - if (wss) { - // Best-effort, non-blocking: awaiting a CDP evaluate during shutdown can - // hang if the connection is already gone. We still inspect - // exceptionDetails so a game-context failure is logged rather than lost. - if (runtimeRef && contextRef) { - void (async () => { - try { - const result = await runtimeRef.evaluate({ - expression: "window.monitorUnwrapAll()", - awaitPromise: true, - returnByValue: true, - }); - if (result.exceptionDetails) { - log.error("Error unwrapping all monitors during shutdown:", result.exceptionDetails.text); - } - } catch (err) { - log.error("Error unwrapping all monitors during shutdown:", err.message); - } - })(); - } - - for (const client of clients) { - client.close(); - } - clients.clear(); - clientMonitorState.clear(); - for (const retryMap of monitorSubscribeRetryTimers.values()) { - for (const timer of retryMap.values()) { - clearTimeout(timer); - } - } - monitorSubscribeRetryTimers.clear(); - for (const timer of monitorSendTimers.values()) { - clearTimeout(timer); - } - monitorSendTimers.clear(); - globalWatchersByPath.clear(); - wss.close(); - wss = null; - log.info("Server closed"); - } -} - module.exports = { initWebSocket, broadcastCheatStates, - getConnectedClients, - closeWebSocket, }; diff --git a/src/modules/updateChecker.js b/src/modules/updateChecker.js index 294dbb3a..e318c3cd 100644 --- a/src/modules/updateChecker.js +++ b/src/modules/updateChecker.js @@ -1,4 +1,3 @@ -const https = require("https"); const { createLogger } = require("./utils/logger"); const log = createLogger("UpdateChecker"); @@ -27,62 +26,33 @@ function compareVersions(v1, v2) { * @param {string} currentVersion - The current version of the application. * @returns {Promise<{updateAvailable: boolean, latestVersion: string, url: string}|null>} */ -function checkForUpdates(currentVersion) { - return new Promise((resolve) => { - const options = { - hostname: "api.github.com", - path: "/repos/MrJoiny/Idleon-Injector/releases/latest", - method: "GET", - headers: { - "User-Agent": "Idleon-Injector-Update-Checker", - }, - }; - - const req = https.request(options, (res) => { - let data = ""; - - res.on("data", (chunk) => { - data += chunk; - }); - - res.on("end", () => { - if (res.statusCode === 200) { - try { - const release = JSON.parse(data); - const latestVersion = release.tag_name; - - if (compareVersions(latestVersion, currentVersion) > 0) { - resolve({ - updateAvailable: true, - latestVersion: latestVersion, - url: release.html_url, - assets: (release.assets || []).map((a) => ({ - name: a.name, - url: a.browser_download_url, - size: a.size, - })), - }); - } else { - resolve({ updateAvailable: false }); - } - } catch (e) { - log.error("Failed to parse update check response:", e); - resolve(null); - } - } else { - // Silently fail on non-200 to avoid annoying users if offline/rate limited - resolve(null); - } - }); +async function checkForUpdates(currentVersion) { + try { + const response = await fetch("https://api.github.com/repos/MrJoiny/Idleon-Injector/releases/latest", { + headers: { "User-Agent": "Idleon-Injector-Update-Checker" }, }); - req.on("error", (error) => { - log.error("Update check failed:", error.message); - resolve(null); - }); - - req.end(); - }); + // Silently fail on non-200 to avoid annoying users if offline/rate limited + if (!response.ok) return null; + + const release = await response.json(); + const latestVersion = release.tag_name; + if (compareVersions(latestVersion, currentVersion) <= 0) return { updateAvailable: false }; + + return { + updateAvailable: true, + latestVersion, + url: release.html_url, + assets: (release.assets || []).map((asset) => ({ + name: asset.name, + url: asset.browser_download_url, + size: asset.size, + })), + }; + } catch (error) { + log.error("Update check failed:", error.message); + return null; + } } module.exports = { checkForUpdates }; diff --git a/src/modules/utils/logger.js b/src/modules/utils/logger.js index 97fe2e07..2ab6dcc1 100644 --- a/src/modules/utils/logger.js +++ b/src/modules/utils/logger.js @@ -123,14 +123,6 @@ function getConfiguredLevel() { return configuredLevel; } -/** - * Resets the cached log level. Call this after config changes. - */ -function resetLogLevel() { - configuredLevel = null; - configLoaded = false; -} - /** * Ensures the log directory exists. */ @@ -308,6 +300,5 @@ function createLogger(moduleName) { module.exports = { createLogger, - resetLogLevel, setActivePrompt, }; diff --git a/src/modules/utils/objectUtils.js b/src/modules/utils/objectUtils.js index d3bd38e1..3ec19a68 100644 --- a/src/modules/utils/objectUtils.js +++ b/src/modules/utils/objectUtils.js @@ -2,7 +2,7 @@ * Object Utility Functions * * Native JavaScript implementations for object manipulation. - * Provides deepClone, deepMerge, and union functions. + * Provides deepClone and deepMerge functions. */ /** @@ -46,18 +46,6 @@ const deepClone = (obj) => { return cloned; }; -/** - * Union of two arrays (concatenates and deduplicates) - * @param {Array} arr1 - First array - * @param {Array} arr2 - Second array - * @returns {Array} New array with unique elements from both arrays - */ -const union = (arr1, arr2) => { - const a1 = Array.isArray(arr1) ? arr1 : []; - const a2 = Array.isArray(arr2) ? arr2 : []; - return [...new Set([...a1, ...a2])]; -}; - /** * Deep merge two objects (mutates target in-place) * Behavior matches lodash merge: @@ -98,6 +86,5 @@ const deepMerge = (target, source) => { module.exports = { deepClone, - union, deepMerge, }; diff --git a/src/ui/components/views/account/TasksTab.js b/src/ui/components/views/account/TasksTab.js index 911dd457..766c38b7 100644 --- a/src/ui/components/views/account/TasksTab.js +++ b/src/ui/components/views/account/TasksTab.js @@ -8,7 +8,7 @@ import { cleanName, cleanNameEffect, createStaticRowReconciler, getOrCreateState import { RefreshButton } from "./components/AccountPageChrome.js"; import { AccountSection } from "./components/AccountSection.js"; import { PersistentAccountListPage } from "./components/PersistentAccountListPage.js"; -import { createComingSoonPlaceholder, renderLazyPanes, renderTabNav } from "./tabShared.js"; +import { renderLazyPanes, renderTabNav } from "./tabShared.js"; const { div, span } = van.tags; @@ -397,8 +397,6 @@ const WorldTasksPanel = ({ worldIndex }) => { activeId: active, navClass: "account-nested-sub-nav", buttonClass: "account-nested-sub-tab-btn", - stubClass: "account-nested-sub-tab-btn--stub", - isStub: (tab) => !tab.component, }), div( { class: "account-nested-sub-content" }, @@ -408,8 +406,7 @@ const WorldTasksPanel = ({ worldIndex }) => { paneClass: "account-nested-pane", activeClass: "account-nested-pane--active", dataAttr: "data-tasks-panel", - renderContent: (tab) => - tab.component ? tab.component(worldIndex) : createComingSoonPlaceholder(tab.label), + renderContent: (tab) => tab.component(worldIndex), }) ) ); diff --git a/src/ui/components/views/account/W1Tab.js b/src/ui/components/views/account/W1Tab.js index bfc89446..0f181fb5 100644 --- a/src/ui/components/views/account/W1Tab.js +++ b/src/ui/components/views/account/W1Tab.js @@ -2,7 +2,6 @@ * World 1 Tab - Blunder Hills */ -import van from "../../../vendor/van-1.6.0.js"; import { StampsTab } from "./w1/StampsTab.js"; import { AnvilTab } from "./w1/AnvilTab.js"; import { ForgeTab } from "./w1/ForgeTab.js"; @@ -10,9 +9,7 @@ import { StatuesTab } from "./w1/StatuesTab.js"; import { OrionTab } from "./w1/OrionTab.js"; import { StarSignsTab } from "./w1/StarSignsTab.js"; import { CompanionsTab } from "./w1/CompanionsTab.js"; -import { createComingSoonPlaceholder, renderLazyPanes, renderTabNav } from "./tabShared.js"; - -const { div } = van.tags; +import { createWorldTab } from "./tabShared.js"; const W1_SUBTABS = [ { id: "stamps", label: "STAMPS", component: StampsTab }, @@ -24,28 +21,4 @@ const W1_SUBTABS = [ { id: "companions", label: "PETS", component: CompanionsTab }, ]; -export const W1Tab = () => { - const activeSubTab = van.state(W1_SUBTABS[0].id); - - return div( - { class: "world-tab w1-world-tab" }, - renderTabNav({ - tabs: W1_SUBTABS, - activeId: activeSubTab, - navClass: "world-sub-nav", - buttonClass: "account-world-sub-tab-btn", - stubClass: "account-world-sub-tab-btn--stub", - isStub: (tab) => !tab.component, - }), - div( - { class: "world-sub-content" }, - ...renderLazyPanes({ - tabs: W1_SUBTABS, - activeId: activeSubTab, - paneClass: "world-sub-pane", - dataAttr: "data-subtab", - renderContent: (tab) => (tab.component ? tab.component() : createComingSoonPlaceholder(tab.label)), - }) - ) - ); -}; +export const W1Tab = createWorldTab(W1_SUBTABS, "w1-world-tab"); diff --git a/src/ui/components/views/account/W2Tab.js b/src/ui/components/views/account/W2Tab.js index f8c48787..2ae1f4f8 100644 --- a/src/ui/components/views/account/W2Tab.js +++ b/src/ui/components/views/account/W2Tab.js @@ -2,7 +2,6 @@ * World 2 Tab - Yum-Yum Desert */ -import van from "../../../vendor/van-1.6.0.js"; import { BrewingTab } from "./w2/BrewingTab.js"; import { LiquidTab } from "./w2/LiquidTab.js"; import { VialTab } from "./w2/VialTab.js"; @@ -12,9 +11,7 @@ import { ArcadeTab } from "./w2/ArcadeTab.js"; import { PostOfficeTab } from "./w2/PostOfficeTab.js"; import { KillroyTab } from "./w2/KillroyTab.js"; import { PoppyTab } from "./w2/PoppyTab.js"; -import { createComingSoonPlaceholder, renderLazyPanes, renderTabNav } from "./tabShared.js"; - -const { div } = van.tags; +import { createNestedTab, createWorldTab } from "./tabShared.js"; const ALCHEMY_SUBTABS = [ { id: "brewing", label: "BREWING", component: BrewingTab }, @@ -24,67 +21,14 @@ const ALCHEMY_SUBTABS = [ { id: "sigils", label: "SIGILS", component: SigilTab }, ]; +const AlchemyPanel = createNestedTab(ALCHEMY_SUBTABS, "", "data-alchemy"); + const W2_SUBTABS = [ - { id: "alchemy", label: "ALCHEMY", component: null }, + { id: "alchemy", label: "ALCHEMY", component: AlchemyPanel }, { id: "arcade", label: "ARCADE", component: ArcadeTab }, { id: "post-office", label: "POST OFFICE", component: PostOfficeTab }, { id: "killroy", label: "KILLROY", component: KillroyTab }, { id: "poppy", label: "POPPY", component: PoppyTab }, ]; -const AlchemyPanel = () => { - const active = van.state(ALCHEMY_SUBTABS[0].id); - - return div( - { class: "tab-container" }, - renderTabNav({ - tabs: ALCHEMY_SUBTABS, - activeId: active, - navClass: "account-nested-sub-nav", - buttonClass: "account-nested-sub-tab-btn", - stubClass: "account-nested-sub-tab-btn--stub", - isStub: (tab) => !tab.component, - }), - div( - { class: "account-nested-sub-content" }, - ...renderLazyPanes({ - tabs: ALCHEMY_SUBTABS, - activeId: active, - paneClass: "account-nested-pane", - activeClass: "account-nested-pane--active", - dataAttr: "data-alchemy", - renderContent: (tab) => (tab.component ? tab.component() : createComingSoonPlaceholder(tab.label)), - }) - ) - ); -}; - -export const W2Tab = () => { - const activeSubTab = van.state(W2_SUBTABS[0].id); - - return div( - { class: "world-tab w2-world-tab" }, - renderTabNav({ - tabs: W2_SUBTABS, - activeId: activeSubTab, - navClass: "world-sub-nav", - buttonClass: "account-world-sub-tab-btn", - stubClass: "account-world-sub-tab-btn--stub", - isStub: (tab) => !tab.component && tab.id !== "alchemy", - }), - div( - { class: "world-sub-content" }, - ...renderLazyPanes({ - tabs: W2_SUBTABS, - activeId: activeSubTab, - paneClass: "world-sub-pane", - dataAttr: "data-subtab", - renderContent: (tab) => { - if (tab.id === "alchemy") return AlchemyPanel(); - if (tab.component) return tab.component(); - return createComingSoonPlaceholder(tab.label); - }, - }) - ) - ); -}; +export const W2Tab = createWorldTab(W2_SUBTABS, "w2-world-tab"); diff --git a/src/ui/components/views/account/W3Tab.js b/src/ui/components/views/account/W3Tab.js index 420993f4..b2d6869b 100644 --- a/src/ui/components/views/account/W3Tab.js +++ b/src/ui/components/views/account/W3Tab.js @@ -2,7 +2,6 @@ * World 3 Tab - Frostbite Tundra */ -import van from "../../../vendor/van-1.6.0.js"; import { ConstructionBuildingsTab } from "./w3/ConstructionBuildingsTab.js"; import { CogsTab } from "./w3/CogsTab.js"; import { RefineryTab } from "./w3/RefineryTab.js"; @@ -15,15 +14,15 @@ import { DeathNoteTab } from "./w3/DeathNoteTab.js"; import { LibraryTab } from "./w3/LibraryTab.js"; import { EquinoxTab } from "./w3/EquinoxTab.js"; import { TrappingTab } from "./w3/TrappingTab.js"; -import { createComingSoonPlaceholder, renderLazyPanes, renderTabNav } from "./tabShared.js"; - -const { div } = van.tags; +import { createNestedTab, createWorldTab } from "./tabShared.js"; const CONSTRUCTION_SUBTABS = [ { id: "buildings", label: "BUILDINGS", component: ConstructionBuildingsTab }, { id: "cogs", label: "COGS", component: CogsTab }, ]; +const ConstructionPanel = createNestedTab(CONSTRUCTION_SUBTABS, "", "data-construction"); + const W3_SUBTABS = [ { id: "construction", label: "CONSTRUCTION", component: ConstructionPanel }, { id: "refinery", label: "REFINERY", component: RefineryTab }, @@ -38,55 +37,4 @@ const W3_SUBTABS = [ { id: "trapping", label: "TRAPPING", component: TrappingTab }, ]; -function ConstructionPanel() { - const active = van.state(CONSTRUCTION_SUBTABS[0].id); - - return div( - { class: "tab-container" }, - renderTabNav({ - tabs: CONSTRUCTION_SUBTABS, - activeId: active, - navClass: "account-nested-sub-nav", - buttonClass: "account-nested-sub-tab-btn", - stubClass: "account-nested-sub-tab-btn--stub", - isStub: (tab) => !tab.component, - }), - div( - { class: "account-nested-sub-content" }, - ...renderLazyPanes({ - tabs: CONSTRUCTION_SUBTABS, - activeId: active, - paneClass: "account-nested-pane", - activeClass: "account-nested-pane--active", - dataAttr: "data-construction", - renderContent: (tab) => (tab.component ? tab.component() : createComingSoonPlaceholder(tab.label)), - }) - ) - ); -} - -export const W3Tab = () => { - const activeSubTab = van.state(W3_SUBTABS[0].id); - - return div( - { class: "world-tab w3-world-tab" }, - renderTabNav({ - tabs: W3_SUBTABS, - activeId: activeSubTab, - navClass: "world-sub-nav", - buttonClass: "account-world-sub-tab-btn", - stubClass: "account-world-sub-tab-btn--stub", - isStub: (tab) => !tab.component, - }), - div( - { class: "world-sub-content" }, - ...renderLazyPanes({ - tabs: W3_SUBTABS, - activeId: activeSubTab, - paneClass: "world-sub-pane", - dataAttr: "data-subtab", - renderContent: (tab) => (tab.component ? tab.component() : createComingSoonPlaceholder(tab.label)), - }) - ) - ); -}; +export const W3Tab = createWorldTab(W3_SUBTABS, "w3-world-tab"); diff --git a/src/ui/components/views/account/W4Tab.js b/src/ui/components/views/account/W4Tab.js index 9d45b4f3..bc70932c 100644 --- a/src/ui/components/views/account/W4Tab.js +++ b/src/ui/components/views/account/W4Tab.js @@ -1,12 +1,9 @@ -import van from "../../../vendor/van-1.6.0.js"; import { BreedingTab } from "./w4/BreedingTab.js"; import { CookingTab } from "./w4/CookingTab.js"; import { LabTab } from "./w4/LabTab.js"; import { RiftTab } from "./w4/RiftTab.js"; import { TomeTab } from "./w4/TomeTab.js"; -import { renderLazyPanes, renderTabNav } from "./tabShared.js"; - -const { div } = van.tags; +import { createWorldTab } from "./tabShared.js"; const W4_SUBTABS = [ { id: "cooking", label: "COOKING", component: CookingTab }, @@ -16,26 +13,4 @@ const W4_SUBTABS = [ { id: "tome", label: "TOME", component: TomeTab }, ]; -export const W4Tab = () => { - const activeSubTab = van.state(W4_SUBTABS[0].id); - - return div( - { class: "world-tab w4-world-tab" }, - renderTabNav({ - tabs: W4_SUBTABS, - activeId: activeSubTab, - navClass: "world-sub-nav", - buttonClass: "account-world-sub-tab-btn", - }), - div( - { class: "world-sub-content" }, - ...renderLazyPanes({ - tabs: W4_SUBTABS, - activeId: activeSubTab, - paneClass: "world-sub-pane", - dataAttr: "data-subtab", - renderContent: (tab) => tab.component(), - }) - ) - ); -}; +export const W4Tab = createWorldTab(W4_SUBTABS, "w4-world-tab"); diff --git a/src/ui/components/views/account/W5Tab.js b/src/ui/components/views/account/W5Tab.js index 3548af48..086f7e43 100644 --- a/src/ui/components/views/account/W5Tab.js +++ b/src/ui/components/views/account/W5Tab.js @@ -1,11 +1,8 @@ -import van from "../../../vendor/van-1.6.0.js"; import { DivinityTab } from "./w5/DivinityTab.js"; import { GamingTab } from "./w5/GamingTab.js"; import { HoleTab } from "./w5/HoleTab.js"; import { SailingTab } from "./w5/SailingTab.js"; -import { createComingSoonPlaceholder, renderLazyPanes, renderTabNav } from "./tabShared.js"; - -const { div } = van.tags; +import { createWorldTab } from "./tabShared.js"; const W5_SUBTABS = [ { id: "sailing", label: "SAILING", component: SailingTab }, @@ -14,28 +11,4 @@ const W5_SUBTABS = [ { id: "hole", label: "HOLE", component: HoleTab }, ]; -export const W5Tab = () => { - const activeSubTab = van.state(W5_SUBTABS[0].id); - - return div( - { class: "world-tab w5-world-tab" }, - renderTabNav({ - tabs: W5_SUBTABS, - activeId: activeSubTab, - navClass: "world-sub-nav", - buttonClass: "account-world-sub-tab-btn", - stubClass: "account-world-sub-tab-btn--stub", - isStub: (tab) => !tab.component, - }), - div( - { class: "world-sub-content" }, - ...renderLazyPanes({ - tabs: W5_SUBTABS, - activeId: activeSubTab, - paneClass: "world-sub-pane", - dataAttr: "data-subtab", - renderContent: (tab) => (tab.component ? tab.component() : createComingSoonPlaceholder(tab.label)), - }) - ) - ); -}; +export const W5Tab = createWorldTab(W5_SUBTABS, "w5-world-tab"); diff --git a/src/ui/components/views/account/W6Tab.js b/src/ui/components/views/account/W6Tab.js index c2a69daa..37179d0b 100644 --- a/src/ui/components/views/account/W6Tab.js +++ b/src/ui/components/views/account/W6Tab.js @@ -1,11 +1,8 @@ -import van from "../../../vendor/van-1.6.0.js"; import { BeanstackTab } from "./w6/BeanstackTab.js"; import { FarmingTab } from "./w6/FarmingTab.js"; import { SneakingTab } from "./w6/SneakingTab.js"; import { SummoningTab } from "./w6/SummoningTab.js"; -import { createComingSoonPlaceholder, renderLazyPanes, renderTabNav } from "./tabShared.js"; - -const { div } = van.tags; +import { createWorldTab } from "./tabShared.js"; const W6_SUBTABS = [ { id: "farming", label: "FARMING", component: FarmingTab }, @@ -14,28 +11,4 @@ const W6_SUBTABS = [ { id: "beanstack", label: "BEANSTACK", component: BeanstackTab }, ]; -export const W6Tab = () => { - const activeSubTab = van.state(W6_SUBTABS[0].id); - - return div( - { class: "world-tab w6-world-tab" }, - renderTabNav({ - tabs: W6_SUBTABS, - activeId: activeSubTab, - navClass: "world-sub-nav", - buttonClass: "account-world-sub-tab-btn", - stubClass: "account-world-sub-tab-btn--stub", - isStub: (tab) => !tab.component, - }), - div( - { class: "world-sub-content" }, - ...renderLazyPanes({ - tabs: W6_SUBTABS, - activeId: activeSubTab, - paneClass: "world-sub-pane", - dataAttr: "data-subtab", - renderContent: (tab) => (tab.component ? tab.component() : createComingSoonPlaceholder(tab.label)), - }) - ) - ); -}; +export const W6Tab = createWorldTab(W6_SUBTABS, "w6-world-tab"); diff --git a/src/ui/components/views/account/W7Tab.js b/src/ui/components/views/account/W7Tab.js index 982a1f2c..d4c36113 100644 --- a/src/ui/components/views/account/W7Tab.js +++ b/src/ui/components/views/account/W7Tab.js @@ -1,4 +1,3 @@ -import van from "../../../vendor/van-1.6.0.js"; import { BigFishTab } from "./w7/BigFishTab.js"; import { ButtonTab } from "./w7/ButtonTab.js"; import { ClamTab } from "./w7/ClamTab.js"; @@ -11,9 +10,7 @@ import { ResearchTab } from "./w7/ResearchTab.js"; import { SpelunkingTab } from "./w7/SpelunkingTab.js"; import { SushiTab } from "./w7/SushiTab.js"; import { ZenithTab } from "./w7/ZenithTab.js"; -import { createComingSoonPlaceholder, renderLazyPanes, renderTabNav } from "./tabShared.js"; - -const { div } = van.tags; +import { createWorldTab } from "./tabShared.js"; const W7_SUBTABS = [ { id: "spelunking", label: "SPELUNKING", component: SpelunkingTab }, @@ -30,28 +27,4 @@ const W7_SUBTABS = [ { id: "sushi", label: "SUSHI", component: SushiTab }, ]; -export const W7Tab = () => { - const activeSubTab = van.state(W7_SUBTABS[0].id); - - return div( - { class: "world-tab w7-world-tab" }, - renderTabNav({ - tabs: W7_SUBTABS, - activeId: activeSubTab, - navClass: "world-sub-nav", - buttonClass: "account-world-sub-tab-btn", - stubClass: "account-world-sub-tab-btn--stub", - isStub: (tab) => !tab.component, - }), - div( - { class: "world-sub-content" }, - ...renderLazyPanes({ - tabs: W7_SUBTABS, - activeId: activeSubTab, - paneClass: "world-sub-pane", - dataAttr: "data-subtab", - renderContent: (tab) => (tab.component ? tab.component() : createComingSoonPlaceholder(tab.label)), - }) - ) - ); -}; +export const W7Tab = createWorldTab(W7_SUBTABS, "w7-world-tab"); diff --git a/src/ui/components/views/account/components/AccountPageShell.js b/src/ui/components/views/account/components/AccountPageShell.js deleted file mode 100644 index bfa2ee29..00000000 --- a/src/ui/components/views/account/components/AccountPageShell.js +++ /dev/null @@ -1,105 +0,0 @@ -import van from "../../../../vendor/van-1.6.0.js"; -import { Icons } from "../../../../assets/icons.js"; -import { Loader } from "../../../Loader.js"; -import { EmptyState } from "../../../EmptyState.js"; -import { joinClasses, renderAccountError, renderAccountLoading, resolveValue } from "../accountShared.js"; -const { div } = van.tags; - -/** - * Shared account page wrapper. - * - Persistent tabs pass `persistentState` + `body`. - * - Rebuild-style tabs pass `loadState` + `renderBody`. - * - `body` is a normal Van child and may itself be a reactive function child. - */ -export const AccountPageShell = ({ - header, - topNotices = null, - subNav = null, - body = null, - loadState = null, - renderBody = null, - renderLoading = renderAccountLoading, - renderError = renderAccountError, - rootClass = "tab-container", - persistentState = null, - persistentLoadingText = null, - persistentErrorTitle = "LOAD FAILED", - persistentInitialWrapperClass = null, -}) => - (() => { - const initialClass = (isVisible) => - joinClasses(persistentInitialWrapperClass, !isVisible ? "is-hidden-until-ready" : ""); - const hasLoaded = persistentState ? van.state(false) : null; - - if (persistentState) { - van.derive(() => { - const isLoading = Boolean(resolveValue(persistentState.loading)); - const errorMessage = resolveValue(persistentState.error); - if (!isLoading && !errorMessage) hasLoaded.val = true; - }); - } - - const initialState = persistentState - ? [ - div( - { - class: () => { - const isLoading = Boolean(resolveValue(persistentState.loading)); - return initialClass(isLoading && !hasLoaded.val); - }, - }, - div( - { class: "account-loader" }, - persistentLoadingText !== null ? Loader({ text: persistentLoadingText }) : Loader() - ) - ), - div( - { - class: () => { - const isLoading = Boolean(resolveValue(persistentState.loading)); - const errorMessage = resolveValue(persistentState.error); - return initialClass(!isLoading && Boolean(errorMessage)); - }, - }, - EmptyState({ - icon: Icons.SearchX(), - title: persistentErrorTitle, - subtitle: () => String(resolveValue(persistentState.error) || ""), - }) - ), - ] - : null; - - const chromeNodes = subNav ? [subNav, header, topNotices] : [header, topNotices]; - const resolvedPersistentBody = typeof body === "function" ? () => body() ?? div() : body; - const resolvedBody = - persistentState || !loadState - ? body - : () => { - const isLoading = Boolean(resolveValue(loadState.loading)); - if (isLoading) return renderLoading(); - - const errorMessage = resolveValue(loadState.error); - if (errorMessage) return renderError(errorMessage); - - const resolvedData = resolveValue(loadState.data); - if (resolvedData === null || resolvedData === undefined) return null; - - return renderBody(resolvedData); - }; - - return div( - { class: rootClass }, - ...chromeNodes, - ...(initialState ?? []), - persistentState - ? div( - { - class: () => - joinClasses("account-page-shell__body", !hasLoaded.val ? "is-hidden-until-ready" : ""), - }, - resolvedPersistentBody - ) - : resolvedBody - ); - })(); diff --git a/src/ui/components/views/account/components/AccountTabHeader.js b/src/ui/components/views/account/components/AccountTabHeader.js deleted file mode 100644 index 05590835..00000000 --- a/src/ui/components/views/account/components/AccountTabHeader.js +++ /dev/null @@ -1,22 +0,0 @@ -import van from "../../../../vendor/van-1.6.0.js"; -import { toNodes } from "../accountShared.js"; - -const { div, h3, p } = van.tags; - -/** - * Shared header shell for account tabs. - */ -export const AccountTabHeader = ({ title, description = null, actions = null, wrapActions = true }) => - div( - { class: "account-header account-tab-header" }, - div( - { class: "account-tab-header__main" }, - h3({ class: "account-tab-header__title" }, title), - description ? p({ class: "account-tab-header__desc" }, description) : null - ), - actions - ? wrapActions - ? div({ class: "account-header__actions account-tab-header__actions" }, ...toNodes(actions)) - : actions - : null - ); diff --git a/src/ui/components/views/account/components/PersistentAccountListPage.js b/src/ui/components/views/account/components/PersistentAccountListPage.js index ceb8eccd..c403e984 100644 --- a/src/ui/components/views/account/components/PersistentAccountListPage.js +++ b/src/ui/components/views/account/components/PersistentAccountListPage.js @@ -1,5 +1,10 @@ -import { AccountPageShell } from "./AccountPageShell.js"; -import { AccountTabHeader } from "./AccountTabHeader.js"; +import van from "../../../../vendor/van-1.6.0.js"; +import { Icons } from "../../../../assets/icons.js"; +import { EmptyState } from "../../../EmptyState.js"; +import { Loader } from "../../../Loader.js"; +import { joinClasses, resolveValue, toNodes } from "../accountShared.js"; + +const { div, h3, p } = van.tags; /** * Shared wrapper for account pages that keep their row DOM alive across refreshes. @@ -32,15 +37,54 @@ export const PersistentAccountListPage = ({ loadingText = null, errorTitle = "LOAD FAILED", initialWrapperClass = null, -}) => - AccountPageShell({ - rootClass, - header: AccountTabHeader({ title, description, actions, wrapActions }), - topNotices, - subNav, - persistentState: state, - persistentLoadingText: loadingText, - persistentErrorTitle: errorTitle, - persistentInitialWrapperClass: initialWrapperClass, - body, +}) => { + const hasLoaded = van.state(false); + const initialClass = (visible) => joinClasses(initialWrapperClass, visible ? "" : "is-hidden-until-ready"); + + van.derive(() => { + if (!resolveValue(state.loading) && !resolveValue(state.error)) hasLoaded.val = true; }); + + const header = div( + { class: "account-header account-tab-header" }, + div( + { class: "account-tab-header__main" }, + h3({ class: "account-tab-header__title" }, title), + description ? p({ class: "account-tab-header__desc" }, description) : null + ), + actions + ? wrapActions + ? div({ class: "account-header__actions account-tab-header__actions" }, ...toNodes(actions)) + : actions + : null + ); + const chromeNodes = subNav ? [subNav, header, topNotices] : [header, topNotices]; + const resolvedBody = typeof body === "function" ? () => body() ?? div() : body; + + return div( + { class: rootClass }, + ...chromeNodes, + div( + { + class: () => initialClass(Boolean(resolveValue(state.loading)) && !hasLoaded.val), + }, + div({ class: "account-loader" }, loadingText !== null ? Loader({ text: loadingText }) : Loader()) + ), + div( + { + class: () => initialClass(!resolveValue(state.loading) && Boolean(resolveValue(state.error))), + }, + EmptyState({ + icon: Icons.SearchX(), + title: errorTitle, + subtitle: () => String(resolveValue(state.error) || ""), + }) + ), + div( + { + class: () => joinClasses("account-page-shell__body", !hasLoaded.val && "is-hidden-until-ready"), + }, + resolvedBody + ) + ); +}; diff --git a/src/ui/components/views/account/tabShared.js b/src/ui/components/views/account/tabShared.js index 18bf2f02..457beee7 100644 --- a/src/ui/components/views/account/tabShared.js +++ b/src/ui/components/views/account/tabShared.js @@ -1,15 +1,7 @@ import van from "../../../vendor/van-1.6.0.js"; -import { Icons } from "../../../assets/icons.js"; import { joinClasses, toNodes } from "./accountShared.js"; -const { div, button, span, p } = van.tags; - -export const createComingSoonPlaceholder = (label) => - div( - { class: "world-sub-placeholder" }, - span({ class: "world-sub-placeholder__icon" }, Icons.Wrench()), - p({ class: "world-sub-placeholder__label" }, `${label} — COMING SOON`) - ); +const { div, button } = van.tags; /** * Render a shared account-workspace tab navigation row. @@ -19,8 +11,6 @@ export const createComingSoonPlaceholder = (label) => * @param {string} props.navClass - Additional navigation class * @param {string|Function} props.buttonClass - Additional button class or class resolver * @param {string} [props.activeClass] - Class applied to the active tab - * @param {string|null} [props.stubClass] - Optional class applied to stub tabs - * @param {Function} [props.isStub] - Stub-tab predicate * @param {Function} [props.renderLabel] - Tab-label renderer * @param {Function|null} [props.getButtonProps] - Additional button-props resolver * @param {Function|null} [props.onSelect] - Callback invoked after a tab is selected @@ -32,8 +22,6 @@ export const renderTabNav = ({ navClass, buttonClass, activeClass = "active", - stubClass = null, - isStub = () => false, renderLabel = (tab) => tab.label, getButtonProps = null, onSelect = null, @@ -49,8 +37,7 @@ export const renderTabNav = ({ joinClasses( "account-sub-tab-btn", typeof buttonClass === "function" ? buttonClass(tab) : buttonClass, - activeId.val === tab.id && activeClass, - stubClass && isStub(tab) && stubClass + activeId.val === tab.id && activeClass ), "aria-current": () => (activeId.val === tab.id ? "page" : "false"), onclick: () => { @@ -88,6 +75,64 @@ export const renderLazyPanes = ({ return pane; }); +const createTabbedPage = + ({ tabs, rootClass, navClass, buttonClass, contentClass, paneClass, activeClass = "active", dataAttr }) => + () => { + const activeId = van.state(tabs[0].id); + + return div( + { class: rootClass }, + renderTabNav({ tabs, activeId, navClass, buttonClass }), + div( + { class: contentClass }, + ...renderLazyPanes({ + tabs, + activeId, + paneClass, + activeClass, + dataAttr, + renderContent: (tab) => tab.component(), + }) + ) + ); + }; + +/** + * Create a lazily mounted world-level tab component. + * @param {object[]} tabs - Tab definitions with component functions + * @param {string} worldClass - World-specific root class + * @returns {Function} VanJS component function + */ +export const createWorldTab = (tabs, worldClass) => + createTabbedPage({ + tabs, + rootClass: joinClasses("world-tab", worldClass), + navClass: "world-sub-nav", + buttonClass: "account-world-sub-tab-btn", + contentClass: "world-sub-content", + paneClass: "world-sub-pane", + dataAttr: "data-subtab", + }); + +/** + * Create a lazily mounted nested account tab component. + * @param {object[]} tabs - Tab definitions with component functions + * @param {string} rootClass - Feature-specific root class + * @param {string} dataAttr - Pane data attribute + * @returns {Function} VanJS component function + */ +export const createNestedTab = (tabs, rootClass, dataAttr) => + createTabbedPage({ + tabs, + rootClass: joinClasses("tab-container", rootClass), + navClass: "account-nested-sub-nav", + buttonClass: "account-nested-sub-tab-btn", + contentClass: "account-nested-sub-content", + paneClass: "account-nested-pane", + activeClass: "account-nested-pane--active", + dataAttr, + }); + /** * Render all pane bodies immediately and keep them mounted. * `renderContent` is called eagerly for every tab when the parent mounts. @@ -109,34 +154,3 @@ export const renderPersistentPagePanes = ({ ...toNodes(typeof renderContent === "function" ? renderContent(tab, index) : null) ) ); - -export const createWorldComingSoonTab = - ({ worldClass, worldKey }) => - () => { - const tabs = [{ id: "coming-soon", label: "COMING SOON" }]; - const activeSubTab = van.state(tabs[0].id); - - return div( - { class: joinClasses("world-tab", worldClass) }, - renderTabNav({ - tabs, - activeId: activeSubTab, - navClass: "world-sub-nav", - buttonClass: "account-world-sub-tab-btn", - stubClass: "account-world-sub-tab-btn--stub", - isStub: () => true, - }), - div( - { class: "world-sub-content" }, - div( - { class: "world-sub-pane active world-sub-pane--empty" }, - span({ class: "world-empty-icon" }, Icons.Wrench()), - p({ class: "world-empty-label" }, `${worldKey} SYSTEMS COMING SOON`), - p( - { class: "world-empty-desc" }, - `Follow the W1Tab pattern to add sub-tabs for each ${worldKey} system.` - ) - ) - ) - ); - }; diff --git a/src/ui/components/views/account/w4/BreedingTab.js b/src/ui/components/views/account/w4/BreedingTab.js index 5c7a9d8e..ace2c08a 100644 --- a/src/ui/components/views/account/w4/BreedingTab.js +++ b/src/ui/components/views/account/w4/BreedingTab.js @@ -1,38 +1,12 @@ -import van from "../../../../vendor/van-1.6.0.js"; -import { renderLazyPanes, renderTabNav } from "../tabShared.js"; +import { createNestedTab } from "../tabShared.js"; import { GeneralTab } from "./breeding/GeneralTab.js"; import { PetsTab } from "./breeding/PetsTab.js"; import { TerritoryTab } from "./breeding/TerritoryTab.js"; -const { div } = van.tags; - const BREEDING_SUBTABS = [ { id: "general", label: "GENERAL", component: GeneralTab }, { id: "pets", label: "PETS", component: PetsTab }, { id: "territory", label: "TERRITORY", component: TerritoryTab }, ]; -export const BreedingTab = () => { - const activeSubTab = van.state(BREEDING_SUBTABS[0].id); - - return div( - { class: "tab-container breeding-tab" }, - renderTabNav({ - tabs: BREEDING_SUBTABS, - activeId: activeSubTab, - navClass: "account-nested-sub-nav", - buttonClass: "account-nested-sub-tab-btn", - }), - div( - { class: "account-nested-sub-content" }, - ...renderLazyPanes({ - tabs: BREEDING_SUBTABS, - activeId: activeSubTab, - paneClass: "account-nested-pane", - activeClass: "account-nested-pane--active", - dataAttr: "data-breeding", - renderContent: (tab) => tab.component(), - }) - ) - ); -}; +export const BreedingTab = createNestedTab(BREEDING_SUBTABS, "breeding-tab", "data-breeding"); diff --git a/src/ui/components/views/account/w4/CookingTab.js b/src/ui/components/views/account/w4/CookingTab.js index 2fea08ff..ba4fbccc 100644 --- a/src/ui/components/views/account/w4/CookingTab.js +++ b/src/ui/components/views/account/w4/CookingTab.js @@ -1,12 +1,9 @@ -import van from "../../../../vendor/van-1.6.0.js"; -import { renderLazyPanes, renderTabNav } from "../tabShared.js"; +import { createNestedTab } from "../tabShared.js"; import { MasteryTab } from "./cooking/MasteryTab.js"; import { MealsTab } from "./cooking/MealsTab.js"; import { SpicesTab } from "./cooking/SpicesTab.js"; import { TablesTab } from "./cooking/TablesTab.js"; -const { div } = van.tags; - const COOKING_SUBTABS = [ { id: "tables", label: "TABLES", component: TablesTab }, { id: "meals", label: "MEALS", component: MealsTab }, @@ -14,27 +11,4 @@ const COOKING_SUBTABS = [ { id: "spices", label: "SPICES", component: SpicesTab }, ]; -export const CookingTab = () => { - const activeSubTab = van.state(COOKING_SUBTABS[0].id); - - return div( - { class: "tab-container cooking-tab" }, - renderTabNav({ - tabs: COOKING_SUBTABS, - activeId: activeSubTab, - navClass: "account-nested-sub-nav", - buttonClass: "account-nested-sub-tab-btn", - }), - div( - { class: "account-nested-sub-content" }, - ...renderLazyPanes({ - tabs: COOKING_SUBTABS, - activeId: activeSubTab, - paneClass: "account-nested-pane", - activeClass: "account-nested-pane--active", - dataAttr: "data-cooking", - renderContent: (tab) => tab.component(), - }) - ) - ); -}; +export const CookingTab = createNestedTab(COOKING_SUBTABS, "cooking-tab", "data-cooking"); diff --git a/src/ui/components/views/account/w4/LabTab.js b/src/ui/components/views/account/w4/LabTab.js index 4fb201e6..b1dbd075 100644 --- a/src/ui/components/views/account/w4/LabTab.js +++ b/src/ui/components/views/account/w4/LabTab.js @@ -1,36 +1,10 @@ -import van from "../../../../vendor/van-1.6.0.js"; -import { renderLazyPanes, renderTabNav } from "../tabShared.js"; +import { createNestedTab } from "../tabShared.js"; import { ChipsTab } from "./lab/ChipsTab.js"; import { JewelsTab } from "./lab/JewelsTab.js"; -const { div } = van.tags; - const LAB_SUBTABS = [ { id: "chips", label: "CHIPS", component: ChipsTab }, { id: "jewels", label: "JEWELS", component: JewelsTab }, ]; -export const LabTab = () => { - const activeSubTab = van.state(LAB_SUBTABS[0].id); - - return div( - { class: "tab-container lab-tab" }, - renderTabNav({ - tabs: LAB_SUBTABS, - activeId: activeSubTab, - navClass: "account-nested-sub-nav", - buttonClass: "account-nested-sub-tab-btn", - }), - div( - { class: "account-nested-sub-content" }, - ...renderLazyPanes({ - tabs: LAB_SUBTABS, - activeId: activeSubTab, - paneClass: "account-nested-pane", - activeClass: "account-nested-pane--active", - dataAttr: "data-lab", - renderContent: (tab) => tab.component(), - }) - ) - ); -}; +export const LabTab = createNestedTab(LAB_SUBTABS, "lab-tab", "data-lab"); diff --git a/src/ui/components/views/account/w5/DivinityTab.js b/src/ui/components/views/account/w5/DivinityTab.js index 9462e2d4..b7f6ecbd 100644 --- a/src/ui/components/views/account/w5/DivinityTab.js +++ b/src/ui/components/views/account/w5/DivinityTab.js @@ -1,38 +1,10 @@ -import van from "../../../../vendor/van-1.6.0.js"; -import { createComingSoonPlaceholder, renderLazyPanes, renderTabNav } from "../tabShared.js"; +import { createNestedTab } from "../tabShared.js"; import { CoralKidTab } from "./divinity/CoralKidTab.js"; import { GodTab } from "./divinity/GodTab.js"; -const { div } = van.tags; - const DIVINITY_SUBTABS = [ { id: "god", label: "GOD", component: GodTab }, { id: "coral-kid", label: "CORAL KID", component: CoralKidTab }, ]; -export const DivinityTab = () => { - const activeSubTab = van.state(DIVINITY_SUBTABS[0].id); - - return div( - { class: "tab-container divinity-tab" }, - renderTabNav({ - tabs: DIVINITY_SUBTABS, - activeId: activeSubTab, - navClass: "account-nested-sub-nav", - buttonClass: "account-nested-sub-tab-btn", - stubClass: "account-nested-sub-tab-btn--stub", - isStub: (tab) => !tab.component, - }), - div( - { class: "account-nested-sub-content" }, - ...renderLazyPanes({ - tabs: DIVINITY_SUBTABS, - activeId: activeSubTab, - paneClass: "account-nested-pane", - activeClass: "account-nested-pane--active", - dataAttr: "data-divinity", - renderContent: (tab) => (tab.component ? tab.component() : createComingSoonPlaceholder(tab.label)), - }) - ) - ); -}; +export const DivinityTab = createNestedTab(DIVINITY_SUBTABS, "divinity-tab", "data-divinity"); diff --git a/src/ui/components/views/account/w5/GamingTab.js b/src/ui/components/views/account/w5/GamingTab.js index c0511982..cce93d7f 100644 --- a/src/ui/components/views/account/w5/GamingTab.js +++ b/src/ui/components/views/account/w5/GamingTab.js @@ -1,13 +1,10 @@ -import van from "../../../../vendor/van-1.6.0.js"; -import { createComingSoonPlaceholder, renderLazyPanes, renderTabNav } from "../tabShared.js"; +import { createNestedTab } from "../tabShared.js"; import { GeneralTab } from "./gaming/GeneralTab.js"; import { ImportsTab } from "./gaming/ImportsTab.js"; import { PaletteHexTab } from "./gaming/PaletteHexTab.js"; import { PaletteTab } from "./gaming/PaletteTab.js"; import { SuperbitsTab } from "./gaming/SuperbitsTab.js"; -const { div } = van.tags; - const GAMING_SUBTABS = [ { id: "general", label: "GENERAL", component: GeneralTab }, { id: "imports", label: "IMPORTS", component: ImportsTab }, @@ -16,29 +13,4 @@ const GAMING_SUBTABS = [ { id: "palette-hex", label: "PALETTE HEX", component: PaletteHexTab }, ]; -export const GamingTab = () => { - const activeSubTab = van.state(GAMING_SUBTABS[0].id); - - return div( - { class: "tab-container gaming-tab" }, - renderTabNav({ - tabs: GAMING_SUBTABS, - activeId: activeSubTab, - navClass: "account-nested-sub-nav", - buttonClass: "account-nested-sub-tab-btn", - stubClass: "account-nested-sub-tab-btn--stub", - isStub: (tab) => !tab.component, - }), - div( - { class: "account-nested-sub-content" }, - ...renderLazyPanes({ - tabs: GAMING_SUBTABS, - activeId: activeSubTab, - paneClass: "account-nested-pane", - activeClass: "account-nested-pane--active", - dataAttr: "data-gaming", - renderContent: (tab) => (tab.component ? tab.component() : createComingSoonPlaceholder(tab.label)), - }) - ) - ); -}; +export const GamingTab = createNestedTab(GAMING_SUBTABS, "gaming-tab", "data-gaming"); diff --git a/src/ui/components/views/account/w5/HoleTab.js b/src/ui/components/views/account/w5/HoleTab.js index c0f5cb3a..ece9d025 100644 --- a/src/ui/components/views/account/w5/HoleTab.js +++ b/src/ui/components/views/account/w5/HoleTab.js @@ -1,5 +1,4 @@ -import van from "../../../../vendor/van-1.6.0.js"; -import { createComingSoonPlaceholder, renderLazyPanes, renderTabNav } from "../tabShared.js"; +import { createNestedTab } from "../tabShared.js"; import { BellTab } from "./hole/BellTab.js"; import { CglunkoTab } from "./hole/CglunkoTab.js"; import { CosmoTab } from "./hole/CosmoTab.js"; @@ -20,8 +19,6 @@ import { TempleTab } from "./hole/TempleTab.js"; import { VillagersTab } from "./hole/VillagersTab.js"; import { WellTab } from "./hole/WellTab.js"; -const { div } = van.tags; - const HOLE_SUBTABS = [ { id: "opals", label: "OPALS", component: OpalsTab }, { id: "villagers", label: "VILLAGERS", component: VillagersTab }, @@ -44,29 +41,4 @@ const HOLE_SUBTABS = [ { id: "crystal-cove", label: "CRYSTAL COVE", component: CglunkoTab }, ]; -export const HoleTab = () => { - const activeSubTab = van.state(HOLE_SUBTABS[0].id); - - return div( - { class: "tab-container hole-tab" }, - renderTabNav({ - tabs: HOLE_SUBTABS, - activeId: activeSubTab, - navClass: "account-nested-sub-nav", - buttonClass: "account-nested-sub-tab-btn", - stubClass: "account-nested-sub-tab-btn--stub", - isStub: (tab) => !tab.component, - }), - div( - { class: "account-nested-sub-content" }, - ...renderLazyPanes({ - tabs: HOLE_SUBTABS, - activeId: activeSubTab, - paneClass: "account-nested-pane", - activeClass: "account-nested-pane--active", - dataAttr: "data-hole", - renderContent: (tab) => (tab.component ? tab.component() : createComingSoonPlaceholder(tab.label)), - }) - ) - ); -}; +export const HoleTab = createNestedTab(HOLE_SUBTABS, "hole-tab", "data-hole"); diff --git a/src/ui/components/views/account/w5/SailingTab.js b/src/ui/components/views/account/w5/SailingTab.js index dd33ede1..66c32133 100644 --- a/src/ui/components/views/account/w5/SailingTab.js +++ b/src/ui/components/views/account/w5/SailingTab.js @@ -1,12 +1,9 @@ -import van from "../../../../vendor/van-1.6.0.js"; -import { createComingSoonPlaceholder, renderLazyPanes, renderTabNav } from "../tabShared.js"; +import { createNestedTab } from "../tabShared.js"; import { ArtifactsTab } from "./sailing/ArtifactsTab.js"; import { BoatsTab } from "./sailing/BoatsTab.js"; import { CurrencyTab } from "./sailing/CurrencyTab.js"; import { IslandsTab } from "./sailing/IslandsTab.js"; -const { div } = van.tags; - const SAILING_SUBTABS = [ { id: "currency", label: "CURRENCY", component: CurrencyTab }, { id: "artifacts", label: "ARTIFACTS", component: ArtifactsTab }, @@ -14,29 +11,4 @@ const SAILING_SUBTABS = [ { id: "boats", label: "BOATS", component: BoatsTab }, ]; -export const SailingTab = () => { - const activeSubTab = van.state(SAILING_SUBTABS[0].id); - - return div( - { class: "tab-container sailing-tab" }, - renderTabNav({ - tabs: SAILING_SUBTABS, - activeId: activeSubTab, - navClass: "account-nested-sub-nav", - buttonClass: "account-nested-sub-tab-btn", - stubClass: "account-nested-sub-tab-btn--stub", - isStub: (tab) => !tab.component, - }), - div( - { class: "account-nested-sub-content" }, - ...renderLazyPanes({ - tabs: SAILING_SUBTABS, - activeId: activeSubTab, - paneClass: "account-nested-pane", - activeClass: "account-nested-pane--active", - dataAttr: "data-sailing", - renderContent: (tab) => (tab.component ? tab.component() : createComingSoonPlaceholder(tab.label)), - }) - ) - ); -}; +export const SailingTab = createNestedTab(SAILING_SUBTABS, "sailing-tab", "data-sailing"); diff --git a/src/ui/components/views/account/w6/FarmingTab.js b/src/ui/components/views/account/w6/FarmingTab.js index c557b78f..9600261b 100644 --- a/src/ui/components/views/account/w6/FarmingTab.js +++ b/src/ui/components/views/account/w6/FarmingTab.js @@ -1,5 +1,4 @@ -import van from "../../../../vendor/van-1.6.0.js"; -import { createComingSoonPlaceholder, renderLazyPanes, renderTabNav } from "../tabShared.js"; +import { createNestedTab } from "../tabShared.js"; import { DepoTab } from "./farming/DepoTab.js"; import { ExoticTab } from "./farming/ExoticTab.js"; import { MarketsTab } from "./farming/MarketsTab.js"; @@ -7,8 +6,6 @@ import { PlotTab } from "./farming/PlotTab.js"; import { RankTab } from "./farming/RankTab.js"; import { StickerTab } from "./farming/StickerTab.js"; -const { div } = van.tags; - const FARMING_SUBTABS = [ { id: "depo", label: "DEPO", component: DepoTab }, { id: "markets", label: "MARKETS", component: MarketsTab }, @@ -18,29 +15,4 @@ const FARMING_SUBTABS = [ { id: "rank", label: "RANK", component: RankTab }, ]; -export const FarmingTab = () => { - const activeSubTab = van.state(FARMING_SUBTABS[0].id); - - return div( - { class: "tab-container farming-tab" }, - renderTabNav({ - tabs: FARMING_SUBTABS, - activeId: activeSubTab, - navClass: "account-nested-sub-nav", - buttonClass: "account-nested-sub-tab-btn", - stubClass: "account-nested-sub-tab-btn--stub", - isStub: (tab) => !tab.component, - }), - div( - { class: "account-nested-sub-content" }, - ...renderLazyPanes({ - tabs: FARMING_SUBTABS, - activeId: activeSubTab, - paneClass: "account-nested-pane", - activeClass: "account-nested-pane--active", - dataAttr: "data-farming", - renderContent: (tab) => (tab.component ? tab.component() : createComingSoonPlaceholder(tab.label)), - }) - ) - ); -}; +export const FarmingTab = createNestedTab(FARMING_SUBTABS, "farming-tab", "data-farming"); diff --git a/src/ui/components/views/account/w6/SneakingTab.js b/src/ui/components/views/account/w6/SneakingTab.js index 7d722ea6..66575ba9 100644 --- a/src/ui/components/views/account/w6/SneakingTab.js +++ b/src/ui/components/views/account/w6/SneakingTab.js @@ -1,40 +1,12 @@ -import van from "../../../../vendor/van-1.6.0.js"; -import { createComingSoonPlaceholder, renderLazyPanes, renderTabNav } from "../tabShared.js"; +import { createNestedTab } from "../tabShared.js"; import { CharmsTab } from "./sneaking/CharmsTab.js"; import { JadeTab } from "./sneaking/JadeTab.js"; import { UpgradesTab } from "./sneaking/UpgradesTab.js"; -const { div } = van.tags; - const SNEAKING_SUBTABS = [ { id: "upgrades", label: "UPGRADES", component: UpgradesTab }, { id: "jade", label: "JADE", component: JadeTab }, { id: "charms", label: "CHARMS", component: CharmsTab }, ]; -export const SneakingTab = () => { - const activeSubTab = van.state(SNEAKING_SUBTABS[0].id); - - return div( - { class: "tab-container sneaking-tab" }, - renderTabNav({ - tabs: SNEAKING_SUBTABS, - activeId: activeSubTab, - navClass: "account-nested-sub-nav", - buttonClass: "account-nested-sub-tab-btn", - stubClass: "account-nested-sub-tab-btn--stub", - isStub: (tab) => !tab.component, - }), - div( - { class: "account-nested-sub-content" }, - ...renderLazyPanes({ - tabs: SNEAKING_SUBTABS, - activeId: activeSubTab, - paneClass: "account-nested-pane", - activeClass: "account-nested-pane--active", - dataAttr: "data-sneaking", - renderContent: (tab) => (tab.component ? tab.component() : createComingSoonPlaceholder(tab.label)), - }) - ) - ); -}; +export const SneakingTab = createNestedTab(SNEAKING_SUBTABS, "sneaking-tab", "data-sneaking"); diff --git a/src/ui/components/views/account/w6/SummoningTab.js b/src/ui/components/views/account/w6/SummoningTab.js index 9ce5dbf1..ed06335c 100644 --- a/src/ui/components/views/account/w6/SummoningTab.js +++ b/src/ui/components/views/account/w6/SummoningTab.js @@ -1,40 +1,12 @@ -import van from "../../../../vendor/van-1.6.0.js"; -import { createComingSoonPlaceholder, renderLazyPanes, renderTabNav } from "../tabShared.js"; +import { createNestedTab } from "../tabShared.js"; import { EssenceTab } from "./summoning/EssenceTab.js"; import { RoundsTab } from "./summoning/RoundsTab.js"; import { UpgradesTab } from "./summoning/UpgradesTab.js"; -const { div } = van.tags; - const SUMMONING_SUBTABS = [ { id: "upgrades", label: "UPGRADES", component: UpgradesTab }, { id: "essence", label: "ESSENCE", component: EssenceTab }, { id: "rounds", label: "ROUNDS", component: RoundsTab }, ]; -export const SummoningTab = () => { - const activeSubTab = van.state(SUMMONING_SUBTABS[0].id); - - return div( - { class: "tab-container summoning-tab" }, - renderTabNav({ - tabs: SUMMONING_SUBTABS, - activeId: activeSubTab, - navClass: "account-nested-sub-nav", - buttonClass: "account-nested-sub-tab-btn", - stubClass: "account-nested-sub-tab-btn--stub", - isStub: (tab) => !tab.component, - }), - div( - { class: "account-nested-sub-content" }, - ...renderLazyPanes({ - tabs: SUMMONING_SUBTABS, - activeId: activeSubTab, - paneClass: "account-nested-pane", - activeClass: "account-nested-pane--active", - dataAttr: "data-summoning", - renderContent: (tab) => (tab.component ? tab.component() : createComingSoonPlaceholder(tab.label)), - }) - ) - ); -}; +export const SummoningTab = createNestedTab(SUMMONING_SUBTABS, "summoning-tab", "data-summoning"); diff --git a/src/ui/components/views/account/w7/GalleryTab.js b/src/ui/components/views/account/w7/GalleryTab.js index f089627d..d0b294f9 100644 --- a/src/ui/components/views/account/w7/GalleryTab.js +++ b/src/ui/components/views/account/w7/GalleryTab.js @@ -1,38 +1,10 @@ -import van from "../../../../vendor/van-1.6.0.js"; import { NametagTab } from "./NametagTab.js"; import { TrophyTab } from "./TrophyTab.js"; -import { createComingSoonPlaceholder, renderLazyPanes, renderTabNav } from "../tabShared.js"; - -const { div } = van.tags; +import { createNestedTab } from "../tabShared.js"; const GALLERY_SUBTABS = [ { id: "trophy", label: "TROPHY", component: TrophyTab }, { id: "nametag", label: "NAMETAG", component: NametagTab }, ]; -export const GalleryTab = () => { - const activeSubTab = van.state(GALLERY_SUBTABS[0].id); - - return div( - { class: "tab-container" }, - renderTabNav({ - tabs: GALLERY_SUBTABS, - activeId: activeSubTab, - navClass: "account-nested-sub-nav", - buttonClass: "account-nested-sub-tab-btn", - stubClass: "account-nested-sub-tab-btn--stub", - isStub: (tab) => !tab.component, - }), - div( - { class: "account-nested-sub-content" }, - ...renderLazyPanes({ - tabs: GALLERY_SUBTABS, - activeId: activeSubTab, - paneClass: "account-nested-pane", - activeClass: "account-nested-pane--active", - dataAttr: "data-gallery", - renderContent: (tab) => (tab.component ? tab.component() : createComingSoonPlaceholder(tab.label)), - }) - ) - ); -}; +export const GalleryTab = createNestedTab(GALLERY_SUBTABS, "", "data-gallery"); diff --git a/src/ui/components/views/account/w7/ResearchTab.js b/src/ui/components/views/account/w7/ResearchTab.js index f11f3e82..a3c9d9ed 100644 --- a/src/ui/components/views/account/w7/ResearchTab.js +++ b/src/ui/components/views/account/w7/ResearchTab.js @@ -1,38 +1,10 @@ -import van from "../../../../vendor/van-1.6.0.js"; import { GridTab } from "./GridTab.js"; import { ObservationsTab } from "./ObservationsTab.js"; -import { createComingSoonPlaceholder, renderLazyPanes, renderTabNav } from "../tabShared.js"; - -const { div } = van.tags; +import { createNestedTab } from "../tabShared.js"; const RESEARCH_SUBTABS = [ { id: "grid", label: "GRID", component: GridTab }, { id: "observations", label: "OBSERVATIONS", component: ObservationsTab }, ]; -export const ResearchTab = () => { - const activeSubTab = van.state(RESEARCH_SUBTABS[0].id); - - return div( - { class: "tab-container" }, - renderTabNav({ - tabs: RESEARCH_SUBTABS, - activeId: activeSubTab, - navClass: "account-nested-sub-nav", - buttonClass: "account-nested-sub-tab-btn", - stubClass: "account-nested-sub-tab-btn--stub", - isStub: (tab) => !tab.component, - }), - div( - { class: "account-nested-sub-content" }, - ...renderLazyPanes({ - tabs: RESEARCH_SUBTABS, - activeId: activeSubTab, - paneClass: "account-nested-pane", - activeClass: "account-nested-pane--active", - dataAttr: "data-research", - renderContent: (tab) => (tab.component ? tab.component() : createComingSoonPlaceholder(tab.label)), - }) - ) - ); -}; +export const ResearchTab = createNestedTab(RESEARCH_SUBTABS, "", "data-research"); diff --git a/src/ui/components/views/account/w7/SpelunkingTab.js b/src/ui/components/views/account/w7/SpelunkingTab.js index 3d534740..510daed5 100644 --- a/src/ui/components/views/account/w7/SpelunkingTab.js +++ b/src/ui/components/views/account/w7/SpelunkingTab.js @@ -1,40 +1,12 @@ -import van from "../../../../vendor/van-1.6.0.js"; -import { createComingSoonPlaceholder, renderLazyPanes, renderTabNav } from "../tabShared.js"; +import { createNestedTab } from "../tabShared.js"; import { SpelunkingCavesTab } from "./spelunking/SpelunkingCavesTab.js"; import { SpelunkingLoreTab } from "./spelunking/SpelunkingLoreTab.js"; import { SpelunkingShopTab } from "./spelunking/SpelunkingShopTab.js"; -const { div } = van.tags; - const SPELUNKING_SUBTABS = [ { id: "caves", label: "CAVES", component: SpelunkingCavesTab }, { id: "shop", label: "SHOP", component: SpelunkingShopTab }, { id: "lore", label: "LORE", component: SpelunkingLoreTab }, ]; -export const SpelunkingTab = () => { - const activeSubTab = van.state(SPELUNKING_SUBTABS[0].id); - - return div( - { class: "tab-container spelunking-tab" }, - renderTabNav({ - tabs: SPELUNKING_SUBTABS, - activeId: activeSubTab, - navClass: "account-nested-sub-nav", - buttonClass: "account-nested-sub-tab-btn", - stubClass: "account-nested-sub-tab-btn--stub", - isStub: (tab) => !tab.component, - }), - div( - { class: "account-nested-sub-content" }, - ...renderLazyPanes({ - tabs: SPELUNKING_SUBTABS, - activeId: activeSubTab, - paneClass: "account-nested-pane", - activeClass: "account-nested-pane--active", - dataAttr: "data-spelunking", - renderContent: (tab) => (tab.component ? tab.component() : createComingSoonPlaceholder(tab.label)), - }) - ) - ); -}; +export const SpelunkingTab = createNestedTab(SPELUNKING_SUBTABS, "spelunking-tab", "data-spelunking"); diff --git a/src/ui/components/views/account/w7/SushiTab.js b/src/ui/components/views/account/w7/SushiTab.js index daa339b0..5d179ae1 100644 --- a/src/ui/components/views/account/w7/SushiTab.js +++ b/src/ui/components/views/account/w7/SushiTab.js @@ -1,40 +1,12 @@ -import van from "../../../../vendor/van-1.6.0.js"; -import { createComingSoonPlaceholder, renderLazyPanes, renderTabNav } from "../tabShared.js"; +import { createNestedTab } from "../tabShared.js"; import { SushiGeneralTab } from "./sushi/SushiGeneralTab.js"; import { SushiShopTab } from "./sushi/SushiShopTab.js"; import { SushiStationTab } from "./sushi/SushiStationTab.js"; -const { div } = van.tags; - const SUSHI_SUBTABS = [ { id: "general", label: "GENERAL", component: SushiGeneralTab }, { id: "station", label: "STATION", component: SushiStationTab }, { id: "shop", label: "SHOP", component: SushiShopTab }, ]; -export const SushiTab = () => { - const activeSubTab = van.state(SUSHI_SUBTABS[0].id); - - return div( - { class: "tab-container sushi-tab" }, - renderTabNav({ - tabs: SUSHI_SUBTABS, - activeId: activeSubTab, - navClass: "account-nested-sub-nav", - buttonClass: "account-nested-sub-tab-btn", - stubClass: "account-nested-sub-tab-btn--stub", - isStub: (tab) => !tab.component, - }), - div( - { class: "account-nested-sub-content" }, - ...renderLazyPanes({ - tabs: SUSHI_SUBTABS, - activeId: activeSubTab, - paneClass: "account-nested-pane", - activeClass: "account-nested-pane--active", - dataAttr: "data-sushi", - renderContent: (tab) => (tab.component ? tab.component() : createComingSoonPlaceholder(tab.label)), - }) - ) - ); -}; +export const SushiTab = createNestedTab(SUSHI_SUBTABS, "sushi-tab", "data-sushi"); diff --git a/src/ui/components/views/search/sections.js b/src/ui/components/views/search/sections.js index e0559281..fdeb21e7 100644 --- a/src/ui/components/views/search/sections.js +++ b/src/ui/components/views/search/sections.js @@ -773,7 +773,7 @@ const SavedResultItem = ({ entry: initialEntry, ui, handlers }) => { return { node, sync: (nextEntry) => (entryState.val = nextEntry) }; }; -export const SavedResultsSection = ({ ui, handlers }) => { +const SavedResultsSection = ({ ui, handlers }) => { const rowCache = new Map(); const listNode = div({ class: "saved-results-list" }); const reconcile = createStaticRowReconciler(listNode); diff --git a/src/ui/services/ws.js b/src/ui/services/ws.js index 2e2dbb8b..2ff06c20 100644 --- a/src/ui/services/ws.js +++ b/src/ui/services/ws.js @@ -163,20 +163,3 @@ export function sendMonitorUnsubscribe(id) { export function getConnectionStatus() { return isConnected; } - -/** - * Closes the WebSocket connection - */ -export function closeWebSocket() { - if (reconnectTimer) { - clearTimeout(reconnectTimer); - reconnectTimer = null; - } - - if (ws) { - ws.close(); - ws = null; - } - - isConnected = false; -} diff --git a/src/ui/styles/_account-pages.css b/src/ui/styles/_account-pages.css index f698efba..8bfa53d5 100644 --- a/src/ui/styles/_account-pages.css +++ b/src/ui/styles/_account-pages.css @@ -790,11 +790,6 @@ --tab-nav-active-glow: 0 0 5px var(--world-color, var(--c-accent-glow)); } -.account-nested-sub-tab-btn--stub { - color: var(--c-text-muted); - cursor: default; -} - .account-nested-sub-content { flex: 1; overflow: hidden; diff --git a/src/ui/styles/_world-tabs.css b/src/ui/styles/_world-tabs.css index 656ba1f6..14e848b4 100644 --- a/src/ui/styles/_world-tabs.css +++ b/src/ui/styles/_world-tabs.css @@ -168,14 +168,6 @@ --tab-nav-active-indicator: var(--world-color, var(--c-accent)); } -.account-world-sub-tab-btn--stub { - color: var(--c-text-muted); - cursor: default; -} -.account-world-sub-tab-btn--stub:hover { - color: var(--c-text-muted); -} - /* ── World inner panes ───────────────────────────────────────────────────── */ .world-sub-content { @@ -198,57 +190,6 @@ animation: slideIn 0.18s ease; } -/* Empty pane (unimplemented tabs) */ -.world-sub-pane--empty { - align-items: center; - justify-content: center; - gap: 10px; - flex-direction: column; - color: var(--c-text-muted); - padding: 40px; -} - -.world-empty-icon { - font-size: 2.5rem; - color: var(--c-text-muted); - line-height: 1; -} -.world-empty-label { - font-size: 0.875rem; - font-weight: 700; - letter-spacing: 0.08em; - margin: 0; -} -.world-empty-desc { - font-size: 0.875rem; - margin: 0; - text-align: center; - max-width: 340px; - color: var(--c-text-muted); -} - -/* Inline stub inside W1 for unimplemented sub-tabs */ -.world-sub-placeholder { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - height: 100%; - gap: 10px; - color: var(--c-text-muted); -} - -.world-sub-placeholder__icon { - font-size: 2rem; - color: var(--c-text-muted); -} -.world-sub-placeholder__label { - font-size: 0.875rem; - font-weight: 700; - letter-spacing: 0.08em; - margin: 0; -} - /* Atlas account workbench -------------------------------------------------- */ #options-account-tab { diff --git a/src/ui/styles/tabs/w3/_construction.css b/src/ui/styles/tabs/w3/_construction.css deleted file mode 100644 index e69de29b..00000000 diff --git a/src/ui/styles/tabs/w3/_index.css b/src/ui/styles/tabs/w3/_index.css index 2c1ba9f8..3f9a1c1c 100644 --- a/src/ui/styles/tabs/w3/_index.css +++ b/src/ui/styles/tabs/w3/_index.css @@ -1,4 +1,3 @@ -@import url("./_construction.css"); @import url("./_construction-buildings.css"); @import url("./_cogs.css"); @import url("./_refinery.css"); diff --git a/src/ui/utils/functionParser.js b/src/ui/utils/functionParser.js index b4623f75..c9efe40c 100644 --- a/src/ui/utils/functionParser.js +++ b/src/ui/utils/functionParser.js @@ -143,23 +143,6 @@ export const generateFunctionString = (type, value) => { } }; -/** - * Convert a function string to an actual executable function - * - * @param {string} fnString - The function string - * @returns {Function|null} The executable function, or null if invalid - */ -export const stringToFunction = (fnString) => { - try { - // Use Function constructor to create the function - // This is safe since we control the input and it runs client-side only - return new Function("return " + fnString)(); - } catch (e) { - console.warn("Failed to parse function string:", fnString, e); - return null; - } -}; - /** * Check if a value is a function (either actual function or function string) * From d03b6162e0d51146e942e4c02989d348efa81023 Mon Sep 17 00:00:00 2001 From: Arnold W Date: Sat, 15 Aug 2026 16:10:04 +0200 Subject: [PATCH 06/32] feat(ui): add Chromium 87-safe dark mode --- src/ui/components/views/Config.js | 16 + src/ui/components/views/account/CardsTab.js | 32 +- src/ui/entry/index.html | 6 + src/ui/entry/style.css | 3 + src/ui/state/store.js | 6 + src/ui/state/theme.js | 18 + src/ui/styles/_account-pages.css | 7 + src/ui/styles/_activity-drawer.css | 2 + src/ui/styles/_atlas-shell.css | 87 +-- src/ui/styles/_search.css | 22 - src/ui/styles/_theme.css | 612 ++++++++++++++++++++ src/ui/styles/_world-tabs.css | 28 - src/ui/styles/config.css | 33 ++ src/ui/styles/tabs/w5/_gaming.css | 1 + tests/atlas-ui-compat.mjs | 55 +- 15 files changed, 795 insertions(+), 133 deletions(-) create mode 100644 src/ui/state/theme.js create mode 100644 src/ui/styles/_theme.css diff --git a/src/ui/components/views/Config.js b/src/ui/components/views/Config.js index bc604246..1f1aceae 100644 --- a/src/ui/components/views/Config.js +++ b/src/ui/components/views/Config.js @@ -248,6 +248,22 @@ export const Config = () => { class: () => `config-sub-tab-pane ${activeSubTab.val === "injectorconfig" ? "active" : ""}`, }, + div( + { class: "theme-preference" }, + div( + div({ class: "theme-preference-title" }, "INTERFACE THEME"), + div({ class: "theme-preference-description" }, "Stored locally and applied without a restart.") + ), + select( + { + onchange: (event) => store.setTheme(event.target.value), + "aria-label": "Interface theme", + }, + option({ value: "system", selected: () => store.app.theme === "system" }, "System"), + option({ value: "light", selected: () => store.app.theme === "light" }, "Light"), + option({ value: "dark", selected: () => store.app.theme === "dark" }, "Dark") + ) + ), div({ class: "warning-banner mb-20" }, "⚠ RESTART REQUIRED FOR CHANGES TO APPLY"), injectorConfigNode ) diff --git a/src/ui/components/views/account/CardsTab.js b/src/ui/components/views/account/CardsTab.js index ecbd9b79..362535be 100644 --- a/src/ui/components/views/account/CardsTab.js +++ b/src/ui/components/views/account/CardsTab.js @@ -41,8 +41,12 @@ const CARD_REGION_NAMES = [ ]; const toUnwrappedIndexedArray = (value) => toIndexedArray(unwrapH(value)); -const tierIndexForAmount = (amount, thresholds) => - thresholds.findLastIndex((threshold) => Number(amount) >= threshold); +const tierIndexForAmount = (amount, thresholds) => { + for (let index = thresholds.length - 1; index >= 0; index--) { + if (Number(amount) >= thresholds[index]) return index; + } + return -1; +}; const nextTierLabel = (amount, thresholds) => { const nextThreshold = thresholds.find((threshold) => Number(amount) < threshold); @@ -96,10 +100,7 @@ const TierSelect = ({ }, option({ value: "", disabled: true, selected: true }, label), ...TIER_MULTIPLIERS.map((_, tierIndex) => - option( - { value: tierIndex }, - `TIER ${tierIndex + 1} - ${thresholds ? thresholds[tierIndex] : "PER CARD"}` - ) + option({ value: tierIndex }, `TIER ${tierIndex + 1} - ${thresholds ? thresholds[tierIndex] : "PER CARD"}`) ) ); }; @@ -247,19 +248,17 @@ const CardSection = ({ ), div( { class: "card-region__body account-item-stack" }, - ...region.cards.map((card) => - Row({ card, valueState: getOrCreateState(valueStates, card.monsterId) }) - ) + ...region.cards.map((card) => Row({ card, valueState: getOrCreateState(valueStates, card.monsterId) })) ) ), setRegionTier ? TierSelect({ - label: "SET REGION TIER", - status, - disabled: () => region.cards.length === 0, - className: "card-region__tier-select", - onSelect: (tierIndex) => setRegionTier(region, tierIndex), - }) + label: "SET REGION TIER", + status, + disabled: () => region.cards.length === 0, + className: "card-region__tier-select", + onSelect: (tierIndex) => setRegionTier(region, tierIndex), + }) : null ); }; @@ -347,8 +346,7 @@ export const CardsTab = () => { return PersistentAccountListPage({ title: "CARDS", - description: () => - `${totalCards.val} cards grouped by Card Region. Edit amounts or set exact tier minimums.`, + description: () => `${totalCards.val} cards grouped by Card Region. Edit amounts or set exact tier minimums.`, actions: RefreshButton({ onRefresh: load, tooltip: "Re-read live cards and definitions from the running game.", diff --git a/src/ui/entry/index.html b/src/ui/entry/index.html index 3ad05dce..c600ff50 100644 --- a/src/ui/entry/index.html +++ b/src/ui/entry/index.html @@ -4,6 +4,12 @@ Idleon Injector + diff --git a/src/ui/entry/style.css b/src/ui/entry/style.css index 746d1f7c..cb5921c0 100644 --- a/src/ui/entry/style.css +++ b/src/ui/entry/style.css @@ -40,3 +40,6 @@ /* ATLAS APPLICATION SHELL */ @import url("../styles/_atlas-shell.css"); @import url("../styles/_activity-drawer.css"); + +/* THEME OVERRIDES */ +@import url("../styles/_theme.css"); diff --git a/src/ui/state/store.js b/src/ui/state/store.js index 04c36dbf..dd7acc3c 100644 --- a/src/ui/state/store.js +++ b/src/ui/state/store.js @@ -1,6 +1,7 @@ import vanX from "../vendor/van-x-0.6.3.js"; import * as API from "../services/api.js"; import { VIEWS } from "./constants.js"; +import { loadThemePreference, saveThemePreference } from "./theme.js"; import { getCheatConfigPath, configPathExists } from "../utils/index.js"; import { formatDisplayValue, monitorIdFromMonitorPath } from "../components/views/search/valueUtils.js"; import { @@ -43,6 +44,7 @@ const appState = vanX.reactive({ activityDrawer: null, sidebarMobileOpen: false, sidebarCollapsed: localStorage.getItem("sidebarCollapsed") === "true", + theme: loadThemePreference(), configForcedPath: null, }); @@ -370,6 +372,10 @@ const store = { localStorage.setItem("sidebarCollapsed", appState.sidebarCollapsed); }, + setTheme: (theme) => { + appState.theme = saveThemePreference(theme); + }, + setActiveTab: (viewId) => { appState.activeTab = viewId; appState.sidebarMobileOpen = false; diff --git a/src/ui/state/theme.js b/src/ui/state/theme.js new file mode 100644 index 00000000..36873b5a --- /dev/null +++ b/src/ui/state/theme.js @@ -0,0 +1,18 @@ +export const THEME_STORAGE_KEY = "uiTheme"; +export const THEMES = ["system", "light", "dark"]; + +export const normalizeTheme = (theme) => (THEMES.includes(theme) ? theme : "light"); + +export const loadThemePreference = (storage = localStorage) => normalizeTheme(storage.getItem(THEME_STORAGE_KEY)); + +export const applyTheme = (theme, root = document.documentElement) => { + const normalizedTheme = normalizeTheme(theme); + root.dataset.theme = normalizedTheme; + return normalizedTheme; +}; + +export const saveThemePreference = (theme, storage = localStorage, root = document.documentElement) => { + const normalizedTheme = applyTheme(theme, root); + storage.setItem(THEME_STORAGE_KEY, normalizedTheme); + return normalizedTheme; +}; diff --git a/src/ui/styles/_account-pages.css b/src/ui/styles/_account-pages.css index 8bfa53d5..93cf1fab 100644 --- a/src/ui/styles/_account-pages.css +++ b/src/ui/styles/_account-pages.css @@ -535,6 +535,13 @@ } @media (max-width: 760px) { + .account-row__name { + flex-basis: 100%; + white-space: normal; + overflow: visible; + text-overflow: clip; + } + .account-row__controls--field-grid { grid-template-columns: 1fr; } diff --git a/src/ui/styles/_activity-drawer.css b/src/ui/styles/_activity-drawer.css index 3ad3ebd8..008c3723 100644 --- a/src/ui/styles/_activity-drawer.css +++ b/src/ui/styles/_activity-drawer.css @@ -6,6 +6,7 @@ flex: 0 0 0; min-height: 0; overflow: hidden; + visibility: hidden; color: #dfe4f2; background: #090d1d; border-top: 0 solid #273049; @@ -17,6 +18,7 @@ .atlas-activity-drawer.is-open { flex-basis: clamp(180px, 28vh, 280px); border-top-width: 1px; + visibility: visible; } .atlas-drawer-tabs { diff --git a/src/ui/styles/_atlas-shell.css b/src/ui/styles/_atlas-shell.css index a5576cd2..9364d621 100644 --- a/src/ui/styles/_atlas-shell.css +++ b/src/ui/styles/_atlas-shell.css @@ -3,27 +3,6 @@ * Dark global header, light workspace canvas, and responsive navigation. */ -:root { - --atlas-header-height: 48px; - --atlas-sidebar-width: 220px; - --atlas-sidebar-collapsed-width: 64px; - --atlas-header: #090b14; - --atlas-header-border: #1d2230; - --atlas-canvas: #f4f6fa; - --atlas-surface: #ffffff; - --atlas-surface-muted: #f8f9fc; - --atlas-border: #dce2ec; - --atlas-border-strong: #c7d0df; - --atlas-text: #14213d; - --atlas-text-muted: #66748d; - --atlas-text-soft: #8a96ab; - --atlas-accent: #5b5ce2; - --atlas-accent-soft: #ececff; - --atlas-success: #0aa575; - --atlas-danger: #d9435f; - --atlas-warning: #d58a08; -} - body { background: var(--atlas-canvas); } @@ -261,39 +240,6 @@ body { } .viewport.atlas-canvas { - --c-void: #f4f6fa; - --c-void-soft: #edf1f7; - --c-panel: #ffffff; - --c-panel-dim: #f8f9fc; - --c-panel-dark-dim: #f0f3f8; - --c-panel-hover: #f0f3fa; - --c-panel-95: rgba(255, 255, 255, 0.96); - --c-panel-98: rgba(255, 255, 255, 0.98); - --c-border: #dce2ec; - --c-border-strong: #c7d0df; - --c-text-main: #14213d; - --c-text-dim: #42526b; - --c-text-muted: #71809b; - --c-text: var(--c-text-main); - --c-accent: #5b5ce2; - --c-accent-hover: #4b4dcc; - --c-accent-dim: rgba(91, 92, 226, 0.1); - --c-accent-dim-solid: #ededfd; - --c-accent-glow: rgba(91, 92, 226, 0.22); - --c-accent-06: rgba(91, 92, 226, 0.06); - --c-accent-20: rgba(91, 92, 226, 0.2); - --c-accent-25: rgba(91, 92, 226, 0.25); - --c-accent-40: rgba(91, 92, 226, 0.4); - --c-success: #0aa575; - --c-warning: #d58a08; - --c-danger: #d9435f; - --c-success-10: rgba(10, 165, 117, 0.1); - --c-danger-05: rgba(217, 67, 95, 0.05); - --c-danger-10: rgba(217, 67, 95, 0.1); - --c-warning-10: rgba(213, 138, 8, 0.1); - --c-hover: rgba(20, 33, 61, 0.05); - --c-border-faint: rgba(20, 33, 61, 0.07); - --c-scrollbar-thumb: #b8c2d1; flex: 1 1 auto; min-width: 0; min-height: 0; @@ -487,26 +433,35 @@ body { height: 14px; } -.atlas-sidebar:is(.sidebar-collapsed, .is-responsive-rail) .atlas-sidebar-section-label, -.atlas-sidebar:is(.sidebar-collapsed, .is-responsive-rail) .atlas-sidebar-divider, -.atlas-sidebar:is(.sidebar-collapsed, .is-responsive-rail) .atlas-context-slot, -.atlas-sidebar:is(.sidebar-collapsed, .is-responsive-rail) .atlas-nav-shortcut, -.atlas-sidebar:is(.sidebar-collapsed, .is-responsive-rail) .tab-label { +.atlas-sidebar.sidebar-collapsed .atlas-sidebar-section-label, +.atlas-sidebar.sidebar-collapsed .atlas-sidebar-divider, +.atlas-sidebar.sidebar-collapsed .atlas-context-slot, +.atlas-sidebar.sidebar-collapsed .atlas-nav-shortcut, +.atlas-sidebar.sidebar-collapsed .tab-label, +.atlas-sidebar.is-responsive-rail .atlas-sidebar-section-label, +.atlas-sidebar.is-responsive-rail .atlas-sidebar-divider, +.atlas-sidebar.is-responsive-rail .atlas-context-slot, +.atlas-sidebar.is-responsive-rail .atlas-nav-shortcut, +.atlas-sidebar.is-responsive-rail .tab-label { display: none; } -.atlas-sidebar:is(.sidebar-collapsed, .is-responsive-rail) .atlas-nav-button, -.atlas-sidebar:is(.sidebar-collapsed, .is-responsive-rail) .sidebar-toggle { +.atlas-sidebar.sidebar-collapsed .atlas-nav-button, +.atlas-sidebar.sidebar-collapsed .sidebar-toggle, +.atlas-sidebar.is-responsive-rail .atlas-nav-button, +.atlas-sidebar.is-responsive-rail .sidebar-toggle { justify-content: center; padding-inline: 7px; } -.atlas-sidebar:is(.sidebar-collapsed, .is-responsive-rail) .atlas-sidebar-footer { +.atlas-sidebar.sidebar-collapsed .atlas-sidebar-footer, +.atlas-sidebar.is-responsive-rail .atlas-sidebar-footer { margin-top: auto; border-top: 0; } -.atlas-sidebar:is(.sidebar-collapsed, .is-responsive-rail) .atlas-sidebar-controls { +.atlas-sidebar.sidebar-collapsed .atlas-sidebar-controls, +.atlas-sidebar.is-responsive-rail .atlas-sidebar-controls { display: block; } @@ -518,7 +473,11 @@ body { display: none; } -.app-layout :is(button, a, input, select, textarea):focus-visible { +.app-layout button:focus-visible, +.app-layout a:focus-visible, +.app-layout input:focus-visible, +.app-layout select:focus-visible, +.app-layout textarea:focus-visible { outline: 2px solid #7779f4; outline-offset: 2px; } diff --git a/src/ui/styles/_search.css b/src/ui/styles/_search.css index 7923621a..0eab5661 100644 --- a/src/ui/styles/_search.css +++ b/src/ui/styles/_search.css @@ -780,28 +780,6 @@ /* Atlas search workbench --------------------------------------------------- */ #search-tab { - --c-panel: #ffffff; - --c-panel-dim: #f8fafc; - --c-panel-hover: #f1f5f9; - --c-border: #e2e8f0; - --c-border-strong: #cbd5e1; - --c-control-border-strong: #e2e8f0; - --c-text-main: #0f172a; - --c-text-dim: #475569; - --c-text-muted: #94a3b8; - --c-accent: #6366f1; - --c-accent-hover: #4f46e5; - --c-accent-dim: rgba(99, 102, 241, 0.08); - --c-accent-dim-solid: #eef2ff; - --c-accent-06: rgba(99, 102, 241, 0.06); - --c-accent-20: rgba(99, 102, 241, 0.2); - --c-accent-25: rgba(99, 102, 241, 0.25); - --c-success: #10b981; - --c-success-10: rgba(16, 185, 129, 0.1); - --c-warning: #f59e0b; - --c-danger: #f43f5e; - --c-white-05: rgba(15, 23, 42, 0.04); - --c-white-10: rgba(15, 23, 42, 0.07); --font-display: var(--font-sans, "Inter", "Segoe UI", sans-serif); padding: 0; background: #f8fafc; diff --git a/src/ui/styles/_theme.css b/src/ui/styles/_theme.css new file mode 100644 index 00000000..7671c358 --- /dev/null +++ b/src/ui/styles/_theme.css @@ -0,0 +1,612 @@ +/** + * Atlas light/dark themes. All base values are Chromium 87-safe HEX/RGBA colors. + */ + +:root { + color-scheme: light; + --atlas-header-height: 48px; + --atlas-sidebar-width: 220px; + --atlas-sidebar-collapsed-width: 64px; + --atlas-header: #090b14; + --atlas-header-border: #1d2230; + --atlas-canvas: #f4f6fa; + --atlas-surface: #ffffff; + --atlas-surface-raised: #ffffff; + --atlas-surface-muted: #f8f9fc; + --atlas-surface-hover: #f0f3fa; + --atlas-field: #ffffff; + --atlas-border: #dce2ec; + --atlas-border-strong: #c7d0df; + --atlas-text: #14213d; + --atlas-text-muted: #66748d; + --atlas-text-soft: #8a96ab; + --atlas-accent: #5b5ce2; + --atlas-accent-hover: #4b4dcc; + --atlas-accent-soft: #ececff; + --atlas-focus: #7779f4; + --atlas-success: #0aa575; + --atlas-success-soft: rgba(10, 165, 117, 0.1); + --atlas-danger: #d9435f; + --atlas-danger-soft: rgba(217, 67, 95, 0.1); + --atlas-warning: #d58a08; + --atlas-warning-soft: rgba(213, 138, 8, 0.1); + --atlas-overlay-02: rgba(20, 33, 61, 0.02); + --atlas-overlay-03: rgba(20, 33, 61, 0.03); + --atlas-overlay-04: rgba(20, 33, 61, 0.04); + --atlas-overlay-05: rgba(20, 33, 61, 0.05); + --atlas-overlay-10: rgba(20, 33, 61, 0.1); + --atlas-shadow: rgba(20, 33, 61, 0.12); + --atlas-scrollbar: #b8c2d1; + --atlas-control-bg: #111a30; + --atlas-control-hover: #293552; + --atlas-control-text: #ffffff; + --atlas-disabled-bg: #e8ecf2; + --atlas-disabled-text: #7f8ca4; +} + +:root[data-theme="dark"] { + color-scheme: dark; + --atlas-canvas: #10121a; + --atlas-surface: #171b25; + --atlas-surface-raised: #1c2130; + --atlas-surface-muted: #1a1f2c; + --atlas-surface-hover: #242b3b; + --atlas-field: #111620; + --atlas-border: #30384a; + --atlas-border-strong: #46516a; + --atlas-text: #eceff8; + --atlas-text-muted: #bec3d1; + --atlas-text-soft: #8f99ae; + --atlas-accent: #8b8df5; + --atlas-accent-hover: #a7a8ff; + --atlas-accent-soft: #292b50; + --atlas-focus: #a7a8ff; + --atlas-success: #59d99a; + --atlas-success-soft: rgba(89, 217, 154, 0.12); + --atlas-danger: #ff7189; + --atlas-danger-soft: rgba(255, 113, 137, 0.12); + --atlas-warning: #f3b84b; + --atlas-warning-soft: rgba(243, 184, 75, 0.12); + --atlas-overlay-02: rgba(255, 255, 255, 0.02); + --atlas-overlay-03: rgba(255, 255, 255, 0.03); + --atlas-overlay-04: rgba(255, 255, 255, 0.04); + --atlas-overlay-05: rgba(255, 255, 255, 0.05); + --atlas-overlay-10: rgba(255, 255, 255, 0.1); + --atlas-shadow: rgba(0, 0, 0, 0.34); + --atlas-scrollbar: #46516a; + --atlas-control-bg: #7779f4; + --atlas-control-hover: #8b8df5; + --atlas-control-text: #ffffff; + --atlas-disabled-bg: #252b38; + --atlas-disabled-text: #7f8aa3; +} + +@media (prefers-color-scheme: dark) { + :root[data-theme="system"] { + color-scheme: dark; + --atlas-canvas: #10121a; + --atlas-surface: #171b25; + --atlas-surface-raised: #1c2130; + --atlas-surface-muted: #1a1f2c; + --atlas-surface-hover: #242b3b; + --atlas-field: #111620; + --atlas-border: #30384a; + --atlas-border-strong: #46516a; + --atlas-text: #eceff8; + --atlas-text-muted: #bec3d1; + --atlas-text-soft: #8f99ae; + --atlas-accent: #8b8df5; + --atlas-accent-hover: #a7a8ff; + --atlas-accent-soft: #292b50; + --atlas-focus: #a7a8ff; + --atlas-success: #59d99a; + --atlas-success-soft: rgba(89, 217, 154, 0.12); + --atlas-danger: #ff7189; + --atlas-danger-soft: rgba(255, 113, 137, 0.12); + --atlas-warning: #f3b84b; + --atlas-warning-soft: rgba(243, 184, 75, 0.12); + --atlas-overlay-02: rgba(255, 255, 255, 0.02); + --atlas-overlay-03: rgba(255, 255, 255, 0.03); + --atlas-overlay-04: rgba(255, 255, 255, 0.04); + --atlas-overlay-05: rgba(255, 255, 255, 0.05); + --atlas-overlay-10: rgba(255, 255, 255, 0.1); + --atlas-shadow: rgba(0, 0, 0, 0.34); + --atlas-scrollbar: #46516a; + --atlas-control-bg: #7779f4; + --atlas-control-hover: #8b8df5; + --atlas-control-text: #ffffff; + --atlas-disabled-bg: #252b38; + --atlas-disabled-text: #7f8aa3; + } +} + +.viewport.atlas-canvas, +#search-tab, +#options-account-tab { + --c-void: var(--atlas-canvas); + --c-void-soft: var(--atlas-surface-muted); + --c-panel: var(--atlas-surface); + --c-panel-dim: var(--atlas-surface-muted); + --c-panel-dark-dim: var(--atlas-surface-raised); + --c-panel-hover: var(--atlas-surface-hover); + --c-panel-95: var(--atlas-surface); + --c-panel-98: var(--atlas-surface); + --c-border: var(--atlas-border); + --c-border-strong: var(--atlas-border-strong); + --c-text-main: var(--atlas-text); + --c-text-dim: var(--atlas-text-muted); + --c-text-muted: var(--atlas-text-soft); + --c-text: var(--atlas-text); + --c-accent: var(--atlas-accent); + --c-accent-hover: var(--atlas-accent-hover); + --c-accent-dim: var(--atlas-accent-soft); + --c-accent-dim-solid: var(--atlas-accent-soft); + --c-accent-glow: var(--atlas-accent-soft); + --c-accent-06: var(--atlas-overlay-05); + --c-accent-20: rgba(91, 92, 226, 0.2); + --c-accent-25: rgba(91, 92, 226, 0.25); + --c-accent-40: rgba(91, 92, 226, 0.4); + --c-success: var(--atlas-success); + --c-success-10: var(--atlas-success-soft); + --c-warning: var(--atlas-warning); + --c-warning-10: var(--atlas-warning-soft); + --c-danger: var(--atlas-danger); + --c-danger-05: var(--atlas-danger-soft); + --c-danger-10: var(--atlas-danger-soft); + --c-white-02: var(--atlas-overlay-02); + --c-white-03: var(--atlas-overlay-03); + --c-white-04: var(--atlas-overlay-04); + --c-white-05: var(--atlas-overlay-05); + --c-white-10: var(--atlas-overlay-10); + --c-black-20: var(--atlas-overlay-05); + --c-black-40: var(--atlas-overlay-10); + --c-hover: var(--atlas-overlay-05); + --c-border-faint: var(--atlas-overlay-05); + --c-control-border-strong: var(--atlas-border-strong); + --c-control-thumb: var(--atlas-text-soft); + --c-scrollbar-thumb: var(--atlas-scrollbar); +} + +body, +.viewport.atlas-canvas, +#search-tab, +#options-account-tab, +#config-tab.config-layout, +#devtools-tab.devtools-workspace { + color: var(--atlas-text); + background: var(--atlas-canvas); +} + +.app-layout button:focus-visible, +.app-layout a:focus-visible, +.app-layout input:focus-visible, +.app-layout select:focus-visible, +.app-layout textarea:focus-visible { + outline-color: var(--atlas-focus); +} + +/* Shell */ +.atlas-nav-button, +.atlas-sidebar .sidebar-toggle { + color: var(--atlas-text-muted); +} + +.atlas-nav-button:hover, +.atlas-sidebar .sidebar-toggle:hover { + color: var(--atlas-text); + background: var(--atlas-surface-hover); + border-color: var(--atlas-border); +} + +.atlas-nav-button.active { + color: var(--atlas-accent); + background: var(--atlas-accent-soft); + border-color: var(--atlas-border-strong); +} + +.atlas-nav-shortcut { + color: var(--atlas-text-soft); +} + +/* Cheats workspace */ +#cheats-tab.atlas-cheats-pane, +.atlas-cheats-workbench { + color: var(--atlas-text); + background: var(--atlas-canvas); +} + +.atlas-cheat-table, +.atlas-cheat-inspector, +.atlas-cheat-search, +.atlas-cheat-pagination button, +.atlas-cheat-run, +.atlas-inspector-field input, +.atlas-open-full-config, +.atlas-inspector-config .cheat-category, +.atlas-inspector-config .config-item, +.atlas-inspector-config .config-item input[type="text"], +.atlas-inspector-config .config-item input[type="number"], +.atlas-inspector-toggle { + color: var(--atlas-text); + background: var(--atlas-surface); +} + +.atlas-cheat-toolbar, +.atlas-cheat-table-head, +.atlas-cheat-row:hover, +.atlas-inspector-config .cheat-category summary { + background: var(--atlas-surface-muted); +} + +.atlas-scope-button:hover, +.atlas-inspector-tabs button.is-active, +.atlas-cheat-run:disabled { + color: var(--atlas-text); + background: var(--atlas-surface-hover); +} + +.atlas-scope-button.is-active, +.atlas-cheat-row.is-selected, +.atlas-cheat-config-link:hover, +.atlas-cheat-favorite:hover, +.atlas-cheat-run:hover:not(:disabled) { + color: var(--atlas-accent); + background: var(--atlas-accent-soft); +} + +.atlas-cheat-table, +.atlas-cheat-toolbar, +.atlas-cheat-table-head, +.atlas-cheat-row, +.atlas-table-hint, +.atlas-inspector-header, +.atlas-inspector-tabs, +.atlas-inspector-facts, +.atlas-inspector-facts > div, +.atlas-inspector-config .cheat-category, +.atlas-inspector-config .config-item, +.atlas-inspector-config .cheat-category-content, +.atlas-cheat-inspector, +.atlas-cheat-search, +.atlas-cheat-pagination button, +.atlas-cheat-run, +.atlas-cheat-switch, +.atlas-inspector-field input, +.atlas-open-full-config, +.atlas-inspector-toggle { + border-color: var(--atlas-border); +} + +.atlas-tree-heading, +.atlas-scope-count, +.atlas-cheat-search, +.atlas-cheat-search input::placeholder, +.atlas-row-count, +.atlas-table-hint, +.atlas-cheat-pagination, +.atlas-cheat-table-head, +.atlas-cheat-saved-value, +.atlas-cheat-description, +.atlas-cheat-category, +.atlas-inspector-title code, +.atlas-inspector-tabs button, +.atlas-inspector-description, +.atlas-inspector-field, +.atlas-inspector-facts > div > :first-child, +.atlas-linked-config-path, +.atlas-inspector-config .config-description, +.atlas-inspector-close { + color: var(--atlas-text-muted); +} + +.atlas-scope-button, +.atlas-cheat-search input, +.atlas-cheat-command, +.atlas-inspector-title > span, +.atlas-inspector-facts > div, +.atlas-inspector-config .cheat-category summary { + color: var(--atlas-text); +} + +.atlas-inspector-run { + color: var(--atlas-control-text); + background: var(--atlas-control-bg); +} + +.atlas-inspector-run:hover:not(:disabled) { + background: var(--atlas-control-hover); +} + +.atlas-inspector-run:disabled { + color: var(--atlas-disabled-text); + background: var(--atlas-disabled-bg); +} + +.atlas-cheat-switch { + background: var(--atlas-surface-hover); +} + +.atlas-cheat-switch-thumb { + background: var(--atlas-surface-raised); + box-shadow: 0 1px 3px var(--atlas-shadow); +} + +.atlas-cheat-switch.is-on { + border-color: var(--atlas-accent); + background: var(--atlas-accent); +} + +/* Search workspace */ +#search-tab, +#search-tab .search-layout, +#search-tab .keys-footer, +#search-tab .account-sub-tab-content { + color: var(--c-text-main); + background: var(--c-panel-dim); +} + +#search-tab .search-keys-section, +#search-tab .search-input-section, +#search-tab .search-results-section, +#search-tab .saved-results-section, +#search-tab .section-header, +#search-tab .search-input-content, +#search-tab .search-pane-toolbar, +#search-tab .search-result-item, +#search-tab .search-keys-toggle, +#search-tab .search-inspector-toggle, +#search-tab .search-keys-close, +#search-tab .search-inspector-close, +#search-tab .search-inspector { + background: var(--c-panel); +} + +#search-tab .search-right-column, +#search-tab .search-keys-section, +#search-tab .search-input-section, +#search-tab .section-header, +#search-tab .keys-footer, +#search-tab .search-pane-toolbar, +#search-tab .search-result-item, +#search-tab .search-keys-toggle, +#search-tab .search-inspector-toggle, +#search-tab .search-keys-close, +#search-tab .search-inspector-close, +#search-tab .search-inspector-header { + border-color: var(--c-border); +} + +#search-tab .section-title, +#search-tab .type-label, +#search-tab .selected-count, +#search-tab .keys-loading, +#search-tab .search-result-item, +#search-tab .result-action-btn, +#search-tab .search-inspector-tab, +#search-tab .selected-result-kicker, +#search-tab .selected-result-label { + color: var(--c-text-muted); +} + +#search-tab .key-checkbox, +#search-tab .selected-result-path, +#search-tab .search-inspector-tab:hover { + color: var(--c-text-main); +} + +#search-tab .key-checkbox:hover, +#search-tab .search-inspector-tab:hover { + background: var(--c-panel-hover); +} + +#search-tab .key-checkbox.checked, +#search-tab .results-scope-badge, +#search-tab .search-result-item:hover, +#search-tab .search-result-item.is-selected, +#search-tab .search-toolbar-count, +#search-tab .search-inspector-count, +#search-tab .search-inspector-tab.active { + color: var(--c-accent); + background: var(--c-accent-dim-solid); + border-color: var(--c-border-strong); +} + +/* Account workspace */ +#options-account-tab, +#options-account-tab .account-sub-tab-content { + background: var(--c-panel-dim); +} + +.account-root-nav.account-sub-nav, +#options-account-tab .world-sub-nav, +#options-account-tab .account-page-nav, +#options-account-tab .account-nested-sub-nav, +#options-account-tab .account-header, +#options-account-tab .account-section, +#options-account-tab .account-row, +#options-account-tab .feature-card { + background: var(--c-panel); + border-color: var(--c-border); +} + +.account-root-nav .account-sub-tab-btn, +#options-account-tab .world-sub-nav .account-sub-tab-btn, +#options-account-tab .account-page-nav .account-sub-tab-btn, +#options-account-tab .account-nested-sub-nav .account-sub-tab-btn, +#options-account-tab .account-tab-header__desc, +#options-account-tab .account-row__index { + color: var(--c-text-dim); +} + +#options-account-tab .account-tab-header__title, +.account-root-nav .account-sub-tab-btn:hover, +#options-account-tab .world-sub-nav .account-sub-tab-btn:hover, +#options-account-tab .account-page-nav .account-sub-tab-btn:hover, +#options-account-tab .account-nested-sub-nav .account-sub-tab-btn:hover { + color: var(--c-text-main); +} + +.account-root-nav .account-sub-tab-btn:hover, +#options-account-tab .account-row:hover, +#options-account-tab .feature-card:hover, +#options-account-tab .world-sub-nav .account-sub-tab-btn:hover, +#options-account-tab .account-page-nav .account-sub-tab-btn:hover, +#options-account-tab .account-nested-sub-nav .account-sub-tab-btn:hover { + background: var(--c-panel-hover); + border-color: var(--c-border-strong); +} + +.account-root-nav .account-sub-tab-btn.active, +#options-account-tab .account-row__badge, +#options-account-tab .world-sub-nav .account-sub-tab-btn.active, +#options-account-tab .account-page-nav .account-sub-tab-btn.active, +#options-account-tab .account-nested-sub-nav .account-sub-tab-btn.active { + color: var(--c-accent); + background: var(--c-accent-dim-solid); + border-color: var(--c-border-strong); +} + +#options-account-tab .account-row__index { + background: var(--c-panel-hover); +} + +/* Config and DevTools */ +.atlas-config-status-chip { + color: var(--atlas-text-muted); + background: var(--atlas-surface-muted); + border-color: var(--atlas-border); +} + +.atlas-config-status-chip.is-dirty { + color: var(--atlas-warning); + background: var(--atlas-warning-soft); + border-color: var(--atlas-warning); +} + +.atlas-config-actions .btn-secondary { + color: var(--atlas-text); + background: var(--atlas-surface); + border-color: var(--atlas-border-strong); +} + +#config-tab .action-bar { + box-shadow: 0 -8px 22px var(--atlas-shadow); +} + +#devtools-tab.devtools-workspace, +#devtools-tab.devtools-workspace .terminal-wrapper, +.devtools-workspace #devtools-iframe, +.devtools-popout-card { + background: var(--atlas-surface); +} + +.devtools-workspace #devtools-message { + background: var(--atlas-canvas); + color: var(--atlas-text-muted); +} + +.devtools-popout-card { + color: var(--atlas-text-muted); + border-color: var(--atlas-border); + box-shadow: 0 18px 45px var(--atlas-shadow); +} + +.devtools-popout-title { + color: var(--atlas-text); +} + +.devtools-popout-kicker { + color: var(--atlas-accent); +} + +/* Chromium 87 fallbacks for optional color-mix() enhancements. */ +@supports not (color: color-mix(in srgb, white 50%, black)) { + .summoning-round-row--done:not(.account-row--success):not(.account-row--error), + .sneaking-toggle-row--enabled:not(.account-row--success):not(.account-row--error), + .arcade-row__badge--cosmic, + .stamp-row--exalted, + .stamp-exalted-btn--active, + .brewing-row--prisma, + .brewing-prisma-btn.brewing-prisma-btn--active, + .brewing-prisma-btn.brewing-prisma-btn--active:hover:not(:disabled), + .po-currency-row__value, + .po-points-summary__row--highlight, + .sigil-card--unlocked, + .sigil-card--boosted, + .sigil-card--ionized, + .sigil-card--ethereal, + .sigil-card--eclectic, + .cogs-selected-summary, + .liquid-row__badge, + .library-maxbooklv, + .account-row__badge, + .account-row--info, + .card-row .account-row__badge, + .warning-banner, + .warning-banner--polymer, + .account-root-nav .world-tab-btn-num, + #options-account-tab .world-sub-nav .account-sub-tab-btn.active, + #options-account-tab .account-page-nav .account-sub-tab-btn.active, + #options-account-tab .account-nested-sub-nav .account-sub-tab-btn.active { + background: var(--c-accent-dim-solid); + } + + .killroy-row--blur, + .refinery-section--placeholder, + .has-warning:not(.account-row--success):not(.account-row--error) { + background: var(--c-warning-10); + } + + .feature-card.account-row--success, + .account-row--success, + .account-btn--success, + .card-region--success { + background: var(--c-success-10) !important; + } + + .feature-card.account-row--error, + .account-row--error, + .account-btn--error, + .card-region--error, + .account-btn--danger { + background: var(--c-danger-10) !important; + } + + .account-row.cloud-row--nightmare:not(.account-row--success):not(.account-row--error), + .account-row.cloud-row--nightmare:not(.account-row--success):not(.account-row--error) .account-row__index, + .account-row.cloud-row--nightmare:not(.account-row--success):not(.account-row--error) .account-row__badge { + background: var(--c-warning-10); + } + + .research-grid-tile__fill, + .research-grid-detail__preview-fill { + background: var(--c-accent); + } + + .observation-tile--unlocked, + .summoning-round-row--done:not(.account-row--success):not(.account-row--error), + .sneaking-toggle-row--enabled:not(.account-row--success):not(.account-row--error), + .card-row .account-row__badge, + .account-row.cloud-row--nightmare:not(.account-row--success):not(.account-row--error), + .account-row.cloud-row--nightmare:not(.account-row--success):not(.account-row--error) .account-row__badge, + .sushi-station-tile--plate-0, + .sushi-station-tile--plate-1, + .sushi-station-tile--plate-2, + .sushi-station-tile--plate-3 { + border-color: var(--c-border-strong); + } + + @keyframes account-row-success-flash { + from, + to { + background: var(--c-success-10); + } + } + + @keyframes account-row-error-flash { + from, + to { + background: var(--c-danger-10); + } + } +} diff --git a/src/ui/styles/_world-tabs.css b/src/ui/styles/_world-tabs.css index 14e848b4..458092d8 100644 --- a/src/ui/styles/_world-tabs.css +++ b/src/ui/styles/_world-tabs.css @@ -193,34 +193,6 @@ /* Atlas account workbench -------------------------------------------------- */ #options-account-tab { - --c-panel: #ffffff; - --c-panel-dim: #f8fafc; - --c-panel-hover: #f1f5f9; - --c-border: #e2e8f0; - --c-border-strong: #cbd5e1; - --c-text-main: #0f172a; - --c-text-dim: #475569; - --c-text-muted: #94a3b8; - --c-accent: #6366f1; - --c-accent-hover: #4f46e5; - --c-accent-dim: rgba(99, 102, 241, 0.08); - --c-accent-dim-solid: #eef2ff; - --c-accent-glow: rgba(99, 102, 241, 0.18); - --c-accent-06: rgba(99, 102, 241, 0.06); - --c-accent-20: rgba(99, 102, 241, 0.2); - --c-accent-25: rgba(99, 102, 241, 0.25); - --c-success: #10b981; - --c-warning: #f59e0b; - --c-danger: #f43f5e; - --c-success-10: rgba(16, 185, 129, 0.1); - --c-danger-05: rgba(244, 63, 94, 0.05); - --c-danger-10: rgba(244, 63, 94, 0.1); - --c-white-05: rgba(15, 23, 42, 0.05); - --c-white-10: rgba(15, 23, 42, 0.08); - --c-black-20: rgba(15, 23, 42, 0.06); - --c-black-40: rgba(15, 23, 42, 0.08); - --c-control-border-strong: #cbd5e1; - --c-control-thumb: #ffffff; --font-display: var(--font-sans, "Inter", "Segoe UI", sans-serif); padding: 0; background: #f8fafc; diff --git a/src/ui/styles/config.css b/src/ui/styles/config.css index c354b9e5..2e789189 100644 --- a/src/ui/styles/config.css +++ b/src/ui/styles/config.css @@ -270,6 +270,39 @@ } /* --- ATLAS CONFIG WORKSPACE --- */ +.theme-preference { + display: flex; + align-items: center; + justify-content: space-between; + gap: 16px; + margin-bottom: 14px; + padding: 12px; + border: 1px solid var(--atlas-border); + border-radius: 8px; + background: var(--atlas-surface); +} + +.theme-preference-title { + color: var(--atlas-text); + font-size: 0.75rem; + font-weight: 700; + letter-spacing: 0.06em; +} + +.theme-preference-description { + margin-top: 3px; + color: var(--atlas-text-muted); + font-size: 0.75rem; +} + +.theme-preference select { + width: 130px; + min-height: 34px; + color: var(--atlas-text); + background: var(--atlas-field); + border-color: var(--atlas-border-strong); +} + #config-tab.config-layout { color: var(--atlas-text, #14213d); background: var(--atlas-canvas, #f4f6fa); diff --git a/src/ui/styles/tabs/w5/_gaming.css b/src/ui/styles/tabs/w5/_gaming.css index eadd931e..932041f5 100644 --- a/src/ui/styles/tabs/w5/_gaming.css +++ b/src/ui/styles/tabs/w5/_gaming.css @@ -48,6 +48,7 @@ .gaming-palette-hex { align-items: center; + height: 132px; aspect-ratio: 0.88 / 1; background: var(--hex-bg); border: 2px solid rgba(255, 255, 255, 0.78); diff --git a/tests/atlas-ui-compat.mjs b/tests/atlas-ui-compat.mjs index a1ef64b7..e0404d45 100644 --- a/tests/atlas-ui-compat.mjs +++ b/tests/atlas-ui-compat.mjs @@ -1,7 +1,8 @@ import assert from "node:assert/strict"; -import { readFile } from "node:fs/promises"; +import { readFile, readdir } from "node:fs/promises"; +import path from "node:path"; import test from "node:test"; -import { URL } from "node:url"; +import { fileURLToPath, URL } from "node:url"; const workspaceUtilsSource = await readFile( new URL("../src/ui/components/views/search/workspaceUtils.js", import.meta.url), @@ -10,6 +11,10 @@ const workspaceUtilsSource = await readFile( const { loadLocalFavoriteKeys, pickInitialSelectedKeys, saveLocalFavoriteKeys } = await import( `data:text/javascript,${encodeURIComponent(workspaceUtilsSource)}` ); +const themeSource = await readFile(new URL("../src/ui/state/theme.js", import.meta.url), "utf8"); +const { applyTheme, loadThemePreference, normalizeTheme, saveThemePreference } = await import( + `data:text/javascript,${encodeURIComponent(themeSource)}` +); const createStorage = (initial = {}) => { const values = new Map(Object.entries(initial)); @@ -41,3 +46,49 @@ test("Search selection fallback prefers persisted keys, then favorites", () => { assert.deepEqual(pickInitialSelectedKeys(all, [], ["C", "missing", "B"]), ["C", "B"]); assert.deepEqual(pickInitialSelectedKeys(all, [], []), all); }); + +test("Theme preferences default to light and persist valid selections", () => { + const storage = createStorage(); + const root = { dataset: {} }; + + assert.equal(loadThemePreference(storage), "light"); + assert.equal(normalizeTheme("unknown"), "light"); + assert.equal(applyTheme("dark", root), "dark"); + assert.equal(root.dataset.theme, "dark"); + + assert.equal(saveThemePreference("system", storage, root), "system"); + assert.equal(storage.value("uiTheme"), "system"); + assert.equal(root.dataset.theme, "system"); +}); + +const collectSourceFiles = async (directory) => { + const entries = await readdir(directory, { withFileTypes: true }); + const files = await Promise.all( + entries.map((entry) => { + const entryPath = path.join(directory, entry.name); + return entry.isDirectory() ? collectSourceFiles(entryPath) : [entryPath]; + }) + ); + return files.flat(); +}; + +test("UI source keeps the Chromium 87 compatibility floor", async () => { + const uiRoot = fileURLToPath(new URL("../src/ui", import.meta.url)); + const sourceFiles = (await collectSourceFiles(uiRoot)).filter( + (file) => !file.includes(`${path.sep}vendor${path.sep}`) && [".css", ".js"].includes(path.extname(file)) + ); + const unsupportedPatterns = [ + [/:is\(/, "CSS :is()"], + [/\.findLast(?:Index)?\(/, "Array findLast/findLastIndex"], + [/\.at\(/, "Array/String at()"], + [/\bstructuredClone\(/, "structuredClone()"], + [/\bObject\.hasOwn\(/, "Object.hasOwn()"], + ]; + + for (const file of sourceFiles) { + const source = await readFile(file, "utf8"); + for (const [pattern, label] of unsupportedPatterns) { + assert.doesNotMatch(source, pattern, `${label} is not supported by Chromium 87: ${file}`); + } + } +}); From 4755bb9abef0bbe3a878aa1ab342ecee1baf62f4 Mon Sep 17 00:00:00 2001 From: Arnold W Date: Tue, 1 Sep 2026 00:05:37 +0200 Subject: [PATCH 07/32] fix(ui): harmonize account sidebar navigation with Atlas theme --- src/ui/styles/_theme.css | 39 ++++++++++++++++++++++++++++++----- src/ui/styles/_world-tabs.css | 34 +++++++++++++++--------------- 2 files changed, 51 insertions(+), 22 deletions(-) diff --git a/src/ui/styles/_theme.css b/src/ui/styles/_theme.css index 7671c358..ee50128e 100644 --- a/src/ui/styles/_theme.css +++ b/src/ui/styles/_theme.css @@ -120,6 +120,8 @@ } } +:root, +.app-layout, .viewport.atlas-canvas, #search-tab, #options-account-tab { @@ -417,7 +419,25 @@ body, background: var(--c-panel-dim); } -.account-root-nav.account-sub-nav, +.account-root-nav.account-sub-nav { + background: transparent; + border: 0; +} + +.account-root-nav .account-sub-tab-btn { + color: var(--atlas-text-muted); +} + +.account-root-nav .account-sub-tab-btn:hover { + color: var(--atlas-text); + background: var(--atlas-surface-hover); +} + +.account-root-nav .account-sub-tab-btn.active { + color: var(--atlas-accent); + background: var(--atlas-accent-soft); +} + #options-account-tab .world-sub-nav, #options-account-tab .account-page-nav, #options-account-tab .account-nested-sub-nav, @@ -429,7 +449,6 @@ body, border-color: var(--c-border); } -.account-root-nav .account-sub-tab-btn, #options-account-tab .world-sub-nav .account-sub-tab-btn, #options-account-tab .account-page-nav .account-sub-tab-btn, #options-account-tab .account-nested-sub-nav .account-sub-tab-btn, @@ -439,14 +458,12 @@ body, } #options-account-tab .account-tab-header__title, -.account-root-nav .account-sub-tab-btn:hover, #options-account-tab .world-sub-nav .account-sub-tab-btn:hover, #options-account-tab .account-page-nav .account-sub-tab-btn:hover, #options-account-tab .account-nested-sub-nav .account-sub-tab-btn:hover { color: var(--c-text-main); } -.account-root-nav .account-sub-tab-btn:hover, #options-account-tab .account-row:hover, #options-account-tab .feature-card:hover, #options-account-tab .world-sub-nav .account-sub-tab-btn:hover, @@ -456,7 +473,6 @@ body, border-color: var(--c-border-strong); } -.account-root-nav .account-sub-tab-btn.active, #options-account-tab .account-row__badge, #options-account-tab .world-sub-nav .account-sub-tab-btn.active, #options-account-tab .account-page-nav .account-sub-tab-btn.active, @@ -551,12 +567,25 @@ body, background: var(--c-accent-dim-solid); } + .bundle-row__badge--queued, .killroy-row--blur, .refinery-section--placeholder, .has-warning:not(.account-row--success):not(.account-row--error) { background: var(--c-warning-10); } + .outpost-card, + .outpost-vanilla-units, + .outpost-map-unit, + .outpost-unit-config__world, + .outpost-vanilla-units__row { + background: var(--c-panel-dim); + } + + .masterclass-currency__badge, + .outpost-field__rank, + .outpost-field__next, + .masterclass-category-tabs__button.is-active, .feature-card.account-row--success, .account-row--success, .account-btn--success, diff --git a/src/ui/styles/_world-tabs.css b/src/ui/styles/_world-tabs.css index 458092d8..f2be03f0 100644 --- a/src/ui/styles/_world-tabs.css +++ b/src/ui/styles/_world-tabs.css @@ -195,7 +195,7 @@ #options-account-tab { --font-display: var(--font-sans, "Inter", "Segoe UI", sans-serif); padding: 0; - background: #f8fafc; + background: var(--atlas-canvas, #f8fafc); color: var(--c-text-main); } @@ -218,7 +218,7 @@ overflow-y: auto; padding: 8px; border: 0; - background: #ffffff; + background: transparent; } .account-root-nav .account-sub-tab-btn { @@ -234,7 +234,7 @@ border: 0; border-radius: 7px; background: transparent; - color: #475569; + color: var(--atlas-text-muted, #475569); font-family: var(--font-display); font-size: 0.75rem; font-weight: 500; @@ -243,13 +243,13 @@ } .account-root-nav .account-sub-tab-btn:hover { - background: #f1f5f9; - color: #0f172a; + background: var(--atlas-surface-hover, #f1f5f9); + color: var(--atlas-text, #0f172a); } .account-root-nav .account-sub-tab-btn.active { - background: #eef2ff; - color: #4338ca; + background: var(--atlas-accent-soft, #eef2ff); + color: var(--atlas-accent, #4338ca); font-weight: 650; } @@ -260,7 +260,7 @@ width: 3px; height: auto; border-radius: 0 3px 3px 0; - background: var(--world-color, #6366f1); + background: var(--world-color, var(--atlas-accent, #6366f1)); box-shadow: none; } @@ -289,7 +289,7 @@ flex: 0 0 25px; place-items: center; border-radius: 5px; - background: color-mix(in srgb, var(--world-color) 14%, #ffffff); + background: color-mix(in srgb, var(--world-color) 14%, var(--atlas-surface, #ffffff)); color: var(--world-color); font-family: var(--font-mono); font-size: 0.75rem; @@ -298,7 +298,7 @@ .account-sub-tab-content { width: 100%; height: 100%; - background: #f8fafc; + background: var(--atlas-canvas, #f8fafc); } #options-account-tab .world-sub-nav, @@ -306,8 +306,8 @@ #options-account-tab .account-nested-sub-nav { gap: 2px; padding: 7px 10px; - border-bottom-color: var(--c-border); - background: #ffffff; + border-bottom-color: var(--atlas-border, var(--c-border)); + background: var(--atlas-surface, #ffffff); } #options-account-tab .world-sub-nav .account-sub-tab-btn, @@ -319,7 +319,7 @@ border: 0; border-radius: 6px; background: transparent; - color: #64748b; + color: var(--atlas-text-muted, #64748b); font-family: var(--font-display); font-size: 0.75rem; font-weight: 600; @@ -329,15 +329,15 @@ #options-account-tab .world-sub-nav .account-sub-tab-btn:hover, #options-account-tab .account-page-nav .account-sub-tab-btn:hover, #options-account-tab .account-nested-sub-nav .account-sub-tab-btn:hover { - background: #f1f5f9; - color: #0f172a; + background: var(--atlas-surface-hover, #f1f5f9); + color: var(--atlas-text, #0f172a); } #options-account-tab .world-sub-nav .account-sub-tab-btn.active, #options-account-tab .account-page-nav .account-sub-tab-btn.active, #options-account-tab .account-nested-sub-nav .account-sub-tab-btn.active { - background: color-mix(in srgb, var(--world-color, #6366f1) 10%, #ffffff); - color: color-mix(in srgb, var(--world-color, #6366f1) 78%, #0f172a); + background: color-mix(in srgb, var(--world-color, #6366f1) 10%, var(--atlas-surface, #ffffff)); + color: color-mix(in srgb, var(--world-color, #6366f1) 78%, var(--atlas-text, #0f172a)); } #options-account-tab .world-sub-nav .account-sub-tab-btn.active::after, From 04b8262e54380452e03336d52d260be4b19788f5 Mon Sep 17 00:00:00 2001 From: Arnold W Date: Tue, 1 Sep 2026 00:26:35 +0200 Subject: [PATCH 08/32] fix(ui): polish inspector config layout and function input styling --- src/ui/styles/_theme.css | 28 ++++- src/ui/styles/cheats.css | 57 ++++++---- src/ui/styles/config.css | 19 +++- src/ui/styles/function-input.css | 186 +++++++++++++++++-------------- src/ui/styles/number-input.css | 35 +++--- 5 files changed, 199 insertions(+), 126 deletions(-) diff --git a/src/ui/styles/_theme.css b/src/ui/styles/_theme.css index ee50128e..830fd4d3 100644 --- a/src/ui/styles/_theme.css +++ b/src/ui/styles/_theme.css @@ -228,7 +228,12 @@ body, .atlas-inspector-config .config-item, .atlas-inspector-config .config-item input[type="text"], .atlas-inspector-config .config-item input[type="number"], -.atlas-inspector-toggle { +.atlas-inspector-toggle, +.function-type-select, +.function-value-input-wrapper, +.function-number-input-wrapper, +.function-raw-input, +.number-input-wrapper { color: var(--atlas-text); background: var(--atlas-surface); } @@ -236,13 +241,16 @@ body, .atlas-cheat-toolbar, .atlas-cheat-table-head, .atlas-cheat-row:hover, -.atlas-inspector-config .cheat-category summary { +.atlas-inspector-config .cheat-category summary, +.function-preset-btn, +.number-input-btn { background: var(--atlas-surface-muted); } .atlas-scope-button:hover, .atlas-inspector-tabs button.is-active, -.atlas-cheat-run:disabled { +.atlas-cheat-run:disabled, +.function-preset-btn:hover { color: var(--atlas-text); background: var(--atlas-surface-hover); } @@ -256,6 +264,12 @@ body, background: var(--atlas-accent-soft); } +.function-preset-btn.active { + color: #ffffff; + background: var(--atlas-accent); + border-color: var(--atlas-accent); +} + .atlas-cheat-table, .atlas-cheat-toolbar, .atlas-cheat-table-head, @@ -275,7 +289,13 @@ body, .atlas-cheat-switch, .atlas-inspector-field input, .atlas-open-full-config, -.atlas-inspector-toggle { +.atlas-inspector-toggle, +.function-type-select, +.function-value-input-wrapper, +.function-number-input-wrapper, +.function-raw-input, +.function-preset-btn, +.number-input-wrapper { border-color: var(--atlas-border); } diff --git a/src/ui/styles/cheats.css b/src/ui/styles/cheats.css index ff6640d6..60389714 100644 --- a/src/ui/styles/cheats.css +++ b/src/ui/styles/cheats.css @@ -711,15 +711,22 @@ align-items: center; justify-content: space-between; width: 100%; - margin: 12px 0; - padding: 8px 10px; - border: 1px solid #d4dce9; + margin: 12px 0 8px; + padding: 8px 12px; + border: 1px solid var(--atlas-border, #d4dce9); border-radius: 6px; - color: #3e4d68; - background: #fff; + color: var(--atlas-accent, #3e4d68); + background: var(--atlas-surface, #fff); font-size: 0.75rem; + font-weight: 600; text-transform: none; letter-spacing: normal; + transition: all 0.15s; +} + +.atlas-open-full-config:hover { + border-color: var(--atlas-accent); + background: var(--atlas-accent-soft); } .atlas-open-full-config svg { @@ -729,26 +736,29 @@ .atlas-inspector-config .cheat-category, .atlas-inspector-config .config-item { - border-color: #dce3ef; - color: #172033; - background: #fff; + border-color: var(--atlas-border, #dce3ef); + color: var(--atlas-text, #172033); + background: var(--atlas-surface, #fff); + border-radius: 6px; } .atlas-inspector-config .cheat-category-content { - padding: 8px; - border-color: #dce3ef; + padding: 6px; + border-color: var(--atlas-border, #dce3ef); + gap: 6px; } .atlas-inspector-config .cheat-category summary { - padding: 8px 10px; - color: #41506c; - background: #f7f9fd; + padding: 6px 10px; + color: var(--atlas-text, #41506c); + background: var(--atlas-surface-muted, #f7f9fd); font-size: 0.75rem; + font-weight: 700; } .atlas-inspector-config .config-item { gap: 7px; - padding: 9px; + padding: 8px 10px; } .atlas-inspector-config .config-item-header { @@ -765,37 +775,42 @@ .atlas-inspector-config .config-item-header > label { grid-area: key; min-width: 0; + color: var(--atlas-text, #111c33); + font-size: 0.75rem; + font-weight: 750; + letter-spacing: 0.04em; } .atlas-inspector-config .config-description { grid-area: description; overflow: visible; padding: 0; - color: #63718a; + color: var(--atlas-text-muted, #63718a); font-size: 0.75rem; - line-height: 1.4; + line-height: 1.35; text-overflow: clip; white-space: normal; } .atlas-inspector-config .config-reset-btn { grid-area: reset; - padding: 3px 6px; + padding: 2px 5px; + border-radius: 4px; } .atlas-inspector-config .number-input-wrapper { - min-height: 32px; + min-height: 30px; } .atlas-inspector-config .number-input-btn { - height: 32px; + height: 30px; padding: 0 8px; } .atlas-inspector-config .config-item input[type="text"], .atlas-inspector-config .config-item input[type="number"] { - color: #172033; - background: #fff; + color: var(--atlas-text, #172033); + background: var(--atlas-field, #fff); } @media (max-width: 1280px) { diff --git a/src/ui/styles/config.css b/src/ui/styles/config.css index 2e789189..fcffd1ae 100644 --- a/src/ui/styles/config.css +++ b/src/ui/styles/config.css @@ -470,17 +470,34 @@ .atlas-config-actions.is-compact { align-items: stretch; flex-direction: column; + gap: 6px; } .atlas-config-actions.is-compact .atlas-config-dirty-state { display: grid; - grid-template-columns: 1fr; + grid-template-columns: 1fr 1fr; + gap: 6px; + width: 100%; } .atlas-config-actions.is-compact .atlas-config-status-chip { + min-inline-size: 0; + min-height: 26px; + padding: 2px 4px; + font-size: 0.72rem; + border-radius: 6px; justify-content: center; } +.atlas-config-actions.is-compact .btn-primary, +.atlas-config-actions.is-compact .btn-secondary { + width: 100%; + min-height: 32px; + font-size: 0.75rem; + font-weight: 700; + border-radius: 6px; +} + @media (max-width: 980px) { #config-tab .action-bar, .atlas-config-actions { diff --git a/src/ui/styles/function-input.css b/src/ui/styles/function-input.css index dfb513b5..e0266b43 100644 --- a/src/ui/styles/function-input.css +++ b/src/ui/styles/function-input.css @@ -11,43 +11,45 @@ gap: 8px; } -/* Main row: dropdown + value input on same line */ +/* Main row: dropdown + value input */ .function-input-row { display: flex; align-items: center; - gap: 12px; + gap: 8px; flex-wrap: wrap; + width: 100%; } .function-type-select { - width: auto; - min-width: 130px; + width: 100%; + min-width: 0; padding: 6px 10px; - font-size: 0.875rem; - background: var(--c-black-40); - border: 1px solid var(--c-border); - color: var(--c-text-main); + font-size: 0.8rem; + font-weight: 600; + background: var(--atlas-field, var(--c-panel)); + border: 1px solid var(--atlas-border, var(--c-border)); + border-radius: 6px; + color: var(--atlas-text, var(--c-text-main)); cursor: pointer; - flex-shrink: 0; + transition: border-color 0.15s, box-shadow 0.15s; } .function-type-select:hover { - border-color: var(--c-accent); + border-color: var(--atlas-accent, var(--c-accent)); } .function-type-select:focus { - border-color: var(--c-accent); + border-color: var(--atlas-accent, var(--c-accent)); outline: none; - box-shadow: 0 0 0 1px var(--c-accent-dim); + box-shadow: 0 0 0 2px var(--atlas-focus, var(--c-accent-dim)); } /* Slider Group: slider + editable number input */ .function-slider-group { display: flex; align-items: center; - gap: 10px; - flex: 1; - min-width: 200px; + gap: 8px; + width: 100%; } .function-slider { @@ -55,11 +57,11 @@ -webkit-appearance: none; appearance: none; height: 6px; - background: var(--c-border); + background: var(--atlas-border, var(--c-border)); border-radius: 3px; outline: none; cursor: pointer; - min-width: 100px; + min-width: 60px; } .function-slider::-webkit-slider-thumb { @@ -67,56 +69,56 @@ appearance: none; width: 16px; height: 16px; - background: var(--c-accent); + background: var(--atlas-accent, var(--c-accent)); + border: 2px solid var(--atlas-surface, #fff); border-radius: 50%; cursor: pointer; - box-shadow: 0 0 6px var(--c-accent-glow); - transition: - transform 0.15s, - box-shadow 0.15s; + box-shadow: 0 1px 4px var(--atlas-shadow, rgba(0, 0, 0, 0.2)); + transition: transform 0.15s, box-shadow 0.15s; } .function-slider::-webkit-slider-thumb:hover { transform: scale(1.15); - box-shadow: 0 0 10px var(--c-accent); + box-shadow: 0 0 8px var(--atlas-accent, var(--c-accent)); } .function-slider::-moz-range-thumb { width: 16px; height: 16px; - background: var(--c-accent); - border: none; + background: var(--atlas-accent, var(--c-accent)); + border: 2px solid var(--atlas-surface, #fff); border-radius: 50%; cursor: pointer; - box-shadow: 0 0 6px var(--c-accent-glow); + box-shadow: 0 1px 4px var(--atlas-shadow, rgba(0, 0, 0, 0.2)); } /* Editable value input next to slider */ .function-value-input-wrapper { display: flex; align-items: center; - gap: 4px; - background: var(--c-black-30); - border: 1px solid var(--c-border); - border-radius: var(--radius-sm); - padding: 0 8px 0 0; + gap: 2px; + background: var(--atlas-field, var(--c-panel)); + border: 1px solid var(--atlas-border, var(--c-border)); + border-radius: 6px; + padding: 0 6px 0 0; + flex-shrink: 0; } .function-value-input-wrapper:focus-within { - border-color: var(--c-accent); - box-shadow: 0 0 0 1px var(--c-accent-dim); + border-color: var(--atlas-accent, var(--c-accent)); + box-shadow: 0 0 0 2px var(--atlas-focus, var(--c-accent-dim)); } .function-value-input { - width: 60px; + width: 48px; border: none; background: transparent; - color: var(--c-accent); + color: var(--atlas-text, var(--c-text-main)); font-family: var(--font-mono); - font-size: 0.875rem; - font-weight: 600; - text-align: left; - padding: 6px 4px 6px 8px; + font-size: 0.85rem; + font-weight: 700; + text-align: right; + padding: 5px 4px 5px 6px; box-shadow: none !important; } @@ -126,74 +128,87 @@ } .function-value-suffix { - color: var(--c-accent); + color: var(--atlas-accent, var(--c-accent)); font-family: var(--font-mono); - font-size: 0.875rem; - font-weight: 600; + font-size: 0.85rem; + font-weight: 800; + user-select: none; } /* Preset Buttons */ .function-presets { - display: flex; - flex-wrap: wrap; - gap: 6px; - padding-left: 164px; + display: grid; + grid-template-columns: repeat(6, 1fr); + gap: 4px; + width: 100%; + padding-left: 0; } .function-preset-btn { - background: var(--c-black-30); - border: 1px solid var(--c-border); - color: var(--c-text-dim); - padding: 3px 8px; - font-size: 0.875rem; + display: inline-flex; + align-items: center; + justify-content: center; + width: 100%; + height: 26px; + padding: 0; + background: var(--atlas-surface-muted, var(--c-panel-dim)); + border: 1px solid var(--atlas-border, var(--c-border)); + border-radius: 5px; + color: var(--atlas-text-muted, var(--c-text-dim)); + font-size: 0.75rem; font-family: var(--font-mono); + font-weight: 600; cursor: pointer; transition: all 0.15s; } .function-preset-btn:hover { - border-color: var(--c-accent); - color: var(--c-accent); - background: var(--c-accent-dim); + border-color: var(--atlas-accent, var(--c-accent)); + color: var(--atlas-text, var(--c-text-main)); + background: var(--atlas-surface-hover, var(--c-panel-hover)); } .function-preset-btn.active { - background: var(--c-accent); - color: var(--c-black); - border-color: var(--c-accent); - font-weight: 600; + background: var(--atlas-accent, var(--c-accent)); + color: #ffffff !important; + border-color: var(--atlas-accent, var(--c-accent)); + font-weight: 700; + box-shadow: 0 1px 3px var(--atlas-shadow, rgba(0, 0, 0, 0.15)); } /* Passthrough Label */ .function-passthrough-label { - font-size: 0.875rem; - color: var(--c-text-muted); + font-size: 0.8rem; + color: var(--atlas-text-muted, var(--c-text-muted)); font-style: italic; + padding: 4px 0; } /* Number Input Wrapper with inline +/- buttons for Fixed/Max/Min */ .function-number-input-wrapper { display: flex; align-items: center; - background: var(--c-black-30); - border: 1px solid var(--c-border); - border-radius: var(--radius-sm); - flex: 1; - min-width: 100px; - max-width: 160px; + background: var(--atlas-field, var(--c-panel)); + border: 1px solid var(--atlas-border, var(--c-border)); + border-radius: 6px; + width: 100%; + max-width: 180px; + overflow: hidden; } .function-number-input-wrapper:focus-within { - border-color: var(--c-accent); - box-shadow: 0 0 0 1px var(--c-accent-dim); + border-color: var(--atlas-accent, var(--c-accent)); + box-shadow: 0 0 0 2px var(--atlas-focus, var(--c-accent-dim)); } .function-number-btn { background: transparent; border: none; - color: var(--c-accent); + color: var(--atlas-accent, var(--c-accent)); font-size: 1rem; - padding: 6px 10px; + font-weight: 700; + padding: 4px 10px; + height: 30px; cursor: pointer; transition: 0.15s; display: flex; @@ -203,23 +218,24 @@ } .function-number-btn:hover { - background: var(--c-accent-dim); - color: var(--c-white); + background: var(--atlas-accent-soft, var(--c-accent-dim)); + color: var(--atlas-accent, var(--c-accent)); } .function-number-btn:active { - background: var(--c-accent-20); + background: var(--atlas-accent-soft, var(--c-accent-20)); } .function-number-input { flex: 1; border: none; background: transparent; - color: var(--c-text-main); + color: var(--atlas-text, var(--c-text-main)); font-family: var(--font-mono); - font-size: 0.875rem; + font-size: 0.85rem; + font-weight: 600; text-align: center; - padding: 6px 0; + padding: 4px 0; min-width: 40px; box-shadow: none !important; } @@ -231,19 +247,19 @@ /* Raw Function Text Input (single line) */ .function-raw-input { - flex: 1; - min-width: 150px; - background: var(--c-black-30); - border: 1px solid var(--c-border); - color: var(--c-text-main); + width: 100%; + min-width: 0; + background: var(--atlas-field, var(--c-panel)); + border: 1px solid var(--atlas-border, var(--c-border)); + color: var(--atlas-text, var(--c-text-main)); font-family: var(--font-mono); - font-size: 0.875rem; + font-size: 0.8rem; padding: 6px 10px; - border-radius: var(--radius-sm); + border-radius: 6px; } .function-raw-input:focus { - border-color: var(--c-accent); + border-color: var(--atlas-accent, var(--c-accent)); outline: none; - box-shadow: 0 0 0 1px var(--c-accent-dim); + box-shadow: 0 0 0 2px var(--atlas-focus, var(--c-accent-dim)); } diff --git a/src/ui/styles/number-input.css b/src/ui/styles/number-input.css index 43e2e20b..47cef991 100644 --- a/src/ui/styles/number-input.css +++ b/src/ui/styles/number-input.css @@ -24,20 +24,22 @@ input[type="number"] { width: 100%; min-width: 0; position: relative; - border: 1px solid var(--c-border); - border-radius: var(--radius-sm); + border: 1px solid var(--atlas-border, var(--c-border)); + border-radius: 6px; overflow: hidden; - background: var(--c-panel-dim); + background: var(--atlas-field, var(--c-panel-dim)); + transition: border-color 0.15s, box-shadow 0.15s; } .number-input-wrapper:focus-within { - border-color: var(--c-accent); - box-shadow: 0 0 0 1px var(--c-accent-dim); + border-color: var(--atlas-accent, var(--c-accent)); + box-shadow: 0 0 0 2px var(--atlas-focus, var(--c-accent-dim)); } .number-input-wrapper input { border: none; - /* background: transparent; */ + background: transparent; + color: var(--atlas-text, var(--c-text-main)); text-align: center; box-shadow: none !important; border-radius: 0; @@ -45,29 +47,32 @@ input[type="number"] { width: 0; min-width: 3ch; padding: 0 4px; + font-family: var(--font-mono); + font-size: 0.85rem; + font-weight: 600; } .number-input-btn { - background: var(--c-panel-dim); - color: var(--c-accent); + background: var(--atlas-surface-muted, var(--c-panel-dim)); + color: var(--atlas-accent, var(--c-accent)); border: none; cursor: pointer; - font-size: 1.2rem; + font-size: 1.1rem; + font-weight: 700; padding: 0 10px; - height: 34px; - /* Approximate height of input */ + height: 32px; display: flex; align-items: center; justify-content: center; - transition: 0.2s; + transition: 0.15s; user-select: none; } .number-input-btn:hover { - background: var(--c-accent-dim); - color: var(--c-white); + background: var(--atlas-accent-soft, var(--c-accent-dim)); + color: var(--atlas-accent, var(--c-white)); } .number-input-btn:active { - background: var(--c-accent-20); + background: var(--atlas-accent-soft, var(--c-accent-20)); } From 96d32f5d518ef4653611eed6d95211c1d51f83ee Mon Sep 17 00:00:00 2001 From: Arnold W Date: Tue, 1 Sep 2026 16:11:49 +0200 Subject: [PATCH 09/32] feat(ui): implement full dark mode as default theme across the UI --- src/ui/components/views/Config.js | 4 +- src/ui/entry/index.html | 2 +- src/ui/state/theme.js | 2 +- src/ui/styles/_account-pages.css | 36 +++--- src/ui/styles/_activity-drawer.css | 27 +++-- src/ui/styles/_atlas-shell.css | 10 +- src/ui/styles/_theme.css | 171 +++++++++++++++++----------- src/ui/styles/cheats.css | 175 +++++++++++++++-------------- src/ui/styles/devtools.css | 28 ++--- src/ui/styles/tabs/w3/_cogs.css | 18 +-- tests/atlas-ui-compat.mjs | 10 +- 11 files changed, 263 insertions(+), 220 deletions(-) diff --git a/src/ui/components/views/Config.js b/src/ui/components/views/Config.js index 1f1aceae..3c57bfd1 100644 --- a/src/ui/components/views/Config.js +++ b/src/ui/components/views/Config.js @@ -259,9 +259,9 @@ export const Config = () => { onchange: (event) => store.setTheme(event.target.value), "aria-label": "Interface theme", }, - option({ value: "system", selected: () => store.app.theme === "system" }, "System"), + option({ value: "dark", selected: () => store.app.theme === "dark" }, "Dark"), option({ value: "light", selected: () => store.app.theme === "light" }, "Light"), - option({ value: "dark", selected: () => store.app.theme === "dark" }, "Dark") + option({ value: "system", selected: () => store.app.theme === "system" }, "System") ) ), div({ class: "warning-banner mb-20" }, "⚠ RESTART REQUIRED FOR CHANGES TO APPLY"), diff --git a/src/ui/entry/index.html b/src/ui/entry/index.html index c600ff50..fda94463 100644 --- a/src/ui/entry/index.html +++ b/src/ui/entry/index.html @@ -8,7 +8,7 @@ const savedTheme = localStorage.getItem("uiTheme"); document.documentElement.dataset.theme = ["system", "light", "dark"].includes(savedTheme) ? savedTheme - : "light"; + : "dark"; diff --git a/src/ui/state/theme.js b/src/ui/state/theme.js index 36873b5a..798f8300 100644 --- a/src/ui/state/theme.js +++ b/src/ui/state/theme.js @@ -1,7 +1,7 @@ export const THEME_STORAGE_KEY = "uiTheme"; export const THEMES = ["system", "light", "dark"]; -export const normalizeTheme = (theme) => (THEMES.includes(theme) ? theme : "light"); +export const normalizeTheme = (theme) => (THEMES.includes(theme) ? theme : "dark"); export const loadThemePreference = (storage = localStorage) => normalizeTheme(storage.getItem(THEME_STORAGE_KEY)); diff --git a/src/ui/styles/_account-pages.css b/src/ui/styles/_account-pages.css index 93cf1fab..644e9ac5 100644 --- a/src/ui/styles/_account-pages.css +++ b/src/ui/styles/_account-pages.css @@ -24,18 +24,18 @@ #options-account-tab .account-header { min-height: 52px; padding: 9px 14px; - border-bottom-color: #e2e8f0; - background: #ffffff; + border-bottom: 1px solid var(--atlas-border, var(--c-border)); + background: var(--atlas-surface, var(--c-panel)); } #options-account-tab .account-tab-header__title { - color: #0f172a; + color: var(--atlas-text, var(--c-text-main)); font-size: 0.8125rem; letter-spacing: 0.025em; } #options-account-tab .account-tab-header__desc { - color: #64748b; + color: var(--atlas-text-muted, var(--c-text-dim)); font-size: 0.75rem; } @@ -47,27 +47,27 @@ #options-account-tab .account-section { gap: 7px; padding: 10px; - border-color: #e2e8f0; + border: 1px solid var(--atlas-border, var(--c-border)); border-radius: 8px; - background: #ffffff; + background: var(--atlas-surface, var(--c-panel)); } #options-account-tab .account-section__header { - border-bottom-color: #e2e8f0; + border-bottom-color: var(--atlas-border, var(--c-border)); } #options-account-tab .account-section__title { - color: #4f46e5; + color: var(--atlas-accent, var(--c-accent)); font-size: 0.75rem; letter-spacing: 0.08em; } #options-account-tab .account-row, #options-account-tab .feature-card { - border-color: #e2e8f0; + border: 1px solid var(--atlas-border, var(--c-border)); border-radius: 7px; - background: #ffffff; - box-shadow: 0 1px 1px rgba(15, 23, 42, 0.02); + background: var(--atlas-surface, var(--c-panel)); + box-shadow: 0 1px 2px var(--atlas-shadow, rgba(0, 0, 0, 0.05)); } #options-account-tab .account-row { @@ -82,21 +82,21 @@ #options-account-tab .account-row:hover, #options-account-tab .feature-card:hover { - border-color: #c7d2fe; - background: #fafbff; + border-color: var(--atlas-border-strong, var(--c-border-strong)); + background: var(--atlas-surface-hover, var(--c-panel-hover)); } #options-account-tab .account-row__index { border-radius: 4px; - background: #f1f5f9; - color: #64748b; + background: var(--atlas-surface-muted, var(--c-panel-hover)); + color: var(--atlas-text-muted, var(--c-text-dim)); } #options-account-tab .account-row__badge { - border-color: #c7d2fe; + border: 1px solid var(--atlas-border-strong, var(--c-border-strong)); border-radius: 999px; - background: #eef2ff; - color: #4f46e5; + background: var(--atlas-accent-soft, var(--c-accent-dim-solid)); + color: var(--atlas-accent, var(--c-accent)); } @media (max-width: 760px) { diff --git a/src/ui/styles/_activity-drawer.css b/src/ui/styles/_activity-drawer.css index 008c3723..ad592664 100644 --- a/src/ui/styles/_activity-drawer.css +++ b/src/ui/styles/_activity-drawer.css @@ -7,9 +7,9 @@ min-height: 0; overflow: hidden; visibility: hidden; - color: #dfe4f2; - background: #090d1d; - border-top: 0 solid #273049; + color: var(--atlas-text); + background: var(--atlas-surface); + border-top: 0 solid var(--atlas-border); transition: flex-basis 0.2s ease, border-width 0.2s ease; @@ -26,8 +26,8 @@ align-items: center; height: 38px; padding: 0 8px; - background: #ffffff; - border-bottom: 1px solid #dce2ec; + background: var(--atlas-surface); + border-bottom: 1px solid var(--atlas-border); } .atlas-drawer-tab, @@ -36,7 +36,7 @@ align-items: center; justify-content: center; height: 32px; - color: #65738b; + color: var(--atlas-text-muted); background: transparent; border: 0; border-radius: 6px; @@ -50,9 +50,14 @@ padding: 0 10px; } +.atlas-drawer-tab:hover { + color: var(--atlas-text); + background: var(--atlas-surface-hover); +} + .atlas-drawer-tab.is-active { - color: #ffffff; - background: #10162a; + color: var(--atlas-accent); + background: var(--atlas-accent-soft); } .atlas-drawer-tab svg, @@ -63,7 +68,7 @@ .atlas-drawer-summary { margin-left: auto; - color: #8a96ab; + color: var(--atlas-text-soft); font-family: var(--font-mono); font-size: 12px; } @@ -74,8 +79,8 @@ } .atlas-drawer-close:hover { - color: #14213d; - background: #f0f3f8; + color: var(--atlas-text); + background: var(--atlas-surface-hover); } .atlas-drawer-content { diff --git a/src/ui/styles/_atlas-shell.css b/src/ui/styles/_atlas-shell.css index 9364d621..0a285dc5 100644 --- a/src/ui/styles/_atlas-shell.css +++ b/src/ui/styles/_atlas-shell.css @@ -315,7 +315,7 @@ body { min-height: 34px; padding: 7px 8px; overflow: hidden; - color: #52617a; + color: var(--atlas-text-muted, #52617a); background: transparent; border: 1px solid transparent; border-radius: 7px; @@ -330,14 +330,14 @@ body { .atlas-nav-button:hover { color: var(--atlas-text); - background: var(--atlas-surface-muted); - border-color: #edf0f5; + background: var(--atlas-surface-hover); + border-color: var(--atlas-border); } .atlas-nav-button.active { - color: #494bc7; + color: var(--atlas-accent); background: var(--atlas-accent-soft); - border-color: #dddefd; + border-color: var(--atlas-border-strong); box-shadow: inset 2px 0 0 var(--atlas-accent); } diff --git a/src/ui/styles/_theme.css b/src/ui/styles/_theme.css index 830fd4d3..fe86bd2a 100644 --- a/src/ui/styles/_theme.css +++ b/src/ui/styles/_theme.css @@ -3,45 +3,45 @@ */ :root { - color-scheme: light; + color-scheme: dark; --atlas-header-height: 48px; --atlas-sidebar-width: 220px; --atlas-sidebar-collapsed-width: 64px; --atlas-header: #090b14; --atlas-header-border: #1d2230; - --atlas-canvas: #f4f6fa; - --atlas-surface: #ffffff; - --atlas-surface-raised: #ffffff; - --atlas-surface-muted: #f8f9fc; - --atlas-surface-hover: #f0f3fa; - --atlas-field: #ffffff; - --atlas-border: #dce2ec; - --atlas-border-strong: #c7d0df; - --atlas-text: #14213d; - --atlas-text-muted: #66748d; - --atlas-text-soft: #8a96ab; - --atlas-accent: #5b5ce2; - --atlas-accent-hover: #4b4dcc; - --atlas-accent-soft: #ececff; - --atlas-focus: #7779f4; - --atlas-success: #0aa575; - --atlas-success-soft: rgba(10, 165, 117, 0.1); - --atlas-danger: #d9435f; - --atlas-danger-soft: rgba(217, 67, 95, 0.1); - --atlas-warning: #d58a08; - --atlas-warning-soft: rgba(213, 138, 8, 0.1); - --atlas-overlay-02: rgba(20, 33, 61, 0.02); - --atlas-overlay-03: rgba(20, 33, 61, 0.03); - --atlas-overlay-04: rgba(20, 33, 61, 0.04); - --atlas-overlay-05: rgba(20, 33, 61, 0.05); - --atlas-overlay-10: rgba(20, 33, 61, 0.1); - --atlas-shadow: rgba(20, 33, 61, 0.12); - --atlas-scrollbar: #b8c2d1; - --atlas-control-bg: #111a30; - --atlas-control-hover: #293552; + --atlas-canvas: #10121a; + --atlas-surface: #171b25; + --atlas-surface-raised: #1c2130; + --atlas-surface-muted: #1a1f2c; + --atlas-surface-hover: #242b3b; + --atlas-field: #111620; + --atlas-border: #30384a; + --atlas-border-strong: #46516a; + --atlas-text: #eceff8; + --atlas-text-muted: #bec3d1; + --atlas-text-soft: #8f99ae; + --atlas-accent: #8b8df5; + --atlas-accent-hover: #a7a8ff; + --atlas-accent-soft: #292b50; + --atlas-focus: #a7a8ff; + --atlas-success: #59d99a; + --atlas-success-soft: rgba(89, 217, 154, 0.12); + --atlas-danger: #ff7189; + --atlas-danger-soft: rgba(255, 113, 137, 0.12); + --atlas-warning: #f3b84b; + --atlas-warning-soft: rgba(243, 184, 75, 0.12); + --atlas-overlay-02: rgba(255, 255, 255, 0.02); + --atlas-overlay-03: rgba(255, 255, 255, 0.03); + --atlas-overlay-04: rgba(255, 255, 255, 0.04); + --atlas-overlay-05: rgba(255, 255, 255, 0.05); + --atlas-overlay-10: rgba(255, 255, 255, 0.1); + --atlas-shadow: rgba(0, 0, 0, 0.34); + --atlas-scrollbar: #46516a; + --atlas-control-bg: #7779f4; + --atlas-control-hover: #8b8df5; --atlas-control-text: #ffffff; - --atlas-disabled-bg: #e8ecf2; - --atlas-disabled-text: #7f8ca4; + --atlas-disabled-bg: #252b38; + --atlas-disabled-text: #7f8aa3; } :root[data-theme="dark"] { @@ -81,42 +81,79 @@ --atlas-disabled-text: #7f8aa3; } -@media (prefers-color-scheme: dark) { +:root[data-theme="light"] { + color-scheme: light; + --atlas-canvas: #f4f6fa; + --atlas-surface: #ffffff; + --atlas-surface-raised: #ffffff; + --atlas-surface-muted: #f8f9fc; + --atlas-surface-hover: #f0f3fa; + --atlas-field: #ffffff; + --atlas-border: #dce2ec; + --atlas-border-strong: #c7d0df; + --atlas-text: #14213d; + --atlas-text-muted: #66748d; + --atlas-text-soft: #8a96ab; + --atlas-accent: #5b5ce2; + --atlas-accent-hover: #4b4dcc; + --atlas-accent-soft: #ececff; + --atlas-focus: #7779f4; + --atlas-success: #0aa575; + --atlas-success-soft: rgba(10, 165, 117, 0.1); + --atlas-danger: #d9435f; + --atlas-danger-soft: rgba(217, 67, 95, 0.1); + --atlas-warning: #d58a08; + --atlas-warning-soft: rgba(213, 138, 8, 0.1); + --atlas-overlay-02: rgba(20, 33, 61, 0.02); + --atlas-overlay-03: rgba(20, 33, 61, 0.03); + --atlas-overlay-04: rgba(20, 33, 61, 0.04); + --atlas-overlay-05: rgba(20, 33, 61, 0.05); + --atlas-overlay-10: rgba(20, 33, 61, 0.1); + --atlas-shadow: rgba(20, 33, 61, 0.12); + --atlas-scrollbar: #b8c2d1; + --atlas-control-bg: #111a30; + --atlas-control-hover: #293552; + --atlas-control-text: #ffffff; + --atlas-disabled-bg: #e8ecf2; + --atlas-disabled-text: #7f8ca4; +} + +@media (prefers-color-scheme: light) { :root[data-theme="system"] { - color-scheme: dark; - --atlas-canvas: #10121a; - --atlas-surface: #171b25; - --atlas-surface-raised: #1c2130; - --atlas-surface-muted: #1a1f2c; - --atlas-surface-hover: #242b3b; - --atlas-field: #111620; - --atlas-border: #30384a; - --atlas-border-strong: #46516a; - --atlas-text: #eceff8; - --atlas-text-muted: #bec3d1; - --atlas-text-soft: #8f99ae; - --atlas-accent: #8b8df5; - --atlas-accent-hover: #a7a8ff; - --atlas-accent-soft: #292b50; - --atlas-focus: #a7a8ff; - --atlas-success: #59d99a; - --atlas-success-soft: rgba(89, 217, 154, 0.12); - --atlas-danger: #ff7189; - --atlas-danger-soft: rgba(255, 113, 137, 0.12); - --atlas-warning: #f3b84b; - --atlas-warning-soft: rgba(243, 184, 75, 0.12); - --atlas-overlay-02: rgba(255, 255, 255, 0.02); - --atlas-overlay-03: rgba(255, 255, 255, 0.03); - --atlas-overlay-04: rgba(255, 255, 255, 0.04); - --atlas-overlay-05: rgba(255, 255, 255, 0.05); - --atlas-overlay-10: rgba(255, 255, 255, 0.1); - --atlas-shadow: rgba(0, 0, 0, 0.34); - --atlas-scrollbar: #46516a; - --atlas-control-bg: #7779f4; - --atlas-control-hover: #8b8df5; + color-scheme: light; + --atlas-canvas: #f4f6fa; + --atlas-surface: #ffffff; + --atlas-surface-raised: #ffffff; + --atlas-surface-muted: #f8f9fc; + --atlas-surface-hover: #f0f3fa; + --atlas-field: #ffffff; + --atlas-border: #dce2ec; + --atlas-border-strong: #c7d0df; + --atlas-text: #14213d; + --atlas-text-muted: #66748d; + --atlas-text-soft: #8a96ab; + --atlas-accent: #5b5ce2; + --atlas-accent-hover: #4b4dcc; + --atlas-accent-soft: #ececff; + --atlas-focus: #7779f4; + --atlas-success: #0aa575; + --atlas-success-soft: rgba(10, 165, 117, 0.1); + --atlas-danger: #d9435f; + --atlas-danger-soft: rgba(217, 67, 95, 0.1); + --atlas-warning: #d58a08; + --atlas-warning-soft: rgba(213, 138, 8, 0.1); + --atlas-overlay-02: rgba(20, 33, 61, 0.02); + --atlas-overlay-03: rgba(20, 33, 61, 0.03); + --atlas-overlay-04: rgba(20, 33, 61, 0.04); + --atlas-overlay-05: rgba(20, 33, 61, 0.05); + --atlas-overlay-10: rgba(20, 33, 61, 0.1); + --atlas-shadow: rgba(20, 33, 61, 0.12); + --atlas-scrollbar: #b8c2d1; + --atlas-control-bg: #111a30; + --atlas-control-hover: #293552; --atlas-control-text: #ffffff; - --atlas-disabled-bg: #252b38; - --atlas-disabled-text: #7f8aa3; + --atlas-disabled-bg: #e8ecf2; + --atlas-disabled-text: #7f8ca4; } } diff --git a/src/ui/styles/cheats.css b/src/ui/styles/cheats.css index 60389714..14cc70e4 100644 --- a/src/ui/styles/cheats.css +++ b/src/ui/styles/cheats.css @@ -56,8 +56,8 @@ #cheats-tab.atlas-cheats-pane { padding: 0; min-width: 0; - color: #172033; - background: #f7f9fd; + color: var(--atlas-text); + background: var(--atlas-canvas); } #cheats-tab.atlas-cheats-pane.active { @@ -72,14 +72,14 @@ height: 100%; min-width: 0; overflow: hidden; - background: #f7f9fd; + background: var(--atlas-canvas); } .atlas-cheat-table, .atlas-cheat-inspector { min-width: 0; min-height: 0; - background: #fff; + background: var(--atlas-surface); } .atlas-cheat-context { @@ -92,7 +92,7 @@ .atlas-tree-heading { margin: 0 8px 6px; - color: #8795b1; + color: var(--atlas-text-soft); font-size: 0.75rem; font-weight: 750; letter-spacing: 0.08em; @@ -118,7 +118,7 @@ padding: 6px 9px; border: 0; border-radius: 7px; - color: #42506a; + color: var(--atlas-text-muted); background: transparent; text-align: left; font-size: 0.78rem; @@ -127,13 +127,13 @@ } .atlas-scope-button:hover { - color: #172033; - background: #f1f4fa; + color: var(--atlas-text); + background: var(--atlas-surface-hover); } .atlas-scope-button.is-active { - color: #4f46e5; - background: #eef0ff; + color: var(--atlas-accent); + background: var(--atlas-accent-soft); font-weight: 700; } @@ -154,7 +154,7 @@ } .atlas-scope-count { - color: #94a0b7; + color: var(--atlas-text-soft); font-family: var(--font-mono); font-size: 0.75rem; } @@ -186,12 +186,12 @@ .atlas-cheat-table { display: grid; grid-template-rows: auto auto minmax(0, 1fr); - border-right: 1px solid #dce3ef; + border-right: 1px solid var(--atlas-border); outline: none; } .atlas-cheat-table:focus-visible { - box-shadow: inset 0 0 0 2px #6366f1; + box-shadow: inset 0 0 0 2px var(--atlas-focus); } .atlas-cheat-toolbar { @@ -199,8 +199,8 @@ align-items: center; gap: 10px; padding: 8px 12px; - border-bottom: 1px solid #dce3ef; - background: #fbfcff; + border-bottom: 1px solid var(--atlas-border); + background: var(--atlas-surface-muted); } .atlas-cheat-search { @@ -211,15 +211,15 @@ min-width: 160px; height: 34px; padding: 0 10px; - border: 1px solid #d6deeb; + border: 1px solid var(--atlas-border); border-radius: 7px; - color: #8492ad; - background: #fff; + color: var(--atlas-text-muted); + background: var(--atlas-field); } .atlas-cheat-search:focus-within { - border-color: #7778ed; - box-shadow: 0 0 0 3px rgb(99 102 241 / 10%); + border-color: var(--atlas-accent); + box-shadow: 0 0 0 2px var(--atlas-focus); } .atlas-cheat-search svg { @@ -236,7 +236,7 @@ padding: 0; border: 0; outline: 0; - color: #22304a; + color: var(--atlas-text); background: transparent; font-size: 0.78rem; } @@ -254,13 +254,13 @@ } .atlas-cheat-search input::placeholder { - color: #91a0bc; + color: var(--atlas-text-soft); } .atlas-row-count, .atlas-table-hint { flex: none; - color: #8290ad; + color: var(--atlas-text-soft); font-family: var(--font-mono); font-size: 0.75rem; } @@ -270,7 +270,7 @@ flex: none; align-items: center; gap: 5px; - color: #8290ad; + color: var(--atlas-text-soft); font-family: var(--font-mono); font-size: 0.75rem; } @@ -282,15 +282,16 @@ width: 32px; height: 32px; padding: 0; - border: 1px solid #d4dce9; + border: 1px solid var(--atlas-border); border-radius: 6px; - color: #52617b; - background: #fff; + color: var(--atlas-text-muted); + background: var(--atlas-surface); } .atlas-cheat-pagination button:not(:disabled):hover { - border-color: #7475e9; - color: #4f46e5; + border-color: var(--atlas-accent); + color: var(--atlas-accent); + background: var(--atlas-accent-soft); } .atlas-cheat-pagination button:disabled { @@ -304,7 +305,7 @@ .atlas-table-hint { padding-left: 10px; - border-left: 1px solid #dce3ef; + border-left: 1px solid var(--atlas-border); } .atlas-inspector-toggle, @@ -323,9 +324,9 @@ .atlas-cheat-table-head { min-height: 32px; padding: 0 12px; - border-bottom: 1px solid #dce3ef; - color: #8a98b3; - background: #f7f9fd; + border-bottom: 1px solid var(--atlas-border); + color: var(--atlas-text-soft); + background: var(--atlas-surface-muted); font-size: 0.75rem; font-weight: 700; letter-spacing: 0.05em; @@ -346,7 +347,7 @@ .atlas-cheat-table-body { min-height: 0; overflow-y: auto; - scrollbar-color: #c6cfde transparent; + scrollbar-color: var(--atlas-scrollbar) transparent; } .atlas-cheat-row-list { @@ -357,27 +358,27 @@ position: relative; min-height: 52px; padding: 0 12px; - border-bottom: 1px solid #e8edf5; + border-bottom: 1px solid var(--atlas-border); cursor: default; font-size: 0.8125rem; transition: background 100ms ease; } .atlas-cheat-row:hover { - background: #f7f9fd; + background: var(--atlas-surface-hover); } .atlas-cheat-row.is-selected { - background: #eef0ff; - box-shadow: inset 3px 0 #6366f1; + background: var(--atlas-accent-soft); + box-shadow: inset 3px 0 var(--atlas-accent); } .atlas-cheat-row.feedback-success { - box-shadow: inset 3px 0 #20b77b; + box-shadow: inset 3px 0 var(--atlas-success); } .atlas-cheat-row.feedback-error { - box-shadow: inset 3px 0 #e65468; + box-shadow: inset 3px 0 var(--atlas-danger); } .atlas-cheat-command-cell, @@ -390,7 +391,7 @@ .atlas-cheat-glyph { display: inline-flex; flex: none; - color: #f47d45; + color: var(--atlas-warning, #f47d45); } .atlas-cheat-glyph svg { @@ -413,17 +414,17 @@ } .atlas-cheat-command { - color: #142039; + color: var(--atlas-text); font-weight: 650; } .atlas-cheat-saved-value { - color: #7c8ba8; + color: var(--atlas-text-muted); font-size: 0.75rem; } .atlas-cheat-description { - color: #53617b; + color: var(--atlas-text-muted); display: -webkit-box; overflow: hidden; line-height: 1.35; @@ -433,7 +434,7 @@ } .atlas-cheat-category { - color: #64738e; + color: var(--atlas-text-soft); text-transform: capitalize; } @@ -447,14 +448,14 @@ height: 32px; padding: 0; border: 0; - color: #a0abc0; + color: var(--atlas-text-soft); background: transparent; } .atlas-cheat-config-link:hover, .atlas-cheat-favorite:hover { - color: #5d61df; - background: #e7e9ff; + color: var(--atlas-accent); + background: var(--atlas-accent-soft); } .atlas-cheat-config-link svg, @@ -464,7 +465,7 @@ } .atlas-cheat-favorite.is-favorite { - color: #f4a40f; + color: var(--atlas-warning, #f4a40f); } .atlas-cheat-state-cell { @@ -475,24 +476,24 @@ min-width: 54px; min-height: 32px; padding: 4px 9px; - border: 1px solid #d6deeb; + border: 1px solid var(--atlas-border); border-radius: 6px; - color: #25324c; - background: #fff; + color: var(--atlas-text); + background: var(--atlas-surface); font-size: 0.75rem; text-transform: none; letter-spacing: normal; } .atlas-cheat-run:hover:not(:disabled) { - border-color: #7475e9; - color: #5153d5; - background: #f3f3ff; + border-color: var(--atlas-accent); + color: var(--atlas-accent); + background: var(--atlas-accent-soft); } .atlas-cheat-run:disabled { - color: #9aa6ba; - background: #f2f4f8; + color: var(--atlas-disabled-text); + background: var(--atlas-disabled-bg); } .atlas-cheat-switch { @@ -500,9 +501,9 @@ width: 35px; height: 20px; padding: 2px; - border: 1px solid #d5dce8; + border: 1px solid var(--atlas-border); border-radius: 12px; - background: #edf0f5; + background: var(--atlas-surface-hover); } .atlas-cheat-switch-thumb { @@ -510,14 +511,14 @@ width: 14px; height: 14px; border-radius: 50%; - background: #fff; - box-shadow: 0 1px 3px rgb(30 41 59 / 25%); + background: var(--atlas-surface-raised); + box-shadow: 0 1px 3px var(--atlas-shadow); transition: transform 130ms ease; } .atlas-cheat-switch.is-on { - border-color: #6668e8; - background: #6869ed; + border-color: var(--atlas-accent); + background: var(--atlas-accent); } .atlas-cheat-switch.is-on .atlas-cheat-switch-thumb { @@ -539,7 +540,7 @@ align-items: center; gap: 11px; padding: 16px 14px; - border-bottom: 1px solid #dce3ef; + border-bottom: 1px solid var(--atlas-border); } .atlas-inspector-header-actions { @@ -556,8 +557,8 @@ width: 40px; height: 40px; border-radius: 11px; - color: #f26e36; - background: #e8f6fb; + color: var(--atlas-accent); + background: var(--atlas-surface-muted); } .atlas-inspector-icon svg { @@ -574,7 +575,7 @@ .atlas-inspector-title > span { overflow: hidden; - color: #111c33; + color: var(--atlas-text); font-size: 0.88rem; font-weight: 750; text-overflow: ellipsis; @@ -583,7 +584,7 @@ .atlas-inspector-title code { overflow: hidden; - color: #667590; + color: var(--atlas-text-soft); font-size: 0.75rem; text-overflow: ellipsis; white-space: nowrap; @@ -593,14 +594,14 @@ display: flex; gap: 4px; padding: 8px 12px; - border-bottom: 1px solid #dce3ef; + border-bottom: 1px solid var(--atlas-border); } .atlas-inspector-tabs button { padding: 6px 10px; border: 0; border-radius: 6px; - color: #5c6a84; + color: var(--atlas-text-muted); background: transparent; font-size: 0.75rem; text-transform: none; @@ -608,8 +609,8 @@ } .atlas-inspector-tabs button.is-active { - color: #172033; - background: #eef1f6; + color: var(--atlas-text); + background: var(--atlas-surface-hover); font-weight: 700; } @@ -623,7 +624,7 @@ .atlas-inspector-description { margin-bottom: 14px; - color: #41506c; + color: var(--atlas-text-muted); font-size: 0.76rem; line-height: 1.55; } @@ -633,7 +634,7 @@ flex-direction: column; gap: 6px; margin-bottom: 10px; - color: #61708c; + color: var(--atlas-text-muted); font-size: 0.75rem; font-weight: 650; } @@ -641,10 +642,10 @@ .atlas-inspector-field input { width: 100%; height: 34px; - border: 1px solid #d4dce9; + border: 1px solid var(--atlas-border); border-radius: 6px; - color: #172033; - background: #fff; + color: var(--atlas-text); + background: var(--atlas-field); } .atlas-inspector-run { @@ -653,23 +654,23 @@ margin-bottom: 14px; border: 0; border-radius: 7px; - color: #fff; - background: #111a30; + color: var(--atlas-control-text); + background: var(--atlas-control-bg); text-transform: none; letter-spacing: normal; } .atlas-inspector-run:hover:not(:disabled) { - background: #293552; + background: var(--atlas-control-hover); } .atlas-inspector-run:disabled { - color: #7f8ca4; - background: #e8ecf2; + color: var(--atlas-disabled-text); + background: var(--atlas-disabled-bg); } .atlas-inspector-facts { - border-top: 1px solid #e3e8f0; + border-top: 1px solid var(--atlas-border); } .atlas-inspector-facts > div { @@ -678,13 +679,13 @@ gap: 10px; min-height: 38px; padding: 9px 0; - border-bottom: 1px solid #e9edf4; - color: #15203a; + border-bottom: 1px solid var(--atlas-border); + color: var(--atlas-text); font-size: 0.75rem; } .atlas-inspector-facts > div > :first-child { - color: #6f7d97; + color: var(--atlas-text-muted); } .atlas-inspector-facts > div > :last-child { @@ -694,7 +695,7 @@ .atlas-linked-config-path { margin-bottom: 10px; - color: #7a88a4; + color: var(--atlas-text-muted); font-family: var(--font-mono); font-size: 0.75rem; overflow-wrap: anywhere; diff --git a/src/ui/styles/devtools.css b/src/ui/styles/devtools.css index 3ec445f6..ab6d98cb 100644 --- a/src/ui/styles/devtools.css +++ b/src/ui/styles/devtools.css @@ -5,7 +5,7 @@ .devtools-popout-title { margin-bottom: 8px; - color: #0f172a; + color: var(--atlas-text); font-size: 1.125rem; font-weight: 700; letter-spacing: -0.02em; @@ -13,7 +13,7 @@ #devtools-tab.devtools-workspace { padding: 0; - background: #ffffff; + background: var(--atlas-canvas); } #devtools-tab.devtools-workspace .terminal-wrapper { @@ -23,25 +23,25 @@ min-width: 0; min-height: 0; overflow: hidden; - background: #ffffff; + background: var(--atlas-canvas); } .devtools-workspace #devtools-iframe { width: 100%; height: 100%; border: 0; - background: #ffffff; + background: var(--atlas-canvas); } .devtools-popout-card { width: min(520px, calc(100% - 32px)); margin: auto; padding: 28px; - border: 1px solid #e2e8f0; + border: 1px solid var(--atlas-border); border-radius: 12px; - background: #ffffff; - box-shadow: 0 18px 45px rgba(15, 23, 42, 0.08); - color: #64748b; + background: var(--atlas-surface); + box-shadow: 0 18px 45px var(--atlas-shadow); + color: var(--atlas-text-muted); font-family: var(--font-sans, "Inter", "Segoe UI", sans-serif); font-size: 0.8125rem; line-height: 1.55; @@ -50,7 +50,7 @@ .devtools-popout-kicker { margin-bottom: 5px; - color: #6366f1; + color: var(--atlas-accent); font-size: 0.75rem; font-weight: 750; letter-spacing: 0.12em; @@ -71,11 +71,11 @@ .devtools-error { margin-top: 12px; - color: #e11d48; + color: var(--atlas-danger); } #devtools-message.is-error { - color: #e11d48; + color: var(--atlas-danger); } .devtools-workspace #devtools-message { @@ -83,14 +83,14 @@ min-height: 100%; place-items: center; padding: 24px; - background: #f8fafc; - color: #64748b; + background: var(--atlas-canvas); + color: var(--atlas-text-muted); font-family: var(--font-mono); font-size: 0.75rem; } .devtools-workspace button:focus-visible { - outline: 2px solid #6366f1; + outline: 2px solid var(--atlas-focus); outline-offset: 2px; } diff --git a/src/ui/styles/tabs/w3/_cogs.css b/src/ui/styles/tabs/w3/_cogs.css index ae9de59a..84e86f9b 100644 --- a/src/ui/styles/tabs/w3/_cogs.css +++ b/src/ui/styles/tabs/w3/_cogs.css @@ -317,10 +317,10 @@ min-width: 96px; min-height: 30px; padding: 4px 7px; - border: 1px solid #dce2ec; + border: 1px solid var(--atlas-border); border-radius: 6px; - color: #14213d; - background: #ffffff; + color: var(--atlas-text); + background: var(--atlas-field); font-family: var(--font-mono); font-size: 0.8125rem; box-shadow: none; @@ -328,17 +328,17 @@ .cogs-popup .cogs-cog-stat-input:focus { outline: none; - border-color: #7779f4 !important; - background: #ffffff !important; - box-shadow: 0 0 0 2px rgb(119 121 244 / 14%) !important; + border-color: var(--atlas-accent) !important; + background: var(--atlas-field) !important; + box-shadow: 0 0 0 2px var(--atlas-focus) !important; } .cogs-popup .cogs-cog-stat-input:focus-visible { outline: none; outline-offset: 0; - border-color: #7779f4 !important; - background: #ffffff !important; - box-shadow: 0 0 0 2px rgb(119 121 244 / 14%) !important; + border-color: var(--atlas-accent) !important; + background: var(--atlas-field) !important; + box-shadow: 0 0 0 2px var(--atlas-focus) !important; } .cogs-cog-stat-set-btn { diff --git a/tests/atlas-ui-compat.mjs b/tests/atlas-ui-compat.mjs index e0404d45..c22da006 100644 --- a/tests/atlas-ui-compat.mjs +++ b/tests/atlas-ui-compat.mjs @@ -47,14 +47,14 @@ test("Search selection fallback prefers persisted keys, then favorites", () => { assert.deepEqual(pickInitialSelectedKeys(all, [], []), all); }); -test("Theme preferences default to light and persist valid selections", () => { +test("Theme preferences default to dark and persist valid selections", () => { const storage = createStorage(); const root = { dataset: {} }; - assert.equal(loadThemePreference(storage), "light"); - assert.equal(normalizeTheme("unknown"), "light"); - assert.equal(applyTheme("dark", root), "dark"); - assert.equal(root.dataset.theme, "dark"); + assert.equal(loadThemePreference(storage), "dark"); + assert.equal(normalizeTheme("unknown"), "dark"); + assert.equal(applyTheme("light", root), "light"); + assert.equal(root.dataset.theme, "light"); assert.equal(saveThemePreference("system", storage, root), "system"); assert.equal(storage.value("uiTheme"), "system"); From 0f974f1d43df215d6c0f65695e559d64f8f004f9 Mon Sep 17 00:00:00 2001 From: Arnold W Date: Tue, 1 Sep 2026 16:16:08 +0200 Subject: [PATCH 10/32] feat(ui): add quick theme toggle button to top header bar --- src/ui/assets/icons.js | 23 +++++++++++++++++++++++ src/ui/components/AtlasHeader.js | 14 ++++++++++++++ src/ui/styles/_atlas-shell.css | 5 +++++ 3 files changed, 42 insertions(+) diff --git a/src/ui/assets/icons.js b/src/ui/assets/icons.js index 7c721b26..9efbf763 100644 --- a/src/ui/assets/icons.js +++ b/src/ui/assets/icons.js @@ -302,4 +302,27 @@ export const Icons = { }), { "stroke-width": "2", "aria-hidden": "true", ...props } ), + + Sun: (props) => + SvgBase( + [ + circle({ cx: "12", cy: "12", r: "5" }), + line({ x1: "12", y1: "1", x2: "12", y2: "3" }), + line({ x1: "12", y1: "21", x2: "12", y2: "23" }), + line({ x1: "4.22", y1: "4.22", x2: "5.64", y2: "5.64" }), + line({ x1: "18.36", y1: "18.36", x2: "19.78", y2: "19.78" }), + line({ x1: "1", y1: "12", x2: "3", y2: "12" }), + line({ x1: "21", y1: "12", x2: "23", y2: "12" }), + line({ x1: "4.22", y1: "19.78", x2: "5.64", y2: "18.36" }), + line({ x1: "18.36", y1: "5.64", x2: "19.78", y2: "4.22" }), + ], + { "stroke-width": "2", "aria-hidden": "true", ...props } + ), + + Moon: (props) => + SvgBase(path({ d: "M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z" }), { + "stroke-width": "2", + "aria-hidden": "true", + ...props, + }), }; diff --git a/src/ui/components/AtlasHeader.js b/src/ui/components/AtlasHeader.js index fd895c0d..7a833b33 100644 --- a/src/ui/components/AtlasHeader.js +++ b/src/ui/components/AtlasHeader.js @@ -76,6 +76,20 @@ export const AtlasHeader = () => () => store.app.updateInfo?.updateAvailable ? span({ class: "atlas-update-dot" }) : span({ hidden: true }) ), + button( + { + class: "atlas-header-button atlas-theme-toggle", + type: "button", + onclick: () => { + const currentTheme = document.documentElement.dataset.theme || store.app.theme; + store.setTheme(currentTheme === "dark" ? "light" : "dark"); + }, + title: () => (store.app.theme === "light" ? "Switch to dark theme" : "Switch to light theme"), + "aria-label": () => + store.app.theme === "light" ? "Switch to dark theme" : "Switch to light theme", + }, + () => (store.app.theme === "light" ? Icons.Moon() : Icons.Sun()) + ), button( { class: () => diff --git a/src/ui/styles/_atlas-shell.css b/src/ui/styles/_atlas-shell.css index 0a285dc5..d3309663 100644 --- a/src/ui/styles/_atlas-shell.css +++ b/src/ui/styles/_atlas-shell.css @@ -205,6 +205,11 @@ body { height: 14px; } +.atlas-theme-toggle { + width: 32px; + padding: 0; +} + .atlas-version:disabled { cursor: default; opacity: 0.72; From 05e4d8a061b3bd7c7d4eb24ada0f3ca9fa5174b4 Mon Sep 17 00:00:00 2001 From: Arnold W Date: Tue, 1 Sep 2026 16:43:09 +0200 Subject: [PATCH 11/32] feat(cheats,ui): restyle in-game overlay buttons to Atlas style and position close button in top bar right --- src/cheats/ui/overlay.js | 91 ++++++++++++++++++++-------------- src/ui/styles/_atlas-shell.css | 4 +- 2 files changed, 55 insertions(+), 40 deletions(-) diff --git a/src/cheats/ui/overlay.js b/src/cheats/ui/overlay.js index b6414d1e..97be6132 100644 --- a/src/cheats/ui/overlay.js +++ b/src/cheats/ui/overlay.js @@ -9,7 +9,7 @@ import { webPort } from "../core/state.js"; // UI constants const Z_INDEX_BASE = 1000000; -const TRANSITION_SETTINGS = "0.6s cubic-bezier(0.05, 0.7, 0.1, 1)"; +const TRANSITION_SETTINGS = "0.25s cubic-bezier(0.16, 1, 0.3, 1)"; const STYLES = { container: ` @@ -27,54 +27,61 @@ const STYLES = { border: none; transform: translateY(-100%); transition: transform ${TRANSITION_SETTINGS}; - background: #050507; + background: #10121a; box-shadow: 0 10px 30px rgba(0,0,0,0.7); pointer-events: auto; z-index: ${Z_INDEX_BASE + 1}; `, buttonBase: ` - font-family: 'Rajdhani', sans-serif; - font-weight: 700; - font-size: 14px; + font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; + font-weight: 600; + font-size: 12px; cursor: pointer; user-select: none; pointer-events: auto; z-index: ${Z_INDEX_BASE + 2}; - transition: all ${TRANSITION_SETTINGS}; + transition: all 0.2s ease; -webkit-app-region: no-drag; text-align: center; + box-sizing: border-box; `, buttonDefault: ` - background: linear-gradient(180deg, #161821, #0e0f14); - color: #ffb700; - padding: 0 20px; - height: 32px; - line-height: 32px; + background: #090b14; + color: #c8cede; + padding: 0 16px; + height: 28px; + line-height: 26px; border-radius: 0 0 8px 8px; - letter-spacing: 2px; - box-shadow: 0 4px 15px rgba(0,0,0,0.5); - border: 1px solid #2a2b36; + letter-spacing: 0.06em; + box-shadow: 0 4px 14px rgba(0, 0, 0, 0.5); + border: 1px solid #293043; border-top: none; - text-shadow: 0 0 10px rgba(255, 183, 0, 0.3); position: absolute; top: 0; left: 50%; transform: translateX(-50%); + display: flex; + align-items: center; + justify-content: center; + text-transform: uppercase; `, buttonExpanded: ` - background: #ffb700; - color: #050507; - padding: 10px 24px; - height: auto; - line-height: normal; - border-radius: 2px; - letter-spacing: 1px; - box-shadow: 0 0 20px rgba(255, 183, 0, 0.2); - border: none; + background: rgba(217, 67, 95, 0.15); + color: #ff7189; + padding: 0 14px; + height: 32px; + line-height: 30px; + border-radius: 7px; + letter-spacing: 0.04em; + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.2); + border: 1px solid rgba(255, 113, 137, 0.3); position: absolute; - top: 20px; - right: 30px; + top: 8px; + right: 12px; transform: none; + display: flex; + align-items: center; + justify-content: center; text-transform: uppercase; `, }; @@ -106,25 +113,33 @@ export function injectWebUI() { toggleBtn.onmouseover = () => { if (!isUiExpanded) { - toggleBtn.style.background = "#161821"; - toggleBtn.style.color = "#ffe066"; - toggleBtn.style.boxShadow = "0 4px 20px rgba(255, 183, 0, 0.15)"; - toggleBtn.style.height = "36px"; + toggleBtn.style.background = "#171b25"; + toggleBtn.style.color = "#8b8df5"; + toggleBtn.style.borderColor = "#46516a"; + toggleBtn.style.boxShadow = "0 6px 18px rgba(139, 141, 245, 0.25)"; + toggleBtn.style.height = "32px"; + toggleBtn.style.lineHeight = "30px"; } else { - toggleBtn.style.background = "#ffe066"; - toggleBtn.style.boxShadow = "0 0 25px rgba(255, 183, 0, 0.4)"; + toggleBtn.style.background = "#d9435f"; + toggleBtn.style.color = "#ffffff"; + toggleBtn.style.borderColor = "#d9435f"; + toggleBtn.style.boxShadow = "0 2px 10px rgba(217, 67, 95, 0.4)"; } }; toggleBtn.onmouseout = () => { if (!isUiExpanded) { - toggleBtn.style.background = "linear-gradient(180deg, #161821, #0e0f14)"; - toggleBtn.style.color = "#ffb700"; - toggleBtn.style.boxShadow = "0 4px 15px rgba(0,0,0,0.5)"; - toggleBtn.style.height = "32px"; + toggleBtn.style.background = "#090b14"; + toggleBtn.style.color = "#c8cede"; + toggleBtn.style.borderColor = "#293043"; + toggleBtn.style.boxShadow = "0 4px 14px rgba(0, 0, 0, 0.5)"; + toggleBtn.style.height = "28px"; + toggleBtn.style.lineHeight = "26px"; } else { - toggleBtn.style.background = "#ffb700"; - toggleBtn.style.boxShadow = "0 0 20px rgba(255, 183, 0, 0.2)"; + toggleBtn.style.background = "rgba(217, 67, 95, 0.15)"; + toggleBtn.style.color = "#ff7189"; + toggleBtn.style.borderColor = "rgba(255, 113, 137, 0.3)"; + toggleBtn.style.boxShadow = "0 1px 4px rgba(0, 0, 0, 0.2)"; } }; diff --git a/src/ui/styles/_atlas-shell.css b/src/ui/styles/_atlas-shell.css index d3309663..48a9de51 100644 --- a/src/ui/styles/_atlas-shell.css +++ b/src/ui/styles/_atlas-shell.css @@ -38,7 +38,7 @@ body { align-items: center; gap: 18px; min-width: 0; - padding: 0 12px; + padding: 0 92px 0 12px; color: #f6f7fb; background: var(--atlas-header); border-bottom: 1px solid var(--atlas-header-border); @@ -584,7 +584,7 @@ body { .atlas-header { grid-template-columns: minmax(0, 1fr) auto; gap: 8px; - padding-inline: 8px; + padding: 0 86px 0 8px; } .atlas-breadcrumb, From 2224f029c73c608d2fc1d5c2036a45ce40fc9cb2 Mon Sep 17 00:00:00 2001 From: Arnold W Date: Wed, 2 Sep 2026 18:46:05 +0200 Subject: [PATCH 12/32] refactor(ui): resolve standards and architectural review findings --- package.json | 3 +- src/ui/components/ActivityDrawer.js | 2 +- src/ui/components/App.js | 3 +- src/ui/components/CheatItem.js | 2 +- src/ui/components/Sidebar.js | 2 +- src/ui/components/UpdateModal.js | 2 +- src/ui/components/views/AtlasCheats.js | 32 +++++-- src/ui/components/views/Config.js | 9 +- src/ui/components/views/Search.js | 8 +- .../components/views/config/ConfigActions.js | 2 +- .../search/{sections.js => SearchSections.js} | 49 +++++----- .../views/config => state}/configDraft.js | 8 +- src/ui/state/store.js | 2 +- src/ui/styles/_atlas-shell.css | 6 ++ src/ui/styles/function-input.css | 8 +- src/ui/styles/number-input.css | 4 +- .../views => utils}/search/scanUtils.js | 0 .../views => utils}/search/valueUtils.js | 0 .../views => utils}/search/workspaceUtils.js | 0 tests/atlas-ui-compat.mjs | 94 ------------------- 20 files changed, 88 insertions(+), 148 deletions(-) rename src/ui/components/views/search/{sections.js => SearchSections.js} (97%) rename src/ui/{components/views/config => state}/configDraft.js (96%) rename src/ui/{components/views => utils}/search/scanUtils.js (100%) rename src/ui/{components/views => utils}/search/valueUtils.js (100%) rename src/ui/{components/views => utils}/search/workspaceUtils.js (100%) delete mode 100644 tests/atlas-ui-compat.mjs diff --git a/package.json b/package.json index 970217a5..d0a12410 100644 --- a/package.json +++ b/package.json @@ -8,10 +8,9 @@ "start": "node src/main.js", "build:cheats": "rollup -c", "watch:cheats": "rollup -c --watch", - "test:ui-compat": "node --test tests/atlas-ui-compat.mjs", "format": "prettier --write .", "format:check": "prettier --check .", - "validate": "npm run build:cheats && npm run test:ui-compat && node --check cheats.js config.js && npx eslint . && node -e \"require('./src/ui/config/optionsAccountSchema.json')\"", + "validate": "npm run build:cheats && node --check cheats.js config.js && npx eslint . && node -e \"require('./src/ui/config/optionsAccountSchema.json')\"", "build": "npm run build:cheats && pkg . -t node18-win-x64 --compress Gzip --output InjectCheatsUI.exe", "build-unix": "npm run build:cheats && pkg . -t node18-linux-x64 --compress Gzip --output InjectCheatsUI-linux", "build-macos-x64": "npm run build:cheats && pkg . -t node18-macos-x64 --compress Gzip --output InjectCheatsUI-macos-x64", diff --git a/src/ui/components/ActivityDrawer.js b/src/ui/components/ActivityDrawer.js index 42027369..0b1e66e1 100644 --- a/src/ui/components/ActivityDrawer.js +++ b/src/ui/components/ActivityDrawer.js @@ -2,7 +2,7 @@ import van from "../vendor/van-1.6.0.js"; import store from "../state/store.js"; import { VIEWS } from "../state/constants.js"; import { Icons } from "../assets/icons.js"; -import { formatDisplayValue } from "./views/search/valueUtils.js"; +import { formatDisplayValue } from "../utils/search/valueUtils.js"; const { section, div, button, span, code } = van.tags; diff --git a/src/ui/components/App.js b/src/ui/components/App.js index 7081ba0e..22c293a5 100644 --- a/src/ui/components/App.js +++ b/src/ui/components/App.js @@ -2,11 +2,12 @@ import van from "../vendor/van-1.6.0.js"; import store from "../state/store.js"; import { VIEWS } from "../state/constants.js"; +import { saveConfigDraft } from "../state/configDraft.js"; + // Components import { Sidebar, SidebarBackdrop } from "./Sidebar.js"; import { AtlasHeader } from "./AtlasHeader.js"; import { ActivityDrawer } from "./ActivityDrawer.js"; -import { saveConfigDraft } from "./views/config/configDraft.js"; import { Toast } from "./Toast.js"; import { TooltipContainer } from "./Tooltip.js"; import { UpdateModal } from "./UpdateModal.js"; diff --git a/src/ui/components/CheatItem.js b/src/ui/components/CheatItem.js index 3da93f9f..da7c293a 100644 --- a/src/ui/components/CheatItem.js +++ b/src/ui/components/CheatItem.js @@ -42,7 +42,7 @@ export const CheatItem = ({ try { pending.val = true; - await onExecute(entry.action || cheat.value, cheat.message || cheat.value); + await onExecute(entry.action, cheat.message || cheat.value); flash("success"); } catch { flash("error"); diff --git a/src/ui/components/Sidebar.js b/src/ui/components/Sidebar.js index f7e9a140..33b5d659 100644 --- a/src/ui/components/Sidebar.js +++ b/src/ui/components/Sidebar.js @@ -1,8 +1,8 @@ import van from "../vendor/van-1.6.0.js"; import store from "../state/store.js"; import { VIEWS, VIEW_ORDER, IS_ELECTRON } from "../state/constants.js"; -import { Icons } from "../assets/icons.js"; import { WorkspaceContextSlot } from "./WorkspaceContext.js"; +import { Icons } from "../assets/icons.js"; const { aside, nav, div, button, span, a } = van.tags; diff --git a/src/ui/components/UpdateModal.js b/src/ui/components/UpdateModal.js index 37320314..69f09a3d 100644 --- a/src/ui/components/UpdateModal.js +++ b/src/ui/components/UpdateModal.js @@ -1,7 +1,7 @@ import van from "../vendor/van-1.6.0.js"; import store from "../state/store.js"; import { IS_ELECTRON } from "../state/constants.js"; -import { configDraftStatus, discardConfigDraft, saveConfigDraft } from "./views/config/configDraft.js"; +import { configDraftStatus, discardConfigDraft, saveConfigDraft } from "../state/configDraft.js"; const { div, h3, p, button, a, span } = van.tags; diff --git a/src/ui/components/views/AtlasCheats.js b/src/ui/components/views/AtlasCheats.js index 552d3ecc..2391ca9d 100644 --- a/src/ui/components/views/AtlasCheats.js +++ b/src/ui/components/views/AtlasCheats.js @@ -2,16 +2,21 @@ import van from "../../vendor/van-1.6.0.js"; import vanX from "../../vendor/van-x-0.6.3.js"; import store from "../../state/store.js"; import { CATEGORY_ORDER, VIEWS } from "../../state/constants.js"; -import * as API from "../../services/api.js"; -import { configPathExists, getCheatConfigPath } from "../../utils/index.js"; -import { Icons } from "../../assets/icons.js"; +import { + buildConfigPathTemplate, + configDraftReady, + getConfigDraft, + getConfigPathData, +} from "../../state/configDraft.js"; import { Loader } from "../Loader.js"; import { EmptyState } from "../EmptyState.js"; import { CheatItem } from "../CheatItem.js"; import { ConfigNode } from "../config/ConfigNode.js"; import { registerWorkspaceContext } from "../WorkspaceContext.js"; import { ConfigActions } from "./config/ConfigActions.js"; -import { buildConfigPathTemplate, configDraftReady, getConfigDraft, getConfigPathData } from "./config/configDraft.js"; +import * as API from "../../services/api.js"; +import { configPathExists, getCheatConfigPath } from "../../utils/index.js"; +import { Icons } from "../../assets/icons.js"; const { div, button, span, input, code } = van.tags; @@ -246,7 +251,14 @@ export const AtlasCheats = () => { } }; - const getExecutionAction = (entry) => { + /** + * Build the executable action string for a cheat entry. + * Appends parameter if required by the command, or null if the parameter is empty. + * For non-parameterized commands, returns the command identifier. + * @param {object} entry + * @returns {string|null} + */ + const buildExecutableAction = (entry) => { if (!entry.cheat.needsParam) return entry.cheat.value; const parameter = getParameterState(entry).val.trim(); return parameter ? `${entry.cheat.value} ${parameter}` : null; @@ -267,7 +279,7 @@ export const AtlasCheats = () => { }; const toggleFavorite = (entry) => { - const action = getExecutionAction(entry); + const action = buildExecutableAction(entry); if (!action) { selectEntry(entry, { focusParameter: true }); store.notify("Enter a value before saving this command", "error"); @@ -443,7 +455,7 @@ export const AtlasCheats = () => { entry, selected: () => selectedEntry.val?.action === entry.action, getStateInfo, - isFavorite: (item) => store.isFavorite(item.action || item.cheat.value), + isFavorite: (item) => store.isFavorite(item.action), onSelect: selectEntry, onExecute: executeAction, onFavorite: toggleFavorite, @@ -459,7 +471,7 @@ export const AtlasCheats = () => { const parameterState = entry.cheat.needsParam ? getParameterState(entry) : null; const pending = van.state(false); const executeFromInspector = async () => { - const action = getExecutionAction(entry); + const action = buildExecutableAction(entry); if (!action) { document.querySelector("#atlas-cheat-parameter")?.focus(); return; @@ -528,7 +540,7 @@ export const AtlasCheats = () => { ), div( span("Command"), - code(() => getExecutionAction(entry) || entry.cheat.value) + code(() => buildExecutableAction(entry) || entry.cheat.value) ) ) ); @@ -631,7 +643,7 @@ export const AtlasCheats = () => { { type: "button", class: () => - `atlas-cheat-favorite ${store.isFavorite(getExecutionAction(entry) || entry.action) ? "is-favorite" : ""}`, + `atlas-cheat-favorite ${store.isFavorite(buildExecutableAction(entry) || entry.action) ? "is-favorite" : ""}`, title: "Toggle favorite", "aria-label": "Toggle favorite", onclick: () => toggleFavorite(entry), diff --git a/src/ui/components/views/Config.js b/src/ui/components/views/Config.js index 3c57bfd1..5c853c4c 100644 --- a/src/ui/components/views/Config.js +++ b/src/ui/components/views/Config.js @@ -1,13 +1,18 @@ import van from "../../vendor/van-1.6.0.js"; import store from "../../state/store.js"; +import { + buildConfigPathTemplate, + configDraftReady, + getConfigDraft, + getConfigPathData, +} from "../../state/configDraft.js"; import { Loader } from "../Loader.js"; import { EmptyState } from "../EmptyState.js"; import { ConfigNode } from "../config/ConfigNode.js"; import { StartupCheats, AddCheatSearchBar } from "../config/StartupCheats.js"; import { SearchBar } from "../SearchBar.js"; -import { Icons } from "../../assets/icons.js"; import { ConfigActions } from "./config/ConfigActions.js"; -import { buildConfigPathTemplate, configDraftReady, getConfigDraft, getConfigPathData } from "./config/configDraft.js"; +import { Icons } from "../../assets/icons.js"; const { div, button, select, option, label, span } = van.tags; diff --git a/src/ui/components/views/Search.js b/src/ui/components/views/Search.js index 581c1d3b..51e6cbae 100644 --- a/src/ui/components/views/Search.js +++ b/src/ui/components/views/Search.js @@ -2,6 +2,7 @@ import van from "../../vendor/van-1.6.0.js"; import vanX from "../../vendor/van-x-0.6.3.js"; import store from "../../state/store.js"; import { FAVORITE_KEYS } from "../../state/constants.js"; +import { KeysSection, SearchInputSection, ResultsSection, SearchInspector } from "./search/SearchSections.js"; import { detectQueryType } from "../../utils/index.js"; import { NEW_SCAN_TYPES, @@ -12,7 +13,7 @@ import { needsPreviousSnapshot, buildSnapshotFromResults, filterResultsByScanType, -} from "./search/scanUtils.js"; +} from "../../utils/search/scanUtils.js"; import { seedEditValue, expectedUiType, @@ -25,7 +26,7 @@ import { getUiTypeFromRawValue, getDraftFromRawValue, getResultValue, -} from "./search/valueUtils.js"; +} from "../../utils/search/valueUtils.js"; import { uniqueStrings, loadLocalFavoriteKeys, @@ -37,8 +38,7 @@ import { pickInitialSelectedKeys, normalizeFilterText, matchesEntryFilter, -} from "./search/workspaceUtils.js"; -import { KeysSection, SearchInputSection, ResultsSection, SearchInspector } from "./search/sections.js"; +} from "../../utils/search/workspaceUtils.js"; const { div, button, span } = van.tags; diff --git a/src/ui/components/views/config/ConfigActions.js b/src/ui/components/views/config/ConfigActions.js index e6011d13..43c9b531 100644 --- a/src/ui/components/views/config/ConfigActions.js +++ b/src/ui/components/views/config/ConfigActions.js @@ -1,6 +1,6 @@ import van from "../../../vendor/van-1.6.0.js"; +import { configDraftStatus, saveConfigDraft } from "../../../state/configDraft.js"; import { withTooltip } from "../../Tooltip.js"; -import { configDraftStatus, saveConfigDraft } from "./configDraft.js"; const { div, button, span } = van.tags; diff --git a/src/ui/components/views/search/sections.js b/src/ui/components/views/search/SearchSections.js similarity index 97% rename from src/ui/components/views/search/sections.js rename to src/ui/components/views/search/SearchSections.js index fdeb21e7..508fc274 100644 --- a/src/ui/components/views/search/sections.js +++ b/src/ui/components/views/search/SearchSections.js @@ -1,10 +1,11 @@ import van from "../../../vendor/van-1.6.0.js"; import store from "../../../state/store.js"; -import { copyToClipboard } from "../../../utils/index.js"; import { Loader } from "../../Loader.js"; import { EmptyState } from "../../EmptyState.js"; import { Sparkline, canGraph } from "../../Sparkline.js"; +import { createStaticRowReconciler } from "../account/accountShared.js"; import { Icons } from "../../../assets/icons.js"; +import { copyToClipboard } from "../../../utils/index.js"; import { NEW_SCAN_TYPES, NEXT_SCAN_TYPES, @@ -12,17 +13,29 @@ import { getScanTypePlaceholder, isInputlessScanType, requiresSecondaryInput, -} from "./scanUtils.js"; +} from "../../../utils/search/scanUtils.js"; import { monitorPathForSearchResult, formatDisplayValue, getMonitorHistory, resolveMonitorEntry, -} from "./valueUtils.js"; -import { createStaticRowReconciler } from "../account/accountShared.js"; +} from "../../../utils/search/valueUtils.js"; const { div, input, button, span, label, select, option, aside } = van.tags; +const ResultEditInput = ({ class: className = "result-edit-input", draft, onInput, onSave, onCancel }) => + input({ + class: className, + value: draft, + oninput: onInput, + onclick: (event) => event.stopPropagation(), + onkeydown: (event) => { + event.stopPropagation(); + if (event.key === "Enter") onSave(); + if (event.key === "Escape") onCancel(); + }, + }); + const KeyCheckbox = ({ keyName, selectedKeys, onChange, isFavorite, onToggleFavorite }) => { const isChecked = () => selectedKeys.includes(keyName); const favorite = () => isFavorite(keyName); @@ -691,16 +704,11 @@ const SavedResultItem = ({ entry: initialEntry, ui, handlers }) => { ); } - return input({ - class: "result-edit-input", - value: () => ui.savedEdit.draft, - oninput: (e) => (ui.savedEdit.draft = e.target.value), - onclick: (e) => e.stopPropagation(), - onkeydown: (e) => { - e.stopPropagation(); - if (e.key === "Enter") handlers.saveSavedEdit(); - if (e.key === "Escape") handlers.cancelSavedEdit(); - }, + return ResultEditInput({ + draft: () => ui.savedEdit.draft, + onInput: (e) => (ui.savedEdit.draft = e.target.value), + onSave: handlers.saveSavedEdit, + onCancel: handlers.cancelSavedEdit, }); }, @@ -945,15 +953,12 @@ const SelectedResultSection = ({ result, ui, handlers }) => { ), div({ class: "selected-result-value" }, span({ class: "selected-result-label" }, "VALUE"), () => isEditing() - ? input({ + ? ResultEditInput({ class: "result-edit-input selected-result-edit-input", - value: () => ui.edit.draft, - oninput: (event) => (ui.edit.draft = event.target.value), - onkeydown: (event) => { - event.stopPropagation(); - if (event.key === "Enter") handlers.saveEdit(); - if (event.key === "Escape") handlers.cancelEdit(); - }, + draft: () => ui.edit.draft, + onInput: (event) => (ui.edit.draft = event.target.value), + onSave: handlers.saveEdit, + onCancel: handlers.cancelEdit, }) : span({ class: `selected-result-display type-${result.type}` }, result.formattedValue) ), diff --git a/src/ui/components/views/config/configDraft.js b/src/ui/state/configDraft.js similarity index 96% rename from src/ui/components/views/config/configDraft.js rename to src/ui/state/configDraft.js index 53436d22..d61818eb 100644 --- a/src/ui/components/views/config/configDraft.js +++ b/src/ui/state/configDraft.js @@ -1,7 +1,7 @@ -import van from "../../../vendor/van-1.6.0.js"; -import vanX from "../../../vendor/van-x-0.6.3.js"; -import store from "../../../state/store.js"; -import * as API from "../../../services/api.js"; +import van from "../vendor/van-1.6.0.js"; +import vanX from "../vendor/van-x-0.6.3.js"; +import store from "./store.js"; +import * as API from "../services/api.js"; export const configDraftReady = van.state(false); export const configDraftStatus = vanX.reactive({ diff --git a/src/ui/state/store.js b/src/ui/state/store.js index dd7acc3c..60b74db1 100644 --- a/src/ui/state/store.js +++ b/src/ui/state/store.js @@ -3,7 +3,7 @@ import * as API from "../services/api.js"; import { VIEWS } from "./constants.js"; import { loadThemePreference, saveThemePreference } from "./theme.js"; import { getCheatConfigPath, configPathExists } from "../utils/index.js"; -import { formatDisplayValue, monitorIdFromMonitorPath } from "../components/views/search/valueUtils.js"; +import { formatDisplayValue, monitorIdFromMonitorPath } from "../utils/search/valueUtils.js"; import { initWebSocket, onStateUpdate, diff --git a/src/ui/styles/_atlas-shell.css b/src/ui/styles/_atlas-shell.css index 48a9de51..ec4de4fc 100644 --- a/src/ui/styles/_atlas-shell.css +++ b/src/ui/styles/_atlas-shell.css @@ -11,6 +11,12 @@ body { display: none; } +/* Chromium 87 compatibility fallback for inert attribute */ +[inert] { + pointer-events: none !important; + user-select: none !important; +} + .app-layout { position: relative; display: flex; diff --git a/src/ui/styles/function-input.css b/src/ui/styles/function-input.css index e0266b43..1d6189de 100644 --- a/src/ui/styles/function-input.css +++ b/src/ui/styles/function-input.css @@ -31,7 +31,9 @@ border-radius: 6px; color: var(--atlas-text, var(--c-text-main)); cursor: pointer; - transition: border-color 0.15s, box-shadow 0.15s; + transition: + border-color 0.15s, + box-shadow 0.15s; } .function-type-select:hover { @@ -74,7 +76,9 @@ border-radius: 50%; cursor: pointer; box-shadow: 0 1px 4px var(--atlas-shadow, rgba(0, 0, 0, 0.2)); - transition: transform 0.15s, box-shadow 0.15s; + transition: + transform 0.15s, + box-shadow 0.15s; } .function-slider::-webkit-slider-thumb:hover { diff --git a/src/ui/styles/number-input.css b/src/ui/styles/number-input.css index 47cef991..c57eadde 100644 --- a/src/ui/styles/number-input.css +++ b/src/ui/styles/number-input.css @@ -28,7 +28,9 @@ input[type="number"] { border-radius: 6px; overflow: hidden; background: var(--atlas-field, var(--c-panel-dim)); - transition: border-color 0.15s, box-shadow 0.15s; + transition: + border-color 0.15s, + box-shadow 0.15s; } .number-input-wrapper:focus-within { diff --git a/src/ui/components/views/search/scanUtils.js b/src/ui/utils/search/scanUtils.js similarity index 100% rename from src/ui/components/views/search/scanUtils.js rename to src/ui/utils/search/scanUtils.js diff --git a/src/ui/components/views/search/valueUtils.js b/src/ui/utils/search/valueUtils.js similarity index 100% rename from src/ui/components/views/search/valueUtils.js rename to src/ui/utils/search/valueUtils.js diff --git a/src/ui/components/views/search/workspaceUtils.js b/src/ui/utils/search/workspaceUtils.js similarity index 100% rename from src/ui/components/views/search/workspaceUtils.js rename to src/ui/utils/search/workspaceUtils.js diff --git a/tests/atlas-ui-compat.mjs b/tests/atlas-ui-compat.mjs deleted file mode 100644 index c22da006..00000000 --- a/tests/atlas-ui-compat.mjs +++ /dev/null @@ -1,94 +0,0 @@ -import assert from "node:assert/strict"; -import { readFile, readdir } from "node:fs/promises"; -import path from "node:path"; -import test from "node:test"; -import { fileURLToPath, URL } from "node:url"; - -const workspaceUtilsSource = await readFile( - new URL("../src/ui/components/views/search/workspaceUtils.js", import.meta.url), - "utf8" -); -const { loadLocalFavoriteKeys, pickInitialSelectedKeys, saveLocalFavoriteKeys } = await import( - `data:text/javascript,${encodeURIComponent(workspaceUtilsSource)}` -); -const themeSource = await readFile(new URL("../src/ui/state/theme.js", import.meta.url), "utf8"); -const { applyTheme, loadThemePreference, normalizeTheme, saveThemePreference } = await import( - `data:text/javascript,${encodeURIComponent(themeSource)}` -); - -const createStorage = (initial = {}) => { - const values = new Map(Object.entries(initial)); - return { - getItem: (key) => (values.has(key) ? values.get(key) : null), - setItem: (key, value) => values.set(key, String(value)), - value: (key) => values.get(key), - }; -}; - -test("Search favorites preserve unset, empty, and custom storage states", () => { - const unsetStorage = createStorage(); - globalThis.localStorage = unsetStorage; - assert.equal(loadLocalFavoriteKeys(), null); - - const emptyStorage = createStorage({ searchFavoriteKeys: "[]" }); - globalThis.localStorage = emptyStorage; - assert.deepEqual(loadLocalFavoriteKeys(), []); - - const customStorage = createStorage(); - globalThis.localStorage = customStorage; - saveLocalFavoriteKeys(["PlayerDATABASE", "PlayerDATABASE", "SkillLevels"]); - assert.equal(customStorage.value("searchFavoriteKeys"), '["PlayerDATABASE","SkillLevels"]'); -}); - -test("Search selection fallback prefers persisted keys, then favorites", () => { - const all = ["A", "B", "C", "D"]; - assert.deepEqual(pickInitialSelectedKeys(all, ["D"], ["B", "C"]), ["D"]); - assert.deepEqual(pickInitialSelectedKeys(all, [], ["C", "missing", "B"]), ["C", "B"]); - assert.deepEqual(pickInitialSelectedKeys(all, [], []), all); -}); - -test("Theme preferences default to dark and persist valid selections", () => { - const storage = createStorage(); - const root = { dataset: {} }; - - assert.equal(loadThemePreference(storage), "dark"); - assert.equal(normalizeTheme("unknown"), "dark"); - assert.equal(applyTheme("light", root), "light"); - assert.equal(root.dataset.theme, "light"); - - assert.equal(saveThemePreference("system", storage, root), "system"); - assert.equal(storage.value("uiTheme"), "system"); - assert.equal(root.dataset.theme, "system"); -}); - -const collectSourceFiles = async (directory) => { - const entries = await readdir(directory, { withFileTypes: true }); - const files = await Promise.all( - entries.map((entry) => { - const entryPath = path.join(directory, entry.name); - return entry.isDirectory() ? collectSourceFiles(entryPath) : [entryPath]; - }) - ); - return files.flat(); -}; - -test("UI source keeps the Chromium 87 compatibility floor", async () => { - const uiRoot = fileURLToPath(new URL("../src/ui", import.meta.url)); - const sourceFiles = (await collectSourceFiles(uiRoot)).filter( - (file) => !file.includes(`${path.sep}vendor${path.sep}`) && [".css", ".js"].includes(path.extname(file)) - ); - const unsupportedPatterns = [ - [/:is\(/, "CSS :is()"], - [/\.findLast(?:Index)?\(/, "Array findLast/findLastIndex"], - [/\.at\(/, "Array/String at()"], - [/\bstructuredClone\(/, "structuredClone()"], - [/\bObject\.hasOwn\(/, "Object.hasOwn()"], - ]; - - for (const file of sourceFiles) { - const source = await readFile(file, "utf8"); - for (const [pattern, label] of unsupportedPatterns) { - assert.doesNotMatch(source, pattern, `${label} is not supported by Chromium 87: ${file}`); - } - } -}); From b62690e57268ae5f0af64f24bf1d1bd286b57436 Mon Sep 17 00:00:00 2001 From: Arnold W Date: Wed, 2 Sep 2026 20:35:04 +0200 Subject: [PATCH 13/32] fix(ui): polish sidebar typography, currency toggles, outpost card, and number input widths --- src/ui/components/views/Search.js | 50 +--- .../account/masterclasses/OutpostsTab.js | 147 ++++++------ src/ui/styles/_account-pages.css | 13 +- src/ui/styles/_atlas-shell.css | 16 +- src/ui/styles/_masterclasses.css | 220 ++++++++++++++---- src/ui/styles/_theme.css | 115 +-------- src/ui/styles/_world-tabs.css | 4 +- src/ui/styles/cheats.css | 2 +- src/ui/styles/tabs/w2/_killroy.css | 2 +- src/ui/styles/tabs/w7/_research.css | 4 +- 10 files changed, 279 insertions(+), 294 deletions(-) diff --git a/src/ui/components/views/Search.js b/src/ui/components/views/Search.js index 51e6cbae..19d6d78a 100644 --- a/src/ui/components/views/Search.js +++ b/src/ui/components/views/Search.js @@ -138,10 +138,6 @@ export const Search = () => { let resultsFilterTimer = null; let savedFilterTimer = null; const subscribedMonitorPaths = new Set(); - const filterCache = { - results: { source: null, query: "", values: [] }, - saved: { source: null, query: "", values: [] }, - }; const reconcileMonitorSubscriptions = () => { const desiredPaths = new Set(); @@ -243,44 +239,16 @@ export const Search = () => { reconcileMonitorSubscriptions(); }); - const getFilteredList = (source, appliedFilter, cache) => { + const getFilteredList = (source, appliedFilter) => { const query = normalizeFilterText(appliedFilter); - if (cache.source === source && cache.query === query) { - return cache.values; - } - - const values = query ? source.filter((entry) => matchesEntryFilter(entry, query)) : source; - cache.source = source; - cache.query = query; - cache.values = values; - return values; + return query ? source.filter((entry) => matchesEntryFilter(entry, query)) : source; }; - const getFilteredResults = () => getFilteredList(ui.results, ui.resultsFilterApplied, filterCache.results); - const getFilteredSavedResults = () => getFilteredList(ui.savedResults, ui.savedFilterApplied, filterCache.saved); + const getFilteredResults = () => getFilteredList(ui.results, ui.resultsFilterApplied); + const getFilteredSavedResults = () => getFilteredList(ui.savedResults, ui.savedFilterApplied); let inspectorTrigger = null; let keysTrigger = null; - const trapOverlayFocus = (panel, event, isOverlay) => { - if (event.key !== "Tab" || !isOverlay) return; - const focusable = [ - ...panel.querySelectorAll( - 'button:not([disabled]), input:not([disabled]), select:not([disabled]), summary, [tabindex="0"]' - ), - ].filter((node) => node.offsetParent !== null); - const first = focusable[0]; - const last = focusable[focusable.length - 1]; - if (!first || !last) return; - - if (event.shiftKey && document.activeElement === first) { - event.preventDefault(); - last.focus(); - } else if (!event.shiftKey && document.activeElement === last) { - event.preventDefault(); - first.focus(); - } - }; - const closeInspector = () => { if (!ui.inspectorOpen) return; if (document.activeElement?.closest("#search-inspector")) document.activeElement.blur(); @@ -331,22 +299,16 @@ export const Search = () => { }, closeKeysPane, handleInspectorKeydown: (event) => { - if (!ui.inspectorOpen) return; - if (event.key === "Escape") { + if (ui.inspectorOpen && event.key === "Escape") { event.preventDefault(); closeInspector(); - return; } - trapOverlayFocus(event.currentTarget, event, ui.inspectorOverlay); }, handleKeysPanelKeydown: (event) => { - if (!ui.keysOpen) return; - if (event.key === "Escape") { + if (ui.keysOpen && event.key === "Escape") { event.preventDefault(); closeKeysPane(); - return; } - trapOverlayFocus(event.currentTarget, event, ui.keysOverlay); }, handleKeyChange: (keyName, isChecked) => updateSelection([keyName], isChecked), diff --git a/src/ui/components/views/account/masterclasses/OutpostsTab.js b/src/ui/components/views/account/masterclasses/OutpostsTab.js index 79d47883..d8cbdda2 100644 --- a/src/ui/components/views/account/masterclasses/OutpostsTab.js +++ b/src/ui/components/views/account/masterclasses/OutpostsTab.js @@ -360,29 +360,42 @@ const OutpostSlots = ({ mapId, slotState, barracksState, glorifiedState }) => { const unlockedSlots = () => unlockedSlotCount(barracksState.val, glorifiedState.val); return div( - { class: "outpost-slots" }, - span({ class: "outpost-slots__label" }, "OUTPOST SLOTS"), - ...Array.from({ length: 9 }, (_, slot) => - select( - { - class: () => - `outpost-slot-select${status.val === "success" ? " is-success" : ""}${ - status.val === "error" ? " is-error" : "" - }`, - value: () => slots()[slot], - title: `Slot ${slot + 1}`, - disabled: () => slot >= unlockedSlots(), - onchange: (e) => { - const nextSlots = slots(); - nextSlots[slot] = e.target.value; - const nextValue = encodeSlots(nextSlots); - void run(async () => { - await writeVerified(`RoyalMaps[${mapId}][11]`, nextValue); - slotState.val = nextValue; - }); + { class: "outpost-section outpost-section--slots" }, + div( + { class: "outpost-section-header" }, + span({ class: "outpost-card__group-title" }, "OUTPOST SLOTS"), + span({ class: "outpost-slots__count" }, () => `${unlockedSlots()} / 9 Unlocked`) + ), + div( + { class: "outpost-slots-grid" }, + ...Array.from({ length: 9 }, (_, slot) => + div( + { + class: () => `outpost-slot-item ${slot >= unlockedSlots() ? "is-locked" : "is-unlocked"}`, }, - }, - ...SLOT_TYPES.map((entry) => selectOption(entry, slots()[slot])) + span({ class: "outpost-slot-number" }, `#${slot + 1}`), + select( + { + class: () => + `outpost-slot-select${status.val === "success" ? " is-success" : ""}${ + status.val === "error" ? " is-error" : "" + }`, + value: () => slots()[slot], + title: `Slot ${slot + 1}`, + disabled: () => slot >= unlockedSlots(), + onchange: (e) => { + const nextSlots = slots(); + nextSlots[slot] = e.target.value; + const nextValue = encodeSlots(nextSlots); + void run(async () => { + await writeVerified(`RoyalMaps[${mapId}][11]`, nextValue); + slotState.val = nextValue; + }); + }, + }, + ...SLOT_TYPES.map((entry) => selectOption(entry, slots()[slot])) + ) + ) ) ) ); @@ -700,55 +713,51 @@ const BuiltOutpostRow = ({ ), div( { class: "outpost-card__status" }, - span({ class: "outpost-row__badge" }, () => (toInt(glorifiedState.val) === 1 ? "GLORIFIED" : "OUTPOST")) + ActionButton({ + label: () => (toInt(glorifiedState.val) === 1 ? "GLORIFIED" : "MAKE GLORIFIED"), + tooltip: "Toggle glorified outpost status.", + className: () => + `outpost-glorified-button ${toInt(glorifiedState.val) === 1 ? "is-glorified" : "is-standard"}`, + onClick: async (e) => { + e.preventDefault(); + const nextValue = toInt(glorifiedState.val) === 1 ? 0 : 1; + await writeVerified(`RoyalMaps[${outpost.mapId}][12]`, nextValue); + glorifiedState.val = nextValue; + outpost.glorified = nextValue; + await syncCapacity(fieldStates.get("barracks").val, nextValue); + }, + }) ) ), div( { class: "outpost-card__body" }, div( - { class: "outpost-card__group outpost-card__group--levels" }, - span({ class: "outpost-card__group-title" }, "UPGRADES"), - ...OUTPOST_FIELDS.slice(0, 3).map(fieldControl) - ), - div( - { class: "outpost-card__group outpost-card__group--settings" }, - span({ class: "outpost-card__group-title" }, "STATE"), - SelectWriter({ - label: "TYPE", - valueState: outpostTypeState, - options: OUTPOST_TYPES, - path: `RoyalMaps[${outpost.mapId}][10]`, - onApplied: (value) => { - outpost.type = value; - }, - }), + { class: "outpost-section outpost-section--facility" }, + div( + { class: "outpost-section-header" }, + span({ class: "outpost-card__group-title" }, "FACILITY UPGRADES & TYPE") + ), div( - { class: "outpost-select-field" }, - span({ class: "outpost-select-field__label" }, "GLORIFIED"), - ActionButton({ - label: () => (toInt(glorifiedState.val) === 1 ? "GLORIFIED" : "STANDARD"), - tooltip: "Toggle glorified outpost status.", - className: "outpost-glorified-button", - onClick: async (e) => { - e.preventDefault(); - const nextValue = toInt(glorifiedState.val) === 1 ? 0 : 1; - await writeVerified(`RoyalMaps[${outpost.mapId}][12]`, nextValue); - glorifiedState.val = nextValue; - outpost.glorified = nextValue; - await syncCapacity(fieldStates.get("barracks").val, nextValue); + { class: "outpost-facility-grid" }, + ...OUTPOST_FIELDS.slice(0, 3).map(fieldControl), + SelectWriter({ + label: "TYPE", + valueState: outpostTypeState, + options: OUTPOST_TYPES, + path: `RoyalMaps[${outpost.mapId}][10]`, + onApplied: (value) => { + outpost.type = value; }, }) ) ), div( - { class: "outpost-card__group outpost-card__group--rank-a" }, - span({ class: "outpost-card__group-title" }, "RANK XP"), - ...OUTPOST_FIELDS.slice(3, 6).map(fieldControl) - ), - div( - { class: "outpost-card__group outpost-card__group--rank-b" }, - span({ class: "outpost-card__group-title" }, "RANK XP"), - ...OUTPOST_FIELDS.slice(6).map(fieldControl) + { class: "outpost-section outpost-section--ranks" }, + div( + { class: "outpost-section-header" }, + span({ class: "outpost-card__group-title" }, "EXPEDITION RANKS (RANK XP)") + ), + div({ class: "outpost-ranks-grid" }, ...OUTPOST_FIELDS.slice(3).map(fieldControl)) ), OutpostSlots({ mapId: outpost.mapId, @@ -757,12 +766,18 @@ const BuiltOutpostRow = ({ glorifiedState, }), div( - { class: "outpost-map-units" }, - span({ class: "outpost-map-units__label" }, "MAP UNITS"), - MapUnitAddControl({ outpost, onAdded: onUnitsChanged }), - mapUnits.length - ? mapUnits.map((unit) => MapUnitRow({ unit, onRemoved: onUnitsChanged })) - : span({ class: "outpost-map-units__empty" }, "None stationed") + { class: "outpost-section outpost-section--units" }, + div({ class: "outpost-section-header" }, span({ class: "outpost-card__group-title" }, "MAP UNITS")), + div( + { class: "outpost-map-units-wrapper" }, + MapUnitAddControl({ outpost, onAdded: onUnitsChanged }), + div( + { class: "outpost-map-units-list" }, + mapUnits.length + ? mapUnits.map((unit) => MapUnitRow({ unit, onRemoved: onUnitsChanged })) + : span({ class: "outpost-map-units__empty" }, "None stationed") + ) + ) ) ) ); diff --git a/src/ui/styles/_account-pages.css b/src/ui/styles/_account-pages.css index 644e9ac5..2d93ee93 100644 --- a/src/ui/styles/_account-pages.css +++ b/src/ui/styles/_account-pages.css @@ -396,15 +396,6 @@ text-overflow: ellipsis; } -@container account-row-info (max-width: 320px) { - .account-row__name { - flex-basis: 100%; - white-space: normal; - overflow: visible; - text-overflow: clip; - } -} - .account-row__badge { font-family: var(--font-mono); font-size: 0.875rem; @@ -424,7 +415,7 @@ } .account-row__controls .number-input-wrapper { - width: 110px; + width: 140px; } .account-row__controls--stack { @@ -481,7 +472,7 @@ } .account-field-metric .number-input-wrapper { - width: var(--account-field-metric-input-width, 118px); + width: var(--account-field-metric-input-width, 140px); } .account-stacked-fields { diff --git a/src/ui/styles/_atlas-shell.css b/src/ui/styles/_atlas-shell.css index ec4de4fc..a920182c 100644 --- a/src/ui/styles/_atlas-shell.css +++ b/src/ui/styles/_atlas-shell.css @@ -315,7 +315,7 @@ body { .atlas-workspace-nav { display: flex; flex-direction: column; - gap: 2px; + gap: 3px; } .atlas-nav-button { @@ -323,15 +323,15 @@ body { align-items: center; gap: 10px; width: 100%; - min-height: 34px; - padding: 7px 8px; + min-height: 38px; + padding: 8px 10px; overflow: hidden; color: var(--atlas-text-muted, #52617a); background: transparent; border: 1px solid transparent; border-radius: 7px; font-family: inherit; - font-size: 12px; + font-size: 14px; font-weight: 600; text-align: left; text-decoration: none; @@ -354,16 +354,16 @@ body { .atlas-nav-button svg { flex: 0 0 auto; - width: 16px; - height: 16px; - opacity: 0.8; + width: 18px; + height: 18px; + opacity: 0.85; } .atlas-nav-shortcut { margin-left: auto; color: #a0aabc; font-family: var(--font-mono); - font-size: 12px; + font-size: 11px; } .atlas-sidebar-divider { diff --git a/src/ui/styles/_masterclasses.css b/src/ui/styles/_masterclasses.css index 4a986d89..8e295957 100644 --- a/src/ui/styles/_masterclasses.css +++ b/src/ui/styles/_masterclasses.css @@ -57,7 +57,7 @@ .masterclass-currency__fields, .grimoire-currency__fields { display: grid; - grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); + grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 8px; } @@ -102,6 +102,15 @@ align-items: center; gap: 6px; flex-wrap: wrap; + margin-bottom: 2px; +} + +.outpost-field__label-main { + font-size: 0.75rem; + font-weight: 800; + letter-spacing: 0.04em; + color: var(--c-text-main); + white-space: nowrap; } .masterclass-currency__icon { @@ -145,44 +154,59 @@ } .resource-node-row__field .number-input-wrapper { - width: 130px; + width: 160px; } .outpost-field .number-input-wrapper, .outpost-map-unit__field .number-input-wrapper { - width: 120px; + width: 180px; max-width: 100%; } -.outpost-glorified-button { - width: 100%; - min-height: 34px; +.outpost-ranks-grid .outpost-field .number-input-wrapper { + width: 210px; } -.grimoire-currency__toggle { - grid-template-columns: max-content max-content; - grid-template-areas: - "info info" - "badge controls"; - gap: 6px; - justify-content: start; - padding: 0; - border: 0; - background: transparent; +.outpost-kill-row__controls .number-input-wrapper { + width: 160px; } -.grimoire-currency__toggle .account-row__info { - grid-area: info; +.grimoire-currency__toggle, +.masterclass-currency__toggle { + display: flex; + align-items: center; + justify-content: space-between; + gap: 10px; + min-height: 40px; + padding: 8px 12px; + border: 1px solid var(--c-border); + border-radius: 6px; + background: var(--c-panel); +} + +.grimoire-currency__toggle .account-row__info, +.masterclass-currency__toggle .account-row__info { + flex: 1 1 auto; + min-width: 0; } -.grimoire-currency__toggle .account-row__badge { - grid-area: badge; - justify-self: start; +.grimoire-currency__toggle .account-row__name, +.masterclass-currency__toggle .account-row__name { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; } -.grimoire-currency__toggle .account-row__controls { - grid-area: controls; - justify-self: start; +.grimoire-currency__toggle .account-row__badge, +.masterclass-currency__toggle .account-row__badge { + flex: 0 0 auto; +} + +.grimoire-currency__toggle .account-row__controls, +.masterclass-currency__toggle .account-row__controls { + flex: 0 0 auto; + display: flex; + align-items: center; } .grimoire-upgrade-list, @@ -264,19 +288,21 @@ .outpost-card, .outpost-vanilla-units { - display: grid; - gap: 12px; - padding: 12px; + display: flex; + flex-direction: column; + gap: 16px; + padding: 16px; border: 1px solid var(--c-border); + border-radius: 8px; background: color-mix(in srgb, var(--c-panel) 86%, transparent); } .outpost-card__header { display: flex; - align-items: flex-start; + align-items: center; justify-content: space-between; - gap: 12px; - padding-bottom: 10px; + gap: 16px; + padding-bottom: 12px; border-bottom: 1px solid var(--c-border); } @@ -284,30 +310,140 @@ display: grid; grid-template-columns: max-content minmax(0, 1fr); align-items: center; - gap: 8px; + gap: 10px; } .outpost-card__status { flex: 0 0 auto; } +.outpost-glorified-button { + min-width: 120px; + height: 32px; + padding: 0 14px; + border-radius: 6px; + font-size: 0.75rem; + font-weight: 800; + letter-spacing: 0.05em; + cursor: pointer; + transition: all 0.2s ease; +} + +.outpost-glorified-button.is-glorified { + background: color-mix(in srgb, var(--c-accent) 18%, transparent); + border: 1px solid var(--c-accent); + color: var(--c-accent); + box-shadow: 0 0 8px var(--c-accent-glow, rgba(139, 141, 245, 0.25)); +} + +.outpost-glorified-button.is-standard { + background: var(--c-panel-dim); + border: 1px solid var(--c-border); + color: var(--c-text-muted); +} + +.outpost-glorified-button:hover { + border-color: var(--c-accent-hover, var(--c-accent)); + color: var(--c-text-main); +} + .outpost-card__body { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); - gap: 12px 24px; - align-items: start; + display: flex; + flex-direction: column; + gap: 14px; } -.outpost-card__group { - display: grid; +.outpost-section { + display: flex; + flex-direction: column; + gap: 12px; + padding: 12px 14px; + border: 1px solid color-mix(in srgb, var(--c-border) 60%, transparent); + border-radius: 6px; + background: color-mix(in srgb, var(--c-panel-dim) 50%, transparent); +} + +.outpost-section-header { + display: flex; + align-items: center; + justify-content: space-between; gap: 8px; + padding-bottom: 6px; + border-bottom: 1px solid color-mix(in srgb, var(--c-border) 40%, transparent); } .outpost-card__group-title { color: var(--c-accent); font-size: 0.75rem; font-weight: 900; - letter-spacing: 0.05em; + letter-spacing: 0.06em; + text-transform: uppercase; +} + +.outpost-facility-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); + gap: 12px 18px; + align-items: start; +} + +.outpost-ranks-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); + gap: 14px 22px; + align-items: start; +} + +.outpost-slots-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(90px, 1fr)); + gap: 8px; +} + +.outpost-slot-item { + display: flex; + flex-direction: column; + gap: 4px; + padding: 6px 8px; + border: 1px solid var(--c-border); + border-radius: 6px; + background: var(--c-panel); + transition: + opacity 0.2s, + border-color 0.2s; +} + +.outpost-slot-item.is-locked { + opacity: 0.5; + background: transparent; +} + +.outpost-slot-number { + font-size: 0.7rem; + font-weight: 800; + color: var(--c-text-muted); + font-family: var(--font-mono); + text-align: center; +} + +.outpost-slots__count { + font-size: 0.75rem; + font-weight: 700; + color: var(--c-text-muted); + font-family: var(--font-mono); +} + +.outpost-map-units-wrapper { + display: flex; + flex-direction: column; + gap: 10px; +} + +.outpost-map-units-list { + display: flex; + flex-wrap: wrap; + gap: 8px; + align-items: center; } .outpost-select-field__select, @@ -350,14 +486,6 @@ opacity: 0.55; } -.outpost-slots, -.outpost-map-units { - display: grid; - grid-column: 1 / -1; - gap: 8px; - grid-template-columns: repeat(auto-fit, minmax(88px, 1fr)); -} - .outpost-map-units { grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); } diff --git a/src/ui/styles/_theme.css b/src/ui/styles/_theme.css index fe86bd2a..c5601816 100644 --- a/src/ui/styles/_theme.css +++ b/src/ui/styles/_theme.css @@ -2,7 +2,8 @@ * Atlas light/dark themes. All base values are Chromium 87-safe HEX/RGBA colors. */ -:root { +:root, +:root[data-theme="dark"] { color-scheme: dark; --atlas-header-height: 48px; --atlas-sidebar-width: 220px; @@ -44,43 +45,6 @@ --atlas-disabled-text: #7f8aa3; } -:root[data-theme="dark"] { - color-scheme: dark; - --atlas-canvas: #10121a; - --atlas-surface: #171b25; - --atlas-surface-raised: #1c2130; - --atlas-surface-muted: #1a1f2c; - --atlas-surface-hover: #242b3b; - --atlas-field: #111620; - --atlas-border: #30384a; - --atlas-border-strong: #46516a; - --atlas-text: #eceff8; - --atlas-text-muted: #bec3d1; - --atlas-text-soft: #8f99ae; - --atlas-accent: #8b8df5; - --atlas-accent-hover: #a7a8ff; - --atlas-accent-soft: #292b50; - --atlas-focus: #a7a8ff; - --atlas-success: #59d99a; - --atlas-success-soft: rgba(89, 217, 154, 0.12); - --atlas-danger: #ff7189; - --atlas-danger-soft: rgba(255, 113, 137, 0.12); - --atlas-warning: #f3b84b; - --atlas-warning-soft: rgba(243, 184, 75, 0.12); - --atlas-overlay-02: rgba(255, 255, 255, 0.02); - --atlas-overlay-03: rgba(255, 255, 255, 0.03); - --atlas-overlay-04: rgba(255, 255, 255, 0.04); - --atlas-overlay-05: rgba(255, 255, 255, 0.05); - --atlas-overlay-10: rgba(255, 255, 255, 0.1); - --atlas-shadow: rgba(0, 0, 0, 0.34); - --atlas-scrollbar: #46516a; - --atlas-control-bg: #7779f4; - --atlas-control-hover: #8b8df5; - --atlas-control-text: #ffffff; - --atlas-disabled-bg: #252b38; - --atlas-disabled-text: #7f8aa3; -} - :root[data-theme="light"] { color-scheme: light; --atlas-canvas: #f4f6fa; @@ -395,81 +359,6 @@ body, background: var(--atlas-accent); } -/* Search workspace */ -#search-tab, -#search-tab .search-layout, -#search-tab .keys-footer, -#search-tab .account-sub-tab-content { - color: var(--c-text-main); - background: var(--c-panel-dim); -} - -#search-tab .search-keys-section, -#search-tab .search-input-section, -#search-tab .search-results-section, -#search-tab .saved-results-section, -#search-tab .section-header, -#search-tab .search-input-content, -#search-tab .search-pane-toolbar, -#search-tab .search-result-item, -#search-tab .search-keys-toggle, -#search-tab .search-inspector-toggle, -#search-tab .search-keys-close, -#search-tab .search-inspector-close, -#search-tab .search-inspector { - background: var(--c-panel); -} - -#search-tab .search-right-column, -#search-tab .search-keys-section, -#search-tab .search-input-section, -#search-tab .section-header, -#search-tab .keys-footer, -#search-tab .search-pane-toolbar, -#search-tab .search-result-item, -#search-tab .search-keys-toggle, -#search-tab .search-inspector-toggle, -#search-tab .search-keys-close, -#search-tab .search-inspector-close, -#search-tab .search-inspector-header { - border-color: var(--c-border); -} - -#search-tab .section-title, -#search-tab .type-label, -#search-tab .selected-count, -#search-tab .keys-loading, -#search-tab .search-result-item, -#search-tab .result-action-btn, -#search-tab .search-inspector-tab, -#search-tab .selected-result-kicker, -#search-tab .selected-result-label { - color: var(--c-text-muted); -} - -#search-tab .key-checkbox, -#search-tab .selected-result-path, -#search-tab .search-inspector-tab:hover { - color: var(--c-text-main); -} - -#search-tab .key-checkbox:hover, -#search-tab .search-inspector-tab:hover { - background: var(--c-panel-hover); -} - -#search-tab .key-checkbox.checked, -#search-tab .results-scope-badge, -#search-tab .search-result-item:hover, -#search-tab .search-result-item.is-selected, -#search-tab .search-toolbar-count, -#search-tab .search-inspector-count, -#search-tab .search-inspector-tab.active { - color: var(--c-accent); - background: var(--c-accent-dim-solid); - border-color: var(--c-border-strong); -} - /* Account workspace */ #options-account-tab, #options-account-tab .account-sub-tab-content { diff --git a/src/ui/styles/_world-tabs.css b/src/ui/styles/_world-tabs.css index f2be03f0..7efdf71d 100644 --- a/src/ui/styles/_world-tabs.css +++ b/src/ui/styles/_world-tabs.css @@ -236,8 +236,8 @@ background: transparent; color: var(--atlas-text-muted, #475569); font-family: var(--font-display); - font-size: 0.75rem; - font-weight: 500; + font-size: 0.84rem; + font-weight: 550; letter-spacing: 0; text-align: left; } diff --git a/src/ui/styles/cheats.css b/src/ui/styles/cheats.css index 14cc70e4..b9fd3abe 100644 --- a/src/ui/styles/cheats.css +++ b/src/ui/styles/cheats.css @@ -121,7 +121,7 @@ color: var(--atlas-text-muted); background: transparent; text-align: left; - font-size: 0.78rem; + font-size: 0.84rem; text-transform: none; letter-spacing: normal; } diff --git a/src/ui/styles/tabs/w2/_killroy.css b/src/ui/styles/tabs/w2/_killroy.css index f6d5bb22..22bb26ee 100644 --- a/src/ui/styles/tabs/w2/_killroy.css +++ b/src/ui/styles/tabs/w2/_killroy.css @@ -9,7 +9,7 @@ } .killroy-row .number-input-wrapper { - width: 120px; + width: 160px; } .killroy-row--blur { diff --git a/src/ui/styles/tabs/w7/_research.css b/src/ui/styles/tabs/w7/_research.css index 7ba051fc..a2ae30fc 100644 --- a/src/ui/styles/tabs/w7/_research.css +++ b/src/ui/styles/tabs/w7/_research.css @@ -182,7 +182,7 @@ } .research-grid-detail__edit-row .number-input-wrapper { - width: 120px; + width: 160px; } .observations-grid { @@ -277,7 +277,7 @@ } .observation-stat__controls .number-input-wrapper { - width: 104px; + width: 140px; } .observation-tile__toggle { From 3c72e96204388f7ff1aec6b5de24e8dd0e6c609e Mon Sep 17 00:00:00 2001 From: Arnold W Date: Wed, 2 Sep 2026 20:38:15 +0200 Subject: [PATCH 14/32] style: trim trailing whitespace in config.js --- config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.js b/config.js index 0e888915..2a6acad4 100644 --- a/config.js +++ b/config.js @@ -520,7 +520,7 @@ exports.cheatConfig = { StatueUpgOdds: (t) => t * 2, // double the odds of statue upgrade Statue_CanAfford: (t) => 1, // free statue upgrades StatueBon: (t) => t * 2, // double statue bonus - ArmoryUpgCost: (t) => t / 2, // half cost armory upgrades + ArmoryUpgCost: (t) => t / 2, // half cost armory upgrades RatDMG: (t) => t * 2, // double rat dmg ParchmentDrop: (t) => t * 2, // double parchment drop MarbleDrop: (t) => t * 2, // double marble drop From 1639ee962f6d35087adc1b0ab5d8e62c464ed8aa Mon Sep 17 00:00:00 2001 From: Arnold W Date: Wed, 2 Sep 2026 21:12:42 +0200 Subject: [PATCH 15/32] feat(ui): restore and style original injector brand logo in header --- src/ui/assets/icons.js | 38 ++++++++++++++++++++------------ src/ui/components/AtlasHeader.js | 2 +- src/ui/styles/_atlas-shell.css | 24 ++++++++++++++------ 3 files changed, 42 insertions(+), 22 deletions(-) diff --git a/src/ui/assets/icons.js b/src/ui/assets/icons.js index 9efbf763..53a54878 100644 --- a/src/ui/assets/icons.js +++ b/src/ui/assets/icons.js @@ -45,20 +45,30 @@ export const Icons = { fill: "white", d: "M108.66,15 L169.34,50 Q178,55 178,65 L178,135 Q178,145 169.34,150 L108.66,185 Q100,190 91.34,185 L30.66,150 Q22,145 22,135 L22,65 Q22,55 30.66,50 L91.34,15 Q100,10 108.66,15 Z", }), - g({ fill: "none", stroke: "black", "stroke-width": "8", transform: "rotate(-45 100 100)" }, [ - rect({ - x: "85", - y: "60", - width: "30", - height: "80", - rx: "4", - fill: "black", - stroke: "none", - }), - line({ x1: "100", y1: "40", x2: "100", y2: "60" }), - line({ x1: "85", y1: "40", x2: "115", y2: "40" }), - line({ x1: "100", y1: "140", x2: "100", y2: "170" }), - ]), + g( + { + fill: "none", + stroke: "black", + "stroke-width": "10", + "stroke-linecap": "round", + transform: "rotate(-45 100 100)", + }, + [ + rect({ + x: "85", + y: "60", + width: "30", + height: "80", + rx: "4", + fill: "black", + stroke: "none", + }), + line({ x1: "74", y1: "60", x2: "126", y2: "60" }), + line({ x1: "100", y1: "38", x2: "100", y2: "60" }), + line({ x1: "82", y1: "38", x2: "118", y2: "38" }), + line({ x1: "100", y1: "140", x2: "100", y2: "172" }), + ] + ), ]) ), rect({ diff --git a/src/ui/components/AtlasHeader.js b/src/ui/components/AtlasHeader.js index 7a833b33..6a1ab294 100644 --- a/src/ui/components/AtlasHeader.js +++ b/src/ui/components/AtlasHeader.js @@ -24,7 +24,7 @@ export const AtlasHeader = () => }, span({ "aria-hidden": "true" }, span(), span(), span()) ), - span({ class: "atlas-brand-mark", "aria-hidden": "true" }, Icons.Lightning()), + span({ class: "atlas-brand-mark", "aria-hidden": "true" }, Icons.Logo()), span({ class: "atlas-brand-name" }, "Idleon Injector") ), div( diff --git a/src/ui/styles/_atlas-shell.css b/src/ui/styles/_atlas-shell.css index a920182c..de6a477c 100644 --- a/src/ui/styles/_atlas-shell.css +++ b/src/ui/styles/_atlas-shell.css @@ -59,8 +59,8 @@ body { } .atlas-header-brand { - gap: 8px; - font-size: 13px; + gap: 9px; + font-size: 14px; font-weight: 700; white-space: nowrap; } @@ -71,14 +71,24 @@ body { justify-content: center; width: 26px; height: 26px; - color: #ffffff; - background: #6768f5; - border-radius: 7px; + color: var(--atlas-accent); + background: transparent; + border-radius: 0; + flex-shrink: 0; + transition: + transform 0.2s ease, + filter 0.2s ease; +} + +.atlas-brand-mark:hover { + transform: scale(1.08); + filter: drop-shadow(0 0 8px var(--c-accent-glow, rgba(139, 141, 245, 0.45))); } .atlas-brand-mark svg { - width: 15px; - height: 15px; + width: 26px; + height: 26px; + display: block; } .atlas-brand-name { From 79b5d35a6efe0fcd53b99ec7edd90b8a29b556b6 Mon Sep 17 00:00:00 2001 From: Arnold W Date: Wed, 2 Sep 2026 21:22:45 +0200 Subject: [PATCH 16/32] fix(ui): add dark mode support to search workspace --- src/ui/styles/_search.css | 158 +++++++++++++++++++++----------------- 1 file changed, 86 insertions(+), 72 deletions(-) diff --git a/src/ui/styles/_search.css b/src/ui/styles/_search.css index 0eab5661..849bcbfd 100644 --- a/src/ui/styles/_search.css +++ b/src/ui/styles/_search.css @@ -147,14 +147,14 @@ height: 32px; padding: 0; border: 0; - color: #94a3b8; + color: var(--atlas-text-soft); background: transparent; } .key-favorite-btn:hover, .key-favorite-btn.active { - color: #d58a08; - background: #fff7df; + color: var(--atlas-warning); + background: var(--atlas-warning-soft); } .key-favorite-btn .icon-base { @@ -782,15 +782,15 @@ #search-tab { --font-display: var(--font-sans, "Inter", "Segoe UI", sans-serif); padding: 0; - background: #f8fafc; - color: #0f172a; + background: var(--atlas-canvas); + color: var(--atlas-text); } #search-tab .search-layout { position: relative; grid-template-columns: 224px minmax(420px, 1fr) 336px; gap: 0; - background: #f8fafc; + background: var(--atlas-canvas); } #search-tab .search-right-column { @@ -798,7 +798,7 @@ grid-row: 1; grid-template-rows: auto minmax(0, 1fr); gap: 0; - border-right: 1px solid #e2e8f0; + border-right: 1px solid var(--atlas-border); } #search-tab .search-keys-section, @@ -807,28 +807,28 @@ #search-tab .saved-results-section { border: 0; border-radius: 0; - background: #ffffff; + background: var(--atlas-surface); } #search-tab .search-keys-section { grid-column: 1; grid-row: 1; - border-right: 1px solid #e2e8f0; + border-right: 1px solid var(--atlas-border); } #search-tab .search-input-section { - border-bottom: 1px solid #e2e8f0; + border-bottom: 1px solid var(--atlas-border); } #search-tab .section-header { min-height: 42px; padding: 7px 10px; - border-bottom-color: #e2e8f0; - background: #ffffff; + border-bottom: 1px solid var(--atlas-border); + background: var(--atlas-surface); } #search-tab .section-title { - color: #64748b; + color: var(--atlas-text-muted); font-size: 0.75rem; font-weight: 700; letter-spacing: 0.08em; @@ -836,7 +836,7 @@ #search-tab .search-input-content { padding: 10px; - background: #ffffff; + background: var(--atlas-surface); } #search-tab .scan-type-row { @@ -851,24 +851,24 @@ #search-tab .type-label, #search-tab .selected-count, #search-tab .keys-loading { - color: #64748b; + color: var(--atlas-text-muted); } #search-tab .keys-content, #search-tab .results-content, #search-tab .saved-results-content { padding: 8px; - scrollbar-color: #cbd5e1 transparent; + scrollbar-color: var(--atlas-scrollbar) transparent; } #search-tab .keys-footer { padding: 7px 10px; - border-top-color: #e2e8f0; - background: #f8fafc; + border-top: 1px solid var(--atlas-border); + background: var(--atlas-surface-muted); } #search-tab .keys-group-header { - color: #4f46e5; + color: var(--atlas-accent); font-size: 0.75rem; letter-spacing: 0.08em; } @@ -876,16 +876,17 @@ #search-tab .key-checkbox { min-height: 36px; border-radius: 6px; - color: #334155; + color: var(--atlas-text); font-size: 0.75rem; } #search-tab .key-checkbox:hover { - background: #f1f5f9; + background: var(--atlas-surface-hover); } #search-tab .key-checkbox.checked { - background: #eef2ff; + background: var(--atlas-accent-soft); + color: var(--atlas-accent); } #search-tab .key-checkbox-label { @@ -893,20 +894,20 @@ } #search-tab .results-scope-badge { - border-color: #c7d2fe; + border: 1px solid var(--atlas-border-strong); border-radius: 999px; - background: #eef2ff; - color: #4f46e5; + background: var(--atlas-accent-soft); + color: var(--atlas-accent); } #search-tab .search-result-item { min-height: 36px; height: auto; padding: 6px 9px; - border-color: #e2e8f0; + border: 1px solid var(--atlas-border); border-radius: 7px; - background: #ffffff; - color: #475569; + background: var(--atlas-surface); + color: var(--atlas-text-muted); cursor: pointer; transition: border-color 0.15s ease, @@ -916,13 +917,13 @@ #search-tab .search-result-item:hover, #search-tab .search-result-item.is-selected { - border-color: #c7d2fe; - background: #eef2ff; - color: #312e81; + border-color: var(--atlas-border-strong); + background: var(--atlas-accent-soft); + color: var(--atlas-accent); } #search-tab .search-result-item.is-selected { - box-shadow: inset 3px 0 #6366f1; + box-shadow: inset 3px 0 var(--atlas-accent); } #search-tab .result-path, @@ -933,19 +934,24 @@ #search-tab .result-value.type-number, #search-tab .type-value.type-number { - color: #4f46e5; + color: var(--atlas-accent); } #search-tab .result-value.type-string, #search-tab .type-value.type-string { - color: #047857; + color: var(--atlas-success); } #search-tab .result-action-btn { width: 32px; min-height: 32px; border-radius: 5px; - color: #64748b; + color: var(--atlas-text-muted); +} + +#search-tab .result-action-btn:hover { + color: var(--atlas-text); + background: var(--atlas-surface-hover); } #search-tab .search-result-item:focus-within .result-action-btn, @@ -954,8 +960,8 @@ } #search-tab .result-action-btn.monitor-btn.active { - background: #ecfdf5; - color: #059669; + background: var(--atlas-success-soft); + color: var(--atlas-success); } #search-tab .saved-result-item { @@ -1000,8 +1006,8 @@ justify-content: flex-end; gap: 6px; padding: 6px 10px; - border-bottom: 1px solid #e2e8f0; - background: #ffffff; + border-bottom: 1px solid var(--atlas-border); + background: var(--atlas-surface); } .search-keys-toggle, @@ -1009,15 +1015,23 @@ .search-keys-close, .search-inspector-close { min-height: 32px; - border: 1px solid #e2e8f0; + border: 1px solid var(--atlas-border); border-radius: 7px; - background: #ffffff; - color: #475569; + background: var(--atlas-surface); + color: var(--atlas-text-muted); cursor: pointer; font-size: 0.75rem; font-weight: 600; } +.search-keys-toggle:hover, +.search-inspector-toggle:hover, +.search-keys-close:hover, +.search-inspector-close:hover { + background: var(--atlas-surface-hover); + color: var(--atlas-text); +} + .search-keys-toggle, .search-inspector-toggle { display: inline-flex; @@ -1033,8 +1047,8 @@ height: 18px; place-items: center; border-radius: 999px; - background: #eef2ff; - color: #4f46e5; + background: var(--atlas-accent-soft); + color: var(--atlas-accent); font-family: var(--font-mono); font-size: 0.75rem; } @@ -1059,7 +1073,7 @@ min-height: 0; flex-direction: column; overflow: hidden; - background: #ffffff; + background: var(--atlas-surface); } .search-inspector-header { @@ -1068,7 +1082,7 @@ align-items: center; gap: 8px; padding: 6px 8px; - border-bottom: 1px solid #e2e8f0; + border-bottom: 1px solid var(--atlas-border); } .search-inspector-tabs { @@ -1086,20 +1100,20 @@ border: 0; border-radius: 6px; background: transparent; - color: #64748b; + color: var(--atlas-text-muted); cursor: pointer; font-size: 0.75rem; font-weight: 600; } .search-inspector-tab:hover { - background: #f1f5f9; - color: #0f172a; + background: var(--atlas-surface-hover); + color: var(--atlas-text); } .search-inspector-tab.active { - background: #eef2ff; - color: #4338ca; + background: var(--atlas-accent-soft); + color: var(--atlas-accent); } .search-inspector-close { @@ -1150,14 +1164,14 @@ .selected-result-kicker, .selected-result-label { - color: #94a3b8; + color: var(--atlas-text-soft); font-size: 0.75rem; font-weight: 700; letter-spacing: 0.1em; } .selected-result-path { - color: #0f172a; + color: var(--atlas-text); font-family: var(--font-mono); font-size: 0.75rem; font-weight: 600; @@ -1175,13 +1189,13 @@ justify-content: space-between; gap: 12px; padding: 7px 0; - border-bottom: 1px solid #f1f5f9; - color: #64748b; + border-bottom: 1px solid var(--atlas-border); + color: var(--atlas-text-muted); font-size: 0.75rem; } .selected-result-meta > div > span:last-child { - color: #0f172a; + color: var(--atlas-text); font-family: var(--font-mono); text-align: right; } @@ -1191,13 +1205,13 @@ flex-direction: column; gap: 6px; padding: 10px; - border: 1px solid #e2e8f0; + border: 1px solid var(--atlas-border); border-radius: 8px; - background: #f8fafc; + background: var(--atlas-surface-muted); } .selected-result-display { - color: #0f172a; + color: var(--atlas-text); font-family: var(--font-mono); font-size: 0.8125rem; overflow-wrap: anywhere; @@ -1210,13 +1224,13 @@ .selected-result-history { min-height: 56px; padding: 8px; - border: 1px solid #e2e8f0; + border: 1px solid var(--atlas-border); border-radius: 8px; - background: #ffffff; + background: var(--atlas-surface); } .selected-result-history-empty { - color: #94a3b8; + color: var(--atlas-text-soft); font-size: 0.75rem; line-height: 1.45; } @@ -1235,8 +1249,8 @@ .selected-result-history-values span { padding: 2px 5px; border-radius: 4px; - background: #f1f5f9; - color: #64748b; + background: var(--atlas-surface-hover); + color: var(--atlas-text-muted); font-family: var(--font-mono); font-size: 0.75rem; white-space: nowrap; @@ -1270,9 +1284,9 @@ } .selected-monitor-action.active { - border-color: #a7f3d0; - background: #ecfdf5; - color: #047857; + border-color: var(--atlas-success); + background: var(--atlas-success-soft); + color: var(--atlas-success); } .search-inspector-backdrop, @@ -1285,7 +1299,7 @@ #search-tab select:focus-visible, #search-tab summary:focus-visible, #search-tab .search-result-item:focus-visible { - outline: 2px solid #6366f1; + outline: 2px solid var(--atlas-focus); outline-offset: 2px; } @@ -1309,7 +1323,7 @@ transform: translateX(102%); visibility: hidden; pointer-events: none; - box-shadow: -14px 0 32px rgba(15, 23, 42, 0.18); + box-shadow: -14px 0 32px var(--atlas-shadow); transition: transform 0.2s ease; z-index: 41; } @@ -1330,7 +1344,7 @@ z-index: 40; display: block; border: 0; - background: rgba(15, 23, 42, 0.36); + background: rgba(0, 0, 0, 0.45); opacity: 0; pointer-events: none; transition: opacity 0.2s ease; @@ -1367,7 +1381,7 @@ transform: translateX(-102%); visibility: hidden; pointer-events: none; - box-shadow: 14px 0 32px rgba(15, 23, 42, 0.18); + box-shadow: 14px 0 32px var(--atlas-shadow); transition: transform 0.2s ease; z-index: 31; } @@ -1388,7 +1402,7 @@ z-index: 30; display: block; border: 0; - background: rgba(15, 23, 42, 0.36); + background: rgba(0, 0, 0, 0.45); opacity: 0; pointer-events: none; transition: opacity 0.2s ease; From f7e5f4a043aa157de818dfc95f75d287c12f3bf2 Mon Sep 17 00:00:00 2001 From: Arnold W Date: Thu, 3 Sep 2026 15:38:23 +0200 Subject: [PATCH 17/32] fix(ui): add inert polyfill and harden CSS fallback for Chromium 87 --- src/ui/entry/index.html | 26 ++++++++++++++++++++++---- src/ui/styles/_atlas-shell.css | 2 +- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/src/ui/entry/index.html b/src/ui/entry/index.html index fda94463..43fc3273 100644 --- a/src/ui/entry/index.html +++ b/src/ui/entry/index.html @@ -5,10 +5,28 @@ Idleon Injector diff --git a/src/ui/styles/_atlas-shell.css b/src/ui/styles/_atlas-shell.css index de6a477c..3c69b974 100644 --- a/src/ui/styles/_atlas-shell.css +++ b/src/ui/styles/_atlas-shell.css @@ -12,7 +12,7 @@ body { } /* Chromium 87 compatibility fallback for inert attribute */ -[inert] { +[inert]:not([inert="false"]) { pointer-events: none !important; user-select: none !important; } From 84a8143c985d2427d12846157e486ccc289035f4 Mon Sep 17 00:00:00 2001 From: Arnold W Date: Thu, 3 Sep 2026 16:01:00 +0200 Subject: [PATCH 18/32] fix(cheats,ui): position overlay below game title bar and mark header controls no-drag --- src/cheats/ui/overlay.js | 169 +++++++++++++++++---------------- src/ui/styles/_atlas-shell.css | 7 ++ 2 files changed, 96 insertions(+), 80 deletions(-) diff --git a/src/cheats/ui/overlay.js b/src/cheats/ui/overlay.js index 97be6132..f561c576 100644 --- a/src/cheats/ui/overlay.js +++ b/src/cheats/ui/overlay.js @@ -11,80 +11,86 @@ import { webPort } from "../core/state.js"; const Z_INDEX_BASE = 1000000; const TRANSITION_SETTINGS = "0.25s cubic-bezier(0.16, 1, 0.3, 1)"; -const STYLES = { - container: ` - position: fixed; - inset: 0; - z-index: ${Z_INDEX_BASE}; - pointer-events: none; - overflow: hidden; - `, - iframe: ` - position: absolute; - inset: 0; - width: 100vw; - height: 100vh; - border: none; - transform: translateY(-100%); - transition: transform ${TRANSITION_SETTINGS}; - background: #10121a; - box-shadow: 0 10px 30px rgba(0,0,0,0.7); - pointer-events: auto; - z-index: ${Z_INDEX_BASE + 1}; - `, - buttonBase: ` - font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; - font-weight: 600; - font-size: 12px; - cursor: pointer; - user-select: none; - pointer-events: auto; - z-index: ${Z_INDEX_BASE + 2}; - transition: all 0.2s ease; - -webkit-app-region: no-drag; - text-align: center; - box-sizing: border-box; - `, - buttonDefault: ` - background: #090b14; - color: #c8cede; - padding: 0 16px; - height: 28px; - line-height: 26px; - border-radius: 0 0 8px 8px; - letter-spacing: 0.06em; - box-shadow: 0 4px 14px rgba(0, 0, 0, 0.5); - border: 1px solid #293043; - border-top: none; - position: absolute; - top: 0; - left: 50%; - transform: translateX(-50%); - display: flex; - align-items: center; - justify-content: center; - text-transform: uppercase; - `, - buttonExpanded: ` - background: rgba(217, 67, 95, 0.15); - color: #ff7189; - padding: 0 14px; - height: 32px; - line-height: 30px; - border-radius: 7px; - letter-spacing: 0.04em; - box-shadow: 0 1px 4px rgba(0, 0, 0, 0.2); - border: 1px solid rgba(255, 113, 137, 0.3); - position: absolute; - top: 8px; - right: 12px; - transform: none; - display: flex; - align-items: center; - justify-content: center; - text-transform: uppercase; - `, -}; +function getStyles(menuOffset = 0) { + return { + container: ` + position: fixed; + top: ${menuOffset}px; + left: 0; + right: 0; + bottom: 0; + height: calc(100vh - ${menuOffset}px); + z-index: ${Z_INDEX_BASE}; + pointer-events: none; + overflow: hidden; + `, + iframe: ` + position: absolute; + inset: 0; + width: 100vw; + height: 100%; + border: none; + transform: translateY(-100%); + transition: transform ${TRANSITION_SETTINGS}; + background: #10121a; + box-shadow: 0 10px 30px rgba(0,0,0,0.7); + pointer-events: auto; + z-index: ${Z_INDEX_BASE + 1}; + `, + buttonBase: ` + font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; + font-weight: 600; + font-size: 12px; + cursor: pointer; + user-select: none; + pointer-events: auto; + z-index: ${Z_INDEX_BASE + 2}; + transition: all 0.2s ease; + -webkit-app-region: no-drag; + text-align: center; + box-sizing: border-box; + `, + buttonDefault: ` + background: #090b14; + color: #c8cede; + padding: 0 16px; + height: 28px; + line-height: 26px; + border-radius: 0 0 8px 8px; + letter-spacing: 0.06em; + box-shadow: 0 4px 14px rgba(0, 0, 0, 0.5); + border: 1px solid #293043; + border-top: none; + position: absolute; + top: 0; + left: 50%; + transform: translateX(-50%); + display: flex; + align-items: center; + justify-content: center; + text-transform: uppercase; + `, + buttonExpanded: ` + background: rgba(217, 67, 95, 0.15); + color: #ff7189; + padding: 0 14px; + height: 32px; + line-height: 30px; + border-radius: 7px; + letter-spacing: 0.04em; + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.2); + border: 1px solid rgba(255, 113, 137, 0.3); + position: absolute; + top: 8px; + right: 12px; + transform: none; + display: flex; + align-items: center; + justify-content: center; + text-transform: uppercase; + `, + }; +} // UI state let uiContainer = null; @@ -98,18 +104,22 @@ let isUiExpanded = false; export function injectWebUI() { if (uiContainer || webPort === undefined || webPort === null) return; + const menuBar = document.getElementById("menuBar"); + const menuOffset = menuBar ? menuBar.offsetHeight : 0; + const styles = getStyles(menuOffset); + uiContainer = document.createElement("div"); uiContainer.id = "cheat-ui-container"; - uiContainer.style.cssText = STYLES.container; + uiContainer.style.cssText = styles.container; uiIframe = document.createElement("iframe"); uiIframe.src = `http://localhost:${webPort}`; - uiIframe.style.cssText = STYLES.iframe; + uiIframe.style.cssText = styles.iframe; const toggleBtn = document.createElement("div"); toggleBtn.id = "cheat-ui-toggle"; toggleBtn.innerHTML = "CHEATS"; - toggleBtn.style.cssText = STYLES.buttonBase + STYLES.buttonDefault; + toggleBtn.style.cssText = styles.buttonBase + styles.buttonDefault; toggleBtn.onmouseover = () => { if (!isUiExpanded) { @@ -148,14 +158,13 @@ export function injectWebUI() { if (isUiExpanded) { uiIframe.style.transform = "translateY(0)"; toggleBtn.innerHTML = "CLOSE"; - toggleBtn.style.cssText = STYLES.buttonBase + STYLES.buttonExpanded; + toggleBtn.style.cssText = styles.buttonBase + styles.buttonExpanded; } else { uiIframe.style.transform = "translateY(-100%)"; toggleBtn.innerHTML = "CHEATS"; - toggleBtn.style.cssText = STYLES.buttonBase + STYLES.buttonDefault; + toggleBtn.style.cssText = styles.buttonBase + styles.buttonDefault; } }; - uiContainer.appendChild(uiIframe); uiContainer.appendChild(toggleBtn); document.body.appendChild(uiContainer); diff --git a/src/ui/styles/_atlas-shell.css b/src/ui/styles/_atlas-shell.css index 3c69b974..8229dbc5 100644 --- a/src/ui/styles/_atlas-shell.css +++ b/src/ui/styles/_atlas-shell.css @@ -48,6 +48,13 @@ body { color: #f6f7fb; background: var(--atlas-header); border-bottom: 1px solid var(--atlas-header-border); + -webkit-app-region: no-drag; +} + +.atlas-header button, +.atlas-header a, +.atlas-sidebar button { + -webkit-app-region: no-drag; } .atlas-header-brand, From bbcd75136c2ff8ecf78d00cd24ad9b08f0b33ae0 Mon Sep 17 00:00:00 2001 From: Arnold W Date: Thu, 3 Sep 2026 17:14:07 +0200 Subject: [PATCH 19/32] fix(ui): make sidebar scrollable and prevent lower controls cut-off on small windows --- src/ui/styles/_atlas-shell.css | 33 +++++++++++++++++++++++++++++---- src/ui/styles/_world-tabs.css | 4 ---- src/ui/styles/cheats.css | 4 ---- 3 files changed, 29 insertions(+), 12 deletions(-) diff --git a/src/ui/styles/_atlas-shell.css b/src/ui/styles/_atlas-shell.css index 8229dbc5..21e96d55 100644 --- a/src/ui/styles/_atlas-shell.css +++ b/src/ui/styles/_atlas-shell.css @@ -298,7 +298,11 @@ body { width: var(--atlas-sidebar-width); min-width: 0; padding: 12px 10px 10px; - overflow: hidden; + overflow-x: hidden; + overflow-y: auto; + overscroll-behavior: contain; + scrollbar-width: thin; + scrollbar-color: var(--atlas-scrollbar) transparent; color: var(--atlas-text); background: var(--atlas-surface); border-right: 1px solid var(--atlas-border); @@ -309,6 +313,23 @@ body { transform 0.2s ease; } +.atlas-sidebar::-webkit-scrollbar { + width: 5px; +} + +.atlas-sidebar::-webkit-scrollbar-track { + background: transparent; +} + +.atlas-sidebar::-webkit-scrollbar-thumb { + background: var(--atlas-scrollbar); + border-radius: 3px; +} + +.atlas-sidebar::-webkit-scrollbar-thumb:hover { + background: var(--atlas-accent); +} + .atlas-sidebar.sidebar-collapsed, .atlas-sidebar.is-responsive-rail { flex-basis: var(--atlas-sidebar-collapsed-width); @@ -390,9 +411,9 @@ body { } .atlas-context-slot { - flex: 1 1 auto; - min-height: 0; - overflow: hidden; + flex: 0 0 auto; + min-height: min-content; + overflow: visible; } .atlas-context-placeholder { @@ -418,6 +439,7 @@ body { .atlas-sidebar-footer { flex: 0 0 auto; + margin-top: auto; padding-top: 10px; border-top: 1px solid var(--atlas-border); } @@ -537,6 +559,9 @@ body { z-index: 2600; width: min(310px, 86vw); padding: 14px 12px 12px; + overflow-x: hidden; + overflow-y: auto; + overscroll-behavior: contain; visibility: hidden; transform: translateX(-102%); box-shadow: 18px 0 44px rgba(20, 33, 61, 0.18); diff --git a/src/ui/styles/_world-tabs.css b/src/ui/styles/_world-tabs.css index 7efdf71d..610b7502 100644 --- a/src/ui/styles/_world-tabs.css +++ b/src/ui/styles/_world-tabs.css @@ -201,21 +201,17 @@ .account-workspace-context { display: flex; - height: 100%; min-height: 0; flex-direction: column; - overflow: hidden; } .account-root-nav.account-sub-nav { position: static; display: flex; min-height: 0; - flex: 1; flex-direction: column; flex-wrap: nowrap; gap: 2px; - overflow-y: auto; padding: 8px; border: 0; background: transparent; diff --git a/src/ui/styles/cheats.css b/src/ui/styles/cheats.css index b9fd3abe..e4c35c31 100644 --- a/src/ui/styles/cheats.css +++ b/src/ui/styles/cheats.css @@ -84,10 +84,8 @@ .atlas-cheat-context { display: flex; - height: 100%; min-height: 0; flex-direction: column; - overflow: hidden; } .atlas-tree-heading { @@ -103,9 +101,7 @@ } .atlas-category-scopes { - flex: 1; min-height: 0; - overflow-y: auto; padding-bottom: 8px; } From d61bfaaaca38519cd228f50210057d530a58948c Mon Sep 17 00:00:00 2001 From: Arnold W Date: Thu, 3 Sep 2026 17:25:37 +0200 Subject: [PATCH 20/32] fix(cheats): ensure title bar and child layers are draggable --- src/cheats/ui/overlay.js | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/cheats/ui/overlay.js b/src/cheats/ui/overlay.js index f561c576..fffb2e47 100644 --- a/src/cheats/ui/overlay.js +++ b/src/cheats/ui/overlay.js @@ -106,6 +106,21 @@ export function injectWebUI() { const menuBar = document.getElementById("menuBar"); const menuOffset = menuBar ? menuBar.offsetHeight : 0; + if (menuBar) { + menuBar.style.webkitAppRegion = "drag"; + const blockers = menuBar.querySelectorAll( + ".menuTopper, #menuBarBg, #menuBarGradient0, #menuBarGradient1, #menuBarGradient2" + ); + for (const el of blockers) { + el.style.pointerEvents = "none"; + } + const left = menuBar.querySelector(".left"); + if (left) { + left.style.webkitAppRegion = "drag"; + const header = left.querySelector(".menuHeader"); + if (header) header.style.webkitAppRegion = "drag"; + } + } const styles = getStyles(menuOffset); uiContainer = document.createElement("div"); From 7fdf3c388d586d7708c8c54f17bd3653cbd9d25d Mon Sep 17 00:00:00 2001 From: Arnold W Date: Thu, 3 Sep 2026 17:31:34 +0200 Subject: [PATCH 21/32] fix(ui): make atlas header draggable while keeping controls interactive --- src/ui/styles/_atlas-shell.css | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ui/styles/_atlas-shell.css b/src/ui/styles/_atlas-shell.css index 21e96d55..6414b300 100644 --- a/src/ui/styles/_atlas-shell.css +++ b/src/ui/styles/_atlas-shell.css @@ -48,11 +48,12 @@ body { color: #f6f7fb; background: var(--atlas-header); border-bottom: 1px solid var(--atlas-header-border); - -webkit-app-region: no-drag; + -webkit-app-region: drag; } .atlas-header button, .atlas-header a, +.atlas-header input, .atlas-sidebar button { -webkit-app-region: no-drag; } From 8aed566903b9cedbe4f048b01f937b021c78c9c0 Mon Sep 17 00:00:00 2001 From: Arnold W Date: Thu, 3 Sep 2026 17:37:46 +0200 Subject: [PATCH 22/32] fix(cheats,ui): revert title bar modifications while keeping WebUI below title bar --- src/cheats/ui/overlay.js | 15 --------------- src/ui/styles/_atlas-shell.css | 3 +-- 2 files changed, 1 insertion(+), 17 deletions(-) diff --git a/src/cheats/ui/overlay.js b/src/cheats/ui/overlay.js index fffb2e47..f561c576 100644 --- a/src/cheats/ui/overlay.js +++ b/src/cheats/ui/overlay.js @@ -106,21 +106,6 @@ export function injectWebUI() { const menuBar = document.getElementById("menuBar"); const menuOffset = menuBar ? menuBar.offsetHeight : 0; - if (menuBar) { - menuBar.style.webkitAppRegion = "drag"; - const blockers = menuBar.querySelectorAll( - ".menuTopper, #menuBarBg, #menuBarGradient0, #menuBarGradient1, #menuBarGradient2" - ); - for (const el of blockers) { - el.style.pointerEvents = "none"; - } - const left = menuBar.querySelector(".left"); - if (left) { - left.style.webkitAppRegion = "drag"; - const header = left.querySelector(".menuHeader"); - if (header) header.style.webkitAppRegion = "drag"; - } - } const styles = getStyles(menuOffset); uiContainer = document.createElement("div"); diff --git a/src/ui/styles/_atlas-shell.css b/src/ui/styles/_atlas-shell.css index 6414b300..21e96d55 100644 --- a/src/ui/styles/_atlas-shell.css +++ b/src/ui/styles/_atlas-shell.css @@ -48,12 +48,11 @@ body { color: #f6f7fb; background: var(--atlas-header); border-bottom: 1px solid var(--atlas-header-border); - -webkit-app-region: drag; + -webkit-app-region: no-drag; } .atlas-header button, .atlas-header a, -.atlas-header input, .atlas-sidebar button { -webkit-app-region: no-drag; } From f21b96a2e88991420b8970e638a30081105114e9 Mon Sep 17 00:00:00 2001 From: Arnold W Date: Thu, 3 Sep 2026 17:42:47 +0200 Subject: [PATCH 23/32] fix(ui): preserve plural cheat namespace keys in flattenCheatStates so upstones are toggles --- src/ui/components/views/AtlasCheats.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/ui/components/views/AtlasCheats.js b/src/ui/components/views/AtlasCheats.js index 2391ca9d..f6e3a05c 100644 --- a/src/ui/components/views/AtlasCheats.js +++ b/src/ui/components/views/AtlasCheats.js @@ -22,8 +22,6 @@ const { div, button, span, input, code } = van.tags; const PAGE_SIZE = 50; -const normalizeRootStateKey = (key) => (key.endsWith("s") ? key.slice(0, -1) : key); - /** * Flatten the full boolean state response without discarding false values. * Presence in this map means the backend can truthfully expose a switch. @@ -41,7 +39,10 @@ const flattenCheatStates = (states) => { if (!value || typeof value !== "object") return; for (const [key, child] of Object.entries(value)) { - const segment = path.length === 0 ? normalizeRootStateKey(key) : key; + let segment = key; + if (path.length === 0 && typeof child === "boolean" && key.endsWith("s") && states[key.slice(0, -1)]) { + segment = key.slice(0, -1); + } visit(child, [...path, segment]); } }; From abe429f9f141fe487056e89627dafeb05ad2f66f Mon Sep 17 00:00:00 2001 From: Arnold W Date: Thu, 3 Sep 2026 22:18:44 +0200 Subject: [PATCH 24/32] refactor(ui): clean dead code, resolve standards findings, and harden css --- src/ui/assets/icons.js | 28 ----------------- src/ui/components/views/Search.js | 13 ++------ .../components/views/account/accountShared.js | 10 ------ .../account/masterclasses/OutpostsTab.js | 8 +---- .../components/views/search/SearchSections.js | 2 +- src/ui/state/store.js | 13 -------- src/ui/state/theme.js | 24 ++++++++++---- src/ui/styles/_account-pages.css | 26 ---------------- src/ui/styles/_masterclasses.css | 31 ++----------------- src/ui/styles/_theme.css | 2 -- src/ui/styles/_utilities.css | 8 ----- src/ui/styles/_world-tabs.css | 3 ++ 12 files changed, 27 insertions(+), 141 deletions(-) diff --git a/src/ui/assets/icons.js b/src/ui/assets/icons.js index 53a54878..0ba34ce3 100644 --- a/src/ui/assets/icons.js +++ b/src/ui/assets/icons.js @@ -211,23 +211,6 @@ export const Icons = { { "stroke-width": "2", "aria-hidden": "true", ...props } ), - Keyboard: (props) => - SvgBase( - [ - rect({ x: "2", y: "4", width: "20", height: "16", rx: "2", ry: "2" }), - line({ x1: "6", y1: "8", x2: "6.01", y2: "8" }), - line({ x1: "10", y1: "8", x2: "10.01", y2: "8" }), - line({ x1: "14", y1: "8", x2: "14.01", y2: "8" }), - line({ x1: "18", y1: "8", x2: "18.01", y2: "8" }), - line({ x1: "6", y1: "12", x2: "6.01", y2: "12" }), - line({ x1: "10", y1: "12", x2: "10.01", y2: "12" }), - line({ x1: "14", y1: "12", x2: "14.01", y2: "12" }), - line({ x1: "18", y1: "12", x2: "18.01", y2: "12" }), - line({ x1: "7", y1: "16", x2: "17", y2: "16" }), - ], - { "stroke-width": "2", "aria-hidden": "true", ...props } - ), - List: (props) => SvgBase( [ @@ -241,17 +224,6 @@ export const Icons = { { "stroke-width": "2", "aria-hidden": "true", ...props } ), - Tabs: (props) => - SvgBase( - [ - rect({ x: "3", y: "3", width: "7", height: "7" }), - rect({ x: "14", y: "3", width: "7", height: "7" }), - rect({ x: "14", y: "14", width: "7", height: "7" }), - rect({ x: "3", y: "14", width: "7", height: "7" }), - ], - { "stroke-width": "2", "aria-hidden": "true", ...props } - ), - Search: (props) => SvgBase([circle({ cx: "11", cy: "11", r: "8" }), line({ x1: "21", y1: "21", x2: "16.65", y2: "16.65" })], { "stroke-width": "2", diff --git a/src/ui/components/views/Search.js b/src/ui/components/views/Search.js index 19d6d78a..5214717e 100644 --- a/src/ui/components/views/Search.js +++ b/src/ui/components/views/Search.js @@ -569,22 +569,13 @@ export const Search = () => { saveSavedEdit: () => commitEdit(ui.savedEdit, handlers.cancelSavedEdit), - startEdit: (result) => { + startEdit: (result, surface = "row") => { if (ui.isSettingValue) return; // don't switch rows mid-write handlers.cancelSavedEdit(); ui.edit.path = result.path; ui.edit.draft = seedEditValue(result); ui.edit.type = expectedUiType(result); - ui.edit.surface = "row"; - }, - - startInspectorEdit: (result) => { - if (ui.isSettingValue) return; - handlers.cancelSavedEdit(); - ui.edit.path = result.path; - ui.edit.draft = seedEditValue(result); - ui.edit.type = expectedUiType(result); - ui.edit.surface = "inspector"; + ui.edit.surface = surface; }, cancelEdit: () => { diff --git a/src/ui/components/views/account/accountShared.js b/src/ui/components/views/account/accountShared.js index ec5b3391..16e45da9 100644 --- a/src/ui/components/views/account/accountShared.js +++ b/src/ui/components/views/account/accountShared.js @@ -2,14 +2,9 @@ import van from "../../../vendor/van-1.6.0.js"; import { gga, ggaMany, readCList } from "../../../services/api.js"; -import { Icons } from "../../../assets/icons.js"; -import { Loader } from "../../Loader.js"; -import { EmptyState } from "../../EmptyState.js"; import { formatNumber, formattedStep, parseNumber } from "../../../utils/numberFormat.js"; import { toIndexedArray } from "../../../utils/index.js"; -const { div } = van.tags; - /** Unwrap a plain value, van.state, or zero-arg function. */ export const resolveValue = (valueOrState) => { if (typeof valueOrState === "function") return valueOrState(); @@ -188,11 +183,6 @@ export const sortPrefixedNumericCodes = (a, b) => { return Number(a.slice(1)) - Number(b.slice(1)); }; -export const renderAccountLoading = () => div({ class: "account-loader" }, Loader()); - -export const renderAccountError = (message) => - EmptyState({ icon: Icons.SearchX(), title: "LOAD FAILED", subtitle: message }); - /** * Write a value through gga (or a compatible writer) and fail if verification * reports a mismatch. diff --git a/src/ui/components/views/account/masterclasses/OutpostsTab.js b/src/ui/components/views/account/masterclasses/OutpostsTab.js index 4533e1cf..c70748bb 100644 --- a/src/ui/components/views/account/masterclasses/OutpostsTab.js +++ b/src/ui/components/views/account/masterclasses/OutpostsTab.js @@ -95,18 +95,12 @@ const DEFAULT_UNIT_COUNTS = { 7: 1, }; -export const MILITIA_WORLD_TO_DISPLAY_SHELF = { +const MILITIA_WORLD_TO_DISPLAY_SHELF = { 1: 14, 2: 19, 3: 38, 4: 56, }; -export const MILITIA_SHELF_TO_WORLD = { - 14: 1, - 19: 2, - 38: 3, - 56: 4, -}; export const UNIT_REBUILD_DISPLAY_SHELVES = new Set([14, 19, 28, 38, 56]); const displayShelfToOrderIndex = (displayShelf) => displayShelf - 1; diff --git a/src/ui/components/views/search/SearchSections.js b/src/ui/components/views/search/SearchSections.js index 508fc274..de9f9c92 100644 --- a/src/ui/components/views/search/SearchSections.js +++ b/src/ui/components/views/search/SearchSections.js @@ -994,7 +994,7 @@ const SelectedResultSection = ({ result, ui, handlers }) => { : div( { class: "selected-result-edit-actions" }, button( - { class: "btn-primary", onclick: () => handlers.startInspectorEdit(result) }, + { class: "btn-primary", onclick: () => handlers.startEdit(result, "inspector") }, Icons.Pencil(), "Edit value" ), diff --git a/src/ui/state/store.js b/src/ui/state/store.js index 60b74db1..9e3f00cd 100644 --- a/src/ui/state/store.js +++ b/src/ui/state/store.js @@ -232,18 +232,6 @@ const CheatService = { }, }; -const CheatStateService = { - loadCheatStates: async () => { - try { - const result = await API.fetchCheatStates(); - dataState.activeCheatStates = result.data || {}; - } catch (e) { - console.error("Error loading cheat states:", e); - dataState.activeCheatStates = {}; - } - }, -}; - const FavoritesService = { toggleFavorite: (cheatValue) => { const index = dataState.favoriteCheats.indexOf(cheatValue); @@ -354,7 +342,6 @@ const store = { navigateToCheatConfig: CheatService.navigateToCheatConfig, clearForcedConfigPath: CheatService.clearForcedConfigPath, closeConfigDrawer: CheatService.closeConfigDrawer, - loadCheatStates: CheatStateService.loadCheatStates, loadConfig: ConfigService.loadConfig, diff --git a/src/ui/state/theme.js b/src/ui/state/theme.js index 798f8300..b1b75b93 100644 --- a/src/ui/state/theme.js +++ b/src/ui/state/theme.js @@ -1,16 +1,28 @@ -export const THEME_STORAGE_KEY = "uiTheme"; -export const THEMES = ["system", "light", "dark"]; +const THEME_STORAGE_KEY = "uiTheme"; +const THEMES = ["system", "light", "dark"]; -export const normalizeTheme = (theme) => (THEMES.includes(theme) ? theme : "dark"); +const normalizeTheme = (theme) => (THEMES.includes(theme) ? theme : "dark"); -export const loadThemePreference = (storage = localStorage) => normalizeTheme(storage.getItem(THEME_STORAGE_KEY)); - -export const applyTheme = (theme, root = document.documentElement) => { +const applyTheme = (theme, root = document.documentElement) => { const normalizedTheme = normalizeTheme(theme); root.dataset.theme = normalizedTheme; return normalizedTheme; }; +/** + * Load the saved theme preference from local storage. + * @param {Storage} [storage=localStorage] - Storage interface + * @returns {"system"|"light"|"dark"} Normalized theme preference + */ +export const loadThemePreference = (storage = localStorage) => normalizeTheme(storage.getItem(THEME_STORAGE_KEY)); + +/** + * Apply and persist the selected interface theme. + * @param {string} theme - Theme name to persist ("system", "light", "dark") + * @param {Storage} [storage=localStorage] - Storage interface + * @param {HTMLElement} [root=document.documentElement] - Root document element + * @returns {"system"|"light"|"dark"} The applied normalized theme + */ export const saveThemePreference = (theme, storage = localStorage, root = document.documentElement) => { const normalizedTheme = applyTheme(theme, root); storage.setItem(THEME_STORAGE_KEY, normalizedTheme); diff --git a/src/ui/styles/_account-pages.css b/src/ui/styles/_account-pages.css index 2d93ee93..be6eab18 100644 --- a/src/ui/styles/_account-pages.css +++ b/src/ui/styles/_account-pages.css @@ -446,16 +446,6 @@ grid-template-columns: minmax(300px, 1fr) auto minmax(240px, auto); } -.account-row--field-grid { - grid-template-columns: minmax(220px, 1fr) auto minmax(520px, auto); -} - -.account-row__controls--field-grid { - display: grid; - grid-template-columns: repeat(var(--account-row-field-count, 3), minmax(160px, 1fr)) auto; - gap: 8px; -} - .account-field-metric { display: flex; min-width: 0; @@ -511,18 +501,10 @@ grid-template-columns: minmax(0, 1fr) auto; } - .account-row--field-grid { - grid-template-columns: minmax(0, 1fr) auto; - } - .account-row--wide-controls .account-row__controls { grid-column: 1 / -1; justify-content: flex-end; } - - .account-row--field-grid .account-row__controls { - grid-column: 1 / -1; - } } @media (max-width: 760px) { @@ -532,14 +514,6 @@ overflow: visible; text-overflow: clip; } - - .account-row__controls--field-grid { - grid-template-columns: 1fr; - } - - .account-row__controls--field-grid .account-btn { - justify-self: end; - } } .account-btn { diff --git a/src/ui/styles/_masterclasses.css b/src/ui/styles/_masterclasses.css index 8e295957..68371e32 100644 --- a/src/ui/styles/_masterclasses.css +++ b/src/ui/styles/_masterclasses.css @@ -4,12 +4,10 @@ --world-color: var(--c-accent); } -.grimoire-controls, .masterclass-upgrade-controls { flex-shrink: 0; } -.grimoire-scroll, .masterclass-upgrade-scroll { display: flex; flex-direction: column; @@ -65,8 +63,7 @@ .grimoire-currency__field, .resource-node-row__field, .outpost-field, -.outpost-select-field, -.outpost-map-unit__field { +.outpost-select-field { display: grid; grid-template-columns: max-content max-content; align-items: center; @@ -157,8 +154,7 @@ width: 160px; } -.outpost-field .number-input-wrapper, -.outpost-map-unit__field .number-input-wrapper { +.outpost-field .number-input-wrapper { width: 180px; max-width: 100%; } @@ -209,7 +205,6 @@ align-items: center; } -.grimoire-upgrade-list, .masterclass-upgrade-list { padding-bottom: 4px; } @@ -272,13 +267,6 @@ text-align: center; } -.outpost-row__controls { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(188px, max-content)); - align-items: end; - gap: 8px; -} - .outpost-kill-row__controls { display: grid; grid-template-columns: minmax(160px, max-content) repeat(2, max-content); @@ -486,10 +474,6 @@ opacity: 0.55; } -.outpost-map-units { - grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); -} - .outpost-map-unit-add { display: grid; grid-column: 1 / -1; @@ -509,14 +493,6 @@ background: color-mix(in srgb, var(--c-panel-dim) 80%, transparent); } -.outpost-map-unit__index { - align-self: center; - padding: 5px 7px; - background: var(--c-panel); - color: var(--c-text-muted); - font-weight: 800; -} - .outpost-unit-config { display: grid; grid-template-columns: repeat(auto-fit, minmax(360px, 1fr)); @@ -576,17 +552,14 @@ /* Responsive Media Queries */ @media (max-width: 760px) { - .grimoire-row, .masterclass-upgrade-row, .resource-node-row, .outpost-row { grid-template-columns: minmax(0, 1fr) auto; } - .grimoire-row__controls, .masterclass-upgrade-row__controls, .resource-node-row__controls, - .outpost-row__controls, .outpost-kill-row__controls { grid-column: 1 / -1; justify-content: flex-end; diff --git a/src/ui/styles/_theme.css b/src/ui/styles/_theme.css index c5601816..7a5c8dd2 100644 --- a/src/ui/styles/_theme.css +++ b/src/ui/styles/_theme.css @@ -498,14 +498,12 @@ body, .sigil-card--ionized, .sigil-card--ethereal, .sigil-card--eclectic, - .cogs-selected-summary, .liquid-row__badge, .library-maxbooklv, .account-row__badge, .account-row--info, .card-row .account-row__badge, .warning-banner, - .warning-banner--polymer, .account-root-nav .world-tab-btn-num, #options-account-tab .world-sub-nav .account-sub-tab-btn.active, #options-account-tab .account-page-nav .account-sub-tab-btn.active, diff --git a/src/ui/styles/_utilities.css b/src/ui/styles/_utilities.css index 9d70330a..3df9825b 100644 --- a/src/ui/styles/_utilities.css +++ b/src/ui/styles/_utilities.css @@ -47,10 +47,6 @@ background: color-mix(in srgb, var(--c-accent) 8%, var(--c-panel)); } -.warning-banner--polymer { - background: color-mix(in srgb, var(--c-refinery-polymer) 8%, var(--c-panel)); -} - .warning-banner__icon { display: flex; align-items: center; @@ -59,10 +55,6 @@ flex-shrink: 0; } -.warning-banner--polymer .warning-banner__icon { - color: var(--c-refinery-polymer); -} - .warning-banner__content { min-width: 0; flex: 1; diff --git a/src/ui/styles/_world-tabs.css b/src/ui/styles/_world-tabs.css index 610b7502..62c3005c 100644 --- a/src/ui/styles/_world-tabs.css +++ b/src/ui/styles/_world-tabs.css @@ -285,6 +285,7 @@ flex: 0 0 25px; place-items: center; border-radius: 5px; + background: var(--c-accent-dim-solid, rgba(99, 102, 241, 0.12)); background: color-mix(in srgb, var(--world-color) 14%, var(--atlas-surface, #ffffff)); color: var(--world-color); font-family: var(--font-mono); @@ -332,6 +333,8 @@ #options-account-tab .world-sub-nav .account-sub-tab-btn.active, #options-account-tab .account-page-nav .account-sub-tab-btn.active, #options-account-tab .account-nested-sub-nav .account-sub-tab-btn.active { + background: var(--c-accent-dim-solid, rgba(99, 102, 241, 0.12)); + color: var(--world-color, #6366f1); background: color-mix(in srgb, var(--world-color, #6366f1) 10%, var(--atlas-surface, #ffffff)); color: color-mix(in srgb, var(--world-color, #6366f1) 78%, var(--atlas-text, #0f172a)); } From 506b5107a6d5e3fe14864a2467183ea8bb5ac7f5 Mon Sep 17 00:00:00 2001 From: Arnold W Date: Mon, 7 Sep 2026 15:35:42 +0200 Subject: [PATCH 25/32] Fix Atlas inspector reactivity and saved parameter editing --- src/ui/components/views/AtlasCheats.js | 98 +++++++++++++------------- 1 file changed, 49 insertions(+), 49 deletions(-) diff --git a/src/ui/components/views/AtlasCheats.js b/src/ui/components/views/AtlasCheats.js index f6e3a05c..0683c99b 100644 --- a/src/ui/components/views/AtlasCheats.js +++ b/src/ui/components/views/AtlasCheats.js @@ -236,11 +236,17 @@ export const AtlasCheats = () => { const getParameterState = (entry) => { const key = entry.cheat.value; if (!parameterStates.has(key)) parameterStates.set(key, van.state(entry.parameter || "")); - const state = parameterStates.get(key); - if (entry.parameter && state.val !== entry.parameter) state.val = entry.parameter; - return state; + return parameterStates.get(key); }; + let parameterAction = null; + van.derive(() => { + const entry = selectedEntry.val; + if (entry?.action === parameterAction) return; + parameterAction = entry?.action; + if (entry?.parameter) getParameterState(entry).val = entry.parameter; + }); + const selectEntry = (entry, { focusParameter = false } = {}) => { ui.selectedAction = entry.action; if (compactInspector.val) ui.inspectorOpen = true; @@ -322,47 +328,48 @@ export const AtlasCheats = () => { ?.scrollIntoView({ block: "nearest" }); }; - const workspaceContext = div( - { class: "atlas-cheat-context", role: "navigation", "aria-label": "Cheat scopes" }, - div({ class: "atlas-tree-heading" }, "VIEWS"), - ScopeButton({ - id: "all", - label: "All cheats", - count: () => store.data.cheats.length, - icon: Icons.Cheats(), - }), - ScopeButton({ - id: "active", - label: "Active", - count: () => [...stateMap.val.values()].filter(Boolean).length, - icon: Icons.Lightning(), - }), - ScopeButton({ - id: "favorites", - label: "Favorites", - count: () => store.data.favoriteCheats.length, - icon: Icons.Star(), - }), - ScopeButton({ - id: "recent", - label: "Recent", - count: () => store.data.recentCheats.length, - icon: Icons.Refresh(), - }), - div({ class: "atlas-tree-heading atlas-category-heading" }, "CATEGORIES"), - div({ class: "atlas-category-scopes" }, () => - div( - ...sortCategoryNames(matchingCategoryCounts.val.keys()).map((category) => - ScopeButton({ - id: `category:${category}`, - label: category, - count: () => matchingCategoryCounts.val.get(category) || 0, - }) + const workspaceContext = () => + div( + { class: "atlas-cheat-context", role: "navigation", "aria-label": "Cheat scopes" }, + div({ class: "atlas-tree-heading" }, "VIEWS"), + ScopeButton({ + id: "all", + label: "All cheats", + count: () => store.data.cheats.length, + icon: Icons.Cheats(), + }), + ScopeButton({ + id: "active", + label: "Active", + count: () => [...stateMap.val.values()].filter(Boolean).length, + icon: Icons.Lightning(), + }), + ScopeButton({ + id: "favorites", + label: "Favorites", + count: () => store.data.favoriteCheats.length, + icon: Icons.Star(), + }), + ScopeButton({ + id: "recent", + label: "Recent", + count: () => store.data.recentCheats.length, + icon: Icons.Refresh(), + }), + div({ class: "atlas-tree-heading atlas-category-heading" }, "CATEGORIES"), + div({ class: "atlas-category-scopes" }, () => + div( + ...sortCategoryNames(matchingCategoryCounts.val.keys()).map((category) => + ScopeButton({ + id: `category:${category}`, + label: category, + count: () => matchingCategoryCounts.val.get(category) || 0, + }) + ) ) ) - ) - ); - registerWorkspaceContext(VIEWS.CHEATS.id, () => workspaceContext); + ); + registerWorkspaceContext(VIEWS.CHEATS.id, workspaceContext); const table = div( { @@ -547,17 +554,10 @@ export const AtlasCheats = () => { ); }; - const configInspectorCache = new Map(); - const getInspectorConfig = (entry) => { - const cacheKey = entry.cheat.value; - const cached = configInspectorCache.get(cacheKey); - if (cached) return cached; - const host = div({ class: "atlas-inspector-pane atlas-inspector-config" }, Loader({ text: "LOADING CONFIG" })); let mounted = false; - configInspectorCache.set(cacheKey, host); getConfigDraft(); van.derive(() => { From bb09331ec798525c17b6625439e4d416fd7bb948 Mon Sep 17 00:00:00 2001 From: Arnold W Date: Mon, 7 Sep 2026 16:29:35 +0200 Subject: [PATCH 26/32] Restrict UI server access to loopback and trusted origins --- config.js | 2 ++ docs/config.md | 5 ++++ src/main.js | 2 +- src/modules/server/serverAccess.js | 38 +++++++++++++++++++++++++++++ src/modules/server/webServer.js | 17 ++++++++++--- src/modules/server/wsServer.js | 5 ++-- src/ui/config/configDescriptions.js | 2 ++ 7 files changed, 65 insertions(+), 6 deletions(-) create mode 100644 src/modules/server/serverAccess.js diff --git a/config.js b/config.js index 2a6acad4..a73173e5 100644 --- a/config.js +++ b/config.js @@ -892,6 +892,8 @@ exports.injectorConfig = { interceptPattern: "*N.js", enableUI: true, webPort: 8080, + webHost: "127.0.0.1", + webAllowedOrigins: [], // exact remote UI origins; requires a non-loopback webHost onLinuxTimeout: 60000, target: "web", // "web" or "steam" webUrl: "https://www.legendsofidleon.com/ytGl5oc/", diff --git a/docs/config.md b/docs/config.md index 52e3c3cd..d9681adb 100644 --- a/docs/config.md +++ b/docs/config.md @@ -52,6 +52,11 @@ exports.injectorConfig = { `config.custom.js` can omit any export; only provided keys override defaults. +The web UI is local-only by default. Remote access requires a non-loopback +`injectorConfig.webHost` and the exact browser origins in `webAllowedOrigins`. +Restart the injector after changing these settings. Remote access grants command +execution and game-state editing without a login, so use it only on a trusted network. + ## Startup cheats `startupCheats` is an array of command strings run after injection. diff --git a/src/main.js b/src/main.js index 8593de7f..9900adb7 100644 --- a/src/main.js +++ b/src/main.js @@ -171,7 +171,7 @@ async function main() { await printHeader(); printConfiguration(config.injectorConfig); - const app = createWebServer({ enableUI: config.injectorConfig.enableUI }); + const app = createWebServer(config.injectorConfig); const target = (config.injectorConfig.target || "steam").toLowerCase(); if (os.platform() === "darwin" && target !== "web") { diff --git a/src/modules/server/serverAccess.js b/src/modules/server/serverAccess.js new file mode 100644 index 00000000..f776b031 --- /dev/null +++ b/src/modules/server/serverAccess.js @@ -0,0 +1,38 @@ +/** + * Build the shared HTTP/WebSocket request policy. Host validation also prevents + * a browser from reaching loopback through an attacker-controlled DNS name. + * Origin-less native clients remain supported; opaque origins are Steam-only. + * @param {object} config - Injector configuration. + * @param {number} port - Actual listening port. + * @returns {(req: import("http").IncomingMessage) => boolean} Request predicate. + */ +function createRequestPolicy(config, port) { + const uiOrigins = new Set([`http://localhost:${port}`, `http://127.0.0.1:${port}`, `http://[::1]:${port}`]); + const localHosts = new Set(["127.0.0.1", "localhost", "::1"]); + if (!localHosts.has(config.webHost || "127.0.0.1")) { + for (const origin of config.webAllowedOrigins || []) { + const url = new URL(origin); + if (!["http:", "https:"].includes(url.protocol) || url.origin !== origin) { + throw new Error(`Invalid webAllowedOrigins entry: ${origin}`); + } + uiOrigins.add(origin); + } + } + const hosts = new Set([...uiOrigins].map((origin) => new URL(origin).host)); + const origins = new Set(uiOrigins); + if (config.target === "web") { + origins.add(new URL(config.webUrl).origin); + } else { + origins.add("null"); + origins.add("file://"); + } + + return (req) => { + if (!hosts.has(req.headers.host)) return false; + const origin = req.headers.origin; + if (origin !== undefined) return origins.has(origin); + return req.headers["sec-fetch-site"] !== "cross-site"; + }; +} + +module.exports = { createRequestPolicy }; diff --git a/src/modules/server/webServer.js b/src/modules/server/webServer.js index 186d749a..3f12874d 100644 --- a/src/modules/server/webServer.js +++ b/src/modules/server/webServer.js @@ -11,6 +11,7 @@ const path = require("path"); const fs = require("fs").promises; const TinyRouter = require("./tinyRouter"); const { initWebSocket } = require("./wsServer"); +const { createRequestPolicy } = require("./serverAccess"); const { createLogger } = require("../utils/logger"); const log = createLogger("WebServer"); @@ -68,6 +69,7 @@ async function serveStatic(req, res, staticDir) { function createWebServer(config) { const router = new TinyRouter(); router.enableUI = config.enableUI; + router.serverConfig = config; log.debug(`Web UI ${config.enableUI ? "enabled" : "disabled"}`); @@ -85,9 +87,17 @@ function createWebServer(config) { */ function startServer(router, port, wsConfig = null) { const staticDir = path.join(__dirname, "../../ui"); + const config = router.serverConfig; + const host = config.webHost || "127.0.0.1"; + let acceptsRequest = createRequestPolicy(config, port); const server = http.createServer(async (req, res) => { try { + if (!acceptsRequest(req)) { + res.writeHead(403, { "Content-Type": "application/json" }); + res.end(JSON.stringify({ error: "Request origin or host is not allowed" })); + return; + } const handledByRouter = await router.handle(req, res); if (handledByRouter) return; @@ -107,12 +117,13 @@ function startServer(router, port, wsConfig = null) { return new Promise((resolve, reject) => { server - .listen(port, () => { - log.info(`Web UI: http://localhost:${port}`); + .listen(port, host, () => { + acceptsRequest = createRequestPolicy(config, server.address().port); + log.info(`Web UI listening on ${host}:${server.address().port}`); // Initialize WebSocket server if config provided if (wsConfig && wsConfig.runtime && wsConfig.context) { - initWebSocket(server, wsConfig.runtime, wsConfig.context); + initWebSocket(server, wsConfig.runtime, wsConfig.context, (req) => acceptsRequest(req)); } resolve(server); diff --git a/src/modules/server/wsServer.js b/src/modules/server/wsServer.js index 181aca3f..01587841 100644 --- a/src/modules/server/wsServer.js +++ b/src/modules/server/wsServer.js @@ -293,12 +293,13 @@ async function cleanupClientSubscriptions(ws) { * @param {Object} httpServer - Node.js HTTP server instance * @param {Object} runtime - CDP Runtime client * @param {string} context - JavaScript expression for game context + * @param {Function} acceptsRequest - Shared HTTP/WebSocket access policy */ -function initWebSocket(httpServer, runtime, context) { +function initWebSocket(httpServer, runtime, context, acceptsRequest) { runtimeRef = runtime; contextRef = context; - wss = new WebSocketServer({ server: httpServer }); + wss = new WebSocketServer({ server: httpServer, verifyClient: ({ req }) => acceptsRequest(req) }); wss.on("connection", (ws) => { clients.add(ws); diff --git a/src/ui/config/configDescriptions.js b/src/ui/config/configDescriptions.js index cb137133..b455cbf0 100644 --- a/src/ui/config/configDescriptions.js +++ b/src/ui/config/configDescriptions.js @@ -585,6 +585,8 @@ export const configDescriptions = { "injectorConfig.enableUI": "Enable/disable the webui", "injectorConfig.onLinuxTimeout": "Timeout in milliseconds for Linux-specific operations", "injectorConfig.webPort": "Port for the webui", + "injectorConfig.webHost": "UI listen address. Default is local-only. Restart the injector after changing.", + "injectorConfig.webAllowedOrigins": "Exact remote UI origins, e.g. http://192.168.1.10:8080. Requires a non-loopback webHost and restart.", "injectorConfig.target": "Injection target platform (steam or web)", "injectorConfig.webUrl": "Idleon web URL when using browser injection", "injectorConfig.browserPath": "Browser executable path for web injection (auto if empty)", From ff0abb756e4e1b577953f95d2b5f92ca72e02acc Mon Sep 17 00:00:00 2001 From: Arnold W Date: Mon, 7 Sep 2026 16:29:35 +0200 Subject: [PATCH 27/32] Centralize frontend live monitoring ownership --- src/ui/components/ActivityDrawer.js | 5 +- src/ui/components/views/Search.js | 63 +++---------------- .../components/views/search/SearchSections.js | 13 ++-- src/ui/services/ws.js | 22 ++++--- src/ui/state/liveMonitors.js | 53 ++++++++++++++++ src/ui/state/store.js | 28 +-------- 6 files changed, 82 insertions(+), 102 deletions(-) create mode 100644 src/ui/state/liveMonitors.js diff --git a/src/ui/components/ActivityDrawer.js b/src/ui/components/ActivityDrawer.js index 0b1e66e1..bfd47f57 100644 --- a/src/ui/components/ActivityDrawer.js +++ b/src/ui/components/ActivityDrawer.js @@ -1,5 +1,6 @@ import van from "../vendor/van-1.6.0.js"; import store from "../state/store.js"; +import liveMonitors from "../state/liveMonitors.js"; import { VIEWS } from "../state/constants.js"; import { Icons } from "../assets/icons.js"; import { formatDisplayValue } from "../utils/search/valueUtils.js"; @@ -46,7 +47,7 @@ const MonitorPanel = () => "aria-labelledby": "atlas-monitors-tab", }, () => { - const monitors = Object.entries(store.data.monitorValues || {}).sort(([, a], [, b]) => + const monitors = Object.entries(liveMonitors.values.val).sort(([, a], [, b]) => String(a?.path || "").localeCompare(String(b?.path || "")) ); @@ -120,7 +121,7 @@ export const ActivityDrawer = () => "Monitors" ), span({ class: "atlas-drawer-summary" }, () => { - const monitorCount = Object.keys(store.data.monitorValues || {}).length; + const monitorCount = Object.keys(liveMonitors.values.val).length; return `${store.app.notificationHistory.length} events / ${monitorCount} monitors`; }), button( diff --git a/src/ui/components/views/Search.js b/src/ui/components/views/Search.js index 5214717e..27a42a47 100644 --- a/src/ui/components/views/Search.js +++ b/src/ui/components/views/Search.js @@ -1,6 +1,7 @@ import van from "../../vendor/van-1.6.0.js"; import vanX from "../../vendor/van-x-0.6.3.js"; import store from "../../state/store.js"; +import liveMonitors from "../../state/liveMonitors.js"; import { FAVORITE_KEYS } from "../../state/constants.js"; import { KeysSection, SearchInputSection, ResultsSection, SearchInspector } from "./search/SearchSections.js"; import { detectQueryType } from "../../utils/index.js"; @@ -19,10 +20,8 @@ import { expectedUiType, validateEditDraft, monitorPathForSearchResult, - monitorIdFromMonitorPath, formatDisplayValue, getMonitorHistory, - resolveMonitorEntry, getUiTypeFromRawValue, getDraftFromRawValue, getResultValue, @@ -131,45 +130,10 @@ export const Search = () => { } }; - const getResolvedMonitorEntry = (path) => { - return resolveMonitorEntry(path, store.data.monitorValues || {}); - }; + const getResolvedMonitorEntry = liveMonitors.resolve; let resultsFilterTimer = null; let savedFilterTimer = null; - const subscribedMonitorPaths = new Set(); - - const reconcileMonitorSubscriptions = () => { - const desiredPaths = new Set(); - - for (const entry of ui.savedResults) { - if (!entry?.path) continue; - - if (entry.monitorEnabled === false) continue; - - desiredPaths.add(entry.path); - } - - for (const path of desiredPaths) { - const monitorPath = monitorPathForSearchResult(path); - const resolvedMonitor = getResolvedMonitorEntry(monitorPath); - - if (subscribedMonitorPaths.has(path) && !resolvedMonitor.entry) { - subscribedMonitorPaths.delete(path); - } - - if (subscribedMonitorPaths.has(path)) continue; - store.subscribeMonitor(monitorPath); - subscribedMonitorPaths.add(path); - } - - for (const path of [...subscribedMonitorPaths]) { - if (desiredPaths.has(path)) continue; - - store.unsubscribeMonitor(monitorIdFromMonitorPath(monitorPathForSearchResult(path))); - subscribedMonitorPaths.delete(path); - } - }; const updateValueInUi = (path, payload) => { const hasPayloadValue = payload && Object.prototype.hasOwnProperty.call(payload, "value"); @@ -234,9 +198,11 @@ export const Search = () => { }); van.derive(() => { - ui.savedResults; - store.data.monitorValues; - reconcileMonitorSubscriptions(); + liveMonitors.sync( + ui.savedResults + .filter((entry) => entry.path && entry.monitorEnabled !== false) + .map((entry) => monitorPathForSearchResult(entry.path)) + ); }); const getFilteredList = (source, appliedFilter) => { @@ -440,9 +406,6 @@ export const Search = () => { ui.savedResults = [...ui.savedResults, entry]; - store.subscribeMonitor(monitorPath); - subscribedMonitorPaths.add(result.path); - store.notify(`Added ${result.path} to saved list and enabled watcher`, "success"); }, @@ -472,21 +435,14 @@ export const Search = () => { }); if (enabled) { - store.subscribeMonitor(monitorPath); - subscribedMonitorPaths.add(path); store.notify("Enabled watcher for " + path); return; } - store.unsubscribeMonitor(monitorIdFromMonitorPath(monitorPath)); - subscribedMonitorPaths.delete(path); store.notify("Stopped watcher for " + path); }, removeSavedResult: (path) => { - store.unsubscribeMonitor(monitorIdFromMonitorPath(monitorPathForSearchResult(path))); - subscribedMonitorPaths.delete(path); - ui.savedResults = ui.savedResults.filter((entry) => entry.path !== path); if (ui.savedEdit.path === path) handlers.cancelSavedEdit(); store.notify(`Removed ${path} from saved list`); @@ -495,11 +451,6 @@ export const Search = () => { clearSavedResults: () => { if (ui.savedResults.length === 0) return; - for (const entry of ui.savedResults) { - store.unsubscribeMonitor(monitorIdFromMonitorPath(monitorPathForSearchResult(entry.path))); - subscribedMonitorPaths.delete(entry.path); - } - ui.savedResults = []; handlers.cancelSavedEdit(); store.notify("Saved list cleared"); diff --git a/src/ui/components/views/search/SearchSections.js b/src/ui/components/views/search/SearchSections.js index de9f9c92..8ca77d16 100644 --- a/src/ui/components/views/search/SearchSections.js +++ b/src/ui/components/views/search/SearchSections.js @@ -1,5 +1,6 @@ import van from "../../../vendor/van-1.6.0.js"; import store from "../../../state/store.js"; +import liveMonitors from "../../../state/liveMonitors.js"; import { Loader } from "../../Loader.js"; import { EmptyState } from "../../EmptyState.js"; import { Sparkline, canGraph } from "../../Sparkline.js"; @@ -14,12 +15,7 @@ import { isInputlessScanType, requiresSecondaryInput, } from "../../../utils/search/scanUtils.js"; -import { - monitorPathForSearchResult, - formatDisplayValue, - getMonitorHistory, - resolveMonitorEntry, -} from "../../../utils/search/valueUtils.js"; +import { monitorPathForSearchResult, formatDisplayValue, getMonitorHistory } from "../../../utils/search/valueUtils.js"; const { div, input, button, span, label, select, option, aside } = van.tags; @@ -596,7 +592,7 @@ const SavedResultItem = ({ entry: initialEntry, ui, handlers }) => { }; const monitorPath = monitorPathForSearchResult(path); - const monitorData = () => resolveMonitorEntry(monitorPath, store.data.monitorValues || {}).entry; + const monitorData = () => liveMonitors.resolve(monitorPath).entry; const isMonitorEnabled = () => entryState.val.monitorEnabled === true; const isMonitored = () => isMonitorEnabled() && !!monitorData(); const monitorError = () => (isMonitorEnabled() ? monitorData()?.error || null : null); @@ -907,8 +903,7 @@ const SelectedResultSection = ({ result, ui, handlers }) => { const copyFeedback = van.state(false); const savedEntry = () => ui.savedResults.find((entry) => entry.path === result.path) || null; const isEditing = () => ui.edit.path === result.path && ui.edit.surface === "inspector"; - const monitorEntry = () => - resolveMonitorEntry(monitorPathForSearchResult(result.path), store.data.monitorValues || {}).entry; + const monitorEntry = () => liveMonitors.resolve(monitorPathForSearchResult(result.path)).entry; const monitorHistory = () => (savedEntry()?.monitorEnabled === false ? [] : getMonitorHistory(monitorEntry())); const copyPath = () => { diff --git a/src/ui/services/ws.js b/src/ui/services/ws.js index 2ff06c20..fb26203a 100644 --- a/src/ui/services/ws.js +++ b/src/ui/services/ws.js @@ -20,8 +20,8 @@ let stateUpdateHandler = null; /** @type {Function|null} */ let monitorUpdateHandler = null; -/** @type {Map} */ -const desiredMonitorSubscriptions = new Map(); +/** @type {Function|null} */ +let connectionChangeHandler = null; /** Reconnect interval in milliseconds (same as heartbeat) */ const RECONNECT_INTERVAL = 10000; @@ -84,9 +84,7 @@ function connect() { isConnected = true; console.log("[WebSocket] Connected to server"); - for (const [id, path] of desiredMonitorSubscriptions.entries()) { - ws.send(JSON.stringify({ type: "monitor-subscribe", id, path })); - } + connectionChangeHandler?.(true); }; ws.onmessage = handleMessage; @@ -94,6 +92,7 @@ function connect() { ws.onclose = () => { isConnected = false; ws = null; + connectionChangeHandler?.(false); console.log("[WebSocket] Disconnected from server"); scheduleReconnect(); }; @@ -131,14 +130,21 @@ export function onMonitorUpdate(handler) { monitorUpdateHandler = handler; } +/** + * Register the live-monitor owner's connection lifecycle handler. + * @param {Function} handler - Receives whether the socket is connected. + * @returns {void} + */ +export function onConnectionChange(handler) { + connectionChangeHandler = handler; +} + /** * Sends a monitor subscription request to the server * @param {string} id * @param {string} path */ export function sendMonitorSubscribe(id, path) { - desiredMonitorSubscriptions.set(id, path); - if (ws && ws.readyState === WebSocket.OPEN) { ws.send(JSON.stringify({ type: "monitor-subscribe", id, path })); } @@ -149,8 +155,6 @@ export function sendMonitorSubscribe(id, path) { * @param {string} id */ export function sendMonitorUnsubscribe(id) { - desiredMonitorSubscriptions.delete(id); - if (ws && ws.readyState === WebSocket.OPEN) { ws.send(JSON.stringify({ type: "monitor-unsubscribe", id })); } diff --git a/src/ui/state/liveMonitors.js b/src/ui/state/liveMonitors.js new file mode 100644 index 00000000..068f69cb --- /dev/null +++ b/src/ui/state/liveMonitors.js @@ -0,0 +1,53 @@ +import van from "../vendor/van-1.6.0.js"; +import { onMonitorUpdate, onConnectionChange, sendMonitorSubscribe, sendMonitorUnsubscribe } from "../services/ws.js"; +import { monitorIdFromMonitorPath, resolveMonitorEntry } from "../utils/search/valueUtils.js"; + +const values = van.state({}); +const desired = new Map(); +let acknowledged = new Set(); + +onMonitorUpdate((data) => { + const next = data || {}; + for (const [id, path] of desired) { + if (acknowledged.has(id) && !next[id]) sendMonitorSubscribe(id, path); + } + acknowledged = new Set(Object.keys(next)); + values.val = next; +}); + +onConnectionChange((connected) => { + if (!connected) return; + acknowledged.clear(); + for (const [id, path] of desired) sendMonitorSubscribe(id, path); +}); + +/** + * Replace subscription intent with the enabled saved paths supplied by Search. + * Pending and failed subscriptions stay registered until explicitly removed; + * server state updates must not create repeated subscribe requests. + * @param {Iterable} paths - Game paths including the gga. prefix. + * @returns {void} + */ +const sync = (paths) => { + const next = new Map([...paths].map((path) => [monitorIdFromMonitorPath(path), path])); + for (const id of desired.keys()) { + if (next.has(id)) continue; + desired.delete(id); + acknowledged.delete(id); + sendMonitorUnsubscribe(id); + } + for (const [id, path] of next) { + if (desired.has(id)) continue; + desired.set(id, path); + sendMonitorSubscribe(id, path); + } +}; + +/** + * Read the current value history and error for a game path reactively. + * @param {string} path - Game path including the gga. prefix. + * @returns {{id:string, entry:object|null}} Current server entry. + */ +const resolve = (path) => resolveMonitorEntry(path, values.val); + +export default { values, sync, resolve }; diff --git a/src/ui/state/store.js b/src/ui/state/store.js index 9e3f00cd..cf97f707 100644 --- a/src/ui/state/store.js +++ b/src/ui/state/store.js @@ -3,15 +3,8 @@ import * as API from "../services/api.js"; import { VIEWS } from "./constants.js"; import { loadThemePreference, saveThemePreference } from "./theme.js"; import { getCheatConfigPath, configPathExists } from "../utils/index.js"; -import { formatDisplayValue, monitorIdFromMonitorPath } from "../utils/search/valueUtils.js"; -import { - initWebSocket, - onStateUpdate, - onMonitorUpdate, - getConnectionStatus, - sendMonitorSubscribe, - sendMonitorUnsubscribe, -} from "../services/ws.js"; +import { formatDisplayValue } from "../utils/search/valueUtils.js"; +import { initWebSocket, onStateUpdate, getConnectionStatus } from "../services/ws.js"; /** * Safely parse JSON from localStorage with fallback @@ -55,7 +48,6 @@ const dataState = vanX.reactive({ activeCheatStates: {}, favoriteCheats: safeParseJSON("favoriteCheats", []), recentCheats: safeParseJSON("recentCheats", []), - monitorValues: {}, }); const MAX_NOTIFICATION_HISTORY = 100; @@ -92,10 +84,6 @@ const SystemService = { dataState.activeCheatStates = states || {}; }); - onMonitorUpdate((data) => { - dataState.monitorValues = data || {}; - }); - // Use WebSocket connection status for heartbeat, with HTTP fallback const check = async () => { // Check WebSocket connection first @@ -316,15 +304,6 @@ const SearchService = { }, }; -const MonitorService = { - subscribe: (path) => { - sendMonitorSubscribe(monitorIdFromMonitorPath(path), path); - }, - unsubscribe: (id) => { - sendMonitorUnsubscribe(id); - }, -}; - const store = { app: appState, data: dataState, @@ -351,9 +330,6 @@ const store = { searchGga: API.searchGga, setGgaValue: SearchService.setGgaValue, - subscribeMonitor: MonitorService.subscribe, - unsubscribeMonitor: MonitorService.unsubscribe, - toggleSidebar: () => { appState.sidebarCollapsed = !appState.sidebarCollapsed; localStorage.setItem("sidebarCollapsed", appState.sidebarCollapsed); From 9d9b49e55a484cb7a28d44ebeed1a15bd95608ec Mon Sep 17 00:00:00 2001 From: Arnold W Date: Mon, 7 Sep 2026 16:29:36 +0200 Subject: [PATCH 28/32] Centralize API game evaluation and response handling --- src/modules/server/apiRoutes.js | 180 +++++++++++++------------------ src/modules/server/gameAccess.js | 22 ++++ 2 files changed, 98 insertions(+), 104 deletions(-) create mode 100644 src/modules/server/gameAccess.js diff --git a/src/modules/server/apiRoutes.js b/src/modules/server/apiRoutes.js index c5769f81..fd1bd9d7 100644 --- a/src/modules/server/apiRoutes.js +++ b/src/modules/server/apiRoutes.js @@ -18,6 +18,7 @@ const { const { getRuntimePath } = require("../utils/runtimePaths"); const { exec } = require("child_process"); const { broadcastCheatStates } = require("./wsServer"); +const { evaluateGame } = require("./gameAccess"); const { createLogger } = require("../utils/logger"); const { checkForUpdates } = require("../updateChecker"); const { performUpdate } = require("../autoUpdater"); @@ -140,19 +141,17 @@ function setupApiRoutes(app, context, client, config) { app.get("/api/cheats", async (req, res) => { try { - const suggestionsResult = await Runtime.evaluate({ + const suggestionsResult = await evaluateGame(Runtime, { expression: `getAutoCompleteSuggestions()`, - awaitPromise: true, - returnByValue: true, }); - if (suggestionsResult.exceptionDetails) { - log.error("Error getting autocomplete suggestions:", suggestionsResult.exceptionDetails.text); + if (suggestionsResult.error) { + log.error("Error getting autocomplete suggestions:", suggestionsResult.error); res.status(500).json({ error: "Failed to get cheats from game", - details: suggestionsResult.exceptionDetails.text, + details: suggestionsResult.error, }); } else { - const allCheats = suggestionsResult.result.value || []; + const allCheats = suggestionsResult.value || []; const EXCLUDED_PREFIXES = [ "gga", @@ -180,19 +179,16 @@ function setupApiRoutes(app, context, client, config) { app.get("/api/game/bundles", async (req, res) => { try { - const catalogResult = await Runtime.evaluate({ + const catalogResult = await evaluateGame(Runtime, { expression: "getBundleCatalog()", - awaitPromise: true, - returnByValue: true, }); - if (catalogResult.exceptionDetails) { - const details = - catalogResult.exceptionDetails.exception?.description ?? catalogResult.exceptionDetails.text; + if (catalogResult.error) { + const details = catalogResult.error; return res.status(500).json({ error: "Failed to read bundle catalog", details }); } - const bundles = catalogResult.result.value; + const bundles = catalogResult.value; if (!Array.isArray(bundles)) { return res.status(500).json({ error: "Bundle catalog returned invalid data" }); } @@ -211,20 +207,19 @@ function setupApiRoutes(app, context, client, config) { return res.status(400).json({ error: "Missing action parameter" }); } try { - const cheatResponse = await Runtime.evaluate({ - expression: `cheat.call(${context}, '${action}')`, - awaitPromise: true, + const cheatResponse = await evaluateGame(Runtime, { + expression: `cheat.call(${context}, ${JSON.stringify(action)})`, allowUnsafeEvalBlockedByCSP: true, }); - if (cheatResponse.exceptionDetails) { - log.error(`Error executing cheat '${action}':`, cheatResponse.exceptionDetails.text); + if (cheatResponse.error) { + log.error(`Error executing cheat '${action}':`, cheatResponse.error); res.status(500).json({ error: `Failed to execute cheat '${action}'`, - details: cheatResponse.exceptionDetails.text, + details: cheatResponse.error, }); } else { - log.debug(`Executed: ${action} -> ${cheatResponse.result.value}`); - res.json({ result: cheatResponse.result.value }); + log.debug(`Executed: ${action} -> ${cheatResponse.value}`); + res.json({ result: cheatResponse.value }); // Broadcast updated cheat states to all WebSocket clients broadcastCheatStates(); @@ -295,8 +290,8 @@ function setupApiRoutes(app, context, client, config) { const parsedCheatConfig = receivedFullConfig.cheatConfig ? parseConfigFromJson(receivedFullConfig.cheatConfig) : cheatConfig; - const contextExistsResult = await Runtime.evaluate({ expression: `!!(${context})` }); - if (!contextExistsResult || !contextExistsResult.result || !contextExistsResult.result.value) { + const contextExistsResult = await evaluateGame(Runtime, { expression: `!!(${context})` }); + if (contextExistsResult.error || !contextExistsResult.value) { log.error("Cheat context not found in iframe. Cannot update config in game"); return res.status(200).json({ message: "Configuration was not applied because the game context was lost", @@ -315,23 +310,22 @@ function setupApiRoutes(app, context, client, config) { } `; - const updateResult = await Runtime.evaluate({ + const updateResult = await evaluateGame(Runtime, { expression: updateExpression, - awaitPromise: true, allowUnsafeEvalBlockedByCSP: true, }); let gameUpdateDetails = "N/A"; - if (updateResult.exceptionDetails) { - log.error("Error updating config in game:", updateResult.exceptionDetails.text); - gameUpdateDetails = `Failed to apply in game: ${updateResult.exceptionDetails.text}`; + if (updateResult.error) { + log.error("Error updating config in game:", updateResult.error); + gameUpdateDetails = `Failed to apply in game: ${updateResult.error}`; return res.status(200).json({ message: "Configuration was not applied in game", details: gameUpdateDetails, appliedToGame: false, }); } else { - gameUpdateDetails = updateResult.result.value; + gameUpdateDetails = updateResult.value; log.debug(`In-game config update result: ${gameUpdateDetails}`); if (gameUpdateDetails.startsWith("Error:")) { return res.status(200).json({ @@ -363,20 +357,18 @@ function setupApiRoutes(app, context, client, config) { app.get("/api/cheat-states", async (req, res) => { try { - const statesResult = await Runtime.evaluate({ + const statesResult = await evaluateGame(Runtime, { expression: `cheatStateList()`, - awaitPromise: true, - returnByValue: true, }); - if (statesResult.exceptionDetails) { - log.error("Error getting cheat states:", statesResult.exceptionDetails.text); + if (statesResult.error) { + log.error("Error getting cheat states:", statesResult.error); res.status(500).json({ error: "Failed to get cheat states from game", - details: statesResult.exceptionDetails.text, + details: statesResult.error, }); } else { - res.json({ data: statesResult.result.value || {} }); + res.json({ data: statesResult.value || {} }); } } catch (apiError) { log.error("Error in /api/cheat-states:", apiError); @@ -463,20 +455,18 @@ exports.injectorConfig = ${new_injectorConfig}; app.get("/api/search/keys", async (req, res) => { try { - const keysResult = await Runtime.evaluate({ + const keysResult = await evaluateGame(Runtime, { expression: `getGgaKeys()`, - awaitPromise: true, - returnByValue: true, }); - if (keysResult.exceptionDetails) { - log.error("Error getting GGA keys:", keysResult.exceptionDetails.text); + if (keysResult.error) { + log.error("Error getting GGA keys:", keysResult.error); res.status(500).json({ error: "Failed to get GGA keys from game", - details: keysResult.exceptionDetails.text, + details: keysResult.error, }); } else { - res.json({ keys: keysResult.result.value || [] }); + res.json({ keys: keysResult.value || [] }); } } catch (apiError) { log.error("Error in /api/search/keys:", apiError); @@ -511,20 +501,18 @@ exports.injectorConfig = ${new_injectorConfig}; const optionsJson = JSON.stringify({ withinPaths: withinPaths || null, compare: compare || null }); const serializedQuery = JSON.stringify(query); - const searchResult = await Runtime.evaluate({ + const searchResult = await evaluateGame(Runtime, { expression: `searchGga(${serializedQuery}, ${keysJson}, ${optionsJson})`, - awaitPromise: true, - returnByValue: true, }); - if (searchResult.exceptionDetails) { - log.error("Error searching GGA:", searchResult.exceptionDetails.text); + if (searchResult.error) { + log.error("Error searching GGA:", searchResult.error); res.status(500).json({ error: "Failed to search GGA", - details: searchResult.exceptionDetails.text, + details: searchResult.error, }); } else { - const data = searchResult.result.value || { results: [], totalCount: 0 }; + const data = searchResult.value || { results: [], totalCount: 0 }; res.json(data); } } catch (apiError) { @@ -544,19 +532,16 @@ exports.injectorConfig = ${new_injectorConfig}; return res.status(400).json({ error: "Missing or invalid path (must be a non-empty string)" }); } - const escaped = path.replace(/\\/g, "\\\\").replace(/"/g, '\\"'); - try { - const result = await Runtime.evaluate({ - expression: `readGamePath("${escaped}")`, - returnByValue: true, + const result = await evaluateGame(Runtime, { + expression: `readGamePath(${JSON.stringify(path)})`, }); - if (result.exceptionDetails) { - return res.status(500).json({ error: "Read failed", details: result.exceptionDetails.text }); + if (result.error) { + return res.status(500).json({ error: "Read failed", details: result.error }); } - const data = result.result.value; + const data = result.value; if (data.error) return res.status(500).json({ error: data.error }); // CDP may serialize Haxe arrays as plain objects with numeric keys. @@ -600,21 +585,19 @@ exports.injectorConfig = ${new_injectorConfig}; } } - const escapedRootPath = rootPath.replace(/\\/g, "\\\\").replace(/"/g, '\\"'); const keysJson = JSON.stringify(keys); const fieldsJson = JSON.stringify(fields ?? null); try { - const result = await Runtime.evaluate({ - expression: `readGameEntries("${escapedRootPath}", ${keysJson}, ${fieldsJson})`, - returnByValue: true, + const result = await evaluateGame(Runtime, { + expression: `readGameEntries(${JSON.stringify(rootPath)}, ${keysJson}, ${fieldsJson})`, }); - if (result.exceptionDetails) { - return res.status(500).json({ error: "Read entries failed", details: result.exceptionDetails.text }); + if (result.error) { + return res.status(500).json({ error: "Read entries failed", details: result.error }); } - const data = result.result.value; + const data = result.value; if (data.error) return res.status(500).json({ error: data.error }); log.debug(`Read entries: ${rootPath} (${keys.length} keys)`); @@ -638,23 +621,19 @@ exports.injectorConfig = ${new_injectorConfig}; return res.status(400).json({ error: "args must be an array when provided" }); } - const escapedNamespace = namespace.replace(/\\/g, "\\\\").replace(/"/g, '\\"'); - const escapedName = name.replace(/\\/g, "\\\\").replace(/"/g, '\\"'); const argsJson = JSON.stringify(args ?? []); try { - const result = await Runtime.evaluate({ - expression: `readComputedValue("${escapedNamespace}", "${escapedName}", ${argsJson})`, - returnByValue: true, + const result = await evaluateGame(Runtime, { + expression: `readComputedValue(${JSON.stringify(namespace)}, ${JSON.stringify(name)}, ${argsJson})`, }); - if (result.exceptionDetails) { - const ex = result.exceptionDetails; - const details = ex.exception?.description ?? ex.text; + if (result.error) { + const details = result.error; return res.status(500).json({ error: "Computed read failed", details }); } - const data = result.result.value; + const data = result.value; if (!data || typeof data !== "object") { return res.status(500).json({ error: "Computed read returned no data" }); } @@ -684,23 +663,19 @@ exports.injectorConfig = ${new_injectorConfig}; return res.status(400).json({ error: "argSets must contain arrays" }); } - const escapedNamespace = namespace.replace(/\\/g, "\\\\").replace(/"/g, '\\"'); - const escapedName = name.replace(/\\/g, "\\\\").replace(/"/g, '\\"'); const argSetsJson = JSON.stringify(argSets); try { - const result = await Runtime.evaluate({ - expression: `readComputedValues("${escapedNamespace}", "${escapedName}", ${argSetsJson})`, - returnByValue: true, + const result = await evaluateGame(Runtime, { + expression: `readComputedValues(${JSON.stringify(namespace)}, ${JSON.stringify(name)}, ${argSetsJson})`, }); - if (result.exceptionDetails) { - const ex = result.exceptionDetails; - const details = ex.exception?.description ?? ex.text; + if (result.error) { + const details = result.error; return res.status(500).json({ error: "Computed batch read failed", details }); } - const data = result.result.value; + const data = result.value; if (!data || typeof data !== "object") { return res.status(500).json({ error: "Computed batch read returned no data" }); } @@ -723,24 +698,23 @@ exports.injectorConfig = ${new_injectorConfig}; return res.status(400).json({ error: "Missing value" }); } - const escaped = path.replace(/\\/g, "\\\\").replace(/"/g, '\\"'); const serialized = JSON.stringify(value); if (serialized === undefined) { return res.status(400).json({ error: "value must be JSON-serializable" }); } try { - const result = await Runtime.evaluate({ - expression: `writeGamePath("${escaped}", ${serialized})`, - returnByValue: true, + const result = await evaluateGame(Runtime, { + expression: `writeGamePath(${JSON.stringify(path)}, ${serialized})`, + allowUnsafeEvalBlockedByCSP: true, }); - if (result.exceptionDetails) { - return res.status(500).json({ error: "Write failed", details: result.exceptionDetails.text }); + if (result.error) { + return res.status(500).json({ error: "Write failed", details: result.error }); } - const data = result.result.value; + const data = result.value; if (!data || typeof data !== "object") { return res.status(500).json({ error: "Write returned no data" }); } @@ -760,20 +734,18 @@ exports.injectorConfig = ${new_injectorConfig}; return res.status(400).json({ error: "Missing or invalid path (must be a non-empty string)" }); } - const escaped = path.replace(/\\/g, "\\\\").replace(/"/g, '\\"'); - try { - const result = await Runtime.evaluate({ - expression: `deleteGamePath("${escaped}")`, - returnByValue: true, + const result = await evaluateGame(Runtime, { + expression: `deleteGamePath(${JSON.stringify(path)})`, + allowUnsafeEvalBlockedByCSP: true, }); - if (result.exceptionDetails) { - return res.status(500).json({ error: "Delete failed", details: result.exceptionDetails.text }); + if (result.error) { + return res.status(500).json({ error: "Delete failed", details: result.error }); } - const data = result.result.value; + const data = result.value; if (!data || typeof data !== "object") { return res.status(500).json({ error: "Delete returned no data" }); } @@ -814,17 +786,17 @@ exports.injectorConfig = ${new_injectorConfig}; } try { - const result = await Runtime.evaluate({ + const result = await evaluateGame(Runtime, { expression: `writeGamePaths(${serialized})`, - returnByValue: true, + allowUnsafeEvalBlockedByCSP: true, }); - if (result.exceptionDetails) { - return res.status(500).json({ error: "Batch write failed", details: result.exceptionDetails.text }); + if (result.error) { + return res.status(500).json({ error: "Batch write failed", details: result.error }); } - const data = result.result.value; + const data = result.value; if (!data || typeof data !== "object") { return res.status(500).json({ error: "Batch write returned no data" }); } diff --git a/src/modules/server/gameAccess.js b/src/modules/server/gameAccess.js new file mode 100644 index 00000000..525b9fda --- /dev/null +++ b/src/modules/server/gameAccess.js @@ -0,0 +1,22 @@ +/** + * Evaluate an explicit game expression and unwrap the CDP response. Game + * exceptions are returned separately so routes retain their operation-specific + * responses; transport failures and malformed CDP envelopes throw. + * @param {object} runtime - CDP Runtime client, or a fake with evaluate(). + * @param {object} options - Expression and optional CDP evaluation flags. + * @returns {Promise<{value?: any, error?: string}>} Value or game exception. + */ +async function evaluateGame(runtime, options) { + const response = await runtime.evaluate({ awaitPromise: true, returnByValue: true, ...options }); + if (response?.exceptionDetails) { + const exception = response.exceptionDetails; + return { error: exception.exception?.description || exception.text || "Game evaluation failed" }; + } + const result = response?.result; + if (!result || (!Object.prototype.hasOwnProperty.call(result, "value") && result.type !== "undefined")) { + throw new Error("Game evaluation returned a malformed CDP response"); + } + return { value: result.value }; +} + +module.exports = { evaluateGame }; From 7cc7d541595b3221d8351c58e7da403902a01202 Mon Sep 17 00:00:00 2001 From: Arnold W Date: Mon, 7 Sep 2026 16:29:36 +0200 Subject: [PATCH 29/32] Add Chromium 87 fallbacks for outpost styling --- src/ui/styles/_masterclasses.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/ui/styles/_masterclasses.css b/src/ui/styles/_masterclasses.css index 68371e32..c2749ac6 100644 --- a/src/ui/styles/_masterclasses.css +++ b/src/ui/styles/_masterclasses.css @@ -318,6 +318,7 @@ } .outpost-glorified-button.is-glorified { + background: var(--c-accent-dim-solid); background: color-mix(in srgb, var(--c-accent) 18%, transparent); border: 1px solid var(--c-accent); color: var(--c-accent); @@ -346,8 +347,10 @@ flex-direction: column; gap: 12px; padding: 12px 14px; + border: 1px solid var(--c-border); border: 1px solid color-mix(in srgb, var(--c-border) 60%, transparent); border-radius: 6px; + background: var(--c-panel-dim); background: color-mix(in srgb, var(--c-panel-dim) 50%, transparent); } @@ -357,6 +360,7 @@ justify-content: space-between; gap: 8px; padding-bottom: 6px; + border-bottom: 1px solid var(--c-border); border-bottom: 1px solid color-mix(in srgb, var(--c-border) 40%, transparent); } From 552245a2005dbf6015b105066184c16f8067a6a6 Mon Sep 17 00:00:00 2001 From: Arnold W Date: Mon, 7 Sep 2026 16:29:36 +0200 Subject: [PATCH 30/32] Remove unused account and outpost CSS selectors --- src/ui/styles/_masterclasses.css | 3 --- src/ui/styles/account.css | 11 ----------- 2 files changed, 14 deletions(-) diff --git a/src/ui/styles/_masterclasses.css b/src/ui/styles/_masterclasses.css index c2749ac6..59ce49a3 100644 --- a/src/ui/styles/_masterclasses.css +++ b/src/ui/styles/_masterclasses.css @@ -82,9 +82,6 @@ .resource-node-row__field-label, .outpost-field__label, .outpost-select-field__label, -.outpost-map-unit__field-label, -.outpost-slots__label, -.outpost-map-units__label, .outpost-unit-config__label { grid-column: 1 / -1; color: var(--c-text-muted); diff --git a/src/ui/styles/account.css b/src/ui/styles/account.css index 366e1abb..a204272e 100644 --- a/src/ui/styles/account.css +++ b/src/ui/styles/account.css @@ -1,14 +1,3 @@ -.danger-zone-header { - border: 1px dashed var(--c-danger); - background: var(--c-danger-05); - color: var(--c-danger); - padding: 12px; - text-align: center; - font-size: 0.875rem; - margin-bottom: 20px; - letter-spacing: 0.05em; -} - .toggle-switch { display: inline-flex; align-items: center; From bd58b4d64047011078441d0ead3b4969a8505ded Mon Sep 17 00:00:00 2001 From: Arnold W Date: Tue, 8 Sep 2026 02:50:38 +0200 Subject: [PATCH 31/32] fix(ui): support ChromeDebug in the in-game iframe --- docs/ui.md | 11 ++-- src/main.js | 1 + src/modules/server/devtoolsRelay.js | 73 +++++++++++++++++++++++ src/modules/server/webServer.js | 9 ++- src/modules/server/wsServer.js | 25 +++++++- src/ui/components/views/DevTools.js | 90 ++++++++++------------------- src/ui/styles/_theme.css | 17 +----- src/ui/styles/devtools.css | 75 +++++------------------- 8 files changed, 155 insertions(+), 146 deletions(-) create mode 100644 src/modules/server/devtoolsRelay.js diff --git a/docs/ui.md b/docs/ui.md index c68a39f8..a5b557e6 100644 --- a/docs/ui.md +++ b/docs/ui.md @@ -170,11 +170,10 @@ Features: ### DevTools view -`src/ui/components/views/DevTools.js` embeds or launches Chrome DevTools: - -- Calls `/api/devtools-url` and loads it in an iframe. -- When embedded in the in-game UI, prompts for pop-out to avoid crashes. -- Embedded mode can open Web UI or DevTools in external window via `/api/open-url`. +The in-game inspector supports console evaluation and inspection of the main game. +Pauses are skipped while it is connected. Use **Open externally** for breakpoints, +child frames, and workers. Opening externally disconnects the embedded inspector; +**Reconnect here** returns to in-game inspection. ## Components and patterns @@ -220,5 +219,3 @@ const viewFactories = { ## Embedded vs desktop behavior `IS_ELECTRON` in `src/ui/state/constants.js` handles Electron-specific UI behavior (like external link handling). WebSocket updates available in Electron and browser modes. - -`window.parent !== window` detects embedded mode for DevTools view, forcing pop-out workflow. diff --git a/src/main.js b/src/main.js index 9900adb7..6dd38517 100644 --- a/src/main.js +++ b/src/main.js @@ -123,6 +123,7 @@ async function handlePageLoad(gameContext, config, app) { await startWebServer(app, config.webPort, { runtime: Runtime, context: context, + devtools: { client, cdpPort: config.cdpPort }, }); } diff --git a/src/modules/server/devtoolsRelay.js b/src/modules/server/devtoolsRelay.js new file mode 100644 index 00000000..d7d67f8d --- /dev/null +++ b/src/modules/server/devtoolsRelay.js @@ -0,0 +1,73 @@ +const WebSocket = require("ws"); +const { createLogger } = require("../utils/logger"); + +const log = createLogger("DevTools"); + +/** + * Relay an embedded inspector to the current game without inspecting its own iframe. + * Child targets and breakpoints require the external inspector. Auto-attachment can + * crash Chromium 87; pausing the game also stalls the embedded frontend. + * @param {WebSocket} downstream - Authorized frontend connection. + * @param {Object} config - CDP client and port. + * @returns {Promise} Resolves once upstream connection handlers are installed. + */ +async function relayDevTools(downstream, { client, cdpPort }) { + let upstream; + downstream.pause(); + downstream.on("close", () => upstream?.terminate()); + downstream.on("error", (error) => { + log.error("Frontend connection failed:", error.message); + upstream?.terminate(); + }); + + try { + const { targetInfo } = await client.Target.getTargetInfo(); + if (downstream.readyState !== WebSocket.OPEN) return; + upstream = new WebSocket(`ws://127.0.0.1:${cdpPort}/devtools/page/${targetInfo.targetId}`); + upstream.on("open", () => downstream.resume()); + upstream.on("close", () => downstream.close()); + upstream.on("error", (error) => { + log.error("Game connection failed:", error.message); + downstream.close(1011, "Game debugger connection failed"); + }); + upstream.on("message", (data) => { + const message = JSON.parse(data.toString()); + // Other debugger connections can still cause a pause. Resume from + // Node, since the embedded frontend cannot run while the game pauses. + if (message.method === "Debugger.paused") { + upstream.send(JSON.stringify({ id: -2, method: "Debugger.resume" })); + return; + } + if (message.id === -2 || message.method === "Debugger.resumed") return; + if (downstream.readyState === WebSocket.OPEN) downstream.send(data.toString()); + }); + downstream.on("message", (data) => { + try { + const message = JSON.parse(data.toString()); + if (message.method === "Target.setAutoAttach") { + message.params = { ...message.params, autoAttach: false, waitForDebuggerOnStart: false }; + } + // Keep pause events observable so the relay can resume even + // when a different debugger session causes the pause. + if (message.method === "Debugger.setSkipAllPauses") message.params = { skip: false }; + if (message.method === "Debugger.pause") { + downstream.send( + JSON.stringify({ + id: message.id, + error: { code: -32000, message: "Use Open externally to pause the game." }, + }) + ); + return; + } + if (upstream.readyState === WebSocket.OPEN) upstream.send(JSON.stringify(message)); + } catch { + downstream.close(1007, "Invalid debugger message"); + } + }); + } catch (error) { + log.error("Could not connect embedded inspector:", error.message); + downstream.close(1011, "Game debugger unavailable"); + } +} + +module.exports = { relayDevTools }; diff --git a/src/modules/server/webServer.js b/src/modules/server/webServer.js index 3f12874d..9869f614 100644 --- a/src/modules/server/webServer.js +++ b/src/modules/server/webServer.js @@ -83,6 +83,7 @@ function createWebServer(config) { * @param {Object} [wsConfig] - Optional WebSocket configuration * @param {Object} [wsConfig.runtime] - CDP Runtime client for WebSocket * @param {string} [wsConfig.context] - Game context expression for WebSocket + * @param {Object} [wsConfig.devtools] - CDP client and port for the embedded inspector * @returns {Promise} Server instance */ function startServer(router, port, wsConfig = null) { @@ -123,7 +124,13 @@ function startServer(router, port, wsConfig = null) { // Initialize WebSocket server if config provided if (wsConfig && wsConfig.runtime && wsConfig.context) { - initWebSocket(server, wsConfig.runtime, wsConfig.context, (req) => acceptsRequest(req)); + initWebSocket( + server, + wsConfig.runtime, + wsConfig.context, + (req) => acceptsRequest(req), + wsConfig.devtools + ); } resolve(server); diff --git a/src/modules/server/wsServer.js b/src/modules/server/wsServer.js index 01587841..7aea9d22 100644 --- a/src/modules/server/wsServer.js +++ b/src/modules/server/wsServer.js @@ -6,6 +6,7 @@ */ const { WebSocketServer } = require("ws"); +const { relayDevTools } = require("./devtoolsRelay"); const { createLogger } = require("../utils/logger"); const log = createLogger("WebSocket"); @@ -294,14 +295,32 @@ async function cleanupClientSubscriptions(ws) { * @param {Object} runtime - CDP Runtime client * @param {string} context - JavaScript expression for game context * @param {Function} acceptsRequest - Shared HTTP/WebSocket access policy + * @param {Object} [devtools] - CDP client and port for the embedded inspector */ -function initWebSocket(httpServer, runtime, context, acceptsRequest) { +function initWebSocket(httpServer, runtime, context, acceptsRequest, devtools) { runtimeRef = runtime; contextRef = context; - wss = new WebSocketServer({ server: httpServer, verifyClient: ({ req }) => acceptsRequest(req) }); + wss = new WebSocketServer({ + server: httpServer, + verifyClient: ({ req }) => { + if (acceptsRequest(req)) return true; + // The bundled frontend is served by CDP, on a different loopback port. + // Allow that origin only for the relay, retaining the shared Host check. + return ( + devtools && + req.url === "/devtools" && + req.headers.origin === `http://localhost:${devtools.cdpPort}` && + acceptsRequest({ ...req, headers: { ...req.headers, origin: `http://${req.headers.host}` } }) + ); + }, + }); - wss.on("connection", (ws) => { + wss.on("connection", (ws, req) => { + if (req.url === "/devtools" && devtools) { + void relayDevTools(ws, devtools); + return; + } clients.add(ws); getClientMonitorMap(ws); ws.clientType = "ui"; diff --git a/src/ui/components/views/DevTools.js b/src/ui/components/views/DevTools.js index 0ba15641..f82e4670 100644 --- a/src/ui/components/views/DevTools.js +++ b/src/ui/components/views/DevTools.js @@ -7,23 +7,24 @@ const { div, iframe, button } = van.tags; export const DevTools = () => { const url = van.state(""); const error = van.state(""); + const openedExternally = van.state(false); const isEmbedded = window.parent !== window; - const webUiUrl = `http://localhost:${window.location.port || "8080"}`; - - // Load DevTools URL on mount (skip if embedded to prevent crashes) - if (!isEmbedded) { - API.fetchDevToolsUrl() - .then((devtoolsUrl) => { - url.val = devtoolsUrl; - }) - .catch((e) => { - error.val = e.message; - }); - } + API.fetchDevToolsUrl() + .then((devtoolsUrl) => { + const frameUrl = new URL(devtoolsUrl); + if (isEmbedded) frameUrl.searchParams.set("ws", `${window.location.host}/devtools`); + url.val = frameUrl.href; + }) + .catch((e) => { + error.val = e.message; + }); const openDevTools = async () => { try { const devtoolsUrl = await API.fetchDevToolsUrl(); + openedExternally.val = true; + // Let VanJS remove the iframe and close its pause-suppressing session. + await new Promise((resolve) => setTimeout(resolve, 0)); if (IS_ELECTRON) { await API.openExternalUrl(devtoolsUrl); } else { @@ -34,54 +35,7 @@ export const DevTools = () => { } }; - const openWebUi = async () => { - try { - if (IS_ELECTRON) { - await API.openExternalUrl(webUiUrl); - } else { - window.open(webUiUrl, "_blank", "noopener,noreferrer"); - } - } catch (e) { - error.val = `Failed to open Web UI: ${e.message}`; - } - }; - - const renderEmbeddedView = () => - div( - { class: "devtools-popout-card", role: "status" }, - div({ class: "devtools-popout-kicker" }, "EMBEDDED GAME VIEW"), - div({ class: "devtools-popout-title" }, "ChromeDebug opens separately"), - - div("Embedded DevTools is disabled inside the game UI to prevent crashes"), - div("Use the pop-out window for full DevTools access"), - div( - { class: "devtools-actions" }, - button( - { - type: "button", - class: "btn-primary", - onclick: openWebUi, - }, - "Open Web UI" - ), - button( - { - type: "button", - class: "btn-primary", - onclick: openDevTools, - }, - "Open ChromeDebug" - ) - ), - - () => (error.val ? div({ class: "devtools-error", role: "alert" }, error.val) : null) - ); - const renderContent = () => { - if (isEmbedded) { - return renderEmbeddedView(); - } - if (error.val) { return div( { id: "devtools-message", class: "is-error", role: "alert" }, @@ -90,6 +44,17 @@ export const DevTools = () => { ); } + if (openedExternally.val) { + return div( + { id: "devtools-message", role: "status" }, + "Embedded inspector disconnected for external debugging.", + button( + { type: "button", class: "btn-primary", onclick: () => (openedExternally.val = false) }, + "Reconnect here" + ) + ); + } + if (!url.val) { return div({ id: "devtools-message", role: "status", "aria-live": "polite" }, "Connecting to ChromeDebug"); } @@ -103,6 +68,13 @@ export const DevTools = () => { return div( { id: "devtools-tab", class: "tab-pane devtools-workspace" }, + isEmbedded + ? div( + { class: "devtools-embedded-toolbar" }, + div("Inspecting the main game. Use the external window for breakpoints, child frames and workers."), + button({ type: "button", class: "btn-primary", onclick: openDevTools }, "Open externally") + ) + : null, div({ class: "terminal-wrapper" }, renderContent) ); }; diff --git a/src/ui/styles/_theme.css b/src/ui/styles/_theme.css index 7a5c8dd2..38119de1 100644 --- a/src/ui/styles/_theme.css +++ b/src/ui/styles/_theme.css @@ -457,8 +457,7 @@ body, #devtools-tab.devtools-workspace, #devtools-tab.devtools-workspace .terminal-wrapper, -.devtools-workspace #devtools-iframe, -.devtools-popout-card { +.devtools-workspace #devtools-iframe { background: var(--atlas-surface); } @@ -467,20 +466,6 @@ body, color: var(--atlas-text-muted); } -.devtools-popout-card { - color: var(--atlas-text-muted); - border-color: var(--atlas-border); - box-shadow: 0 18px 45px var(--atlas-shadow); -} - -.devtools-popout-title { - color: var(--atlas-text); -} - -.devtools-popout-kicker { - color: var(--atlas-accent); -} - /* Chromium 87 fallbacks for optional color-mix() enhancements. */ @supports not (color: color-mix(in srgb, white 50%, black)) { .summoning-round-row--done:not(.account-row--success):not(.account-row--error), diff --git a/src/ui/styles/devtools.css b/src/ui/styles/devtools.css index ab6d98cb..c142adcd 100644 --- a/src/ui/styles/devtools.css +++ b/src/ui/styles/devtools.css @@ -1,21 +1,27 @@ /** * DevTools View - * Embedded warning, actions, error states + * Embedded inspector and error states */ -.devtools-popout-title { - margin-bottom: 8px; - color: var(--atlas-text); - font-size: 1.125rem; - font-weight: 700; - letter-spacing: -0.02em; -} - #devtools-tab.devtools-workspace { padding: 0; background: var(--atlas-canvas); } +.devtools-embedded-toolbar { + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; + padding: 8px 12px; + color: var(--atlas-text-muted); + font-size: 0.75rem; +} + +.devtools-embedded-toolbar button { + flex-shrink: 0; +} + #devtools-tab.devtools-workspace .terminal-wrapper { flex: 1 1 auto; width: 100%; @@ -33,47 +39,6 @@ background: var(--atlas-canvas); } -.devtools-popout-card { - width: min(520px, calc(100% - 32px)); - margin: auto; - padding: 28px; - border: 1px solid var(--atlas-border); - border-radius: 12px; - background: var(--atlas-surface); - box-shadow: 0 18px 45px var(--atlas-shadow); - color: var(--atlas-text-muted); - font-family: var(--font-sans, "Inter", "Segoe UI", sans-serif); - font-size: 0.8125rem; - line-height: 1.55; - text-align: center; -} - -.devtools-popout-kicker { - margin-bottom: 5px; - color: var(--atlas-accent); - font-size: 0.75rem; - font-weight: 750; - letter-spacing: 0.12em; -} - -.devtools-actions { - display: grid; - grid-template-columns: repeat(2, minmax(0, 1fr)); - gap: 8px; - margin: 20px auto 0; -} - -.devtools-actions button { - min-height: 36px; - border-radius: 8px; - font-size: 0.75rem; -} - -.devtools-error { - margin-top: 12px; - color: var(--atlas-danger); -} - #devtools-message.is-error { color: var(--atlas-danger); } @@ -93,13 +58,3 @@ outline: 2px solid var(--atlas-focus); outline-offset: 2px; } - -@media (max-width: 760px) { - .devtools-popout-card { - padding: 20px; - } - - .devtools-actions { - grid-template-columns: minmax(0, 1fr); - } -} From 838687af0e58ff7873c55816f9750c9e577f27af Mon Sep 17 00:00:00 2001 From: Arnold W Date: Tue, 8 Sep 2026 03:01:50 +0200 Subject: [PATCH 32/32] fix(ui): allow embedded access and target saved favorites correctly --- src/cheats/ui/overlay.js | 3 +++ src/modules/server/serverAccess.js | 26 ++++++++++++++++++++++++-- src/ui/components/views/AtlasCheats.js | 3 ++- 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/cheats/ui/overlay.js b/src/cheats/ui/overlay.js index f561c576..1df766fe 100644 --- a/src/cheats/ui/overlay.js +++ b/src/cheats/ui/overlay.js @@ -113,6 +113,9 @@ export function injectWebUI() { uiContainer.style.cssText = styles.container; uiIframe = document.createElement("iframe"); + // The HTTPS game embeds the local HTTP UI; send its origin across the + // downgrade so the server can authorize the iframe navigation. + uiIframe.referrerPolicy = "origin"; uiIframe.src = `http://localhost:${webPort}`; uiIframe.style.cssText = styles.iframe; diff --git a/src/modules/server/serverAccess.js b/src/modules/server/serverAccess.js index f776b031..ee53b592 100644 --- a/src/modules/server/serverAccess.js +++ b/src/modules/server/serverAccess.js @@ -7,6 +7,7 @@ * @returns {(req: import("http").IncomingMessage) => boolean} Request predicate. */ function createRequestPolicy(config, port) { + const target = (config.target || "steam").toLowerCase(); const uiOrigins = new Set([`http://localhost:${port}`, `http://127.0.0.1:${port}`, `http://[::1]:${port}`]); const localHosts = new Set(["127.0.0.1", "localhost", "::1"]); if (!localHosts.has(config.webHost || "127.0.0.1")) { @@ -20,7 +21,7 @@ function createRequestPolicy(config, port) { } const hosts = new Set([...uiOrigins].map((origin) => new URL(origin).host)); const origins = new Set(uiOrigins); - if (config.target === "web") { + if (target === "web") { origins.add(new URL(config.webUrl).origin); } else { origins.add("null"); @@ -31,7 +32,28 @@ function createRequestPolicy(config, port) { if (!hosts.has(req.headers.host)) return false; const origin = req.headers.origin; if (origin !== undefined) return origins.has(origin); - return req.headers["sec-fetch-site"] !== "cross-site"; + if (req.headers["sec-fetch-site"] !== "cross-site") return true; + + // Embedded UI navigations and GETs may omit Origin while the game + // ancestor makes Sec-Fetch-Site cross-site. Verify their referrer instead. + if (req.method !== "GET" && req.method !== "HEAD") return false; + // File documents never send a referrer. Permit Steam's initial UI shell + // navigation only; its API requests and WebSocket still need authorization. + if ( + target === "steam" && + req.method === "GET" && + (req.url === "/" || req.url === "/index.html") && + req.headers.referer === undefined && + req.headers["sec-fetch-mode"] === "navigate" && + req.headers["sec-fetch-dest"] === "iframe" + ) { + return true; + } + try { + return origins.has(new URL(req.headers.referer).origin); + } catch { + return false; + } }; } diff --git a/src/ui/components/views/AtlasCheats.js b/src/ui/components/views/AtlasCheats.js index 0683c99b..453a38e5 100644 --- a/src/ui/components/views/AtlasCheats.js +++ b/src/ui/components/views/AtlasCheats.js @@ -466,7 +466,8 @@ export const AtlasCheats = () => { isFavorite: (item) => store.isFavorite(item.action), onSelect: selectEntry, onExecute: executeAction, - onFavorite: toggleFavorite, + onFavorite: (entry) => + entry.parameter ? store.toggleFavorite(entry.action) : toggleFavorite(entry), onOpenConfig: openConfig, canExecute: () => store.app.heartbeat, })