- {Array.from({ length: 8 }).map((_, i) => (
+ {/* Window indicator — LEFT wall (landmark for orientation) */}
+
+
+ {Array.from({ length: 6 }).map((_, i) => (
))}
+ {/* Window label */}
+
+ Fereastră
+
+
+ {/* Door indicator — RIGHT wall */}
+
+
+ Ușă
+
{/* Central table */}
diff --git a/src/modules/password-vault/components/password-vault-module.tsx b/src/modules/password-vault/components/password-vault-module.tsx
index e9eaf75..1183a3f 100644
--- a/src/modules/password-vault/components/password-vault-module.tsx
+++ b/src/modules/password-vault/components/password-vault-module.tsx
@@ -267,6 +267,11 @@ export function PasswordVaultModule() {
{entry.username}
+ {entry.email && (
+
+ ({entry.email})
+
+ )}
@@ -301,9 +306,19 @@ export function PasswordVaultModule() {
)}
{entry.url && (
-
+ e.stopPropagation()}
+ >
{entry.url}
-
+
)}
{entry.customFields && entry.customFields.length > 0 && (
@@ -408,6 +423,7 @@ function VaultForm({
}) {
const [label, setLabel] = useState(initial?.label ?? "");
const [username, setUsername] = useState(initial?.username ?? "");
+ const [email, setEmail] = useState(initial?.email ?? "");
const [password, setPassword] = useState(initial?.password ?? "");
const [url, setUrl] = useState(initial?.url ?? "");
const [category, setCategory] = useState(
@@ -468,6 +484,7 @@ function VaultForm({
onSubmit({
label,
username,
+ email,
password,
url,
category,
@@ -539,6 +556,16 @@ function VaultForm({
/>
diff --git a/src/modules/password-vault/types.ts b/src/modules/password-vault/types.ts
index 62c74e4..200ec48 100644
--- a/src/modules/password-vault/types.ts
+++ b/src/modules/password-vault/types.ts
@@ -19,6 +19,7 @@ export interface VaultEntry {
id: string;
label: string;
username: string;
+ email: string;
password: string;
url: string;
category: VaultEntryCategory;
diff --git a/src/shared/components/layout/sidebar.tsx b/src/shared/components/layout/sidebar.tsx
index 5ae18bc..b5df533 100644
--- a/src/shared/components/layout/sidebar.tsx
+++ b/src/shared/components/layout/sidebar.tsx
@@ -3,7 +3,7 @@
import Image from "next/image";
import Link from "next/link";
import { usePathname } from "next/navigation";
-import { useMemo } from "react";
+import { useMemo, useState, useCallback, useEffect } from "react";
import * as Icons from "lucide-react";
import { buildNavigation } from "@/config/navigation";
import { COMPANIES } from "@/config/companies";
@@ -64,24 +64,61 @@ function NavItem({
);
}
-function SidebarLogo() {
- const sdt = COMPANIES["studii-de-teren"];
+const LOGO_COMPANIES = ["studii-de-teren", "urban-switch"] as const;
- const logoSrc = sdt.logo?.light ?? null;
+function SidebarLogos() {
+ const [clickCount, setClickCount] = useState(0);
+ const [shuffled, setShuffled] = useState(false);
- if (!logoSrc) {
- return
;
- }
+ const handleLogoClick = useCallback(() => {
+ setClickCount((prev) => {
+ const next = prev + 1;
+ if (next >= 3) {
+ setShuffled((s) => !s);
+ return 0;
+ }
+ return next;
+ });
+ }, []);
+
+ // Reset click count after 2 seconds of inactivity
+ useEffect(() => {
+ if (clickCount === 0) return;
+ const timer = setTimeout(() => setClickCount(0), 2000);
+ return () => clearTimeout(timer);
+ }, [clickCount]);
+
+ const logos = shuffled ? [...LOGO_COMPANIES].reverse() : [...LOGO_COMPANIES];
return (
-
+
+ {logos.map((companyId) => {
+ const company = COMPANIES[companyId];
+ const logoSrc = company?.logo?.light;
+ if (!logoSrc) return null;
+ return (
+
+ );
+ })}
+
);
}
@@ -91,10 +128,14 @@ export function Sidebar() {
return (