@@ -12,7 +12,7 @@ async function init() {
1212 renderCertCards ( certs ) ;
1313 renderUpdates ( md ) ;
1414
15- setupUpdatesToggle ( ) ; // <-- initialise toggle after updates rendered
15+ setupUpdatesToggle ( ) ; // initialise toggle after updates rendered
1616 } catch ( err ) {
1717 console . error ( err ) ;
1818 const certList = document . getElementById ( "certList" ) ;
@@ -193,33 +193,40 @@ function setupUpdatesToggle() {
193193 const updatesInner = document . getElementById ( "updatesInner" ) ;
194194 if ( ! updatesBox || ! toggleBtn || ! updatesInner ) return ;
195195
196- // default collapsed state on first load (change if you want expanded by default)
197196 const storageKey = "prostore_updates_expanded" ;
198- // If no saved state, default to collapsed (true)
197+ // stored as "1" = expanded, "0" = collapsed
199198 const saved = localStorage . getItem ( storageKey ) ;
200- const initialCollapsed = saved === null ? true : ( saved === "false" ? false : ( saved === "true" ? false : true ) ) ; // keep collapsed if missing
201- // simplified: if saved === "1" expand, else collapse: but we used true/false strings for clarity
199+ const initialCollapsed = saved === null ? true : ( saved === "1" ? false : true ) ;
202200
203- // Utility to set state
204201 function setCollapsed ( collapsed , skipSave = false ) {
205202 if ( collapsed ) {
206203 updatesBox . classList . add ( "collapsed" ) ;
207204 updatesBox . classList . remove ( "expanded" ) ;
208205 toggleBtn . setAttribute ( "aria-expanded" , "false" ) ;
209- toggleBtn . classList . remove ( "rotated" ) ; // caret shows ^
206+ toggleBtn . classList . remove ( "rotated" ) ;
207+ // collapse
208+ updatesInner . style . maxHeight = "0px" ;
209+ updatesInner . style . paddingTop = "0px" ;
210+ updatesInner . style . paddingBottom = "0px" ;
211+ if ( ! skipSave ) localStorage . setItem ( storageKey , "0" ) ;
210212 } else {
211213 updatesBox . classList . remove ( "collapsed" ) ;
212214 updatesBox . classList . add ( "expanded" ) ;
213215 toggleBtn . setAttribute ( "aria-expanded" , "true" ) ;
214- toggleBtn . classList . add ( "rotated" ) ; // caret flips to look like v
216+ toggleBtn . classList . add ( "rotated" ) ;
217+ // expand to exact content height
218+ const h = updatesInner . scrollHeight ;
219+ updatesInner . style . maxHeight = h + "px" ;
220+ // restore padding (CSS fallback values)
221+ updatesInner . style . paddingTop = "" ;
222+ updatesInner . style . paddingBottom = "" ;
223+ if ( ! skipSave ) localStorage . setItem ( storageKey , "1" ) ;
215224 }
216- if ( ! skipSave ) localStorage . setItem ( storageKey , ( ! collapsed ) . toString ( ) ) ;
217225 }
218226
219- // init
227+ // init collapsed by default
220228 setCollapsed ( initialCollapsed , true ) ;
221229
222- // click handler
223230 toggleBtn . addEventListener ( "click" , ( ) => {
224231 const isCollapsed = updatesBox . classList . contains ( "collapsed" ) ;
225232 setCollapsed ( ! isCollapsed ) ;
@@ -232,6 +239,24 @@ function setupUpdatesToggle() {
232239 toggleBtn . click ( ) ;
233240 }
234241 } ) ;
242+
243+ // If content changes while expanded, grow/shrink to match
244+ const mo = new MutationObserver ( ( ) => {
245+ if ( ! updatesBox . classList . contains ( "collapsed" ) ) {
246+ // give the DOM a tick to settle then set exact height
247+ requestAnimationFrame ( ( ) => {
248+ updatesInner . style . maxHeight = updatesInner . scrollHeight + "px" ;
249+ } ) ;
250+ }
251+ } ) ;
252+ mo . observe ( updatesInner , { childList : true , subtree : true , characterData : true } ) ;
253+
254+ // adjust on window resize
255+ window . addEventListener ( "resize" , ( ) => {
256+ if ( ! updatesBox . classList . contains ( "collapsed" ) ) {
257+ updatesInner . style . maxHeight = updatesInner . scrollHeight + "px" ;
258+ }
259+ } ) ;
235260}
236261
237262/* ---------- Modal ---------- */
0 commit comments