diff --git a/packages/frontend/src/pages/AddEvent.tsx b/packages/frontend/src/pages/AddEvent.tsx index c43a556..702b594 100644 --- a/packages/frontend/src/pages/AddEvent.tsx +++ b/packages/frontend/src/pages/AddEvent.tsx @@ -205,9 +205,20 @@ export default function AddEvent() { {/* Header */}
+ style={{ + position: 'absolute', left: '24px', + width: '42px', height: '42px', + background: '#F5F6FA', border: '1px solid #D9DEEA', + borderRadius: '14px', cursor: 'pointer', + display: 'flex', alignItems: 'center', justifyContent: 'center', + boxShadow: '0 6px 16px rgba(34, 43, 69, 0.05)', + }} + > + + + +

Add Event

@@ -410,7 +421,8 @@ export default function AddEvent() {
@@ -418,7 +430,7 @@ export default function AddEvent() { onClick={() => { if (!validateDate(date)) return; if (!allDay && !validateTime(startHours, startMinutes, startAmpm, endHours, endMinutes, endAmpm)) return; - + api('/events', { method: 'POST', token: token ?? undefined, @@ -435,7 +447,8 @@ export default function AddEvent() { .then(() => navigate(`/modules/${moduleId}/calendar`)) .catch(() => {}); }} - className="w-[116px] h-[45px] bg-[#b8e366] rounded-[20px] flex items-center justify-center text-white text-xl" + className="w-[116px] h-[45px] bg-[#B8E466] rounded-[999px] flex items-center justify-center text-white text-sm" + style={{ boxShadow: '0 6px 14px rgba(183,222,88,0.28)' }} > Post diff --git a/packages/frontend/src/pages/AgendaDetail.tsx b/packages/frontend/src/pages/AgendaDetail.tsx index 5c25405..51a953a 100644 --- a/packages/frontend/src/pages/AgendaDetail.tsx +++ b/packages/frontend/src/pages/AgendaDetail.tsx @@ -103,11 +103,11 @@ export default function AgendaDetail() { onClick={() => navigate(`/modules/${moduleId}`)} style={{ position: 'absolute', left: '28px', top: '74px', - width: '38px', height: '42px', - background: 'transparent', border: '1px solid #CED3DE', - borderRadius: '12px', cursor: 'pointer', + width: '42px', height: '42px', + background: '#F5F6FA', border: '1px solid #D9DEEA', + borderRadius: '14px', cursor: 'pointer', display: 'flex', alignItems: 'center', justifyContent: 'center', - opacity: 0.5, + boxShadow: '0 6px 16px rgba(34, 43, 69, 0.05)', }} > @@ -174,7 +174,7 @@ export default function AgendaDetail() {

Calendar

+

Calendar

{/* Month Navigation */} @@ -226,7 +226,7 @@ export default function CalendarScreenCoach() {
{ev.startTime}-{ev.endTime}
-
{ev.title}
+
{ev.title}
)} diff --git a/packages/frontend/src/pages/CalendarScreenUser.tsx b/packages/frontend/src/pages/CalendarScreenUser.tsx index edba0f8..a4c3206 100644 --- a/packages/frontend/src/pages/CalendarScreenUser.tsx +++ b/packages/frontend/src/pages/CalendarScreenUser.tsx @@ -149,7 +149,7 @@ export default function CalendarScreenUser() { -

Calendar

+

Calendar

{/* Month Navigation */} @@ -226,7 +226,7 @@ export default function CalendarScreenUser() {
{ev.allDay ? "All Day" : `${ev.startTime ?? ""} - ${ev.endTime ?? ""}`}
-
{ev.title}
+
{ev.title}
diff --git a/packages/frontend/src/pages/CreateAgenda.tsx b/packages/frontend/src/pages/CreateAgenda.tsx index 3cf9db0..8699688 100644 --- a/packages/frontend/src/pages/CreateAgenda.tsx +++ b/packages/frontend/src/pages/CreateAgenda.tsx @@ -43,11 +43,11 @@ export default function CreateAgenda() { onClick={() => navigate(`/modules/${moduleId}`)} style={{ position: 'absolute', left: '28px', top: '74px', - width: '38px', height: '42px', - background: 'transparent', border: '1px solid #CED3DE', - borderRadius: '12px', cursor: 'pointer', + width: '42px', height: '42px', + background: '#F5F6FA', border: '1px solid #D9DEEA', + borderRadius: '14px', cursor: 'pointer', display: 'flex', alignItems: 'center', justifyContent: 'center', - opacity: 0.5, + boxShadow: '0 6px 16px rgba(34, 43, 69, 0.05)', }} > @@ -169,9 +169,9 @@ export default function CreateAgenda() { position: 'absolute', left: '156px', top: '788px', width: '116px', height: '45px', background: '#FFFFFF', - boxShadow: '0px 1px 4px rgba(0,0,0,0.25)', - borderRadius: '20px', border: 'none', cursor: 'pointer', - fontFamily: 'Amiko', fontSize: '20px', color: '#222B45', + border: '1px solid #DFE5F0', + borderRadius: '999px', cursor: 'pointer', + fontFamily: 'Amiko', fontSize: '14px', color: '#222B45', }} > Cancel @@ -185,8 +185,9 @@ export default function CreateAgenda() { position: 'absolute', left: '284px', top: '789px', width: '116px', height: '45px', background: '#B8E466', - borderRadius: '20px', border: 'none', cursor: 'pointer', - fontFamily: 'Amiko', fontSize: '20px', color: '#FFFFFF', + borderRadius: '999px', border: 'none', cursor: 'pointer', + fontFamily: 'Amiko', fontSize: '14px', color: '#FFFFFF', + boxShadow: '0 6px 14px rgba(183,222,88,0.28)', opacity: submitting || !title.trim() || !description.trim() || !date ? 0.5 : 1, }} > diff --git a/packages/frontend/src/pages/CreateAnnouncement.tsx b/packages/frontend/src/pages/CreateAnnouncement.tsx index 69260fb..f24f61c 100644 --- a/packages/frontend/src/pages/CreateAnnouncement.tsx +++ b/packages/frontend/src/pages/CreateAnnouncement.tsx @@ -42,11 +42,11 @@ export default function CreateAnnouncement() { onClick={() => navigate(`/modules/${moduleId}`)} style={{ position: 'absolute', left: '28px', top: '74px', - width: '38px', height: '42px', - background: 'transparent', border: '1px solid #CED3DE', - borderRadius: '12px', cursor: 'pointer', + width: '42px', height: '42px', + background: '#F5F6FA', border: '1px solid #D9DEEA', + borderRadius: '14px', cursor: 'pointer', display: 'flex', alignItems: 'center', justifyContent: 'center', - opacity: 0.5, + boxShadow: '0 6px 16px rgba(34, 43, 69, 0.05)', }} > @@ -139,9 +139,9 @@ export default function CreateAnnouncement() { position: 'absolute', left: '156px', top: '788px', width: '116px', height: '45px', background: '#FFFFFF', - boxShadow: '0px 1px 4px rgba(0,0,0,0.25)', - borderRadius: '20px', border: 'none', cursor: 'pointer', - fontFamily: 'Amiko', fontSize: '20px', color: '#222B45', + border: '1px solid #DFE5F0', + borderRadius: '999px', cursor: 'pointer', + fontFamily: 'Amiko', fontSize: '14px', color: '#222B45', }} > Cancel @@ -155,8 +155,9 @@ export default function CreateAnnouncement() { position: 'absolute', left: '284px', top: '789px', width: '116px', height: '45px', background: '#B8E466', - borderRadius: '20px', border: 'none', cursor: 'pointer', - fontFamily: 'Amiko', fontSize: '20px', color: '#FFFFFF', + borderRadius: '999px', border: 'none', cursor: 'pointer', + fontFamily: 'Amiko', fontSize: '14px', color: '#FFFFFF', + boxShadow: '0 6px 14px rgba(183,222,88,0.28)', opacity: submitting || !title.trim() || !body.trim() ? 0.5 : 1, }} > diff --git a/packages/frontend/src/pages/CreateModule.tsx b/packages/frontend/src/pages/CreateModule.tsx index 43752d5..c3f648f 100644 --- a/packages/frontend/src/pages/CreateModule.tsx +++ b/packages/frontend/src/pages/CreateModule.tsx @@ -72,12 +72,12 @@ export default function CreateModule() { transition={{ ...spring, delay: 0 }} onClick={() => navigate('/module-homepage')} style={{ - position: 'absolute', left: '38px', top: '71px', - width: '38px', height: '42px', - background: 'white', border: '1px solid #CED3DE', - borderRadius: '10px', cursor: 'pointer', + position: 'absolute', left: '28px', top: '74px', + width: '42px', height: '42px', + background: '#F5F6FA', border: '1px solid #D9DEEA', + borderRadius: '14px', cursor: 'pointer', display: 'flex', alignItems: 'center', justifyContent: 'center', - opacity: 0.8, + boxShadow: '0 6px 16px rgba(34, 43, 69, 0.05)', }}> @@ -88,7 +88,7 @@ export default function CreateModule() { + style={{ position: 'absolute', left: '72px', top: '119px', fontFamily: 'Amiko', fontWeight: 400, fontSize: '40px', lineHeight: '53px', color: '#000000', margin: 0 }}> Create Module @@ -166,38 +166,40 @@ export default function CreateModule() {

)} - {/* Create button */} + {/* Cancel button */} navigate('/module-homepage')} style={{ - position: 'absolute', left: '56px', top: '740px', - width: '317px', height: '41px', - background: '#B8E466', boxShadow: '0px 8px 20px rgba(0,0,0,0.1)', - borderRadius: '40px', border: 'none', - fontFamily: 'Amiko', fontWeight: 600, fontSize: '24px', - color: '#FFFFFF', cursor: 'pointer', + position: 'absolute', left: '60px', top: '760px', + width: '150px', height: '52px', + background: '#FF6B6B', border: 'none', + borderRadius: '999px', cursor: 'pointer', + fontFamily: 'Amiko', fontWeight: 400, fontSize: '16px', + color: '#FFFFFF', + boxShadow: '0 6px 14px rgba(255,107,107,0.28)', }}> - {loading ? 'Creating...' : 'Create'} + Cancel - {/* Cancel button */} + {/* Create button */} navigate('/module-homepage')} style={{ - position: 'absolute', left: '63px', top: '795px', - width: '304px', height: '41px', - background: '#FFFFFF', boxShadow: '0px 8px 20px rgba(0,0,0,0.1)', - borderRadius: '40px', border: 'none', - fontFamily: 'Amiko', fontWeight: 600, fontSize: '24px', - color: '#C8C8C8', cursor: 'pointer', + position: 'absolute', left: '230px', top: '760px', + width: '150px', height: '52px', + background: '#B8E466', border: 'none', + borderRadius: '999px', cursor: 'pointer', + fontFamily: 'Amiko', fontWeight: 400, fontSize: '16px', + color: '#FFFFFF', + boxShadow: '0 6px 14px rgba(183,222,88,0.28)', }}> - Cancel + {loading ? 'Creating...' : 'Create'} diff --git a/packages/frontend/src/pages/EditAgenda.tsx b/packages/frontend/src/pages/EditAgenda.tsx index a4ea016..277adf6 100644 --- a/packages/frontend/src/pages/EditAgenda.tsx +++ b/packages/frontend/src/pages/EditAgenda.tsx @@ -65,11 +65,11 @@ export default function EditAgenda() { onClick={() => navigate(`/modules/${moduleId}/agendas/${agendaId}`)} style={{ position: 'absolute', left: '28px', top: '74px', - width: '38px', height: '42px', - background: 'transparent', border: '1px solid #CED3DE', - borderRadius: '12px', cursor: 'pointer', + width: '42px', height: '42px', + background: '#F5F6FA', border: '1px solid #D9DEEA', + borderRadius: '14px', cursor: 'pointer', display: 'flex', alignItems: 'center', justifyContent: 'center', - opacity: 0.5, + boxShadow: '0 6px 16px rgba(34, 43, 69, 0.05)', }} > @@ -189,9 +189,9 @@ export default function EditAgenda() { position: 'absolute', left: '156px', top: '788px', width: '116px', height: '45px', background: '#FFFFFF', - boxShadow: '0px 1px 4px rgba(0,0,0,0.25)', - borderRadius: '20px', border: 'none', cursor: 'pointer', - fontFamily: 'Amiko', fontSize: '20px', color: '#222B45', + border: '1px solid #DFE5F0', + borderRadius: '999px', cursor: 'pointer', + fontFamily: 'Amiko', fontSize: '14px', color: '#222B45', }} > Cancel @@ -205,8 +205,9 @@ export default function EditAgenda() { position: 'absolute', left: '284px', top: '789px', width: '116px', height: '45px', background: '#B8E466', - borderRadius: '20px', border: 'none', cursor: 'pointer', - fontFamily: 'Amiko', fontSize: '20px', color: '#FFFFFF', + borderRadius: '999px', border: 'none', cursor: 'pointer', + fontFamily: 'Amiko', fontSize: '14px', color: '#FFFFFF', + boxShadow: '0 6px 14px rgba(183,222,88,0.28)', opacity: submitting || !title.trim() || !description.trim() || !date ? 0.5 : 1, }} > diff --git a/packages/frontend/src/pages/EditAnnouncement.tsx b/packages/frontend/src/pages/EditAnnouncement.tsx index a91590d..9603ce5 100644 --- a/packages/frontend/src/pages/EditAnnouncement.tsx +++ b/packages/frontend/src/pages/EditAnnouncement.tsx @@ -63,11 +63,11 @@ export default function EditAnnouncement() { onClick={() => navigate(`/modules/${moduleId}/announcements/${announcementId}`)} style={{ position: 'absolute', left: '28px', top: '74px', - width: '38px', height: '42px', - background: 'transparent', border: '1px solid #CED3DE', - borderRadius: '12px', cursor: 'pointer', + width: '42px', height: '42px', + background: '#F5F6FA', border: '1px solid #D9DEEA', + borderRadius: '14px', cursor: 'pointer', display: 'flex', alignItems: 'center', justifyContent: 'center', - opacity: 0.5, + boxShadow: '0 6px 16px rgba(34, 43, 69, 0.05)', }} > @@ -160,9 +160,9 @@ export default function EditAnnouncement() { position: 'absolute', left: '156px', top: '788px', width: '116px', height: '45px', background: '#FFFFFF', - boxShadow: '0px 1px 4px rgba(0,0,0,0.25)', - borderRadius: '20px', border: 'none', cursor: 'pointer', - fontFamily: 'Amiko', fontSize: '20px', color: '#222B45', + border: '1px solid #DFE5F0', + borderRadius: '999px', cursor: 'pointer', + fontFamily: 'Amiko', fontSize: '14px', color: '#222B45', }} > Cancel @@ -176,8 +176,9 @@ export default function EditAnnouncement() { position: 'absolute', left: '284px', top: '789px', width: '116px', height: '45px', background: '#B8E466', - borderRadius: '20px', border: 'none', cursor: 'pointer', - fontFamily: 'Amiko', fontSize: '20px', color: '#FFFFFF', + borderRadius: '999px', border: 'none', cursor: 'pointer', + fontFamily: 'Amiko', fontSize: '14px', color: '#FFFFFF', + boxShadow: '0 6px 14px rgba(183,222,88,0.28)', opacity: submitting || !title.trim() || !body.trim() ? 0.5 : 1, }} > diff --git a/packages/frontend/src/pages/EditEvent.tsx b/packages/frontend/src/pages/EditEvent.tsx index 74ac9fe..372c427 100644 --- a/packages/frontend/src/pages/EditEvent.tsx +++ b/packages/frontend/src/pages/EditEvent.tsx @@ -240,9 +240,20 @@ export default function EditEvent() { {/* Header */}
+ style={{ + position: 'absolute', left: '24px', + width: '42px', height: '42px', + background: '#F5F6FA', border: '1px solid #D9DEEA', + borderRadius: '14px', cursor: 'pointer', + display: 'flex', alignItems: 'center', justifyContent: 'center', + boxShadow: '0 6px 16px rgba(34, 43, 69, 0.05)', + }} + > + + + +

Edit Event

@@ -365,13 +376,15 @@ export default function EditEvent() {
diff --git a/packages/frontend/src/pages/Inbox.tsx b/packages/frontend/src/pages/Inbox.tsx index 2683316..40ce477 100644 --- a/packages/frontend/src/pages/Inbox.tsx +++ b/packages/frontend/src/pages/Inbox.tsx @@ -176,7 +176,7 @@ export default function Messaging() { + + {canManageAttendance && ( + + )} +
{error && ( @@ -660,23 +637,7 @@ export default function ModuleAttendanceScreen() { )} - {success && ( -
- {success} -
- )} - - {view === 'roster' && ( +{view === 'roster' && ( <> {rosterLoading ? (

Loading...

@@ -711,16 +672,17 @@ export default function ModuleAttendanceScreen() { }} style={{ width: '100%', - border: 'none', - background: '#F6F5FB', + border: '1px solid #EAECF4', + background: '#FFFFFF', borderRadius: '18px', - minHeight: '42px', + minHeight: '48px', padding: '10px 14px', display: 'flex', alignItems: 'center', gap: '10px', cursor: isCoachRow ? 'default' : 'pointer', opacity: isCoachRow ? 0.92 : 1, + boxShadow: '0 4px 12px rgba(34, 43, 69, 0.07)', }} >
-
- - {saving ? 'Saving...' : 'Save'} - -
- {attendanceLoading ? (

Loading...

) : attendanceMembers.length === 0 ? ( @@ -1066,20 +1003,22 @@ export default function ModuleAttendanceScreen() { whileHover={{ y: -2, boxShadow: '0 8px 18px rgba(56, 60, 109, 0.10)' }} transition={hoverTransition} style={{ - background: '#F6F5FB', + background: '#FFFFFF', + border: '1px solid #EAECF4', borderRadius: '18px', - minHeight: '42px', + minHeight: '48px', padding: '10px 12px', display: 'flex', alignItems: 'center', gap: '8px', + boxShadow: '0 4px 12px rgba(34, 43, 69, 0.07)', }} > - setStatus( + autoSaveStatus( member.memberId, member.status === 'PRESENT' ? null : 'PRESENT' ) @@ -1090,7 +1029,7 @@ export default function ModuleAttendanceScreen() { kind="absent" active={member.status === 'ABSENT'} onClick={() => - setStatus( + autoSaveStatus( member.memberId, member.status === 'ABSENT' ? null : 'ABSENT' ) @@ -1218,6 +1157,7 @@ export default function ModuleAttendanceScreen() { ) }) )} + )}
diff --git a/packages/frontend/src/pages/ModuleDashboard.tsx b/packages/frontend/src/pages/ModuleDashboard.tsx index c666999..156dd5b 100644 --- a/packages/frontend/src/pages/ModuleDashboard.tsx +++ b/packages/frontend/src/pages/ModuleDashboard.tsx @@ -5,9 +5,10 @@ import { api } from '../utils/api' import { useAuth } from '../context/AuthContext' import { useModule } from '../context/ModuleContext' import BottomNav from '../components/BottomNav' -import React from 'react' const spring = { type: 'spring' as const, stiffness: 100, damping: 14 } +const accent = '#6166DB' +const fontFamily = 'Amiko, sans-serif' interface ModuleInfo { id: string @@ -39,6 +40,34 @@ interface AgendaItem { author: { firstName: string; lastName: string } } +function TopTab({ label, active, onClick }: { label: string; active: boolean; onClick: () => void }) { + return ( + + ) +} + export default function ModuleDashboard() { const { id: moduleId } = useParams<{ id: string }>() const navigate = useNavigate() @@ -51,6 +80,7 @@ export default function ModuleDashboard() { const [loading, setLoading] = useState(true) const [error, setError] = useState(null) const [showJoinCode, setShowJoinCode] = useState(false) + const [activeTab, setActiveTab] = useState<'announcements' | 'agenda'>('announcements') const isAdmin = moduleInfo?.memberRole === 'MODULE_ADMIN' @@ -76,7 +106,7 @@ export default function ModuleDashboard() { return (
-

Loading...

+

Loading...

) @@ -86,7 +116,7 @@ export default function ModuleDashboard() { return (
-

{error}

+

{error}

) @@ -106,11 +136,11 @@ export default function ModuleDashboard() { onClick={(e) => { e.stopPropagation(); navigate('/module-homepage') }} style={{ position: 'absolute', left: '28px', top: '74px', - width: '38px', height: '42px', - background: 'transparent', border: '1px solid #CED3DE', - borderRadius: '12px', cursor: 'pointer', + width: '42px', height: '42px', + background: '#F5F6FA', border: '1px solid #D9DEEA', + borderRadius: '14px', cursor: 'pointer', display: 'flex', alignItems: 'center', justifyContent: 'center', - opacity: 0.5, + boxShadow: '0 6px 16px rgba(34, 43, 69, 0.05)', }} > @@ -124,7 +154,7 @@ export default function ModuleDashboard() { transition={{ ...spring, delay: 0.05 }} style={{ position: 'absolute', left: 0, right: 0, top: '69px', - fontFamily: 'Amiko', fontWeight: 400, fontSize: '40px', + fontFamily, fontWeight: 400, fontSize: '40px', lineHeight: '53px', color: '#000000', margin: 0, textAlign: 'center', pointerEvents: 'none', }} @@ -160,7 +190,7 @@ export default function ModuleDashboard() { background: '#FFFFFF', borderRadius: '12px', padding: '10px 16px', boxShadow: '0px 4px 16px rgba(0,0,0,0.15)', - fontFamily: 'Amiko', fontSize: '14px', fontWeight: 400, + fontFamily, fontSize: '14px', fontWeight: 400, color: '#000000', zIndex: 10, border: '2px solid #707070', }} @@ -174,104 +204,96 @@ export default function ModuleDashboard() { initial={{ opacity: 0, y: 20 }} animate={{ opacity: 1, y: 0 }} transition={{ ...spring, delay: 0.1 }} style={{ - position: 'absolute', top: '155px', left: '20px', right: '20px', - bottom: '110px', overflowY: 'auto', padding: '0 10px 20px', + position: 'absolute', top: '145px', left: '20px', right: '20px', + bottom: '110px', overflowY: 'auto', padding: '0 10px 20px', }} > - {/* Announcements section */} -
navigate(`/modules/${moduleId}/announcements/create`)} + {/* Tab row — sticky */} +
- {announcements.length === 0 ? ( - - ) : ( - announcements.map(a => ( - navigate(`/modules/${moduleId}/announcements/${a.id}`)} - /> - )) - )} - +
+ setActiveTab('announcements')} + /> + setActiveTab('agenda')} + /> +
+
- {/* Agenda section */} -
navigate(`/modules/${moduleId}/agendas/create`)} - > - {agendas.length === 0 ? ( - - ) : ( - agendas.map(a => ( - navigate(`/modules/${moduleId}/agendas/${a.id}`)} - /> - )) - )} -
+ {/* Tab content */} + {activeTab === 'announcements' ? ( + <> + {announcements.length === 0 ? ( + + ) : ( + announcements.map(a => ( + navigate(`/modules/${moduleId}/announcements/${a.id}`)} + /> + )) + )} + {isAdmin && ( + navigate(`/modules/${moduleId}/announcements/create`)} /> + )} + + ) : ( + <> + {agendas.length === 0 ? ( + + ) : ( + agendas.map(a => ( + navigate(`/modules/${moduleId}/agendas/${a.id}`)} + /> + )) + )} + {isAdmin && ( + navigate(`/modules/${moduleId}/agendas/create`)} /> + )} + + )} + ) } -function Section({ title, isAdmin, onAdd, children }: { - title: string - isAdmin: boolean - onAdd: () => void - children: React.ReactNode -}) { +function AddButton({ onClick }: { onClick: () => void }) { return ( -
- {/* Header bar */} -
- - {title} - -
- - {/* Cards — scrollable window ~3 tall */} -
- {children} -
- - {/* + button (admin only) */} - {isAdmin && ( -
- +
+
) } @@ -287,7 +309,6 @@ function AnnouncementCard({ announcement: a, onClick }: { announcement: Announce marginBottom: '10px', cursor: 'pointer', }} > - {/* Avatar */}
- {/* Content */}
- {/* Purple bubble — capped width so it doesn't stretch full row */}
{a.title}
- {/* Body */}

{a.body}

- {/* Date + author */} - + {date} · {a.author.firstName} {a.author.lastName}
- {/* Big black right arrow */} @@ -348,7 +364,6 @@ function AgendaCard({ agenda: a, onClick }: { agenda: AgendaItem; onClick: () => marginBottom: '10px', cursor: 'pointer', }} > - {/* Avatar */}
- {/* Content */}
@@ -376,29 +390,27 @@ function AgendaCard({ agenda: a, onClick }: { agenda: AgendaItem; onClick: () =>

{a.description ?? ''}

- + {date} · {a.author.firstName} {a.author.lastName}
- {/* Big black right arrow */}
- ) } function EmptyState({ text }: { text: string }) { return ( -

+

{text}

) diff --git a/packages/frontend/src/pages/ModuleHomepage.tsx b/packages/frontend/src/pages/ModuleHomepage.tsx index d3bdc32..a6d205d 100644 --- a/packages/frontend/src/pages/ModuleHomepage.tsx +++ b/packages/frontend/src/pages/ModuleHomepage.tsx @@ -102,7 +102,7 @@ export default function ModuleHomepage() { + style={{ position: 'absolute', left: '134px', top: '83px', fontFamily: 'Amiko', fontWeight: 400, fontSize: '40px', lineHeight: '53px', color: '#000000', margin: 0 }}> Modules @@ -277,14 +277,13 @@ export default function ModuleHomepage() { top: '777px', width: '109px', height: '41px', - background: '#B8E466', - boxShadow: '0px 8px 20px rgba(0,0,0,0.1)', - borderRadius: '40px', - border: 'none', + background: '#FFFFFF', + border: '1px solid #DFE5F0', + borderRadius: '999px', fontFamily: 'Amiko', - fontWeight: 600, - fontSize: '24px', - color: '#FFFFFF', + fontWeight: 400, + fontSize: '14px', + color: '#222B45', cursor: 'pointer', zIndex: 20, }} diff --git a/packages/frontend/src/pages/ProgressPage.tsx b/packages/frontend/src/pages/ProgressPage.tsx index d61d599..68617cd 100644 --- a/packages/frontend/src/pages/ProgressPage.tsx +++ b/packages/frontend/src/pages/ProgressPage.tsx @@ -182,11 +182,11 @@ export default function ProgressPage() { onClick={() => navigate(`/modules/${moduleId}`)} style={{ position: 'absolute', left: '28px', top: '74px', - width: '38px', height: '42px', - background: 'transparent', border: '1px solid #CED3DE', - borderRadius: '12px', cursor: 'pointer', + width: '42px', height: '42px', + background: '#F5F6FA', border: '1px solid #D9DEEA', + borderRadius: '14px', cursor: 'pointer', display: 'flex', alignItems: 'center', justifyContent: 'center', - opacity: 0.5, + boxShadow: '0 6px 16px rgba(34, 43, 69, 0.05)', }} > diff --git a/packages/frontend/src/pages/RoutineDetailPage.tsx b/packages/frontend/src/pages/RoutineDetailPage.tsx index 4319005..6c86fd0 100644 --- a/packages/frontend/src/pages/RoutineDetailPage.tsx +++ b/packages/frontend/src/pages/RoutineDetailPage.tsx @@ -18,19 +18,13 @@ const cardShadow = '0 18px 36px rgba(34, 43, 69, 0.08)' // United Scoring deduction categories (v10.15.25) const DEDUCTION_CATEGORIES = [ - { key: 'AF', label: 'Athlete Fall', pointsEach: 0.15 }, - { key: 'MAF', label: 'Major Athlete Fall', pointsEach: 0.25 }, - { key: 'BB', label: 'Building Bobble', pointsEach: 0.25 }, - { key: 'BF', label: 'Building Fall', pointsEach: 0.75 }, - { key: 'MBF', label: 'Major Building Fall', pointsEach: 1.25 }, - { key: 'OOB', label: 'Boundary Violation', pointsEach: 0.05 }, - { key: 'TLV', label: 'Time Limit Violation', pointsEach: 0.05 }, - { key: 'DV', label: 'Division Violation', pointsEach: 5.00 }, - { key: 'UNI', label: 'Uniform Violation', pointsEach: 0.01 }, - { key: 'APS', label: 'APS / Excessive Celebration', pointsEach: 0.25 }, - { key: 'OOL-T', label: 'Out of Level Tumbling', pointsEach: 0.05 }, - { key: 'OOL-B', label: 'Building Out of Level', pointsEach: 0.10 }, - { key: 'SRD', label: 'Skill Restriction / Division', pointsEach: 0.50 }, + { key: 'AF', label: 'Athlete Fall', pointsEach: 0.15 }, + { key: 'MAF', label: 'Major Athlete Fall', pointsEach: 0.25 }, + { key: 'BB', label: 'Building Bobble', pointsEach: 0.25 }, + { key: 'BF', label: 'Building Fall', pointsEach: 0.75 }, + { key: 'MBF', label: 'Major Building Fall',pointsEach: 1.25 }, + { key: 'OOB', label: 'Boundary Violation', pointsEach: 0.05 }, + { key: 'ILL', label: 'Illegality', pointsEach: 2.00 }, ] as const interface StoredDeduction { @@ -283,7 +277,7 @@ export default function RoutineDetailPage() {
- {DEDUCTION_CATEGORIES.map(cat => { + {DEDUCTION_CATEGORIES.filter(cat => isCoach || getCount(cat.key) > 0).map(cat => { const count = getCount(cat.key) const pts = count * cat.pointsEach return ( diff --git a/packages/frontend/src/pages/StatsPage.tsx b/packages/frontend/src/pages/StatsPage.tsx index 547995e..f81c1af 100644 --- a/packages/frontend/src/pages/StatsPage.tsx +++ b/packages/frontend/src/pages/StatsPage.tsx @@ -18,19 +18,13 @@ const cardBorder = '#EAEFF8' const cardShadow = '0 18px 36px rgba(34, 43, 69, 0.08)' const DEDUCTION_CATEGORIES = [ - { key: 'AF', label: 'Athlete Fall', pointsEach: 0.15 }, - { key: 'MAF', label: 'Major Athlete Fall', pointsEach: 0.25 }, - { key: 'BB', label: 'Building Bobble', pointsEach: 0.25 }, - { key: 'BF', label: 'Building Fall', pointsEach: 0.75 }, - { key: 'MBF', label: 'Major Building Fall', pointsEach: 1.25 }, - { key: 'OOB', label: 'Boundary Violation', pointsEach: 0.05 }, - { key: 'TLV', label: 'Time Limit Violation', pointsEach: 0.05 }, - { key: 'DV', label: 'Division Violation', pointsEach: 5.00 }, - { key: 'UNI', label: 'Uniform Violation', pointsEach: 0.01 }, - { key: 'APS', label: 'APS / Excessive Celebration', pointsEach: 0.25 }, - { key: 'OOL-T', label: 'Out of Level Tumbling', pointsEach: 0.05 }, - { key: 'OOL-B', label: 'Building Out of Level', pointsEach: 0.10 }, - { key: 'SRD', label: 'Skill Restriction / Division', pointsEach: 0.50 }, + { key: 'AF', label: 'Athlete Fall', pointsEach: 0.15 }, + { key: 'MAF', label: 'Major Athlete Fall', pointsEach: 0.25 }, + { key: 'BB', label: 'Building Bobble', pointsEach: 0.25 }, + { key: 'BF', label: 'Building Fall', pointsEach: 0.75 }, + { key: 'MBF', label: 'Major Building Fall', pointsEach: 1.25 }, + { key: 'OOB', label: 'Boundary Violation', pointsEach: 0.05 }, + { key: 'ILL', label: 'Illegality', pointsEach: 2.00 }, ] as const interface Deduction { diff --git a/packages/frontend/src/pages/ViewEvent.tsx b/packages/frontend/src/pages/ViewEvent.tsx index dced92a..06d520a 100644 --- a/packages/frontend/src/pages/ViewEvent.tsx +++ b/packages/frontend/src/pages/ViewEvent.tsx @@ -51,10 +51,21 @@ export default function ViewEvent() { {/* Header */}
-

Event

+ style={{ + position: 'absolute', left: '24px', + width: '42px', height: '42px', + background: '#F5F6FA', border: '1px solid #D9DEEA', + borderRadius: '14px', cursor: 'pointer', + display: 'flex', alignItems: 'center', justifyContent: 'center', + boxShadow: '0 6px 16px rgba(34, 43, 69, 0.05)', + }} + > + + + + +

Event

{loading ? ( @@ -68,7 +79,7 @@ export default function ViewEvent() {
Title
-

{event.title}

+

{event.title}

@@ -112,13 +123,14 @@ export default function ViewEvent() {
@@ -136,13 +148,14 @@ export default function ViewEvent() {