From 7ae0d28ef0cf8e630395a4bee343b89bb78d429e Mon Sep 17 00:00:00 2001 From: Timothy Carambat <rambat1010@gmail.com> Date: Fri, 18 Aug 2023 14:36:58 -0700 Subject: [PATCH] improve UX and useability for Settings and prefernces for mobile and desktop (#200) * improve UX and useability for Settings and prefernces for mobile and desktop * linting --- frontend/src/App.jsx | 2 - .../src/components/AdminSidebar/index.jsx | 8 +- .../Modals/Settings/Appearance/index.jsx} | 55 ++---- .../Modals/Settings/VectorDbs/index.jsx | 2 +- .../src/components/Modals/Settings/index.jsx | 112 +---------- .../Sidebar/SettingsOverlay/index.jsx | 181 ++++++++++++++++++ frontend/src/components/Sidebar/index.jsx | 66 +++---- frontend/src/pages/Admin/Appearance/index.jsx | 2 +- frontend/src/utils/paths.js | 3 - 9 files changed, 239 insertions(+), 192 deletions(-) rename frontend/src/{pages/System/Appearance.jsx => components/Modals/Settings/Appearance/index.jsx} (81%) create mode 100644 frontend/src/components/Sidebar/SettingsOverlay/index.jsx diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index 30168aafc..f5d534262 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -12,7 +12,6 @@ const AdminWorkspaces = lazy(() => import("./pages/Admin/Workspaces")); const AdminChats = lazy(() => import("./pages/Admin/Chats")); const AdminSystem = lazy(() => import("./pages/Admin/System")); const AdminAppearance = lazy(() => import("./pages/Admin/Appearance")); -const Appearance = lazy(() => import("./pages/System/Appearance")); export default function App() { return ( @@ -20,7 +19,6 @@ export default function App() { <ContextWrapper> <Routes> <Route path="/" element={<Main />} /> - <Route path="/system/appearance" element={<Appearance />} /> <Route path="/workspace/:slug" element={<PrivateRoute Component={WorkspaceChat} />} diff --git a/frontend/src/components/AdminSidebar/index.jsx b/frontend/src/components/AdminSidebar/index.jsx index 61402d66c..b185d4f9b 100644 --- a/frontend/src/components/AdminSidebar/index.jsx +++ b/frontend/src/components/AdminSidebar/index.jsx @@ -182,12 +182,12 @@ export function SidebarMobileHeader() { /> <div ref={sidebarRef} - className="h-[100vh] fixed top-0 left-0 rounded-r-[26px] bg-white dark:bg-black-900 w-[70%] p-[18px] " + className="h-[100vh] fixed top-0 left-0 rounded-r-[26px] bg-white dark:bg-black-900 w-[80%] p-[18px] " > <div className="w-full h-full flex flex-col overflow-x-hidden items-between"> {/* Header Information */} - <div className="flex w-full items-center justify-between"> - <div className="flex shrink-0 w-fit items-center justify-start"> + <div className="flex w-full items-center justify-between gap-x-4"> + <div className="flex shrink-1 w-fit items-center justify-start"> <img src={logo} alt="Logo" @@ -195,7 +195,7 @@ export function SidebarMobileHeader() { style={{ objectFit: "contain" }} /> </div> - <div className="flex gap-x-2 items-center text-slate-500"> + <div className="flex gap-x-2 items-center text-slate-500 shrink-0"> <a href={paths.home()} className="transition-all duration-300 p-2 rounded-full bg-slate-200 text-slate-400 dark:bg-stone-800 hover:bg-slate-800 hover:text-slate-200 dark:hover:text-slate-200" diff --git a/frontend/src/pages/System/Appearance.jsx b/frontend/src/components/Modals/Settings/Appearance/index.jsx similarity index 81% rename from frontend/src/pages/System/Appearance.jsx rename to frontend/src/components/Modals/Settings/Appearance/index.jsx index df815b042..8108e74e6 100644 --- a/frontend/src/pages/System/Appearance.jsx +++ b/frontend/src/components/Modals/Settings/Appearance/index.jsx @@ -1,13 +1,10 @@ -import React, { useState, useEffect } from "react"; -import AnythingLLMLight from "../../media/logo/anything-llm-light.png"; -import AnythingLLMDark from "../../media/logo/anything-llm-dark.png"; -import System from "../../models/system"; -import usePrefersDarkMode from "../../hooks/usePrefersDarkMode"; -import useLogo from "../../hooks/useLogo"; -import EditingChatBubble from "../../components/EditingChatBubble"; -import { isMobile } from "react-device-detect"; -import { ArrowLeft } from "react-feather"; -import paths from "../../utils/paths"; +import { useEffect, useState } from "react"; +import useLogo from "../../../../hooks/useLogo"; +import usePrefersDarkMode from "../../../../hooks/usePrefersDarkMode"; +import System from "../../../../models/system"; +import EditingChatBubble from "../../../EditingChatBubble"; +import AnythingLLMLight from "../../../../media/logo/anything-llm-light.png"; +import AnythingLLMDark from "../../../../media/logo/anything-llm-dark.png"; export default function Appearance() { const { logo: _initLogo } = useLogo(); @@ -118,32 +115,16 @@ export default function Appearance() { setHasChanges(false); }; - const handleBackNavigation = () => { - window.location = paths.home(); - }; - return ( - <div className="w-screen h-screen overflow-hidden bg-orange-100 dark:bg-stone-700 flex justify-center py-6"> - <div - style={{ height: isMobile ? "100%" : "calc(100% - 32px)" }} - className="transition-all duration-500 relative md:ml-[2px] md:mr-[8px] md:my-[16px] md:rounded-[26px] bg-white dark:bg-black-900 md:min-w-[82%] p-[18px] h-full overflow-y-scroll" - > - <div className="px-1 md:px-8"> - <div className="mb-6"> - <div - className="cursor-pointer inline-flex items-center gap-3 mb-5 py-2 pl-2 pr-4 text-white rounded-md hover:bg-gray-300 dark:hover:bg-gray-800 transition-all" - onClick={handleBackNavigation} - > - <ArrowLeft /> - <span>Back</span> - </div> - <p className="text-3xl font-semibold text-slate-600 dark:text-slate-200"> - Appearance Settings - </p> - <p className="mt-2 text-sm font-base text-slate-600 dark:text-slate-200"> - Customize the appearance settings of your platform. - </p> - </div> + <div className="relative w-full w-full max-h-full"> + <div className="relative bg-white rounded-lg shadow dark:bg-stone-700"> + <div className="flex items-start justify-between px-6 py-4"> + <p className="text-gray-800 dark:text-stone-200 text-base "> + Customize the appearance settings of AnythingLLM instance. + </p> + </div> + + <div className="px-1 md:px-8 pb-10"> <div className="mb-6"> <div className="flex flex-col gap-y-2"> <h2 className="leading-tight font-medium text-black dark:text-white"> @@ -153,7 +134,7 @@ export default function Appearance() { Change the logo that appears in the sidebar. </p> </div> - <div className="flex items-center"> + <div className="flex flex-col md:flex-row items-center"> <img src={logo} alt="Uploaded Logo" @@ -197,7 +178,7 @@ export default function Appearance() { Change the default messages that are displayed to the users. </p> </div> - <div className="mt-6 flex flex-col gap-y-6"> + <div className="mt-6 flex flex-col gap-y-6 bg-white dark:bg-black-900 p-4 rounded-lg"> {messages.map((message, index) => ( <div key={index} className="flex flex-col gap-y-2"> {message.user && ( diff --git a/frontend/src/components/Modals/Settings/VectorDbs/index.jsx b/frontend/src/components/Modals/Settings/VectorDbs/index.jsx index ec25e0a7e..9bf86af73 100644 --- a/frontend/src/components/Modals/Settings/VectorDbs/index.jsx +++ b/frontend/src/components/Modals/Settings/VectorDbs/index.jsx @@ -61,7 +61,7 @@ export default function VectorDBSelection({ <p className="block text-sm font-medium text-gray-800 dark:text-slate-200"> Vector database providers </p> - <div className="w-full flex overflow-x-scroll gap-x-4"> + <div className="w-full flex md:flex-wrap overflow-x-scroll gap-4"> <input hidden={true} name="VectorDB" value={vectorDB} /> <VectorDBOption name="Chroma" diff --git a/frontend/src/components/Modals/Settings/index.jsx b/frontend/src/components/Modals/Settings/index.jsx index 0814b1d40..591b06a62 100644 --- a/frontend/src/components/Modals/Settings/index.jsx +++ b/frontend/src/components/Modals/Settings/index.jsx @@ -1,13 +1,5 @@ import React, { useEffect, useState } from "react"; -import { - Archive, - Lock, - X, - Users, - Database, - MessageSquare, - Eye, -} from "react-feather"; +import { X } from "react-feather"; import ExportOrImportData from "./ExportImport"; import PasswordProtection from "./PasswordProtection"; import System from "../../../models/system"; @@ -15,23 +7,23 @@ import MultiUserMode from "./MultiUserMode"; import useUser from "../../../hooks/useUser"; import VectorDBSelection from "./VectorDbs"; import LLMSelection from "./LLMSelection"; -import paths from "../../../utils/paths"; +import Appearance from "./Appearance"; -const TABS = { +export const TABS = { llm: LLMSelection, exportimport: ExportOrImportData, password: PasswordProtection, multiuser: MultiUserMode, vectordb: VectorDBSelection, + appearance: Appearance, }; const noop = () => false; -export default function SystemSettingsModal({ hideModal = noop }) { +export default function SystemSettingsModal({ tab = null, hideModal = noop }) { const { user } = useUser(); const [loading, setLoading] = useState(true); - const [selectedTab, setSelectedTab] = useState("llm"); const [settings, setSettings] = useState(null); - const Component = TABS[selectedTab || "llm"]; + const Component = TABS[tab || "llm"]; useEffect(() => { async function fetchKeys() { @@ -64,12 +56,6 @@ export default function SystemSettingsModal({ hideModal = noop }) { <X className="text-gray-300 text-lg" /> </button> </div> - <SettingTabs - selectedTab={selectedTab} - changeTab={setSelectedTab} - settings={settings} - user={user} - /> </div> {loading ? ( <div className="w-full flex h-[400px] p-6"> @@ -84,92 +70,6 @@ export default function SystemSettingsModal({ hideModal = noop }) { ); } -function SettingTabs({ selectedTab, changeTab, settings, user }) { - if (!settings) { - return ( - <div className="w-full flex h-[60px] pb-2"> - <div className="w-full flex h-full bg-gray-200 dark:bg-stone-600 animate-pulse rounded-lg" /> - </div> - ); - } - - return ( - <ul className="flex overflow-x-scroll no-scroll -mb-px text-sm gap-x-2 font-medium text-center text-gray-500 dark:text-gray-400"> - <SettingTab - active={selectedTab === "llm"} - displayName="LLM Choice" - tabName="llm" - icon={<MessageSquare className="h-4 w-4 flex-shrink-0" />} - onClick={changeTab} - /> - <SettingTab - active={selectedTab === "vectordb"} - displayName="Vector Database" - tabName="vectordb" - icon={<Database className="h-4 w-4 flex-shrink-0" />} - onClick={changeTab} - /> - <SettingTab - active={selectedTab === "exportimport"} - displayName="Export or Import" - tabName="exportimport" - icon={<Archive className="h-4 w-4 flex-shrink-0" />} - onClick={changeTab} - /> - {!settings?.MultiUserMode && ( - <> - <SettingTab - active={selectedTab === "multiuser"} - displayName="Multi User Mode" - tabName="multiuser" - icon={<Users className="h-4 w-4 flex-shrink-0" />} - onClick={changeTab} - /> - <SettingTab - active={selectedTab === "password"} - displayName="Password Protection" - tabName="password" - icon={<Lock className="h-4 w-4 flex-shrink-0" />} - onClick={changeTab} - /> - <SettingTab - displayName="Appearance" - tabName="appearance" - icon={<Eye className="h-4 w-4 flex-shrink-0" />} - onClick={() => window.open(paths.appearance())} - /> - </> - )} - </ul> - ); -} - -function SettingTab({ - active = false, - displayName, - tabName, - icon = "", - onClick, -}) { - const classes = active - ? "text-blue-600 border-blue-600 active dark:text-blue-400 dark:border-blue-400 bg-blue-500 bg-opacity-5" - : "border-transparent hover:text-gray-600 hover:border-gray-300 dark:hover:text-gray-300"; - return ( - <li className="mr-2"> - <button - disabled={active} - onClick={() => onClick(tabName)} - className={ - "flex items-center gap-x-1 p-4 border-b-2 rounded-t-lg group whitespace-nowrap " + - classes - } - > - {icon} {displayName} - </button> - </li> - ); -} - export function useSystemSettingsModal() { const [showing, setShowing] = useState(false); const showModal = () => { diff --git a/frontend/src/components/Sidebar/SettingsOverlay/index.jsx b/frontend/src/components/Sidebar/SettingsOverlay/index.jsx new file mode 100644 index 000000000..794968f38 --- /dev/null +++ b/frontend/src/components/Sidebar/SettingsOverlay/index.jsx @@ -0,0 +1,181 @@ +import React, { useEffect, useState } from "react"; +import { + X, + Archive, + Lock, + Users, + Database, + MessageSquare, + Eye, +} from "react-feather"; +import SystemSettingsModal, { + useSystemSettingsModal, +} from "../../Modals/Settings"; +import useLogo from "../../../hooks/useLogo"; +import System from "../../../models/system"; + +const OVERLAY_ID = "anything-llm-system-overlay"; +const OVERLAY_CLASSES = { + enabled: ["z-10", "opacity-1"], + disabled: ["-z-10", "opacity-0"], +}; + +export default function SettingsOverlay() { + const { logo } = useLogo(); + const [tab, setTab] = useState(null); + const [settings, setSettings] = useState(null); + const [loading, setLoading] = useState(true); + const { showing, hideModal, showModal } = useSystemSettingsModal(); + const selectTab = (tab = null) => { + setTab(tab); + showModal(true); + }; + const handleModalClose = () => { + hideModal(); + setTab(null); + }; + + useEffect(() => { + async function fetchKeys() { + const _settings = await System.keys(); + setSettings(_settings); + setLoading(false); + } + fetchKeys(); + }, []); + + return ( + <div + id={OVERLAY_ID} + className="absolute left-0 rounded-[26px] top-0 w-full h-full opacity-0 -z-10 p-[18px] transition-all duration-300 bg-white dark:bg-black-900 flex flex-col overflow-x-hidden items-between" + > + <div className="flex w-full items-center justify-between"> + <div className="flex shrink-0 max-w-[50%] items-center justify-start"> + <img + src={logo} + alt="Logo" + className="rounded max-h-[40px]" + style={{ objectFit: "contain" }} + /> + </div> + <div className="flex gap-x-2 items-center text-slate-500"> + <button + onClick={() => { + setTab(null); + hideOverlay(); + }} + className="transition-all duration-300 p-2 rounded-full bg-slate-200 text-slate-400 dark:bg-stone-800 hover:bg-slate-800 hover:text-slate-200 dark:hover:text-slate-200" + > + <X className="h-4 w-4 " /> + </button> + </div> + </div> + + <div className="h-[100%] flex flex-col w-full justify-between pt-4 overflow-y-hidden"> + <div className="h-auto sidebar-items dark:sidebar-items"> + <p className="text-sm leading-loose my-2 text-slate-800 dark:text-slate-200 "> + Select a setting to configure + </p> + {loading ? ( + <div className="flex flex-col gap-y-4 h-[65vh] pb-8 overflow-y-scroll no-scroll"> + <div className="rounded-lg w-[90%] h-[36px] bg-stone-600 animate-pulse" /> + <div className="rounded-lg w-[90%] h-[36px] bg-stone-600 animate-pulse" /> + <div className="rounded-lg w-[90%] h-[36px] bg-stone-600 animate-pulse" /> + <div className="rounded-lg w-[90%] h-[36px] bg-stone-600 animate-pulse" /> + <div className="rounded-lg w-[90%] h-[36px] bg-stone-600 animate-pulse" /> + <div className="rounded-lg w-[90%] h-[36px] bg-stone-600 animate-pulse" /> + </div> + ) : ( + <div className="flex flex-col gap-y-4 h-[65vh] pb-8 overflow-y-scroll no-scroll"> + {!settings?.MultiUserMode && ( + <Option + btnText="Appearance" + icon={<Eye className="h-4 w-4 flex-shrink-0" />} + isActive={tab === "appearance"} + onClick={() => selectTab("appearance")} + /> + )} + <Option + btnText="LLM Preference" + icon={<MessageSquare className="h-4 w-4 flex-shrink-0" />} + isActive={tab === "llm"} + onClick={() => selectTab("llm")} + /> + <Option + btnText="Vector Database" + icon={<Database className="h-4 w-4 flex-shrink-0" />} + isActive={tab === "vectordb"} + onClick={() => selectTab("vectordb")} + /> + <Option + btnText="Export or Import" + icon={<Archive className="h-4 w-4 flex-shrink-0" />} + isActive={tab === "exportimport"} + onClick={() => selectTab("exportimport")} + /> + {!settings?.MultiUserMode && ( + <> + <Option + btnText="Password Protection" + icon={<Lock className="h-4 w-4 flex-shrink-0" />} + isActive={tab === "password"} + onClick={() => selectTab("password")} + /> + <Option + btnText="Multi User Mode" + icon={<Users className="h-4 w-4 flex-shrink-0" />} + isActive={tab === "multiuser"} + onClick={() => selectTab("multiuser")} + /> + </> + )} + </div> + )} + </div> + </div> + {showing && !!tab && ( + <SystemSettingsModal tab={tab} hideModal={handleModalClose} /> + )} + </div> + ); +} + +const Option = ({ btnText, icon, isActive, onClick }) => { + return ( + <div className="flex gap-x-2 items-center justify-between"> + <button + onClick={onClick} + className={`flex flex-grow w-[75%] h-[36px] gap-x-2 py-[5px] px-4 border border-slate-400 rounded-lg text-slate-800 dark:text-slate-200 justify-start items-center ${ + isActive + ? "bg-gray-100 dark:bg-stone-600" + : "hover:bg-slate-100 dark:hover:bg-stone-900 " + }`} + > + {icon} + <p className="text-slate-800 dark:text-slate-200 text-xs leading-loose font-semibold whitespace-nowrap overflow-hidden "> + {btnText} + </p> + </button> + </div> + ); +}; + +function showOverlay() { + document + .getElementById(OVERLAY_ID) + .classList.remove(...OVERLAY_CLASSES.disabled); + document.getElementById(OVERLAY_ID).classList.add(...OVERLAY_CLASSES.enabled); +} + +function hideOverlay() { + document + .getElementById(OVERLAY_ID) + .classList.remove(...OVERLAY_CLASSES.enabled); + document + .getElementById(OVERLAY_ID) + .classList.add(...OVERLAY_CLASSES.disabled); +} + +export function useSystemSettingsOverlay() { + return { showOverlay, hideOverlay }; +} diff --git a/frontend/src/components/Sidebar/index.jsx b/frontend/src/components/Sidebar/index.jsx index 9b3068ddf..c273f987f 100644 --- a/frontend/src/components/Sidebar/index.jsx +++ b/frontend/src/components/Sidebar/index.jsx @@ -2,8 +2,6 @@ import React, { useEffect, useRef, useState } from "react"; import { AtSign, BookOpen, - Briefcase, - Cpu, GitHub, LogOut, Menu, @@ -11,12 +9,10 @@ import { Plus, Shield, Tool, + X, } from "react-feather"; import IndexCount from "./IndexCount"; import LLMStatus from "./LLMStatus"; -import SystemSettingsModal, { - useSystemSettingsModal, -} from "../Modals/Settings"; import NewWorkspaceModal, { useNewWorkspaceModal, } from "../Modals/NewWorkspace"; @@ -27,15 +23,12 @@ import useUser from "../../hooks/useUser"; import { userFromStorage } from "../../utils/request"; import { AUTH_TOKEN, AUTH_USER } from "../../utils/constants"; import useLogo from "../../hooks/useLogo"; +import SettingsOverlay, { useSystemSettingsOverlay } from "./SettingsOverlay"; export default function Sidebar() { const { logo } = useLogo(); const sidebarRef = useRef(null); - const { - showing: showingSystemSettingsModal, - showModal: showSystemSettingsModal, - hideModal: hideSystemSettingsModal, - } = useSystemSettingsModal(); + const { showOverlay } = useSystemSettingsOverlay(); const { showing: showingNewWsModal, showModal: showNewWsModal, @@ -47,8 +40,9 @@ export default function Sidebar() { <div ref={sidebarRef} style={{ height: "calc(100% - 32px)" }} - className="transition-all duration-500 relative m-[16px] rounded-[26px] bg-white dark:bg-black-900 min-w-[15.5%] p-[18px] " + className="relative transition-all duration-500 relative m-[16px] rounded-[26px] bg-white dark:bg-black-900 min-w-[15.5%] p-[18px] " > + <SettingsOverlay /> <div className="w-full h-full flex flex-col overflow-x-hidden items-between"> {/* Header Information */} <div className="flex w-full items-center justify-between"> @@ -62,12 +56,7 @@ export default function Sidebar() { </div> <div className="flex gap-x-2 items-center text-slate-500"> <AdminHome /> - <button - onClick={showSystemSettingsModal} - className="transition-all duration-300 p-2 rounded-full bg-slate-200 text-slate-400 dark:bg-stone-800 hover:bg-slate-800 hover:text-slate-200 dark:hover:text-slate-200" - > - <Tool className="h-4 w-4 " /> - </button> + <SettingsButton onClick={showOverlay} /> </div> </div> @@ -142,9 +131,6 @@ export default function Sidebar() { </div> </div> </div> - {showingSystemSettingsModal && ( - <SystemSettingsModal hideModal={hideSystemSettingsModal} /> - )} {showingNewWsModal && <NewWorkspaceModal hideModal={hideNewWsModal} />} </> ); @@ -155,11 +141,7 @@ export function SidebarMobileHeader() { const sidebarRef = useRef(null); const [showSidebar, setShowSidebar] = useState(false); const [showBgOverlay, setShowBgOverlay] = useState(false); - const { - showing: showingSystemSettingsModal, - showModal: showSystemSettingsModal, - hideModal: hideSystemSettingsModal, - } = useSystemSettingsModal(); + const { showOverlay } = useSystemSettingsOverlay(); const { showing: showingNewWsModal, showModal: showNewWsModal, @@ -167,6 +149,8 @@ export function SidebarMobileHeader() { } = useNewWorkspaceModal(); useEffect(() => { + // Darkens the rest of the screen + // when sidebar is open. function handleBg() { if (showSidebar) { setTimeout(() => { @@ -213,12 +197,13 @@ export function SidebarMobileHeader() { /> <div ref={sidebarRef} - className="h-[100vh] fixed top-0 left-0 rounded-r-[26px] bg-white dark:bg-black-900 w-[70%] p-[18px] " + className="relative h-[100vh] fixed top-0 left-0 rounded-r-[26px] bg-white dark:bg-black-900 w-[80%] p-[18px] " > + <SettingsOverlay /> <div className="w-full h-full flex flex-col overflow-x-hidden items-between"> {/* Header Information */} - <div className="flex w-full items-center justify-between"> - <div className="flex shrink-0 w-fit items-center justify-start"> + <div className="flex w-full items-center justify-between gap-x-4"> + <div className="flex shrink-1 w-fit items-center justify-start"> <img src={logo} alt="Logo" @@ -226,14 +211,9 @@ export function SidebarMobileHeader() { style={{ objectFit: "contain" }} /> </div> - <div className="flex gap-x-2 items-center text-slate-500"> + <div className="flex gap-x-2 items-center text-slate-500 shink-0"> <AdminHome /> - <button - onClick={showSystemSettingsModal} - className="transition-all duration-300 p-2 rounded-full bg-slate-200 text-slate-400 dark:bg-stone-800 hover:bg-slate-800 hover:text-slate-200 dark:hover:text-slate-200" - > - <Tool className="h-4 w-4 " /> - </button> + <SettingsButton onClick={showOverlay} /> </div> </div> @@ -311,9 +291,6 @@ export function SidebarMobileHeader() { </div> </div> </div> - {showingSystemSettingsModal && ( - <SystemSettingsModal hideModal={hideSystemSettingsModal} /> - )} {showingNewWsModal && <NewWorkspaceModal hideModal={hideNewWsModal} />} </div> </> @@ -355,6 +332,19 @@ function LogoutButton() { ); } +function SettingsButton({ onClick }) { + const { user } = useUser(); + if (!!user) return null; + return ( + <button + onClick={onClick} + className="transition-all duration-300 p-2 rounded-full bg-slate-200 text-slate-400 dark:bg-stone-800 hover:bg-slate-800 hover:text-slate-200 dark:hover:text-slate-200" + > + <Tool className="h-4 w-4 " /> + </button> + ); +} + function ManagedHosting() { if (window.location.origin.includes(".useanything.com")) return null; return ( diff --git a/frontend/src/pages/Admin/Appearance/index.jsx b/frontend/src/pages/Admin/Appearance/index.jsx index 89e161658..e96319631 100644 --- a/frontend/src/pages/Admin/Appearance/index.jsx +++ b/frontend/src/pages/Admin/Appearance/index.jsx @@ -142,7 +142,7 @@ export default function Appearance() { Change the logo that appears in the sidebar. </p> </div> - <div className="flex items-center"> + <div className="flex md:flex-row flex-col items-center"> <img src={logo} alt="Uploaded Logo" diff --git a/frontend/src/utils/paths.js b/frontend/src/utils/paths.js index 7e729bb61..707d49763 100644 --- a/frontend/src/utils/paths.js +++ b/frontend/src/utils/paths.js @@ -22,9 +22,6 @@ export default { feedback: () => { return "https://mintplexlabs.typeform.com/to/i0KE3aEW"; }, - appearance: () => { - return "/system/appearance"; - }, workspace: { chat: (slug) => { return `/workspace/${slug}`; -- GitLab