From 17f1f8e4d2a354fef1083e926fa4b003cf32bb74 Mon Sep 17 00:00:00 2001
From: shafi54 <108669266+shafi-aviz@users.noreply.github.com>
Date: Sat, 23 May 2026 11:25:27 +0530
Subject: [PATCH] added shell screens
---
agents.md | 1 +
apps/pharmanager/.vscode/settings.json | 66 +++----
apps/pharmanager/biome.json | 4 +-
apps/pharmanager/src/components/AppLayout.tsx | 67 +++++++
apps/pharmanager/src/components/Header.tsx | 54 ++++++
apps/pharmanager/src/components/Sidebar.tsx | 159 ++++++++++++++++
apps/pharmanager/src/lib/cn.ts | 3 +
apps/pharmanager/src/main.tsx | 39 ++--
apps/pharmanager/src/routeTree.gen.ts | 178 +++++++++++++++++-
apps/pharmanager/src/router.tsx | 19 --
apps/pharmanager/src/routes/__root.tsx | 47 ++---
apps/pharmanager/src/routes/billing.tsx | 13 ++
apps/pharmanager/src/routes/customers.tsx | 13 ++
apps/pharmanager/src/routes/distributors.tsx | 13 ++
apps/pharmanager/src/routes/index.tsx | 52 +----
apps/pharmanager/src/routes/products.tsx | 13 ++
apps/pharmanager/src/routes/profile.tsx | 13 ++
apps/pharmanager/src/routes/staff.tsx | 13 ++
apps/pharmanager/src/routes/stock.tsx | 13 ++
apps/pharmanager/src/routes/storage.tsx | 13 ++
apps/pharmanager/vite.config.ts | 28 +--
21 files changed, 667 insertions(+), 154 deletions(-)
create mode 100644 agents.md
create mode 100644 apps/pharmanager/src/components/AppLayout.tsx
create mode 100644 apps/pharmanager/src/components/Header.tsx
create mode 100644 apps/pharmanager/src/components/Sidebar.tsx
create mode 100644 apps/pharmanager/src/lib/cn.ts
delete mode 100644 apps/pharmanager/src/router.tsx
create mode 100644 apps/pharmanager/src/routes/billing.tsx
create mode 100644 apps/pharmanager/src/routes/customers.tsx
create mode 100644 apps/pharmanager/src/routes/distributors.tsx
create mode 100644 apps/pharmanager/src/routes/products.tsx
create mode 100644 apps/pharmanager/src/routes/profile.tsx
create mode 100644 apps/pharmanager/src/routes/staff.tsx
create mode 100644 apps/pharmanager/src/routes/stock.tsx
create mode 100644 apps/pharmanager/src/routes/storage.tsx
diff --git a/agents.md b/agents.md
new file mode 100644
index 0000000..cc18bb5
--- /dev/null
+++ b/agents.md
@@ -0,0 +1 @@
+don't try to compile or run or build any project until explicitly asked for
\ No newline at end of file
diff --git a/apps/pharmanager/.vscode/settings.json b/apps/pharmanager/.vscode/settings.json
index 70dd163..b001961 100644
--- a/apps/pharmanager/.vscode/settings.json
+++ b/apps/pharmanager/.vscode/settings.json
@@ -1,35 +1,35 @@
{
- "files.watcherExclude": {
- "**/routeTree.gen.ts": true
- },
- "search.exclude": {
- "**/routeTree.gen.ts": true
- },
- "files.readonlyInclude": {
- "**/routeTree.gen.ts": true
- },
- "[javascript]": {
- "editor.defaultFormatter": "biomejs.biome"
- },
- "[javascriptreact]": {
- "editor.defaultFormatter": "biomejs.biome"
- },
- "[typescript]": {
- "editor.defaultFormatter": "biomejs.biome"
- },
- "[typescriptreact]": {
- "editor.defaultFormatter": "biomejs.biome"
- },
- "[json]": {
- "editor.defaultFormatter": "biomejs.biome"
- },
- "[jsonc]": {
- "editor.defaultFormatter": "biomejs.biome"
- },
- "[css]": {
- "editor.defaultFormatter": "biomejs.biome"
- },
- "editor.codeActionsOnSave": {
- "source.organizeImports.biome": "explicit"
- }
+ "files.watcherExclude": {
+ "**/routeTree.gen.ts": true
+ },
+ "search.exclude": {
+ "**/routeTree.gen.ts": true
+ },
+ "files.readonlyInclude": {
+ "**/routeTree.gen.ts": true
+ },
+ "[javascript]": {
+ "editor.defaultFormatter": "biomejs.biome"
+ },
+ "[javascriptreact]": {
+ "editor.defaultFormatter": "biomejs.biome"
+ },
+ "[typescript]": {
+ "editor.defaultFormatter": "biomejs.biome"
+ },
+ "[typescriptreact]": {
+ "editor.defaultFormatter": "biomejs.biome"
+ },
+ "[json]": {
+ "editor.defaultFormatter": "biomejs.biome"
+ },
+ "[jsonc]": {
+ "editor.defaultFormatter": "biomejs.biome"
+ },
+ "[css]": {
+ "editor.defaultFormatter": "biomejs.biome"
+ },
+ "editor.codeActionsOnSave": {
+ "source.organizeImports.biome": "explicit"
+ }
}
diff --git a/apps/pharmanager/biome.json b/apps/pharmanager/biome.json
index 64b4d31..10a58e3 100644
--- a/apps/pharmanager/biome.json
+++ b/apps/pharmanager/biome.json
@@ -13,7 +13,8 @@
"**/index.html",
"**/vite.config.ts",
"!**/src/routeTree.gen.ts",
- "!**/src/styles.css"
+ "!**/src/styles.css",
+ "!**/inspiration"
]
},
"formatter": {
@@ -33,4 +34,3 @@
}
}
}
-
diff --git a/apps/pharmanager/src/components/AppLayout.tsx b/apps/pharmanager/src/components/AppLayout.tsx
new file mode 100644
index 0000000..4df27ba
--- /dev/null
+++ b/apps/pharmanager/src/components/AppLayout.tsx
@@ -0,0 +1,67 @@
+import { useState, useEffect, type ReactNode } from "react";
+import { useMatches } from "@tanstack/react-router";
+import { Sidebar } from "#/components/Sidebar";
+import { Header } from "#/components/Header";
+
+interface RouteStaticData {
+ title?: string;
+ subtitle?: string;
+}
+
+interface AppLayoutProps {
+ children: ReactNode;
+}
+
+export function AppLayout({ children }: AppLayoutProps) {
+ const [minimized, setMinimized] = useState(false);
+ const [mobileOpen, setMobileOpen] = useState(false);
+
+ const matches = useMatches();
+ const currentMatch = matches[matches.length - 1];
+ const staticData = currentMatch?.staticData as RouteStaticData | undefined;
+
+ useEffect(() => {
+ function handleResize() {
+ if (window.innerWidth > 768) {
+ setMobileOpen(false);
+ }
+ }
+ window.addEventListener("resize", handleResize);
+ return () => window.removeEventListener("resize", handleResize);
+ }, []);
+
+ useEffect(() => {
+ if (mobileOpen && window.innerWidth <= 768) {
+ document.body.style.overflow = "hidden";
+ } else {
+ document.body.style.overflow = "";
+ }
+ return () => {
+ document.body.style.overflow = "";
+ };
+ }, [mobileOpen]);
+
+ return (
+
+
setMinimized((prev) => !prev)}
+ onCloseMobile={() => setMobileOpen(false)}
+ />
+
+
+ setMobileOpen((prev) => !prev)}
+ />
+
+ {children}
+
+
+
+ );
+}
diff --git a/apps/pharmanager/src/components/Header.tsx b/apps/pharmanager/src/components/Header.tsx
new file mode 100644
index 0000000..73b5104
--- /dev/null
+++ b/apps/pharmanager/src/components/Header.tsx
@@ -0,0 +1,54 @@
+import { Menu, Bell, Search } from "lucide-react";
+
+interface HeaderProps {
+ pageTitle: string;
+ pageSubtitle: string;
+ onMobileMenuToggle: () => void;
+}
+
+export function Header({
+ pageTitle,
+ pageSubtitle,
+ onMobileMenuToggle,
+}: HeaderProps) {
+ return (
+
+
+
+
+
{pageTitle}
+
{pageSubtitle}
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/apps/pharmanager/src/components/Sidebar.tsx b/apps/pharmanager/src/components/Sidebar.tsx
new file mode 100644
index 0000000..ff10996
--- /dev/null
+++ b/apps/pharmanager/src/components/Sidebar.tsx
@@ -0,0 +1,159 @@
+import { Link, useLocation } from "@tanstack/react-router";
+import {
+ LayoutDashboard,
+ ReceiptText,
+ Package,
+ Truck,
+ Warehouse,
+ Users,
+ Pill,
+ UserRoundCog,
+ ChevronLeft,
+} from "lucide-react";
+import { cn } from "#/lib/cn";
+
+const NAV_ITEMS = [
+ { to: "/", label: "Home", icon: LayoutDashboard },
+ { to: "/billing", label: "Billing", icon: ReceiptText },
+ { to: "/stock", label: "Stock", icon: Package },
+ { to: "/distributors", label: "Distributors", icon: Truck },
+ { to: "/storage", label: "Storage", icon: Warehouse },
+ { to: "/customers", label: "Customers", icon: Users },
+ { to: "/products", label: "Products", icon: Pill },
+ { to: "/staff", label: "Staff", icon: UserRoundCog },
+] as const;
+
+interface SidebarProps {
+ minimized: boolean;
+ mobileOpen: boolean;
+ onToggleMinimized: () => void;
+ onCloseMobile: () => void;
+}
+
+export function Sidebar({
+ minimized,
+ mobileOpen,
+ onToggleMinimized,
+ onCloseMobile,
+}: SidebarProps) {
+ const location = useLocation();
+
+ const showLabels = !minimized || mobileOpen;
+
+ return (
+ <>
+