diff --git a/src/components/SprintGanttView.tsx b/src/components/SprintGanttView.tsx index bca3949..a785da3 100644 --- a/src/components/SprintGanttView.tsx +++ b/src/components/SprintGanttView.tsx @@ -9,13 +9,17 @@ import { epicScopeSprintProgress, formatGanttSprintSubtitleLines, formatSprintRangeFr, + ganttDayColumns, + ganttMonthBands, ganttRangeFromSprintsAndMilestones, + ganttSubheaderTicks, + ganttVerticalGuideXs, milestoneTooltipText, msToX, parseIsoMs, pixelsPerDay, - timelineTicks, timelineWidthPx, + type GanttDayColumn, type GanttTimeScale, sprintBarBounds, sprintBarFillPercent, @@ -84,6 +88,57 @@ const SCALE_LABELS: Record = { month: 'Mois', } +function GanttTimelineBackdrop({ + dayColumns, + guideXs, + todayX, + todayClamped, + compact, +}: { + dayColumns: GanttDayColumn[] + guideXs: number[] + todayX: number + todayClamped: 'before' | 'inside' | 'after' + compact?: boolean +}) { + const insetY = compact ? 'bottom-1 top-1' : 'inset-y-0' + return ( + <> + {dayColumns + .filter((c) => c.isWeekend) + .map((c) => ( +
+ ))} + {guideXs.map((gx, i) => ( +
+ ))} +
+ + ) +} + export function SprintGanttView({ sprints, milestones, @@ -132,10 +187,21 @@ export function SprintGanttView({ [startMs, endMs, ppd], ) - const maxTicks = useMemo(() => Math.floor(widthPx / 72), [widthPx]) - const ticks = useMemo( - () => timelineTicks(timeScale, startMs, endMs, maxTicks), - [timeScale, startMs, endMs, maxTicks], + const dayColumns = useMemo( + () => ganttDayColumns(startMs, endMs, widthPx), + [startMs, endMs, widthPx], + ) + const monthBands = useMemo( + () => ganttMonthBands(startMs, endMs, widthPx), + [startMs, endMs, widthPx], + ) + const subheaderTicks = useMemo( + () => ganttSubheaderTicks(timeScale, startMs, endMs, widthPx), + [timeScale, startMs, endMs, widthPx], + ) + const guideXs = useMemo( + () => ganttVerticalGuideXs(timeScale, startMs, endMs, widthPx), + [timeScale, startMs, endMs, widthPx], ) const todayLine = useMemo(() => { @@ -204,8 +270,9 @@ export function SprintGanttView({

Échelle jour / semaine / mois et zoom (loupe) : la - timeline s’étire en pixels par jour — faites défiler horizontalement. Barre = charge - (champ Sprint) ou avancement calendaire. Losanges = jalons (survol pour le détail). + timeline s’étire en pixels par jour — faites défiler horizontalement. En-tête : mois puis + jours / repères ; week-ends en fond plus sombre. Barre = charge (champ Sprint) ou + avancement calendaire. Losanges = jalons (survol pour le détail).