dad2b237d480ba64706fbb6c63d092b2738a2413
jnavarr5
  Mon Aug 24 15:33:38 2026 -0700
Add ### headings as indented TOC sub-items and fix docs sidebar highlighting, refs #36320

diff --git docs/staticPage.lua docs/staticPage.lua
index 31aba84f10c..d6ff5208871 100644
--- docs/staticPage.lua
+++ docs/staticPage.lua
@@ -131,31 +131,32 @@
     add("<!--#include virtual=\"$ROOT/inc/gbPageStart.html\" -->")
     add("<link rel=\"stylesheet\" href=\"<!--#echo var=\"ROOT\" -->/style/bootstrap-3-3-7.min.css\">")
     add("")
     add("<h1>" .. metadata["title"] .. "</h1>")
   else
     add("<h1>No title defined in document, first line must be % mytitle </h1>")
   end
 
   -- Sidebar TOC + body in Bootstrap grid. The docs-page class scopes
   -- /docs/-only typography and table styling in gbStatic.css.
   add('<div class="row docs-toc-row docs-page">')
   add('<div class="col-md-2 hidden-sm hidden-xs">')
   add('<nav class="docs-toc" id="docs-toc">')
   add('<ul>')
   for i, h in ipairs(headers) do
-    add("<li><a href='#" .. h.id .. "'>" .. h.text .. "</a></li>")
+    local cls = h.sub and " class='docs-toc-sub'" or ""
+    add("<li" .. cls .. "><a href='#" .. h.id .. "'>" .. h.text .. "</a></li>")
   end
   add('</ul>')
   add('</nav>')
   add('</div>')
   add('<div class="col-md-10">')
   -- ucsc change end
 
   add(body)
   add('</div>') -- close col-md-10
   add('</div>') -- close row
   if #notes > 0 then
     add('<ol class="footnotes">')
     for _,note in pairs(notes) do
       add(note)
     end
@@ -300,39 +301,45 @@
   return s
 end
 
 function Para(s)
   return "<p>\n" .. s .. "\n</p>"
 end
 
 -- lev is an integer, the header level.
 function Header(lev, s, attr)
   local lines = { }
 
   if lev == 1 then
 
     idStr = simplifyId(s)
 
-    table.insert(headers, {text = s, id = idStr})
+    table.insert(headers, {text = s, id = idStr, sub = false})
 
     table.insert(lines, "<h2 id='" .. idStr .. "'>"  .. s .. "</h2>")
     headerOpen = true
 
   elseif lev == 2 then
     -- Collect lev==2 headers for TOC (markdown ## headings)
     local idStr = attr.id or simplifyId(s)
-    table.insert(headers, {text = s, id = idStr})
+    table.insert(headers, {text = s, id = idStr, sub = false})
+    table.insert(lines, "<h" .. lev .. " id='" .. idStr .. "'" ..  ">" .. s .. "</h" .. lev .. ">")
+
+  elseif lev == 3 then
+    -- Collect lev==3 headers for TOC as indented sub-items (markdown ### headings)
+    local idStr = attr.id or simplifyId(s)
+    table.insert(headers, {text = s, id = idStr, sub = true})
     table.insert(lines, "<h" .. lev .. " id='" .. idStr .. "'" ..  ">" .. s .. "</h" .. lev .. ">")
 
   else
     table.insert(lines, "<h" .. lev .. attributes(attr) ..  ">" .. s .. "</h" .. lev .. ">")
   end
 
   return table.concat(lines, "\n")
 end
 
 function BlockQuote(s)
   return "<blockquote>\n" .. s .. "\n</blockquote>"
 end
 
 function HorizontalRule()
   return "<hr/>"