Index: cortav.lua
==================================================================
--- cortav.lua
+++ cortav.lua
@@ -210,10 +210,19 @@
 		python = { color = 0xffd277 };
 		python = { color = 0xcdd6ff };
 	}
 
 	local stylesets = {
+		header = [[
+			h1 { font-size: 200%; border-bottom-style: double !important; border-bottom-width: 3px !important; }
+			h2 { font-size: 130%; }
+			h3 { font-size: 110%; }
+			h4 { font-size: 100%; font-weight: normal; }
+			h5 { font-size: 90%; font-weight: normal; }
+			h6 { font-size: 80%; font-weight: normal; }
+			h3, h4, h5, h6 { border-bottom-style: dotted !important; }
+		]];
 		accent = [[
 			body { background: @bg; color: @fg }
 			a[href] {
 				color: @tone(0.7 30);
 				text-decoration-color: @tone/0.4(0.7 30);
@@ -220,14 +229,16 @@
 			}
 			a[href]:hover {
 				color: @tone(0.9 30);
 				text-decoration-color: @tone/0.7(0.7 30);
 			}
-			h1,h2,h3,h4,h5,h6 {
-				color: @tone(2);
-				border-bottom: 1px solid @tone(0.7);
-			}
+			h1,h2,h3,h4,h5,h6 { border-bottom: 1px solid @tone(0.7); }
+			h1 { color: @tone(2); }
+			h2 { color: @tone(1.5); }
+			h3 { color: @tone(1.2); }
+			h4 { color: @tone(1); }
+			h5,h6 { color: @tone(0.8); }
 		]];
 		code = [[
 			code {
 				background: @fg;
 				color: @bg;
@@ -446,10 +457,13 @@
 					b.origin:fail('critical HTML renderer directive ā€œ%sā€ not supported', cmd)
 				end
 			end;
 			label = function(b,s)
 				if ct.sec.is(b.captions) then
+					if not (opts['fossil-uv'] or opts.snippet) then
+						stylesNeeded.header = true
+					end
 					local h = math.min(6,math.max(1,b.captions.depth))
 					return tag(f('h%u',h), nil, sr.htmlSpan(b.spans, b, s), b)
 				else
 					-- handle other uses of labels here
 				end