From 533b6fbfd230eddb583bdb6ea9a84d9e602abf04 Mon Sep 17 00:00:00 2001 From: jasonMPM Date: Thu, 5 Mar 2026 13:17:36 -0600 Subject: [PATCH] Add files via upload --- .../components/FocusView/DeliverableCard.jsx | 21 +++++++++++++------ .../components/FocusView/FocusTimeline.jsx | 20 ++++++++++++------ frontend/src/components/UI/Drawer.jsx | 19 ++++++++++++----- frontend/src/store/useFocusStore.js | 5 +++-- 4 files changed, 46 insertions(+), 19 deletions(-) diff --git a/frontend/src/components/FocusView/DeliverableCard.jsx b/frontend/src/components/FocusView/DeliverableCard.jsx index 5f5b203..0554a49 100644 --- a/frontend/src/components/FocusView/DeliverableCard.jsx +++ b/frontend/src/components/FocusView/DeliverableCard.jsx @@ -1,18 +1,19 @@ import Badge from '../UI/Badge' import { formatDate } from '../../utils/dateHelpers' -export default function DeliverableCard({ deliverable, isActive, index, projectColor, onEdit }) { +export default function DeliverableCard({ deliverable, isActive, index, projectColor, onSelect, onEdit }) { return (
isActive && onEdit && onEdit(deliverable)} - className={`relative flex flex-col gap-2 rounded-xl border p-4 min-w-[190px] max-w-[230px] flex-shrink-0 transition-all duration-300 select-none + onClick={() => onSelect(deliverable.id)} + className={`relative flex flex-col gap-2 rounded-xl border p-4 min-w-[190px] max-w-[230px] flex-shrink-0 cursor-pointer + transition-all duration-200 select-none mt-4 ${isActive - ? 'border-gold bg-surface-elevated shadow-gold scale-105 ring-2 ring-gold/30 cursor-pointer' - : 'border-surface-border bg-surface cursor-default' + ? 'border-gold bg-surface-elevated shadow-gold scale-105 ring-2 ring-gold/30' + : 'border-surface-border bg-surface hover:border-gold/40 hover:bg-surface-elevated/60' }`} > {isActive && ( -
+
Selected
)} @@ -29,6 +30,14 @@ export default function DeliverableCard({ deliverable, isActive, index, projectC {formatDate(deliverable.due_date)}

+ {isActive && ( + + )}
) } diff --git a/frontend/src/components/FocusView/FocusTimeline.jsx b/frontend/src/components/FocusView/FocusTimeline.jsx index 7588776..20fe705 100644 --- a/frontend/src/components/FocusView/FocusTimeline.jsx +++ b/frontend/src/components/FocusView/FocusTimeline.jsx @@ -1,18 +1,25 @@ import DeliverableCard from './DeliverableCard' +import useFocusStore from '../../store/useFocusStore' export default function FocusTimeline({ project, activeDeliverableId, onEditDeliverable }) { + const setActiveDeliverable = useFocusStore(s => s.setActiveDeliverable) const sorted = [...(project.deliverables || [])].sort((a, b) => new Date(a.due_date) - new Date(b.due_date)) + return ( -
-
+
+

{project.name}

{project.description && ( — {project.description} )} - {sorted.length} deliverable{sorted.length !== 1 ? 's' : ''} + + {sorted.length} deliverable{sorted.length !== 1 ? 's' : ''} +
-
+ + {/* pt-6 gives the "SELECTED" badge room above the card without clipping */} +
{sorted.map((d, i) => (
{i < sorted.length - 1 && ( -
+
@@ -31,7 +39,7 @@ export default function FocusTimeline({ project, activeDeliverableId, onEditDeli
))} {sorted.length === 0 && ( -

No deliverables yet.

+

No deliverables yet.

)}
diff --git a/frontend/src/components/UI/Drawer.jsx b/frontend/src/components/UI/Drawer.jsx index 25dd4a5..a3acfde 100644 --- a/frontend/src/components/UI/Drawer.jsx +++ b/frontend/src/components/UI/Drawer.jsx @@ -1,23 +1,32 @@ import { useEffect } from 'react' + export default function Drawer({ isOpen, onClose, children }) { useEffect(() => { const h = (e) => { if (e.key === 'Escape') onClose() } if (isOpen) document.addEventListener('keydown', h) return () => document.removeEventListener('keydown', h) }, [isOpen, onClose]) + return ( <> - {isOpen &&
} + {isOpen && ( +
+ )}
-
+ {/* Handle bar + close */} +
- + +
+ + {/* Scrollable content — overflow-visible on x so badge doesn't clip */} +
+ {children}
-
{children}
) diff --git a/frontend/src/store/useFocusStore.js b/frontend/src/store/useFocusStore.js index a231166..b5ff6a1 100644 --- a/frontend/src/store/useFocusStore.js +++ b/frontend/src/store/useFocusStore.js @@ -5,8 +5,9 @@ const useFocusStore = create((set) => ({ projectId: null, activeDeliverableId: null, - openFocus: (projectId, deliverableId) => set({ isOpen: true, projectId, activeDeliverableId: deliverableId }), - closeFocus: () => set({ isOpen: false, projectId: null, activeDeliverableId: null }), + openFocus: (projectId, deliverableId) => set({ isOpen: true, projectId, activeDeliverableId: deliverableId }), + closeFocus: () => set({ isOpen: false, projectId: null, activeDeliverableId: null }), + setActiveDeliverable: (id) => set({ activeDeliverableId: id }), })) export default useFocusStore