diff --git a/apps/main/src/components/NavigationBar.tsx b/apps/main/src/components/NavigationBar.tsx
index ea1992f..0aebea1 100644
--- a/apps/main/src/components/NavigationBar.tsx
+++ b/apps/main/src/components/NavigationBar.tsx
@@ -17,12 +17,17 @@ import {
CalendarCheckIcon,
CalendarIcon,
Circle,
+ Compass,
ConstructionIcon,
CreditCard,
// FileTextIcon, // Notes feature temporarily hidden
+ Flame,
FolderIcon,
+ Gem,
+ Heart,
Kanban,
LayersIcon,
+ Leaf,
ListTodo,
LogOutIcon,
MessageCircleIcon,
@@ -33,6 +38,10 @@ import {
SettingsIcon,
Sparkles,
SquareKanban,
+ Star,
+ Sun,
+ Waves,
+ Zap,
} from "lucide-react";
import { useTablosList } from "../hooks/tablos";
import { useState } from "react";
@@ -69,7 +78,7 @@ function NavLink({ isActive, children }: NavLinkProps) {
"*:data-[ui=notification-badge]:text-xs/6",
"*:data-[ui=notification-badge]:font-semibold",
isActive
- ? "bg-navbar-darker font-semibold text-gray-900 dark:text-white *:data-[ui=notification-badge]:bg-transparent"
+ ? "bg-purple-100 dark:bg-purple-900/30 font-semibold text-[#804EEC] dark:text-purple-300 *:data-[ui=notification-badge]:bg-transparent"
: ["font-medium", "text-gray-500 dark:text-gray-300/90 [&:not(:hover)>[data-ui=icon]]:bg-navbar-darker"]
)}
>
@@ -290,6 +299,26 @@ export const SideNavigation = ({ isMobileMenuOpen }: { isMobileMenuOpen: boolean
);
};
+function getTabloIcon(color: string | null | undefined) {
+ switch (color) {
+ case "bg-blue-500": return Zap;
+ case "bg-green-500": return Leaf;
+ case "bg-purple-500": return Gem;
+ case "bg-red-500": return Flame;
+ case "bg-yellow-500": return Star;
+ case "bg-indigo-500": return Compass;
+ case "bg-pink-500": return Heart;
+ case "bg-teal-500": return Waves;
+ case "bg-orange-500": return Sun;
+ case "bg-cyan-500": return Sparkles;
+ default: return FolderIcon;
+ }
+}
+
+function getTabloIconColor(_color: string | null | undefined): string {
+ return "text-gray-700 dark:text-white";
+}
+
function RecentProjectsSection() {
const { t } = useTranslation("navigation");
const location = useLocation();
@@ -309,6 +338,8 @@ function RecentProjectsSection() {
{recentTablos.map((tablo) => {
const isActive = location.pathname === `/tablos/${tablo.id}`;
+ const TabloIcon = getTabloIcon(tablo.color);
+ const iconColor = getTabloIconColor(tablo.color);
return (
-
- {tablo.name.charAt(0).toUpperCase()}
+
{tablo.name}
@@ -458,7 +489,7 @@ export function MainNavigation({ isCollapsed }: { isCollapsed: boolean }) {
diff --git a/apps/main/src/pages/tablo-details.tsx b/apps/main/src/pages/tablo-details.tsx
index 801aebf..ced2221 100644
--- a/apps/main/src/pages/tablo-details.tsx
+++ b/apps/main/src/pages/tablo-details.tsx
@@ -17,16 +17,26 @@ import {
ChevronDownIcon,
ChevronRightIcon,
CircleCheckIcon,
+ Compass,
EllipsisVerticalIcon,
FileTextIcon,
+ Flame,
FolderIcon,
+ Gem,
+ Heart,
KanbanIcon,
LayoutDashboardIcon,
+ Leaf,
ListChecksIcon,
MapIcon,
MessageCircleIcon,
PlusIcon,
+ Sparkles,
+ Star,
+ Sun,
UserPlusIcon,
+ Waves,
+ Zap,
} from "lucide-react";
import { useEffect, useState } from "react";
import {
@@ -47,6 +57,34 @@ import { useTabloFileNames } from "../hooks/tablo_data";
import { useTablosList, useTabloMembers } from "../hooks/tablos";
import { useUser } from "../providers/UserStoreProvider";
+// ─── Icon helpers ─────────────────────────────────────────────────────────────
+
+function getTabloIcon(color: string | null | undefined) {
+ switch (color) {
+ case "bg-blue-500": return Zap;
+ case "bg-green-500": return Leaf;
+ case "bg-purple-500": return Gem;
+ case "bg-red-500": return Flame;
+ case "bg-yellow-500": return Star;
+ case "bg-indigo-500": return Compass;
+ case "bg-pink-500": return Heart;
+ case "bg-teal-500": return Waves;
+ case "bg-orange-500": return Sun;
+ case "bg-cyan-500": return Sparkles;
+ default: return FolderIcon;
+ }
+}
+
+function getTabloIconColor(color: string | null | undefined): string {
+ switch (color) {
+ case "bg-yellow-500":
+ case "bg-cyan-500":
+ return "text-gray-700";
+ default:
+ return "text-white";
+ }
+}
+
// ─── Status helpers ───────────────────────────────────────────────────────────
function getStatusConfig(status: string) {
@@ -196,6 +234,8 @@ export const TabloDetailsPage = () => {
progress,
} = getStatusConfig(tablo.status);
const isAdmin = tablo.is_admin;
+ const TabloIcon = getTabloIcon(tablo.color);
+ const iconColor = getTabloIconColor(tablo.color);
return (
@@ -205,7 +245,7 @@ export const TabloDetailsPage = () => {
@@ -216,7 +256,7 @@ export const TabloDetailsPage = () => {
className="w-full h-full object-cover"
/>
) : (
- tablo.name.charAt(0).toUpperCase()
+
)}
diff --git a/apps/main/src/pages/tablo.tsx b/apps/main/src/pages/tablo.tsx
index c0ff968..7871f41 100644
--- a/apps/main/src/pages/tablo.tsx
+++ b/apps/main/src/pages/tablo.tsx
@@ -20,12 +20,23 @@ import { Text } from "@xtablo/ui/components/typography";
import {
CheckCircle2,
Clock,
+ Compass,
+ Flame,
+ FolderIcon,
+ Gem,
+ Heart,
+ Leaf,
ListTodo,
MessageSquare,
Plus,
Shield,
+ Sparkles,
+ Star,
+ Sun,
Trash2,
Users,
+ Waves,
+ Zap,
} from "lucide-react";
import { useState } from "react";
import { useTranslation } from "react-i18next";
@@ -42,6 +53,32 @@ import { DashboardTaskList } from "src/components/DashboardTaskList";
import { TaskModal } from "src/components/kanban/TaskModal";
import { ProjectCardList } from "src/components/ProjectCardList";
+function getTabloIcon(color: string | null | undefined) {
+ switch (color) {
+ case "bg-blue-500": return Zap;
+ case "bg-green-500": return Leaf;
+ case "bg-purple-500": return Gem;
+ case "bg-red-500": return Flame;
+ case "bg-yellow-500": return Star;
+ case "bg-indigo-500": return Compass;
+ case "bg-pink-500": return Heart;
+ case "bg-teal-500": return Waves;
+ case "bg-orange-500": return Sun;
+ case "bg-cyan-500": return Sparkles;
+ default: return FolderIcon;
+ }
+}
+
+function getTabloIconColor(color: string | null | undefined): string {
+ switch (color) {
+ case "bg-yellow-500":
+ case "bg-cyan-500":
+ return "text-gray-700";
+ default:
+ return "text-white";
+ }
+}
+
export const TabloPage = () => {
const { t } = useTranslation(["pages", "common"]);
@@ -354,6 +391,8 @@ export const TabloPage = () => {
const renderTablo = (tablo: UserTablo) => {
const isAdmin = tablo.is_admin;
+ const TabloIcon = getTabloIcon(tablo.color);
+ const iconColor = getTabloIconColor(tablo.color);
return (
{
tablo.color || "bg-gray-400"
} flex items-center justify-center`}
>
-
- {tablo.name}
-
+
)}
diff --git a/apps/main/src/pages/tablos.tsx b/apps/main/src/pages/tablos.tsx
index 3ef747a..bcab876 100644
--- a/apps/main/src/pages/tablos.tsx
+++ b/apps/main/src/pages/tablos.tsx
@@ -3,12 +3,23 @@ import type { UserTablo } from "@xtablo/shared/types/tablos.types";
import { LoadingSpinner } from "@ui/components/LoadingSpinner";
import {
CalendarIcon,
+ Compass,
FilterIcon,
+ Flame,
+ FolderIcon,
+ Gem,
Grid3x3Icon,
+ Heart,
+ Leaf,
ListIcon,
PlusIcon,
SearchIcon,
+ Sparkles,
+ Star,
+ Sun,
Trash2Icon,
+ Waves,
+ Zap,
} from "lucide-react";
import { useState } from "react";
import { useTranslation } from "react-i18next";
@@ -17,6 +28,34 @@ import { CreateTabloModal } from "../components/CreateTabloModal";
import { DeleteTabloModal } from "../components/DeleteTabloModal";
import { useCreateTablo, useDeleteTablo, useTablosList } from "../hooks/tablos";
+// ─── Icon helpers ─────────────────────────────────────────────────────────────
+
+function getTabloIcon(color: string | null | undefined) {
+ switch (color) {
+ case "bg-blue-500": return Zap;
+ case "bg-green-500": return Leaf;
+ case "bg-purple-500": return Gem;
+ case "bg-red-500": return Flame;
+ case "bg-yellow-500": return Star;
+ case "bg-indigo-500": return Compass;
+ case "bg-pink-500": return Heart;
+ case "bg-teal-500": return Waves;
+ case "bg-orange-500": return Sun;
+ case "bg-cyan-500": return Sparkles;
+ default: return FolderIcon;
+ }
+}
+
+function getTabloIconColor(color: string | null | undefined): string {
+ switch (color) {
+ case "bg-yellow-500":
+ case "bg-cyan-500":
+ return "text-gray-700";
+ default:
+ return "text-white";
+ }
+}
+
// ─── Status helpers ───────────────────────────────────────────────────────────
function getStatusConfig(status: string) {
@@ -63,6 +102,8 @@ function TabloCard({
}) {
const { t } = useTranslation("pages");
const { label, badgeClass, progress } = getStatusConfig(tablo.status);
+ const TabloIcon = getTabloIcon(tablo.color);
+ const iconColor = getTabloIconColor(tablo.color);
return (
{tablo.image ? (

) : (
- tablo.name.charAt(0).toUpperCase()
+
)}
@@ -141,6 +182,8 @@ function TabloRow({
onDelete: (id: string) => void;
}) {
const { label, badgeClass, progress } = getStatusConfig(tablo.status);
+ const TabloIcon = getTabloIcon(tablo.color);
+ const iconColor = getTabloIconColor(tablo.color);
return (
{tablo.image ? (

) : (
- tablo.name.charAt(0).toUpperCase()
+
)}
{tablo.name}
diff --git a/apps/main/src/pages/tasks.tsx b/apps/main/src/pages/tasks.tsx
index 66fdcec..e69dc2d 100644
--- a/apps/main/src/pages/tasks.tsx
+++ b/apps/main/src/pages/tasks.tsx
@@ -14,8 +14,14 @@ import {
CalendarIcon,
CircleCheckIcon,
CircleIcon,
+ Compass,
EllipsisVerticalIcon,
+ Flame,
+ FolderIcon,
+ Gem,
+ Heart,
KanbanIcon,
+ Leaf,
ListIcon,
ListTodo,
MessageSquareIcon,
@@ -23,7 +29,12 @@ import {
PaperclipIcon,
PlusIcon,
Settings2Icon,
+ Sparkles,
+ Star,
+ Sun,
UserIcon,
+ Waves,
+ Zap,
} from "lucide-react";
import { useMemo, useState } from "react";
import { useTranslation } from "react-i18next";
@@ -55,6 +66,33 @@ const columnTitles = {
done: "Terminé",
};
+function getTabloIcon(color: string | null | undefined) {
+ switch (color) {
+ case "bg-blue-500": return Zap;
+ case "bg-green-500": return Leaf;
+ case "bg-purple-500": return Gem;
+ case "bg-red-500": return Flame;
+ case "bg-yellow-500": return Star;
+ case "bg-indigo-500": return Compass;
+ case "bg-pink-500": return Heart;
+ case "bg-teal-500": return Waves;
+ case "bg-orange-500": return Sun;
+ case "bg-cyan-500": return Sparkles;
+ default: return FolderIcon;
+ }
+}
+
+// Light backgrounds need dark text; dark/saturated backgrounds use white
+function getTabloIconColor(color: string | null | undefined): string {
+ switch (color) {
+ case "bg-yellow-500":
+ case "bg-cyan-500":
+ return "text-gray-700";
+ default:
+ return "text-white";
+ }
+}
+
export function TasksPage() {
const navigate = useNavigate();
const { t } = useTranslation(["pages", "common"]);
@@ -502,26 +540,25 @@ export function TasksPage() {
*/}
{/* Tablo row */}
- {taskWithTablo.tablos && (
-
-
-
- {taskWithTablo.tablos.name
- .charAt(0)
- .toUpperCase()}
+ {taskWithTablo.tablos && (() => {
+ const TabloIcon = getTabloIcon(taskWithTablo.tablos.color);
+ const iconColor = getTabloIconColor(taskWithTablo.tablos.color);
+ return (
+
+
+
+
+
+ {taskWithTablo.tablos.name}
-
- {taskWithTablo.tablos.name}
-
-
- )}
+ );
+ })()}
{/* Footer: stats + assignee */}
@@ -664,17 +701,21 @@ export function TasksPage() {
{/* Project */}
- {taskWithTablo.tablos ? (
-
-
- {taskWithTablo.tablos.name.charAt(0).toUpperCase()}
-
- {taskWithTablo.tablos.name}
-
- ) : (
+ {taskWithTablo.tablos ? (() => {
+ const TabloIcon = getTabloIcon(taskWithTablo.tablos.color);
+ const iconColor = getTabloIconColor(taskWithTablo.tablos.color);
+ return (
+
+
+
+
+ {taskWithTablo.tablos.name}
+
+ );
+ })() : (
—
)}
|