diff --git a/apps/tasks/app/tasks/page.tsx b/apps/tasks/app/tasks/page.tsx index 540ab68..89feed3 100644 --- a/apps/tasks/app/tasks/page.tsx +++ b/apps/tasks/app/tasks/page.tsx @@ -63,7 +63,7 @@ export default function TasksPage() { loadData(); }, [token, router, loadData]); - // Navigate to next/previous group + // Navigate to next/previous group via swipe const navigateGroup = useCallback( (direction: "left" | "right") => { if (groupOrder.length <= 1) return; @@ -73,7 +73,6 @@ export default function TasksPage() { : (currentGroupIndex - 1 + groupOrder.length) % groupOrder.length; const newGroupId = groupOrder[newIndex]; - // Show overlay if (newGroupId === null) { setSwipeOverlay({ name: t("tasks.all"), icon: null }); } else { @@ -83,7 +82,6 @@ export default function TasksPage() { setSwipeDirection(direction); setSelectedGroup(newGroupId); - // Hide overlay after animation setTimeout(() => { setSwipeOverlay(null); setSwipeDirection(null); @@ -131,21 +129,23 @@ export default function TasksPage() { if (!token) return null; return ( -
- {/* Group tabs */} - +
+ {/* Group dropdown + Status pills row */} +
+ +
- {/* Status filter */} -
+ {/* Status filter pills - compact */} +
{statusOptions.map((opt) => (
)} - {/* Task list with transition animation */} + {/* Task list */}
{loading ? ( -
-
+
+
) : tasks.length === 0 ? ( -
-
-

{t("tasks.noTasks")}

+
+
+

{t("tasks.noTasks")}

{t("tasks.createFirst")}

) : ( -
+
{tasks.map((task) => (
- {/* Floating action button - positioned for thumb reach */} + {/* Floating action button */} - {groups.map((g) => ( - - ))} + + + + + {/* Dropdown menu */} + {open && ( +
+ + {groups.map((g) => ( + + ))} +
+ )}
); } diff --git a/apps/tasks/components/Header.tsx b/apps/tasks/components/Header.tsx index 66884ec..92c8f20 100644 --- a/apps/tasks/components/Header.tsx +++ b/apps/tasks/components/Header.tsx @@ -40,88 +40,30 @@ export default function Header() { return ( <>
-
- {/* Left: Logo + title */} - -
- - - -
- {t("common.appName")} - - - {/* Right: Desktop controls */} -
- - - {token && user ? ( -
- - - {user.name || user.email} - - -
- ) : ( - - {t("auth.submit")} - - )} -
- - {/* Right: Mobile - avatar + hamburger both open drawer */} -
- {token && user && ( - - )} +
+ {/* Right side only: avatar + hamburger */} + {token && user && ( -
+ )} +
- {/* Mobile slide-out drawer */} + {/* Slide-out drawer */} {drawerOpen && (
{/* Backdrop */} diff --git a/apps/tasks/components/TaskCard.tsx b/apps/tasks/components/TaskCard.tsx index 8f176be..e01a967 100644 --- a/apps/tasks/components/TaskCard.tsx +++ b/apps/tasks/components/TaskCard.tsx @@ -24,8 +24,7 @@ function isDone(status: string): boolean { } export default function TaskCard({ task, onComplete }: TaskCardProps) { - const { t, locale } = useTranslation(); - const groupColor = task.group_color || "#6b7280"; + const { t } = useTranslation(); const priorityColor = PRIORITY_COLORS[task.priority] || PRIORITY_COLORS.medium; const taskDone = isDone(task.status); const [swipeOffset, setSwipeOffset] = useState(0); @@ -34,11 +33,8 @@ export default function TaskCard({ task, onComplete }: TaskCardProps) { const SWIPE_THRESHOLD = 120; - const dateLocale = locale === "ua" ? "uk-UA" : locale === "cs" ? "cs-CZ" : locale === "he" ? "he-IL" : "ru-RU"; - const swipeHandlers = useSwipeable({ onSwiping: (e) => { - // Only allow right swipe for complete gesture if (e.dir === "Right" && !taskDone && onComplete) { const offset = Math.min(e.deltaX, 160); setSwipeOffset(offset); @@ -66,25 +62,25 @@ export default function TaskCard({ task, onComplete }: TaskCardProps) { const showCompleteHint = swipeOffset > 40; return ( -
+
{/* Swipe background - green complete indicator */} {onComplete && !taskDone && (
SWIPE_THRESHOLD ? "bg-green-500" : "bg-green-400/80" }`} >
- + - {t("tasks.status.done")} + {t("tasks.status.done")}
)} @@ -97,81 +93,39 @@ export default function TaskCard({ task, onComplete }: TaskCardProps) { }} > -
- {/* Priority dot on left edge */} +
+ {/* Priority line on left edge */}
- {/* Group color accent bar on top (mobile) */} -
+
+ {/* Group icon */} + {task.group_icon && ( + {task.group_icon} + )} -
- {/* Mobile: compact one-line layout */} -
- {/* Group icon */} - {task.group_icon && ( - {task.group_icon} - )} + {/* Title - single line, truncated */} +

+ {task.title} +

- {/* Content - mobile compact */} -
- {/* Title + status on one line on mobile */} -
-

- {task.title} -

-
- -
-
- - {/* Description - hidden on very small screens */} - {task.description && ( -

- {task.description} -

- )} - - {/* Meta row */} -
-
- -
- {task.group_name && ( - - {task.group_name} - - )} - {task.due_at && ( - - - - - {new Date(task.due_at).toLocaleDateString(dateLocale)} - - )} -
-
- - {/* Priority indicator */} -
+ {/* Status badge */} +
+
+ + {/* Priority dot */} +