@@ -127,6 +127,7 @@ fetch('https://api.github.com/repositories/42366054/releases?per_page=5', {
127127 const releaseContent = document . createElement ( 'div' ) ;
128128 releaseContent . className = 'release-content' ;
129129 releaseContent . innerHTML = release . body_html ;
130+ AdjustChangelog ( releaseContent ) ;
130131 releaseMain . appendChild ( releaseContent ) ;
131132
132133 if ( isLatest ) {
@@ -166,6 +167,99 @@ fetch('https://api.github.com/repositories/42366054/releases?per_page=5', {
166167 } ) ;
167168 } ) ;
168169
170+ function AdjustChangelog ( changelogContainer ) {
171+ // Handle images
172+ const images = changelogContainer . querySelectorAll ( 'img' ) ;
173+ images . forEach ( img => {
174+ // Remove parent link to prevent new-tab navigation
175+ const parentLink = img . closest ( 'a' ) ;
176+ if ( parentLink && parentLink . href === img . src ) {
177+ const wrapper = document . createElement ( 'div' ) ;
178+ wrapper . className = 'changelog-img-wrapper' ;
179+ parentLink . parentNode . insertBefore ( wrapper , parentLink ) ;
180+ wrapper . appendChild ( img ) ;
181+ parentLink . remove ( ) ;
182+ } else if ( ! img . closest ( '.changelog-img-wrapper' ) ) {
183+ const wrapper = document . createElement ( 'div' ) ;
184+ wrapper . className = 'changelog-img-wrapper' ;
185+ img . parentNode . insertBefore ( wrapper , img ) ;
186+ wrapper . appendChild ( img ) ;
187+ }
188+
189+ // Add click handler for modal
190+ img . style . cursor = 'zoom-in' ;
191+ img . addEventListener ( 'click' , ( e ) => {
192+ e . preventDefault ( ) ;
193+ OpenMediaModal ( img . src , img . alt , 'image' ) ;
194+ } ) ;
195+ } ) ;
196+
197+ // Handle videos
198+ const videos = changelogContainer . querySelectorAll ( 'video' ) ;
199+ videos . forEach ( video => {
200+ // Remove outer details/summary wrapper if present
201+ const detailsParent = video . closest ( 'details' ) ;
202+ if ( detailsParent ) {
203+ const wrapper = document . createElement ( 'div' ) ;
204+ wrapper . className = 'changelog-video-wrapper' ;
205+ detailsParent . parentNode . insertBefore ( wrapper , detailsParent ) ;
206+ wrapper . appendChild ( video ) ;
207+ detailsParent . remove ( ) ;
208+ } else if ( ! video . closest ( '.changelog-video-wrapper' ) ) {
209+ const wrapper = document . createElement ( 'div' ) ;
210+ wrapper . className = 'changelog-video-wrapper' ;
211+ video . parentNode . insertBefore ( wrapper , video ) ;
212+ wrapper . appendChild ( video ) ;
213+ }
214+
215+ // Add click handler for modal
216+ video . style . cursor = 'zoom-in' ;
217+ video . addEventListener ( 'click' , ( e ) => {
218+ e . preventDefault ( ) ;
219+ OpenMediaModal ( video . src || video . querySelector ( 'source' ) ?. src , '' , 'video' ) ;
220+ } ) ;
221+ } ) ;
222+ }
223+
224+ // Media modal for changelog (images and videos)
225+ function OpenMediaModal ( src , alt , type ) {
226+ let modal = document . getElementById ( 'changelog-media-modal' ) ;
227+ if ( ! modal ) {
228+ modal = document . createElement ( 'div' ) ;
229+ modal . id = 'changelog-media-modal' ;
230+ modal . className = 'changelog-modal' ;
231+ modal . innerHTML = `
232+ <div class="changelog-modal-backdrop">
233+ <button class="changelog-modal-close" aria-label="Close">×</button>
234+ <div class="changelog-modal-content"></div>
235+ </div>
236+ ` ;
237+ document . body . appendChild ( modal ) ;
238+
239+ const closeModal = ( ) => {
240+ modal . classList . remove ( 'active' ) ;
241+ const content = modal . querySelector ( '.changelog-modal-content' ) ;
242+ const video = content . querySelector ( 'video' ) ;
243+ if ( video ) video . pause ( ) ;
244+ } ;
245+ modal . querySelector ( '.changelog-modal-close' ) . onclick = closeModal ;
246+ modal . querySelector ( '.changelog-modal-backdrop' ) . onclick = ( e ) => {
247+ if ( e . target . classList . contains ( 'changelog-modal-backdrop' ) ) closeModal ( ) ;
248+ } ;
249+ document . addEventListener ( 'keydown' , ( e ) => {
250+ if ( e . key === 'Escape' && modal . classList . contains ( 'active' ) ) closeModal ( ) ;
251+ } ) ;
252+ }
253+
254+ const content = modal . querySelector ( '.changelog-modal-content' ) ;
255+ if ( type === 'video' ) {
256+ content . innerHTML = `<video class="changelog-modal-video" src="${ src } " controls autoplay loop></video>` ;
257+ } else {
258+ content . innerHTML = `<img class="changelog-modal-img" src="${ src } " alt="${ alt || '' } ">` ;
259+ }
260+ modal . classList . add ( 'active' ) ;
261+ }
262+
169263function LoadWorkshop ( ) {
170264 fetch ( 'https://steamdb.info/api/Source2ViewerWorkshop/' )
171265 . then ( ( response ) => {
0 commit comments