-

+
+
-
-
-
-
-
-
-
-
-
- Статья
- Фото
- Ссылка
- Опрос
- Событие
-
-
-
-
- {feedItems.map((item) => (
-
-
-
-
- {item.author[0]}
-
-
-
{item.author}
-
{item.time}
-
-
-
- {item.text}
-
- {item.tags.map((tag) => (
-
- {tag}
-
- ))}
-
-
-
-
-
-
-
- ))}
-
-
-
-
+
+ Статья
+ Фото
+ Ссылка
+ Опрос
+ Событие
+
-
+
+
+ {feedItems.map((item) => (
+
+
+
+
+ {item.author[0]}
+
+
+
{item.author}
+
{item.time}
+
+
+
+ {item.text}
+
+ {item.tags.map((tag) => (
+
+ {tag}
+
+ ))}
+
+
+
+
+
+
+
+ ))}
+
+
);
}
diff --git a/src/app/requests/page.tsx b/src/app/requests/page.tsx
index b9e1443..2399446 100644
--- a/src/app/requests/page.tsx
+++ b/src/app/requests/page.tsx
@@ -1,10 +1,9 @@
+import { AppShell, PageHeader } from "../../components/AppShell";
+
export default function RequestsPage() {
return (
-
-
-
Заявления
-
Раздел в разработке. Здесь появятся заявки и согласования.
-
-
+
+
+
);
}
diff --git a/src/components/AppShell.tsx b/src/components/AppShell.tsx
new file mode 100644
index 0000000..42b5e4b
--- /dev/null
+++ b/src/components/AppShell.tsx
@@ -0,0 +1,173 @@
+"use client";
+
+import { Bell, Building2, FileSignature, FileText, Home as HomeIcon, MessageSquare, Search, Users, Wallet } from "lucide-react";
+import Link from "next/link";
+import { usePathname } from "next/navigation";
+import { ReactNode } from "react";
+
+type AppShellProps = {
+ children: ReactNode;
+};
+
+type PageHeaderProps = {
+ title: string;
+ subtitle?: string;
+ badge?: string;
+ eyebrow?: string;
+};
+
+const navItems = [
+ { href: "/", label: "Лента", icon: HomeIcon },
+ { href: "/messages", label: "Сообщения", icon: MessageSquare },
+ { href: "/employees", label: "Сотрудники", icon: Users },
+ { href: "/departments", label: "Отделы", icon: Building2 },
+ { href: "/requests", label: "Заявления", icon: FileSignature },
+ { href: "/documents", label: "Документы", icon: FileText },
+ { href: "/finances", label: "Финансы", icon: Wallet },
+];
+
+const weekdays = ["Пн", "Вт", "Ср", "Чт", "Пт", "Сб", "Вс"];
+
+const calendarWeeks = [
+ ["", "", "", "", "1", "2", "3"],
+ ["4", "5", "6", "7", "8", "9", "10"],
+ ["11", "12", "13", "14", "15", "16", "17"],
+ ["18", "19", "20", "21", "22", "23", "24"],
+ ["25", "26", "27", "28", "", "", ""],
+];
+
+function Header() {
+ return (
+
+
+
+

+
+
+
+
+
+ );
+}
+
+function LeftNav() {
+ const pathname = usePathname();
+
+ const navLinkClass = (href: string) =>
+ `flex items-center gap-3 rounded-lg px-3 py-2 hover:bg-gray-50 ${
+ pathname === href ? "bg-sky-50 text-sky-700 ring-1 ring-sky-100" : "text-gray-700"
+ }`;
+
+ const navIconClass = (href: string) => (pathname === href ? "text-sky-700" : "text-gray-400");
+
+ return (
+
+ );
+}
+
+function Calendar() {
+ return (
+
+ );
+}
+
+export function PageHeader({ title, subtitle, badge, eyebrow = "Раздел" }: PageHeaderProps) {
+ return (
+
+
+
+ {badge ? (
+
{badge}
+ ) : null}
+
+ {subtitle ?
{subtitle}
: null}
+
+ );
+}
+
+export function AppShell({ children }: AppShellProps) {
+ return (
+
+ );
+}