diff --git a/eslint.config.js b/eslint.config.js index aa8b4ef9..33eae3bb 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -14,7 +14,14 @@ export default defineConfig([ }, tseslint.configs.recommended, eslintPluginAstro.configs.recommended, - globalIgnores(['dist', '.astro', 'node_modules', 'public', '**/*.min.js']), + globalIgnores([ + 'dist', + '.astro', + '.netlify', + 'node_modules', + 'public', + '**/*.min.js' + ]), { rules: { 'no-console': 'error', diff --git a/src/components/RoadmapBoard.astro b/src/components/RoadmapBoard.astro index 5526e7a2..baaa7931 100644 --- a/src/components/RoadmapBoard.astro +++ b/src/components/RoadmapBoard.astro @@ -32,6 +32,11 @@ const now = new Date() const nowYear = now.getUTCFullYear() const nowMonth = now.getUTCMonth() const nowLeft = pos.pctLeft(now).toFixed(2) +const refreshedAt = now.toLocaleDateString('en-US', { + month: 'long', + day: 'numeric', + year: 'numeric' +}) const gridItems = buildGridItems(projects, teams) @@ -63,256 +68,278 @@ function fmtDate(iso: string | null | undefined): string { class="board-frame" style={`--n-months: ${nMonths}; --n-quarters: ${nQuarters}`} > - - +
- -
- - { - gridItems.map((item) => { - if (item.type === 'team-header') { - const { team, row, teamColor } = item + + Roadmap data refreshed: {refreshedAt} + + + + {months.map(() => )} + + + + + + Team / Project + { + quarterHeaders.map((qh) => ( + + {qh.label} + + )) + } + + + {months.map((m) => {m.label})} + + + + + { + gridItems.map((item) => { + if (item.type === 'team-header') { + const { team, teamColor } = item + return ( + + {/* Team header label — sticky left */} + +
{team.name}
+ + {/* Team header track — fills the timeline columns */} + + + ) + } + + const { project: proj, teamColor } = item + const projColor = proj.color ?? DEFAULT_PROJECT_COLOR + const iconEmoji = resolveIcon(proj.icon) + const { + hasDates, + barLeft, + barWidth, + hasCompletedBar, + completedBarLeft, + completedBarWidth, + hasExtension, + extensionLeft, + extensionWidth, + datedMilestones + } = computeProjectBarProps(proj, pos) + return ( -
-
+ {/* Project label — col 1, sticky left */} + -
- {team.name} -
-
-
- ) - } + + {iconEmoji && ( + + )} + {proj.name} + + + + {/* Project timeline track */} + 0 && + `milestones: ${datedMilestones.map((ms) => ms.name).join(', ')}` + ] + .filter(Boolean) + .join('; ') || 'no dates set' + } + style={`background-color: ${teamColor}17; --team-color: ${teamColor}`} + > + {/* "Today" marker */} +