diff --git a/app/src/admin/colors.ts b/app/src/admin/colors.ts index 6043f13..811b692 100644 --- a/app/src/admin/colors.ts +++ b/app/src/admin/colors.ts @@ -61,7 +61,7 @@ export const modelColorMapper: Record = { "code-llama-13b": "#01a9f0", "code-llama-7b": "#01a9f0", - "hunyuan": "#0052d9" + hunyuan: "#0052d9", }; export function getModelColor(model: string): string { diff --git a/app/src/assets/admin/dashboard.less b/app/src/assets/admin/dashboard.less index 5901274..a9780a6 100644 --- a/app/src/assets/admin/dashboard.less +++ b/app/src/assets/admin/dashboard.less @@ -23,7 +23,7 @@ height: max-content; padding: 1rem 2rem; - @media (max-width: 668px) { + @media (max-width: 940px) { flex-direction: column; padding: 1rem; @@ -103,6 +103,7 @@ flex-direction: row; flex-wrap: wrap; padding: 1rem 1.5rem; + width: 100%; .chart-box { width: calc(50% - 1rem); @@ -116,5 +117,13 @@ border: 1px solid hsl(var(--border)); user-select: none; box-shadow: 0 0 1rem 0 hsla(var(--foreground), 0.1); + + @media (max-width: 680px) { + width: 100%; + } + } + + @media (max-width: 680px) { + padding: 1rem; } } diff --git a/app/src/assets/admin/management.less b/app/src/assets/admin/management.less index abfb173..bcb9472 100644 --- a/app/src/assets/admin/management.less +++ b/app/src/assets/admin/management.less @@ -14,6 +14,10 @@ } } + &.mobile { + padding: 1rem; + } + .pagination { display: flex; justify-content: center; diff --git a/app/src/assets/admin/menu.less b/app/src/assets/admin/menu.less index 361a996..3798aad 100644 --- a/app/src/assets/admin/menu.less +++ b/app/src/assets/admin/menu.less @@ -36,12 +36,35 @@ border-radius: var(--radius); font-size: 16px; + &:before { + content: ''; + display: inline-block; + width: 4px; + height: 2rem; + background: hsl(var(--text)); + border-radius: var(--radius); + margin-right: 0; + opacity: 0; + transition: 0.25s; + transition-property: opacity, margin-right; + } + &:hover { background: var(--conversation-card-hover); + + &:before { + opacity: .25; + margin-right: 0.75rem; + } } &.active { background: var(--conversation-card-active); + + &:before { + opacity: 1; + margin-right: 0.75rem; + } } & > * { diff --git a/app/src/assets/globals.less b/app/src/assets/globals.less index 14ddd16..7d63053 100644 --- a/app/src/assets/globals.less +++ b/app/src/assets/globals.less @@ -32,6 +32,7 @@ --border: 37 26% 83%; --border-hover: 37 26% 78%; + --border-active: 37 26% 73%; --input: 37 26% 90%; --input-unread: 37 26% 70%; --ring: 222.2 84% 4.9%; @@ -80,6 +81,7 @@ --border: 240 3.7% 15.9%; --border-hover: 240 3.7% 20.9%; + --border-active: 240 3.7% 25.9%; --input: 240 3.7% 15.9%; --input-unread: 240 3.7% 50%; --ring: 240 4.9% 83.9%; diff --git a/app/src/assets/pages/chat.less b/app/src/assets/pages/chat.less index d379c2c..91d88bb 100644 --- a/app/src/assets/pages/chat.less +++ b/app/src/assets/pages/chat.less @@ -122,11 +122,11 @@ max-width: 100%; padding: 8px 16px; border-radius: var(--radius); - border: 1px solid hsl(var(--border)); + border: 1px solid hsl(var(--border-hover)); transition: 0.25s linear; &:hover { - border-color: hsl(var(--border-hover)); + border-color: hsl(var(--border-active)); } } diff --git a/app/src/components/admin/MenuBar.tsx b/app/src/components/admin/MenuBar.tsx index df8362e..22b57a6 100644 --- a/app/src/components/admin/MenuBar.tsx +++ b/app/src/components/admin/MenuBar.tsx @@ -1,10 +1,11 @@ -import { useSelector } from "react-redux"; -import { selectMenu } from "@/store/menu.ts"; +import { useDispatch, useSelector } from "react-redux"; +import { closeMenu, selectMenu } from "@/store/menu.ts"; import React, { useMemo } from "react"; import { LayoutDashboard, Settings, Users } from "lucide-react"; import router from "@/router.tsx"; import { useLocation } from "react-router-dom"; import { useTranslation } from "react-i18next"; +import { mobile } from "@/utils/device.ts"; type MenuItemProps = { title: string; @@ -14,6 +15,7 @@ type MenuItemProps = { function MenuItem({ title, icon, path }: MenuItemProps) { const location = useLocation(); + const dispatch = useDispatch(); const active = useMemo( () => location.pathname === `/admin${path}` || @@ -21,11 +23,13 @@ function MenuItem({ title, icon, path }: MenuItemProps) { [location.pathname, path], ); + const redirect = async () => { + if (mobile) dispatch(closeMenu()); + await router.navigate(`/admin${path}`); + }; + return ( -
router.navigate(`/admin${path}`)} - > +
{icon}
{title}
diff --git a/app/src/components/app/MenuBar.tsx b/app/src/components/app/MenuBar.tsx index be03db9..1787f22 100644 --- a/app/src/components/app/MenuBar.tsx +++ b/app/src/components/app/MenuBar.tsx @@ -1,6 +1,6 @@ import { useTranslation } from "react-i18next"; import { useDispatch, useSelector } from "react-redux"; -import { logout, selectUsername } from "@/store/auth.ts"; +import { logout, selectAdmin, selectUsername } from "@/store/auth.ts"; import { openDialog as openQuotaDialog, quotaSelector } from "@/store/quota.ts"; import { DropdownMenu, @@ -19,12 +19,14 @@ import { Gift, ListStart, Plug, + Shield, } from "lucide-react"; import { openDialog as openSub } from "@/store/subscription.ts"; import { openDialog as openPackageDialog } from "@/store/package.ts"; import { openDialog as openInvitationDialog } from "@/store/invitation.ts"; import { openDialog as openSharingDialog } from "@/store/sharing.ts"; import { openDialog as openApiDialog } from "@/store/api.ts"; +import router from "@/router.tsx"; type MenuBarProps = { children: React.ReactNode; @@ -36,6 +38,7 @@ function MenuBar({ children, className }: MenuBarProps) { const dispatch = useDispatch(); const username = useSelector(selectUsername); const quota = useSelector(quotaSelector); + const admin = useSelector(selectAdmin); return ( @@ -71,6 +74,12 @@ function MenuBar({ children, className }: MenuBarProps) { {t("api.title")} + {admin && ( + router.navigate("/admin")}> + + {t("admin.users")} + + )}