diff --git a/sitecompanion/settings.css b/sitecompanion/settings.css
index 927ebfd..350c83f 100644
--- a/sitecompanion/settings.css
+++ b/sitecompanion/settings.css
@@ -86,6 +86,34 @@ body {
min-height: 0;
}
+.toc-group {
+ margin: 0;
+}
+
+.toc-group summary {
+ padding: 4px 6px;
+ border-radius: 6px;
+ cursor: pointer;
+ font-size: 12px;
+ color: var(--ink);
+ list-style-position: inside;
+}
+
+.toc-group summary::marker {
+ color: var(--muted);
+}
+
+.toc-group summary:hover {
+ background: var(--card-bg);
+}
+
+.toc-group summary a {
+ display: inline;
+ padding: 0;
+ color: inherit;
+ text-decoration: none;
+}
+
.toc-resizer {
position: absolute;
top: 0;
@@ -112,40 +140,7 @@ body.is-resizing {
.toc-sub {
padding-left: 12px !important;
margin-top: 2px !important;
- display: none;
-}
-
-.toc-sub.expanded {
- display: grid !important;
-}
-
-.toc-item {
- display: flex;
- align-items: center;
- gap: 4px;
- padding: 4px 6px;
- border-radius: 6px;
- cursor: pointer;
- font-size: 12px;
- color: var(--ink);
- text-decoration: none;
-}
-
-.toc-item:hover {
- background: var(--card-bg);
-}
-
-.toc-item .toc-caret {
- display: inline-block;
- width: 10px;
- text-align: center;
- color: var(--muted);
- font-size: 10px;
- transition: transform 0.15s;
-}
-
-.toc-item.expanded .toc-caret {
- transform: rotate(90deg);
+ display: grid;
}
.toc li a {
@@ -161,6 +156,16 @@ body.is-resizing {
background: var(--card-bg);
}
+.toc-group summary a {
+ display: inline;
+ padding: 0;
+ background: transparent;
+}
+
+.toc-group summary a:hover {
+ background: transparent;
+}
+
.toc-sub li a {
color: var(--muted);
}
diff --git a/sitecompanion/settings.html b/sitecompanion/settings.html
index 4965fa9..6b7eb2e 100644
--- a/sitecompanion/settings.html
+++ b/sitecompanion/settings.html
@@ -21,31 +21,31 @@
diff --git a/sitecompanion/settings.js b/sitecompanion/settings.js
index 3f501a4..f586a6e 100644
--- a/sitecompanion/settings.js
+++ b/sitecompanion/settings.js
@@ -3916,14 +3916,6 @@ function openDetailsChain(target) {
}
}
-function toggleTocSection(item, sub, force) {
- if (!sub) return;
- const shouldExpand =
- typeof force === "boolean" ? force : !sub.classList.contains("expanded");
- sub.classList.toggle("expanded", shouldExpand);
- item.classList.toggle("expanded", shouldExpand);
-}
-
function updateToc(workspaces, sites) {
const wsList = document.getElementById("toc-workspaces-list");
if (!wsList) return;
@@ -3931,21 +3923,15 @@ function updateToc(workspaces, sites) {
wsList.innerHTML = "";
for (const ws of workspaces) {
const li = document.createElement("li");
-
- const itemDiv = document.createElement("div");
- itemDiv.className = "toc-item";
-
- const caret = document.createElement("span");
- caret.className = "toc-caret";
- caret.textContent = "▸";
-
+ const details = document.createElement("details");
+ details.className = "toc-group toc-workspace";
+ const summary = document.createElement("summary");
const a = document.createElement("a");
a.href = "#";
a.textContent = ws.name || "Untitled";
-
- itemDiv.appendChild(caret);
- itemDiv.appendChild(a);
-
+ summary.appendChild(a);
+ details.appendChild(summary);
+
const subUl = document.createElement("ul");
subUl.className = "toc-sub";
@@ -3985,13 +3971,6 @@ function updateToc(workspaces, sites) {
subUl.appendChild(subLi);
}
- itemDiv.addEventListener("click", (e) => {
- if (e.target.closest("a")) return;
- e.preventDefault();
- e.stopPropagation();
- toggleTocSection(itemDiv, subUl);
- });
-
a.addEventListener("click", (e) => {
e.preventDefault();
e.stopPropagation();
@@ -4000,11 +3979,11 @@ function updateToc(workspaces, sites) {
card.scrollIntoView({ behavior: "smooth", block: "start" });
openDetailsChain(document.getElementById("workspaces-panel"));
}
- toggleTocSection(itemDiv, subUl);
+ details.open = true;
});
- li.appendChild(itemDiv);
- li.appendChild(subUl);
+ details.appendChild(subUl);
+ li.appendChild(details);
wsList.appendChild(li);
}
@@ -4032,52 +4011,25 @@ function updateToc(workspaces, sites) {
}
function initToc() {
- const items = document.querySelectorAll(".toc-links > ul > li > .toc-item");
- items.forEach(item => {
- item.addEventListener("click", (e) => {
- const sub = item.nextElementSibling;
-
- // Handle link click
- if (e.target.closest("a")) {
- const link = e.target.closest("a");
- const href = link.getAttribute("href");
- if (href && href.startsWith("#")) {
- openDetailsChain(document.querySelector(href));
- if (sub && sub.classList.contains("toc-sub")) {
- toggleTocSection(item, sub);
- }
- }
- return;
- }
-
- // Toggle sub-list on row click (excluding link)
- if (sub && sub.classList.contains("toc-sub")) {
- e.preventDefault();
- e.stopPropagation();
- toggleTocSection(item, sub);
- }
- });
- });
-
- const subLinks = document.querySelectorAll(".toc-sub a[href^=\"#\"]");
- subLinks.forEach((link) => {
- const href = link.getAttribute("href");
- if (!href || href === "#") return;
- link.addEventListener("click", (e) => {
- const target = document.querySelector(href);
- if (target) {
- openDetailsChain(target);
+ const links = document.querySelectorAll(".toc-links a[href^=\"#\"]");
+ links.forEach((link) => {
+ const href = link.getAttribute("href");
+ if (!href || href === "#") return;
+ const isSummaryLink = Boolean(link.closest("summary"));
+ link.addEventListener("click", (e) => {
+ const target = document.querySelector(href);
+ if (target) {
+ openDetailsChain(target);
+ if (!isSummaryLink) {
target.scrollIntoView({ behavior: "smooth", block: "start" });
}
- const sub = link.closest(".toc-sub");
- const parentItem = sub?.previousElementSibling;
- if (parentItem?.classList?.contains("toc-item")) {
- toggleTocSection(parentItem, sub, true);
- }
+ }
+ if (!isSummaryLink) {
e.preventDefault();
e.stopPropagation();
- });
+ }
});
+ });
}
document.addEventListener("DOMContentLoaded", initToc);