2026-04-15 23:37:33 -07:00
import type { Meta , StoryObj } from "@storybook/react-vite" ;
import { PointProgressionChart } from "./PointProgressionChart" ;
import type { ChartDataPoint } from "./PointProgressionChart" ;
const meta : Meta < typeof PointProgressionChart > = {
title : "Standings/PointProgressionChart" ,
component : PointProgressionChart ,
parameters : {
layout : "padded" ,
docs : {
description : {
2026-04-16 11:54:48 -07:00
component : "Multi-line chart showing team point progression over time. Features monotone curve rendering, interactive legend hover highlighting to isolate individual team lines, and legend sorted by current ranking." ,
2026-04-15 23:37:33 -07:00
} ,
} ,
} ,
} ;
export default meta ;
type Story = StoryObj < typeof PointProgressionChart > ;
export const Empty : Story = {
args : {
chartData : [ ] ,
teams : [ ] ,
} ,
} ;
const twoTeams = [
{ id : "team1" , name : "Thunderhawks" } ,
{ id : "team2" , name : "Storm Chasers" } ,
] ;
const twoTeamData = [
{ date : "2024-01-01" , Thunderhawks : 25 , "Storm Chasers" : 20 } ,
{ date : "2024-01-02" , Thunderhawks : 50 , "Storm Chasers" : 40 } ,
{ date : "2024-01-03" , Thunderhawks : 75 , "Storm Chasers" : 60 } ,
{ date : "2024-01-04" , Thunderhawks : 100 , "Storm Chasers" : 80 } ,
{ date : "2024-01-05" , Thunderhawks : 125 , "Storm Chasers" : 105 } ,
] ;
export const TwoTeams : Story = {
args : {
chartData : twoTeamData ,
teams : twoTeams ,
} ,
} ;
const fiveTeams = [
{ id : "team1" , name : "Thunderhawks" } ,
{ id : "team2" , name : "Storm Chasers" } ,
{ id : "team3" , name : "Golden Eagles" } ,
{ id : "team4" , name : "Lightning Bolts" } ,
{ id : "team5" , name : "Iron Wolves" } ,
] ;
const fiveTeamData = [
{ date : "2024-01-01" , Thunderhawks : 25 , "Storm Chasers" : 20 , "Golden Eagles" : 30 , "Lightning Bolts" : 15 , "Iron Wolves" : 10 } ,
{ date : "2024-01-02" , Thunderhawks : 50 , "Storm Chasers" : 45 , "Golden Eagles" : 40 , "Lightning Bolts" : 35 , "Iron Wolves" : 25 } ,
{ date : "2024-01-03" , Thunderhawks : 75 , "Storm Chasers" : 70 , "Golden Eagles" : 55 , "Lightning Bolts" : 65 , "Iron Wolves" : 50 } ,
{ date : "2024-01-04" , Thunderhawks : 100 , "Storm Chasers" : 95 , "Golden Eagles" : 85 , "Lightning Bolts" : 90 , "Iron Wolves" : 80 } ,
{ date : "2024-01-05" , Thunderhawks : 125 , "Storm Chasers" : 115 , "Golden Eagles" : 105 , "Lightning Bolts" : 110 , "Iron Wolves" : 100 } ,
] ;
export const FiveTeams : Story = {
args : {
chartData : fiveTeamData ,
teams : fiveTeams ,
} ,
} ;
const overlappingTeams = [
{ id : "team1" , name : "Alpha" } ,
{ id : "team2" , name : "Beta" } ,
{ id : "team3" , name : "Gamma" } ,
] ;
const overlappingData : ChartDataPoint [ ] = [
{ date : "2024-01-01" , Alpha : 100 , Beta : 100 , Gamma : 100 } ,
{ date : "2024-01-02" , Alpha : 110 , Beta : 110 , Gamma : 105 } ,
{ date : "2024-01-03" , Alpha : 120 , Beta : 115 , Gamma : 120 } ,
{ date : "2024-01-04" , Alpha : 125 , Beta : 125 , Gamma : 125 } ,
] ;
export const OverlappingPoints : Story = {
name : "Overlapping Points (Hover Legend)" ,
args : {
chartData : overlappingData ,
teams : overlappingTeams ,
} ,
parameters : {
docs : {
description : {
2026-04-16 11:54:48 -07:00
story : "Demonstrates interactive highlighting via the legend and legend sorted by current ranking. Hover over a team name in the legend to isolate that team's line and dim the others." ,
2026-04-15 23:37:33 -07:00
} ,
} ,
} ,
} ;
const soloTeam = [ { id : "team1" , name : "Solo Team" } ] ;
const soloTeamData = [
{ date : "2024-01-01" , "Solo Team" : 10 } ,
{ date : "2024-01-02" , "Solo Team" : 20 } ,
{ date : "2024-01-03" , "Solo Team" : 30 } ,
{ date : "2024-01-04" , "Solo Team" : 40 } ,
{ date : "2024-01-05" , "Solo Team" : 50 } ,
] ;
export const SingleTeam : Story = {
args : {
chartData : soloTeamData ,
teams : soloTeam ,
} ,
} ;
const manyTeams = Array . from ( { length : 12 } , ( _ , i ) = > ( {
id : ` team ${ i } ` ,
name : ` Team ${ i + 1 } ` ,
} ) ) ;
const manyTeamData = [
{ date : "2024-01-01" , . . . Object . fromEntries ( manyTeams . map ( ( t , i ) = > [ t . name , ( i + 1 ) * 10 ] ) ) } ,
{ date : "2024-01-02" , . . . Object . fromEntries ( manyTeams . map ( ( t , i ) = > [ t . name , ( i + 1 ) * 10 + 15 ] ) ) } ,
{ date : "2024-01-03" , . . . Object . fromEntries ( manyTeams . map ( ( t , i ) = > [ t . name , ( i + 1 ) * 10 + 30 ] ) ) } ,
] ;
export const ManyTeams : Story = {
args : {
chartData : manyTeamData ,
teams : manyTeams ,
} ,
} ;
const lateStartTeams = [
{ id : "team1" , name : "Early Birds" } ,
{ id : "team2" , name : "Late Bloomer" } ,
] ;
const lateStartData : ChartDataPoint [ ] = [
{ date : "2024-01-01" , "Early Birds" : 25 , "Late Bloomer" : 0 } ,
{ date : "2024-01-02" , "Early Birds" : 50 , "Late Bloomer" : 5 } ,
{ date : "2024-01-03" , "Early Birds" : 75 , "Late Bloomer" : 25 } ,
{ date : "2024-01-04" , "Early Birds" : 100 , "Late Bloomer" : 60 } ,
{ date : "2024-01-05" , "Early Birds" : 125 , "Late Bloomer" : 110 } ,
] ;
export const LateStart : Story = {
args : {
chartData : lateStartData ,
teams : lateStartTeams ,
} ,
} ;