@@ -68,99 +68,104 @@ export function FeedTicker() {
6868 if ( ! currentEntry ) return null
6969
7070 const renderEntry = ( entry : typeof currentEntry ) => {
71- const isRelease = entry . entryType === 'release'
72-
73- if ( isRelease ) {
74- // Get release level badge color
75- const releaseLevelTag = entry . tags . find ( ( tag ) =>
76- tag . startsWith ( 'release:' ) ,
77- )
78- const isPrerelease = entry . tags . includes ( 'release:prerelease' )
79- const releaseLevel = releaseLevelTag ?. replace ( 'release:' , '' ) || ''
80-
81- const badgeColors : Record < string , string > = {
82- major :
83- 'bg-yellow-100 dark:bg-yellow-900 text-yellow-800 dark:text-yellow-200' ,
84- minor :
71+ // Entry type badge configs
72+ const badgeConfigs : Record < string , { label : string ; className : string } > = {
73+ release : {
74+ label : 'Release' ,
75+ className :
76+ 'bg-blue-100 dark:bg-blue-900 text-blue-800 dark:text-blue-200' ,
77+ } ,
78+ blog : {
79+ label : 'Blog' ,
80+ className :
8581 'bg-green-100 dark:bg-green-900 text-green-800 dark:text-green-200' ,
86- patch : 'bg-blue-100 dark:bg-blue-900 text-blue-800 dark:text-blue-200' ,
87- }
88-
89- const badgeColor = isPrerelease
90- ? 'bg-purple-100 dark:bg-purple-900 text-purple-800 dark:text-purple-200'
91- : badgeColors [ releaseLevel ] ||
92- 'bg-gray-100 dark:bg-gray-800 text-gray-800 dark:text-gray-200'
93-
94- // Get version from metadata (strip @tanstack/ prefix)
95- const version = (
96- ( entry . metadata as { version ?: string } | null ) ?. version || ''
97- ) . replace ( / @ t a n s t a c k \/ / gi, '' )
98-
99- return (
100- < Link
101- to = "/feed/$id"
102- params = { { id : entry . _id } }
103- search = { { } as any }
104- className = "flex items-center gap-1.5 px-2 py-1 rounded-lg hover:bg-gray-100/50 dark:hover:bg-gray-800/50 transition-colors group"
105- >
106- { /* Badge */ }
107- < span
108- className = { `px-1.5 py-0.5 rounded text-[10px] font-medium uppercase flex-shrink-0 ${ badgeColor } ` }
109- >
110- { isPrerelease ? 'Pre' : releaseLevel || 'Release' }
111- </ span >
112-
113- { /* Version */ }
114- { version && (
115- < span className = "text-[10px] font-medium text-gray-600 dark:text-gray-400 flex-shrink-0" >
116- { version }
117- </ span >
118- ) }
119-
120- { /* Time ago */ }
121- < span className = "text-[10px] text-gray-500 dark:text-gray-400 flex-shrink-0" >
122- { formatDistanceToNow ( new Date ( entry . publishedAt ) , {
123- addSuffix : true ,
124- } ) }
125- </ span >
82+ } ,
83+ announcement : {
84+ label : 'News' ,
85+ className :
86+ 'bg-orange-100 dark:bg-orange-900 text-orange-800 dark:text-orange-200' ,
87+ } ,
88+ }
12689
127- { /* Library name */ }
128- { entry . libraryIds [ 0 ] &&
129- ( ( ) => {
130- const library = libraries . find (
131- ( lib ) => lib . id === entry . libraryIds [ 0 ] ,
132- )
133- return library ? (
134- < span className = "text-[10px] font-medium text-gray-700 dark:text-gray-300 flex-shrink-0" >
135- { library . name }
136- </ span >
137- ) : null
138- } ) ( ) }
139-
140- { /* Excerpt */ }
141- { entry . excerpt && (
142- < span className = "text-[10px] text-gray-500 dark:text-gray-400 truncate flex-1 min-w-0" >
143- { entry . excerpt }
144- </ span >
145- ) }
146- </ Link >
147- )
90+ const badge = badgeConfigs [ entry . entryType ] || {
91+ label : entry . entryType ,
92+ className :
93+ 'bg-gray-100 dark:bg-gray-800 text-gray-800 dark:text-gray-200' ,
14894 }
14995
150- // Non-release entries - keep original format
96+ const isRelease = entry . entryType === 'release'
97+
98+ // For releases, get release level and version
99+ const releaseLevelTag = isRelease
100+ ? entry . tags . find (
101+ ( tag ) =>
102+ tag === 'release:major' ||
103+ tag === 'release:minor' ||
104+ tag === 'release:patch' ,
105+ )
106+ : null
107+ const releaseLevel = releaseLevelTag ?. replace ( 'release:' , '' ) || ''
108+ const version = isRelease
109+ ? (
110+ ( entry . metadata as { version ?: string } | null ) ?. version || ''
111+ ) . replace ( / @ t a n s t a c k \/ / gi, '' )
112+ : ''
113+
151114 return (
152115 < Link
153116 to = "/feed/$id"
154117 params = { { id : entry . _id } }
155118 search = { { } as any }
156- className = "flex items-center gap-2 px-2 py-1 rounded-lg hover:bg-gray-100/50 dark:hover:bg-gray-800/50 transition-colors group"
119+ className = "flex items-center gap-1.5 px-2 py-1 rounded-lg hover:bg-gray-100/50 dark:hover:bg-gray-800/50 transition-colors group"
157120 >
121+ { /* Entry type badge */ }
122+ < span
123+ className = { `px-1.5 py-0.5 rounded text-[10px] font-medium uppercase flex-shrink-0 ${ badge . className } ` }
124+ >
125+ { badge . label }
126+ </ span >
127+
128+ { /* Release level (for releases only) */ }
129+ { isRelease && releaseLevel && (
130+ < span className = "text-[10px] font-medium text-gray-600 dark:text-gray-400 flex-shrink-0 uppercase" >
131+ { releaseLevel }
132+ </ span >
133+ ) }
134+
135+ { /* Library name (for releases) */ }
136+ { isRelease &&
137+ entry . libraryIds [ 0 ] &&
138+ ( ( ) => {
139+ const library = libraries . find (
140+ ( lib ) => lib . id === entry . libraryIds [ 0 ] ,
141+ )
142+ return library ? (
143+ < span className = "text-[10px] font-semibold text-gray-700 dark:text-gray-300 flex-shrink-0" >
144+ { library . name }
145+ </ span >
146+ ) : null
147+ } ) ( ) }
148+
149+ { /* Version (for releases) */ }
150+ { isRelease && version && (
151+ < span className = "text-[10px] font-medium text-gray-600 dark:text-gray-400 flex-shrink-0" >
152+ { version }
153+ </ span >
154+ ) }
155+
158156 { /* Time ago */ }
159157 < span className = "text-[10px] text-gray-500 dark:text-gray-400 flex-shrink-0" >
160158 { formatDistanceToNow ( new Date ( entry . publishedAt ) , {
161159 addSuffix : true ,
162160 } ) }
163161 </ span >
162+
163+ { /* Title or excerpt */ }
164+ { ( entry . title || entry . excerpt ) && (
165+ < span className = "text-[10px] text-gray-500 dark:text-gray-400 truncate flex-1 min-w-0" >
166+ { isRelease ? entry . excerpt : entry . title || entry . excerpt }
167+ </ span >
168+ ) }
164169 </ Link >
165170 )
166171 }
0 commit comments