@@ -31,7 +31,9 @@ export default function OverviewChart({
3131 const [ mobileModelSummaries , setMobileModelSummaries ] = useState ( [ ] ) ;
3232 const [ hoveredModel , setHoveredModel ] = useState ( null ) ;
3333 const [ activeModel , setActiveModel ] = useState ( null ) ;
34+ const [ dotSizeMenuOpen , setDotSizeMenuOpen ] = useState ( false ) ;
3435 const hoveredModelRef = useRef ( null ) ;
36+ const dotSizeButtonRef = useRef ( null ) ;
3537
3638 const parseDateUtc = ( dateStr ) => {
3739 const [ year , month , day ] = dateStr . split ( '-' ) . map ( Number ) ;
@@ -220,6 +222,17 @@ export default function OverviewChart({
220222 return ( ) => window . removeEventListener ( 'resize' , handleResize ) ;
221223 } , [ ] ) ;
222224
225+ useEffect ( ( ) => {
226+ if ( ! dotSizeMenuOpen ) return ;
227+ const handleClickOutside = ( event ) => {
228+ if ( dotSizeButtonRef . current && ! dotSizeButtonRef . current . contains ( event . target ) ) {
229+ setDotSizeMenuOpen ( false ) ;
230+ }
231+ } ;
232+ document . addEventListener ( 'mousedown' , handleClickOutside ) ;
233+ return ( ) => document . removeEventListener ( 'mousedown' , handleClickOutside ) ;
234+ } , [ dotSizeMenuOpen ] ) ;
235+
223236 useEffect ( ( ) => {
224237 const highlightModel = hoveredModel || activeModel ;
225238 hoveredModelRef . current = highlightModel ;
@@ -521,7 +534,7 @@ export default function OverviewChart({
521534
522535 const withAverage = modelSummaries
523536 . filter ( summary => summary . average !== null && summary . average !== undefined )
524- . sort ( ( a , b ) => a . average - b . average ) ;
537+ . sort ( ( a , b ) => b . average - a . average ) ;
525538 const withoutAverage = modelSummaries . filter ( summary => summary . average === null || summary . average === undefined ) ;
526539 const sortedSummaries = [ ...withAverage , ...withoutAverage ] ;
527540
@@ -617,16 +630,16 @@ export default function OverviewChart({
617630 } ,
618631 layout : {
619632 padding : {
620- right : showModelLabels ? 140 : 24 // Reduce padding when labels hidden
633+ right : showModelLabels ? 140 : 24 , // Reduce padding when labels hidden
634+ bottom : 20 // Add bottom padding for date labels
621635 }
622636 } ,
623637 plugins : {
624638 legend : {
625639 display : false
626640 } ,
627641 title : {
628- display : true ,
629- text : 'Average Price Trends Across All Sources'
642+ display : false
630643 } ,
631644 tooltip : {
632645 displayColors : false , // Remove the colored box
@@ -1153,16 +1166,44 @@ export default function OverviewChart({
11531166 ) ;
11541167 } ) }
11551168 </ div >
1156- < div className = "chart-controls" >
1157- < label htmlFor = "dot-size-mode" > Show:</ label >
1158- < select
1159- id = "dot-size-mode"
1160- value = { dotSizeMode }
1161- onChange = { ( e ) => setDotSizeMode ( e . target . value ) }
1169+ < div className = "dot-size-selector" ref = { dotSizeButtonRef } >
1170+ < button
1171+ type = "button"
1172+ className = "dot-size-button"
1173+ onClick = { ( ) => setDotSizeMenuOpen ( ! dotSizeMenuOpen ) }
1174+ aria-label = "Change dot size mode"
1175+ aria-expanded = { dotSizeMenuOpen }
11621176 >
1163- < option value = "stock" > Stock Count</ option >
1164- < option value = "days" > Avg Days on Market</ option >
1165- </ select >
1177+ < svg width = "24" height = "24" viewBox = "0 0 24 24" fill = "none" xmlns = "http://www.w3.org/2000/svg" >
1178+ < circle cx = "12" cy = "12" r = "4.5" fill = "currentColor" opacity = "0.3" />
1179+ < path d = "M3 12 L7.5 12 M16.5 12 L21 12" stroke = "currentColor" strokeWidth = "1.8" strokeLinecap = "round" />
1180+ < path d = "M4.5 10 L3 12 L4.5 14 M19.5 10 L21 12 L19.5 14" stroke = "currentColor" strokeWidth = "1.8" strokeLinecap = "round" strokeLinejoin = "round" fill = "none" />
1181+ </ svg >
1182+ </ button >
1183+ { dotSizeMenuOpen && (
1184+ < div className = "dot-size-menu" >
1185+ < button
1186+ type = "button"
1187+ className = { `dot-size-menu-item${ dotSizeMode === 'stock' ? ' active' : '' } ` }
1188+ onClick = { ( ) => {
1189+ setDotSizeMode ( 'stock' ) ;
1190+ setDotSizeMenuOpen ( false ) ;
1191+ } }
1192+ >
1193+ Stock Count
1194+ </ button >
1195+ < button
1196+ type = "button"
1197+ className = { `dot-size-menu-item${ dotSizeMode === 'days' ? ' active' : '' } ` }
1198+ onClick = { ( ) => {
1199+ setDotSizeMode ( 'days' ) ;
1200+ setDotSizeMenuOpen ( false ) ;
1201+ } }
1202+ >
1203+ Avg Days on Market
1204+ </ button >
1205+ </ div >
1206+ ) }
11661207 </ div >
11671208 </ div >
11681209 { ! showModelLabels && mobileModelSummaries . length > 0 && (
0 commit comments