Skip to content

Commit 860022e

Browse files
authored
Update certManager.js
1 parent 80668c0 commit 860022e

File tree

1 file changed

+36
-11
lines changed

1 file changed

+36
-11
lines changed

web/certManager.js

Lines changed: 36 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)