Skip to main content

Component Creation - Changelog Component

· 11 min read

Execution Plan

Create a comprehensive Changelog React component with:

  • GitHub-style heatmap visualization (month/quarter/year granularity)
  • Separate heatmap rows for content vs development categories
  • Shared date overlay (year/quarter headers) above heatmap rows
  • Legend section positioned to the right of heatmap rows
  • Modular component architecture for maintainability
  • Quarter-based list view with filtering
  • Responsive design and proper alignment

Execution Results / Attempts

✅ Initial Changelog Component Created (2025-01-20)

Work Period: January 20, 2025

Key Accomplishments:

  • Created initial Changelog component with heatmap visualization
  • Implemented month/quarter/year grouping and display
  • Added quarter-based list view with horizontal scrolling
  • Integrated with changelog data generation system

✅ Component Modularization & Refinement (2025-01-20)

Work Period: January 20, 2025 (Iterative refinement)

Key Accomplishments:

Component Architecture

  • Modularized Changelog component into sub-components:
    • DateOverlay/ - Shared year and quarter headers above heatmap rows
    • HeatmapRow/ - Individual heatmap row for each category (content/development)
    • LegendSidebar/ - Title and legend for each heatmap row
    • Legend/ - Intensity scale legend component
    • Filters/ - Filter dropdowns (status, type, priority, category)
    • QuarterSection/ - Quarterly entries display with filtering

Layout & Alignment

  • Separated heatmap rows from legends:
    • Heatmap rows on left side (flex: 1)
    • Legends section on right side (fixed 200px width)
    • DateOverlay positioned above rows, spanning only rows width
    • Legend section header ("Legend") aligned with DateOverlay

Heatmap Visualization

  • Two separate heatmap rows:
    • Content row (blue color scheme)
    • Development row (green color scheme)
    • Each row has its own title and legend on the right
    • Shared date overlay (year/quarter headers) above both rows

Spacing & Alignment

  • Quarter gaps:

    • Added 4px gap divs between quarters (matching heatmap squares)
    • CSS gap (2px) applies to gap divs, creating 8px total visual gap
    • Updated width calculations to account for quarter gaps (8px total)
    • Quarter bars align perfectly with heatmap squares below
  • Row spacing:

    • Minimal 2px gap between heatmap rows (matching square spacing)
    • Minimal 2px gap between legend entries
    • Removed excessive padding/margins

Alignment Fixes

  • Fixed quarter bar alignment with heatmap squares:

    • Accounted for CSS gap (2px) in width calculations
    • Quarter gap divs (4px) + CSS gap (2px on each side) = 8px total
    • Year and quarter lines span correct widths
    • Quarter lines don't extend beyond their containers (overflow: hidden)
  • Fixed legend alignment:

    • Legends anchored to top-right (not bottom)
    • Added "Legend" header aligned with DateOverlay
    • Proper flex alignment (align-content: flex-start, justify-content: flex-start)

Date Overlay

  • Year labels and lines span full year width (including quarter gaps)
  • Quarter labels and lines span individual quarter widths
  • Proper positioning above heatmap rows
  • Gap divs match heatmap row structure exactly
  • Year labels use Highlight component with gradient background
  • Year line positioned behind year label (z-index: 0)

Additional Enhancements

  • Dynamic Date Range: Always shows 1 year ago, this year, and next year (dynamically calculated)
  • Current Month Indicator: Added to legend with bordered square and month/year label
  • Year Highlighting: Year labels use Highlight component for visual emphasis
  • Legend Header: "Legend" header anchored to top-right with minimal vertical space

Components Created:

  • src/components/Changelog/Changelog.tsx - Main component orchestrating all sub-components
  • src/components/Changelog/DateOverlay/DateOverlay.tsx - Year and quarter headers
  • src/components/Changelog/HeatmapRow/HeatmapRow.tsx - Individual heatmap row
  • src/components/Changelog/LegendSidebar/LegendSidebar.tsx - Title and legend wrapper
  • src/components/Changelog/Legend/Legend.tsx - Intensity scale legend
  • src/components/Changelog/Filters/ChangelogFilters.tsx - Filter dropdowns
  • src/components/Changelog/QuarterSection/QuarterSection.tsx - Quarterly entries display

CSS Modules Created:

  • Each component has its own .module.css file for scoped styling
  • Proper alignment and spacing rules
  • Responsive design considerations

Key Technical Details:

  • Width calculations account for:
    • Month cells: 20px each
    • Month gaps: 2px between months (CSS gap)
    • Quarter gaps: 4px gap div + 2px CSS gap on each side = 8px total
    • Year width = sum of quarter widths + (quarters.length - 1) × 8px
  • Date range: Dynamically shows 1 year ago, this year, and next year
  • Year labels use Highlight component with gradient background
  • Year line z-index: 0 (behind label), label z-index: 3 (above line)
  • Legend includes current month indicator with bordered square and month/year label

Storybook Stories:

  • Changelog.stories.tsx: Default, SingleEntry, ManyEntries, ContentOnly, DevelopmentOnly stories
  • Changelog.mdx: Comprehensive documentation of component structure, layout, and behavior
  • Stories include sample entries with proper category assignments (content/development)

Related Links:

✅ Mobile Responsiveness & UX Improvements (2025-01-20)

Work Period: January 20, 2025 (Iterative refinement)

Key Accomplishments:

Mobile Card Design

  • Minimal, horizontally wide rectangular cards:
    • Reduced card padding from 1.5rem to 0.75rem 1rem (horizontal emphasis)
    • Reduced border radius from 8px to 6px for tighter appearance
    • Reduced gap between cards from 1rem to 0.75rem
    • Disabled hover transform on mobile (no translateY)

Typography Optimization

  • Smaller font sizes on mobile:
    • Title: 1.25rem1rem
    • Description: 0.875rem with 2-line clamp and ellipsis
    • Meta: 0.875rem0.75rem
    • Status titles: 1rem0.875rem
    • Quarter titles: 1.25rem1.1rem

Badge Improvements

  • Compact badges:
    • Padding: 0.25rem 0.75rem0.15rem 0.5rem
    • Font size: 0.75rem0.65rem
    • Border radius: 12px8px
    • Tighter gap: 0.5rem0.25rem

Layout Enhancements

  • Description truncation: Limited to 2 lines with ellipsis on mobile
  • Meta information: Horizontal layout (flex-direction: row) instead of vertical
  • Meta items: Inline with white-space: nowrap for compact display
  • Quarter section: Reduced padding from 1.5rem to 1rem on mobile
  • Quarter headers: Reduced margins and thinner borders

Mobile Heatmap & Legend Layout

  • Vertical stacking on mobile:
    • Legend section moves above heatmap rows (order: -1)
    • Legend takes full width and left-aligns
    • Date overlay and heatmap rows scroll together (no independent scrolling)
    • Filters stack vertically with full-width dropdowns

Filter Improvements

  • Mobile-friendly filters:
    • Stack vertically on mobile (flex-direction: column)
    • Full-width dropdowns with proper box-sizing
    • Smaller font sizes (0.8rem for labels, 0.875rem for selects)
    • Proper text wrapping and overflow handling
    • Removed appearance defaults for better mobile compatibility

CSS Files Modified:

  • QuarterSection.module.css - Mobile card styles, typography, badges, meta layout
  • Changelog.module.css - Mobile heatmap/legend layout, filter styles
  • LegendSidebar.module.css - Mobile legend alignment
  • Legend.module.css - Mobile legend alignment

✅ EntryTimeline Component Creation (2025-01-20)

Work Period: January 20, 2025

Key Accomplishments:

Timeline Visualization

  • Created EntryTimeline component to replace text-based date display with a proper timeline visualization:
    • Timeline bar: Horizontal line spanning full width (2px height, gray background)
    • Inception dot: Primary color dot positioned at left (0%) on the bar
    • Execution dot: Success color dot positioned at right (100%) on the bar (only shown if execution date exists)
    • Duration label: Centered on the bar, showing time between inception and execution
    • Date labels: Displayed below the bar, aligned with their respective dots

Visual Layout Structure

[●─────────────────── 5 days ───────────────────●]
Inception Execution
Jan 15, 2025 Jan 20, 2025

Layout Components:

  1. Timeline Bar (.timelineBar):

    • Horizontal line (2px height) spanning full width
    • Gray background (var(--ifm-color-emphasis-300))
    • Position: relative container for absolutely positioned dots
  2. Timeline Dots (.timelineDotContainer):

    • Inception dot: Absolutely positioned at left: 0 (start of bar)
      • Primary color (var(--ifm-color-primary))
      • 10px diameter (8px on mobile)
      • 2px border (1.5px on mobile)
    • Execution dot: Absolutely positioned at right: 0 (end of bar)
      • Success color (var(--ifm-color-success)) when execution date exists
      • Muted gray color (var(--ifm-color-emphasis-400)) with reduced opacity when execution is TBD
      • Same size as inception dot
      • Always rendered - shows even when execution date is "TBD" or "XX"
  3. Duration Label (.timelineDuration):

    • Centered on the bar (left: 50%, transform: translate(-50%, -50%))
    • Background matches page background (appears above bar)
    • Shows calculated duration or "X days thus far" for TBD execution
    • Font: 0.7rem (0.65rem on mobile), font-weight: 600
  4. Date Labels (.timelineDates):

    • Row below the bar, flex layout with space-between
    • Inception date: Left-aligned under inception dot
    • Execution date: Right-aligned under execution dot (always shown)
    • Each date item contains:
      • Label: "INCEPTION" or "EXECUTION" (uppercase, 0.65rem, 0.6rem on mobile)
      • Date: Formatted date string (0.75rem, 0.7rem on mobile) or "TBD" if execution date is TBD

Duration Calculation

  • Smart duration formatting:
    • TBD execution: Shows "X days thus far" (calculated from inception to today)
    • Completed execution: Shows duration between inception and execution dates
    • Duration formats:
      • "Same day" if 0 days
      • "X days" if < 7 days
      • "X weeks" if < 30 days
      • "X months" if < 365 days
      • "X years, Y months" if >= 1 year
    • Handles invalid dates gracefully (returns "TBD")
  • Visual indication for TBD execution:
    • Execution dot always visible (even when TBD)
    • TBD execution dot uses muted gray color with reduced opacity (.timelineDotTBD)
    • Execution date label shows "TBD" instead of formatted date
    • Duration shows "X days thus far" to indicate ongoing work

Date Formatting

  • Smart date formatting:
    • Handles "TBD" and "XX" dates gracefully (replaces "XX" with "??")
    • Formats dates as "Jan 15, 2025" (month short, day numeric, year numeric)
    • Falls back to original string if date parsing fails

Responsive Design

  • Mobile optimization:
    • Thinner bar: 2px1.5px height on mobile
    • Smaller dots: 10px8px diameter on mobile
    • Thinner borders: 2px1.5px on mobile
    • Smaller duration label: 0.7rem0.65rem on mobile
    • Smaller date fonts: 0.75rem0.7rem for dates, 0.65rem0.6rem for labels
    • Tighter spacing: 0.5rem0.375rem gap
    • Reduced padding on duration label: 0.125rem 0.375rem0.1rem 0.25rem

Integration

  • Replaced text-based dates in QuarterSection:
    • Removed separate "Inception:" and "Execution:" text spans
    • Integrated EntryTimeline component into entryMeta section
    • Timeline aligns properly with other meta items (component name, etc.)
    • Works seamlessly with horizontal meta layout on mobile

Components Created:

  • src/components/Changelog/EntryTimeline/EntryTimeline.tsx - Timeline component with duration calculation
  • src/components/Changelog/EntryTimeline/EntryTimeline.module.css - Timeline styles with bar, dots, and date layout
  • src/components/Changelog/EntryTimeline/index.tsx - Export file

CSS Classes:

  • .timeline - Main container (flex column)
  • .timelineBar - Horizontal bar/line (relative positioning)
  • .timelineDotContainer - Container for dots (absolute positioning)
  • .timelineDot - Dot styling (circular, colored)
  • .timelineDotInception - Primary color for inception dot
  • .timelineDotExecution - Success color for execution dot (when execution date exists)
  • .timelineDotTBD - Muted gray color for execution dot when execution is TBD
  • .timelineDuration - Duration label (centered on bar)
  • .durationLabel - Duration text styling
  • .timelineDates - Date labels row (flex, space-between)
  • .timelineDateItem - Individual date item container
  • .timelineLabel - "INCEPTION" / "EXECUTION" label styling
  • .timelineDate - Formatted date text styling

CSS Integration:

  • Added timeline styles integration in QuarterSection.module.css
  • Timeline works seamlessly with horizontal meta layout on mobile

✅ Docusaurus Routing Configuration (2025-01-20)

Work Period: January 20, 2025

Key Accomplishments:

Plugin Configuration

  • Added @docusaurus/plugin-content-docs plugin to serve changelog markdown files as pages:
    • Plugin ID: changelog (unique identifier for multi-instance plugin, similar to blog plugin's id: 'designs')
    • Path: ./changelog (points to changelog directory, no file copying required)
    • Route Base Path: changelog (files accessible at /changelog/...)
    • Sidebar Configuration: sidebarPath: false (no sidebar needed for changelog entries)
    • Edit URL: Points to GitHub for easy editing
    • Uses built-in Docusaurus plugin: Follows same pattern as @docusaurus/plugin-content-blog for multiple instances

Why Docs Plugin Instead of Pages Plugin

  • Pages plugin limitation: @docusaurus/plugin-content-pages doesn't support multiple instances (unlike blog/docs plugins)
  • Docs plugin advantage: @docusaurus/plugin-content-docs supports multiple instances with id field, just like blog plugin
  • No file copying required: Files served directly from changelog/ directory (like blog serves from designs/)
  • Proper MDX rendering: Full markdown content rendered with Docusaurus MDX features and frontmatter support
  • Fixed broken changelog entry links:
    • Previously linked to GitHub (temporary workaround)
    • Now links to /changelog/${slug} (proper Docusaurus routes)
    • Preserves subdirectory structure in URLs (e.g., /changelog/development/2025-01-15-...)
    • Links work correctly for both content and development entries

Benefits

  • Changelog entries are now accessible as pages:
    • Full markdown content rendered with Docusaurus MDX features
    • Frontmatter properly parsed and displayed
    • Edit links point to GitHub for easy updates
    • Proper routing and navigation within Docusaurus site
    • SEO-friendly URLs
    • No file copying or custom plugins required
    • Uses standard Docusaurus plugin pattern (same as blog plugin)

Configuration Files Modified:

  • docusaurus.config.js: Added changelog docs plugin configuration (follows blog plugin pattern)
  • src/pages/changelog.tsx: Updated getEntryUrl to use proper routes

Example URLs:

  • /changelog/development/2025-01-15-component-creation-svg-kanban
  • /changelog/content/2025-XX-XX-content-post-knowledge-agents-design

Configuration Pattern:

[
'@docusaurus/plugin-content-docs',
{
id: 'changelog', // Multi-instance support (like blog plugin)
path: './changelog',
routeBasePath: 'changelog',
sidebarPath: false,
editUrl: 'https://github.com/.../changelog/',
},
]

Status: Changelog component has been successfully created and refined with modular architecture, proper alignment, GitHub-style heatmap visualization, dynamic date range, year highlighting, current month indicator, mobile responsiveness, timeline visualization, and proper Docusaurus routing. The component is production-ready and maintains clean separation of concerns. Storybook stories and documentation are complete. All changelog entries are now accessible as pages with proper routing.