@@ -92,6 +92,45 @@ function setBusy(element: HTMLElement, busy: boolean): void {
9292 } ) ;
9393}
9494
95+ let orderObserver : MutationObserver | null = null ;
96+
97+ function sortByScore ( ) : void {
98+ const grid = document . querySelector < HTMLElement > ( ".blog-grid" ) ;
99+ if ( ! grid ) return ;
100+
101+ if ( ! orderObserver ) {
102+ const searchInput = document . querySelector < HTMLInputElement > (
103+ "[data-directory-input]" ,
104+ ) ;
105+ orderObserver = new MutationObserver ( ( ) => {
106+ if ( ! searchInput ?. value . trim ( ) ) sortByScore ( ) ;
107+ } ) ;
108+ orderObserver . observe ( grid , { childList : true } ) ;
109+ }
110+
111+ const score = ( card : HTMLElement ) : number =>
112+ Number (
113+ card . querySelector < HTMLElement > ( "[data-blog-vote]" ) ?. dataset . score ?? 0 ,
114+ ) ;
115+
116+ const cards = Array . from (
117+ grid . querySelectorAll < HTMLElement > ( ":scope > .blog-card" ) ,
118+ ) ;
119+ cards . sort ( ( left , right ) => {
120+ const difference = score ( right ) - score ( left ) ;
121+ if ( difference ) return difference ;
122+ return ( left . dataset . searchTitle ?? "" ) . localeCompare (
123+ right . dataset . searchTitle ?? "" ,
124+ undefined ,
125+ { sensitivity : "base" } ,
126+ ) ;
127+ } ) ;
128+
129+ const current = Array . from ( grid . children ) ;
130+ if ( cards . every ( ( card , index ) => card === current [ index ] ) ) return ;
131+ grid . append ( ...cards ) ;
132+ }
133+
95134function redirectTarget ( ) : string {
96135 const url = new URL ( window . location . href ) ;
97136 url . hash = "" ;
@@ -121,6 +160,7 @@ export async function initBlogVoting(): Promise<void> {
121160 const element = byId . get ( row . blog_id ) ;
122161 if ( element ) setScore ( element , Number ( row . score ) || 0 ) ;
123162 }
163+ sortByScore ( ) ;
124164 }
125165
126166 async function loadUserVotes ( session : SupabaseSession | null ) : Promise < void > {
0 commit comments