From 15a17992e180ea70b2c7c656cafa1cc81e7ac9fe Mon Sep 17 00:00:00 2001 From: Cyber-preacher Date: Thu, 12 Feb 2026 02:32:19 +0400 Subject: [PATCH] (ui)Vortex web mobile version: complete responsive reflow across governance surfaces harden mobile navigation in AppSidebar/AppShell (toggle, close-on-route, mobile panel behavior) reflow data-dense pages for small screens: MyGovernance, Proposals, ProposalPP, ProposalChamber, Feed fix chamber/faction/human-node mobile layouts (stacked actions, wrapped badges/tiles, overflow-safe rows) enforce mobile-first rendering behavior where needed (Human Nodes auto-list under <768px) preserve desktop parity while removing horizontal clipping/overflow on phone widths --- src/app/AppShell.css | 25 ++------- src/app/AppSidebar.css | 74 +++++++++++++++++++++++++ src/app/AppSidebar.tsx | 55 +++++++++++++++--- src/components/StatGrid.tsx | 2 +- src/pages/MyGovernance.tsx | 6 +- src/pages/chambers/Chamber.tsx | 13 +++-- src/pages/chambers/Chambers.tsx | 9 ++- src/pages/factions/Faction.tsx | 16 +++--- src/pages/factions/FactionCreate.tsx | 2 +- src/pages/factions/Factions.tsx | 2 +- src/pages/feed/Feed.tsx | 14 ++--- src/pages/human-nodes/HumanNode.tsx | 4 +- src/pages/human-nodes/HumanNodes.tsx | 35 +++++++++--- src/pages/profile/Profile.tsx | 6 +- src/pages/proposals/ProposalChamber.tsx | 16 +++--- src/pages/proposals/ProposalPP.tsx | 4 +- src/pages/proposals/Proposals.tsx | 20 ++----- 17 files changed, 211 insertions(+), 92 deletions(-) diff --git a/src/app/AppShell.css b/src/app/AppShell.css index 868a78d..391b40e 100644 --- a/src/app/AppShell.css +++ b/src/app/AppShell.css @@ -118,35 +118,20 @@ .app-shell > .sidebar { width: 100%; } -} -@media (max-width: 720px) { - .sidebar { - flex-direction: column; - align-items: stretch; - justify-content: flex-start; + .workspace { + padding: 1.25rem 1rem 2.25rem; gap: 1rem; - padding: 1.25rem 1.25rem; - } - - .sidebar__brand { - justify-content: space-between; - padding: 0.65rem 0.9rem; - } - - .sidebar__nav { - flex-direction: row; - flex-wrap: wrap; - justify-content: center; } } @media (max-width: 600px) { .workspace { - padding: 2rem 1.25rem 3rem; + padding: 1rem 0.75rem 2rem; } .app-page { - padding: 1.5rem; + padding: 1.1rem; + border-radius: 14px; } } diff --git a/src/app/AppSidebar.css b/src/app/AppSidebar.css index e98c02f..401e326 100644 --- a/src/app/AppSidebar.css +++ b/src/app/AppSidebar.css @@ -19,6 +19,7 @@ padding: 0.65rem 0.9rem; border-radius: 12px; width: 100%; + position: relative; } .sidebar__auth { @@ -137,6 +138,33 @@ gap: 0.5rem; } +.sidebar__mobilePanel { + display: contents; +} + +.sidebar__mobileToggle { + display: none; + border: 1px solid var(--sidebar-border); + background: transparent; + color: var(--sidebar-text); + border-radius: 10px; + width: 2.25rem; + height: 2.25rem; + align-items: center; + justify-content: center; + cursor: pointer; +} + +.sidebar__mobileToggle:hover { + border-color: var(--sidebar-primary-dim); + background: rgba(255, 255, 255, 0.06); +} + +.sidebar__mobileToggleIcon { + width: 18px; + height: 18px; +} + .sidebar__link { background: transparent; border: 1px solid transparent; @@ -202,3 +230,49 @@ animation: none; } } + +@media (max-width: 960px) { + .sidebar { + gap: 0.75rem; + padding: 0.95rem 1rem; + border-right: 0; + border-bottom: 1px solid var(--sidebar-border); + } + + .sidebar__brand { + justify-content: flex-start; + gap: 0.5rem; + padding: 0.35rem 0; + } + + .sidebar__logo { + width: 34px; + height: 34px; + border-radius: 10px; + } + + .sidebar__mobileToggle { + display: inline-flex; + margin-left: auto; + } + + .sidebar__mobilePanel, + .sidebar__nav { + display: none; + } + + .sidebar.sidebar--mobileOpen .sidebar__mobilePanel { + display: block; + } + + .sidebar.sidebar--mobileOpen .sidebar__nav { + display: flex; + margin-top: 0.25rem; + padding-bottom: 0.35rem; + border-bottom: 1px solid var(--sidebar-border); + } + + .sidebar__link > span { + white-space: normal; + } +} diff --git a/src/app/AppSidebar.tsx b/src/app/AppSidebar.tsx index 5cd15aa..e62f038 100644 --- a/src/app/AppSidebar.tsx +++ b/src/app/AppSidebar.tsx @@ -1,5 +1,5 @@ -import { NavLink } from "react-router"; -import { useState } from "react"; +import { NavLink, useLocation } from "react-router"; +import { useEffect, useState } from "react"; import "./AppSidebar.css"; import clsx from "clsx"; import { @@ -17,6 +17,8 @@ import { User, Users, FileText, + Menu, + X, } from "lucide-react"; import { AuthSidebarPanel } from "@/app/auth/AuthContext"; @@ -36,6 +38,12 @@ type NavItem = { const AppSidebar: React.FC = ({ children }) => { const [settingsOpen, setSettingsOpen] = useState(false); + const [mobileNavOpen, setMobileNavOpen] = useState(false); + const location = useLocation(); + + useEffect(() => { + setMobileNavOpen(false); + }, [location.pathname]); const navItems: NavItem[] = [ { to: "/app/feed", label: "Feed", Icon: Activity }, @@ -52,15 +60,38 @@ const AppSidebar: React.FC = ({ children }) => { ]; return ( -