@@ -168,96 +168,80 @@ fetch('https://api.github.com/repositories/42366054/releases?per_page=5', {
168168 } ) ;
169169
170170function 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 ) {
171+ const wrapMedia = ( element , unwrapParent ) => {
172+ if ( unwrapParent ) {
177173 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' ) ) {
174+ wrapper . className = 'changelog-media -wrapper' ;
175+ unwrapParent . parentNode . insertBefore ( wrapper , unwrapParent ) ;
176+ wrapper . appendChild ( element ) ;
177+ unwrapParent . remove ( ) ;
178+ } else if ( ! element . closest ( '.changelog-media -wrapper' ) ) {
183179 const wrapper = document . createElement ( 'div' ) ;
184- wrapper . className = 'changelog-img -wrapper' ;
185- img . parentNode . insertBefore ( wrapper , img ) ;
186- wrapper . appendChild ( img ) ;
180+ wrapper . className = 'changelog-media -wrapper' ;
181+ element . parentNode . insertBefore ( wrapper , element ) ;
182+ wrapper . appendChild ( element ) ;
187183 }
184+ } ;
185+
186+ for ( const img of changelogContainer . querySelectorAll ( 'img' ) ) {
187+ const parentLink = img . closest ( 'a' ) ;
188+ wrapMedia ( img , parentLink ?. href === img . src ? parentLink : null ) ;
188189
189- // Add click handler for modal
190- img . style . cursor = 'zoom-in' ;
191190 img . addEventListener ( 'click' , ( e ) => {
192191 e . preventDefault ( ) ;
193- OpenMediaModal ( img . src , img . alt , 'image' ) ;
192+ OpenMediaModal ( img . src , 'image' ) ;
194193 } ) ;
195- } ) ;
194+ }
196195
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- }
196+ for ( const video of changelogContainer . querySelectorAll ( 'video' ) ) {
197+ wrapMedia ( video , video . closest ( 'details' ) ) ;
214198
215- // Add click handler for modal
216- video . style . cursor = 'zoom-in' ;
217199 video . addEventListener ( 'click' , ( e ) => {
218200 e . preventDefault ( ) ;
219- OpenMediaModal ( video . src || video . querySelector ( 'source' ) ?. src , '' , ' video') ;
201+ OpenMediaModal ( video . src || video . querySelector ( 'source' ) ?. src , 'video' ) ;
220202 } ) ;
221- } ) ;
203+ }
222204}
223205
224- // Media modal for changelog (images and videos)
225- function OpenMediaModal ( src , alt , type ) {
206+ function OpenMediaModal ( src , type ) {
226207 let modal = document . getElementById ( 'changelog-media-modal' ) ;
227208 if ( ! modal ) {
228- modal = document . createElement ( 'div ' ) ;
209+ modal = document . createElement ( 'dialog ' ) ;
229210 modal . id = 'changelog-media-modal' ;
230211 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 ) ;
238212
239- const closeModal = ( ) => {
240- modal . classList . remove ( 'active' ) ;
241- const content = modal . querySelector ( '.changelog-modal-content' ) ;
242- const video = content . querySelector ( 'video' ) ;
213+ const closeBtn = document . createElement ( 'button' ) ;
214+ closeBtn . className = 'changelog-modal-close' ;
215+ closeBtn . ariaLabel = 'Close' ;
216+ closeBtn . textContent = '\u00D7' ;
217+ closeBtn . onclick = ( ) => modal . close ( ) ;
218+ modal . appendChild ( closeBtn ) ;
219+
220+ modal . addEventListener ( 'click' , ( e ) => {
221+ if ( e . target === modal ) modal . close ( ) ;
222+ } ) ;
223+ modal . addEventListener ( 'close' , ( ) => {
224+ const video = modal . querySelector ( 'video' ) ;
243225 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 ( ) ;
251226 } ) ;
227+
228+ document . body . appendChild ( modal ) ;
252229 }
253230
254- const content = modal . querySelector ( '.changelog-modal-content' ) ;
231+ const existing = modal . querySelector ( 'img, video' ) ;
232+ if ( existing ) existing . remove ( ) ;
233+
234+ const media = document . createElement ( type === 'video' ? 'video' : 'img' ) ;
235+ media . className = 'changelog-modal-media' ;
236+ media . src = src ;
255237 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 || '' } ">` ;
238+ media . controls = true ;
239+ media . autoplay = true ;
240+ media . loop = true ;
259241 }
260- modal . classList . add ( 'active' ) ;
242+ modal . appendChild ( media ) ;
243+
244+ modal . showModal ( ) ;
261245}
262246
263247function LoadWorkshop ( ) {
0 commit comments