diff --git a/src/app/(dashboard)/suggestions/page.tsx b/src/app/(dashboard)/suggestions/page.tsx
index a8522fa..81f5f66 100644
--- a/src/app/(dashboard)/suggestions/page.tsx
+++ b/src/app/(dashboard)/suggestions/page.tsx
@@ -9,5 +9,11 @@ export const dynamic = "force-dynamic";
export default async function SuggestionsPage() {
const session = await getSession();
if (!session) redirect("/login");
- return ;
+ // The panel uses light-gray (neutral-*) text that assumes a white backdrop, so
+ // render it on a white card for readable contrast in light or dark theme.
+ return (
+
+
setOpen(false)} />
+
+
+
+
setOpen(false)} aria-label="Close menu" className="p-1">
+
+
+
+
+
+ {navItems.map(({ label, href, icon: Icon }) => (
+ setOpen(false)} className={linkClass(isNavActive(path, href, navItems), MAIN_INACTIVE)}>
+ {label}
+
+ ))}
+
+
+
+ {settingsItems.map(({ label, href, icon: Icon }) => (
+ setOpen(false)} className={linkClass(path.startsWith(href), SETTINGS_INACTIVE)}>
+ {label}
+
+ ))}
+
+
+
+ )}
+ >
+ );
+}
diff --git a/src/components/layout/nav-items.ts b/src/components/layout/nav-items.ts
new file mode 100644
index 0000000..685bb46
--- /dev/null
+++ b/src/components/layout/nav-items.ts
@@ -0,0 +1,34 @@
+import {
+ LayoutDashboard, Leaf, BookOpen, Package, PawPrint, MapPin, Bell,
+ Lightbulb, KeyRound, HardDrive, RefreshCw, type LucideIcon,
+} from "lucide-react";
+
+export type NavItem = { label: string; href: string; icon: LucideIcon };
+
+export const navItems: NavItem[] = [
+ { label: "Dashboard", href: "/dashboard", icon: LayoutDashboard },
+ { label: "Garden", href: "/garden", icon: Leaf },
+ { label: "Plant types", href: "/garden/types", icon: BookOpen },
+ { label: "Inventory", href: "/inventory", icon: Package },
+ { label: "Animals", href: "/animals", icon: PawPrint },
+ { label: "Locations", href: "/locations", icon: MapPin },
+ { label: "Reminders", href: "/tasks", icon: Bell },
+];
+
+export const settingsItems: NavItem[] = [
+ { label: "Suggestions", href: "/suggestions", icon: Lightbulb },
+ { label: "API tokens", href: "/settings/tokens", icon: KeyRound },
+ { label: "Backup & Restore", href: "/settings/backup", icon: HardDrive },
+ { label: "Updates", href: "/settings/updates", icon: RefreshCw },
+];
+
+// Active on exact match or a sub-path, unless a more specific item (e.g.
+// /garden/types) already claims the current path.
+export function isNavActive(path: string, href: string, all: NavItem[]): boolean {
+ if (path === href) return true;
+ if (href === "/dashboard") return false;
+ if (!path.startsWith(href + "/")) return false;
+ return !all.some(
+ (o) => o.href.length > href.length && (path === o.href || path.startsWith(o.href + "/")),
+ );
+}
diff --git a/src/components/layout/sidebar.tsx b/src/components/layout/sidebar.tsx
index 737ce4e..0ae4704 100644
--- a/src/components/layout/sidebar.tsx
+++ b/src/components/layout/sidebar.tsx
@@ -2,28 +2,9 @@
import Link from "next/link";
import { usePathname } from "next/navigation";
-import { Leaf, Home, Wrench, LayoutDashboard, Bell, HardDrive, Lightbulb, RefreshCw, BookOpen, KeyRound, Package, PawPrint, MapPin } from "lucide-react";
+import { Leaf } from "lucide-react";
import { cn } from "@/lib/utils";
-
-const navItems = [
- { label: "Dashboard", href: "/dashboard", icon: LayoutDashboard },
- { label: "Garden", href: "/garden", icon: Leaf },
- { label: "Plant types", href: "/garden/types", icon: BookOpen },
- { label: "Inventory", href: "/inventory", icon: Package },
- { label: "Animals", href: "/animals", icon: PawPrint },
- { label: "Locations", href: "/locations", icon: MapPin },
- { label: "Reminders", href: "/tasks", icon: Bell },
- // Home maintenance and Equipment come in future releases
- // { label: "Home", href: "/home", icon: Home },
- // { label: "Equipment", href: "/equipment", icon: Wrench },
-];
-
-const settingsItems = [
- { label: "Suggestions", href: "/suggestions", icon: Lightbulb },
- { label: "API tokens", href: "/settings/tokens", icon: KeyRound },
- { label: "Backup & Restore", href: "/settings/backup", icon: HardDrive },
- { label: "Updates", href: "/settings/updates", icon: RefreshCw },
-];
+import { navItems, settingsItems, isNavActive } from "./nav-items";
export function Sidebar() {
const path = usePathname();
@@ -39,14 +20,7 @@ export function Sidebar() {
{navItems.map(({ label, href, icon: Icon }) => {
- // Active on exact match or a sub-path, unless a more specific nav item
- // (e.g. /garden/types) already claims the current path.
- const moreSpecific = navItems.some(
- (o) => o.href.length > href.length && (path === o.href || path.startsWith(o.href + "/"))
- );
- const active =
- path === href ||
- (href !== "/dashboard" && path.startsWith(href + "/") && !moreSpecific);
+ const active = isNavActive(path, href, navItems);
return (
-
-
Moon Base
+
+
+ Moon Base
-
+
+
+
+
-
-
-
-
- {initials(user.name)}
-
- {user.name}
-
-
-
-
- {user.email}
-
-
- signOut({ callbackUrl: "/login" })}>
-
- Sign out
-
-
-
+
+
+
+
+ {initials(user.name)}
+
+ {user.name}
+
+
+
+ {user.email}
+
+ signOut({ callbackUrl: "/login" })}>
+
+ Sign out
+
+
+
+
);
}
diff --git a/src/lib/changelog.ts b/src/lib/changelog.ts
index 4ac2d14..7d31341 100644
--- a/src/lib/changelog.ts
+++ b/src/lib/changelog.ts
@@ -8,6 +8,14 @@ export type ChangelogEntry = {
};
export const CHANGELOG: ChangelogEntry[] = [
+ {
+ version: "0.17.0",
+ date: "2026-06-16",
+ changes: [
+ "Mobile now works — there's a menu button (top-left) that slides out the full navigation, so you can get around on your phone.",
+ "Added a lightbulb button in the top bar that jumps straight to Suggestions, and made the Suggestions page readable (it was washed-out gray on the app's background).",
+ ],
+ },
{
version: "0.16.1",
date: "2026-06-16",
diff --git a/src/lib/version.ts b/src/lib/version.ts
index df9620a..8da7819 100644
--- a/src/lib/version.ts
+++ b/src/lib/version.ts
@@ -1,2 +1,2 @@
// Bump on every user-visible release. Changelog entries live in `src/lib/changelog.ts`.
-export const APP_VERSION = "0.16.1";
+export const APP_VERSION = "0.17.0";