Clean up series detail page typography
Remove completion stats (streak/on-time) from both the series show
page and panel — the history list already conveys this. Use a fixed
"Series" section header instead of repeating the note title. Adjust
type scale so the note (step-0) is visually dominant over detail
fields (step--2) and history rows (step--1).

Assisted-by: Claude Opus 4.6 via Claude Code
change nqpntqsupynsrvsntypsxstsrstwvrys
commit 35b83c86be50c8e1bce8177e60a0e7136010ae70
author Alpha Chen <alpha@kejadlen.dev>
date
parent wptltoml
diff --git a/lib/ketchup/views/series/show.rb b/lib/ketchup/views/series/show.rb
index 23e72b8..fcb932c 100644
--- a/lib/ketchup/views/series/show.rb
+++ b/lib/ketchup/views/series/show.rb
@@ -22,7 +22,7 @@ module Views
               section(class: "section") do
                 div(class: "section-header") do
                   h2(class: "section-title") do
-                    span(class: "section-title-text") { note_title }
+                    span(class: "section-title-text") { "Series" }
                   end
                 end
 
@@ -46,14 +46,6 @@ module Views
                 end
 
                 unless @series.completed_tasks.empty?
-                  stats = @series.completion_stats
-                  dl(class: "detail-fields") do
-                    dt { "Streak" }
-                    dd { stats[:streak].to_s }
-                    dt { "On-time" }
-                    dd { "#{stats[:on_time_pct]}%" }
-                  end
-
                   div(class: "task-history") do
                     div(class: "section-header") do
                       h2(class: "section-title") do
diff --git a/lib/ketchup/views/series_detail.rb b/lib/ketchup/views/series_detail.rb
index 648d1c2..cbc8bd2 100644
--- a/lib/ketchup/views/series_detail.rb
+++ b/lib/ketchup/views/series_detail.rb
@@ -90,16 +90,6 @@ module Views
           end
 
           unless @series.completed_tasks.empty?
-            stats = @series.completion_stats
-            div(class: "panel-stats") do
-              dl(class: "detail-fields") do
-                dt { "Streak" }
-                dd { stats[:streak].to_s }
-                dt { "On-time" }
-                dd { "#{stats[:on_time_pct]}%" }
-              end
-            end
-
             div(class: "task-history") do
               h3 { "History" }
               ul do
diff --git a/public/css/app.css b/public/css/app.css
index 8999f7f..ab7bac5 100644
--- a/public/css/app.css
+++ b/public/css/app.css
@@ -430,6 +430,7 @@ h2 { font-size: var(--step-0); font-weight: 600; }
 /* -------------------- */
 
 .series-note {
+  font-size: var(--step-0);
   color: #444;
   line-height: 1.4;
   border: 1px solid transparent;
@@ -464,7 +465,7 @@ h2 { font-size: var(--step-0); font-weight: 600; }
   display: grid;
   grid-template-columns: auto 1fr;
   gap: var(--space-3xs) var(--space-s);
-  font-size: var(--step--1);
+  font-size: var(--step--2);
 }
 
 .detail-fields dt {
@@ -526,12 +527,6 @@ h2 { font-size: var(--step-0); font-weight: 600; }
   width: 100%;
 }
 
-.panel-stats {
-  margin-block-start: var(--space-m);
-  padding-block-start: var(--space-s);
-  border-block-start: 1px solid #f0f0f0;
-}
-
 /* -------------------- */
 /* Task history */
 /* -------------------- */
@@ -564,7 +559,7 @@ h2 { font-size: var(--step-0); font-weight: 600; }
   display: flex;
   align-items: center;
   gap: var(--space-3xs);
-  font-size: var(--step--2);
+  font-size: var(--step--1);
   color: #444;
 }
 
diff --git a/test/test_web.rb b/test/test_web.rb
index 0831db2..817ed49 100644
--- a/test/test_web.rb
+++ b/test/test_web.rb
@@ -626,18 +626,6 @@ class TestWeb < Minitest::Test
     assert_includes last_response.body, "Haircut"
   end
 
-  def test_series_panel_shows_stats
-    create_series(note: "Call Mom", interval_unit: "week", interval_count: "1",
-                  first_due_date: (Date.today - 7).to_s)
-
-    series = DB[:series].first
-    task = DB[:tasks].first
-    csrf_post "/series/#{series[:id]}/tasks/#{task[:id]}/complete", {}, auth_headers
-
-    get "/series/#{series[:id]}/panel", {}, auth_headers
-    assert_includes last_response.body, "panel-stats"
-  end
-
   private
 
   def csrf_post(path, params = {}, headers = auth_headers)