镜像站点 · 本页由第三方 GitHub 只读镜像提供,非 GitHub 官方站点,不接受任何登录或凭据输入。前往 github.com
Skip to content

Add three responsive light and dark blog themes - #160

Open
mraible wants to merge 8 commits into
apache:masterfrom
mraible:feature/modern-blog-themes
Open

mraible wants to merge 8 commits into
apache:masterfrom
mraible:feature/modern-blog-themes

Conversation

@mraible

@mraible mraible commented Aug 13, 2026 •

Copy link
Copy Markdown
Contributor

Adds three modern, production-ready Roller themes:

  • Horizon: a crisp editorial layout with cool blue accents and generous whitespace
  • Alpenglow: a warm, expressive magazine design with coral and violet accents
  • Dispatch: a compact, typography-led newspaper layout with amber accents

Each theme includes responsive weblog, permalink, search, tag, archive, and sidebar templates. They automatically follow the visitor’s light or dark color-scheme preference, avoid external runtime dependencies, and include an SVG preview for Roller’s theme selector.

Theme discovery coverage verifies that all three themes and their stylesheets load through ThemeManager. The create-weblog flow also keeps Basic as its explicit default so adding an alphabetically earlier theme does not change existing setup behavior.

The previews below are the same production preview.svg assets included in this pull request. They use Roller’s established neutral test-blog fixture content.

Horizon

Horizon theme preview

Alpenglow

Alpenglow theme preview

Dispatch

Dispatch theme preview

Tested with:

  • mvn -pl app -Dtest=ThemeManagerTest test
  • mvn -pl app -DskipTests package
  • mvn -V -ntp install -DskipTests
  • cd it-selenium && mvn -V -ntp install
  • git diff --check

Introduce Horizon, Alpenglow, and Dispatch as modern Roller themes with responsive layouts and automatic color-scheme support. Add theme discovery coverage for all three.
Expand the compact theme templates into readable, consistently indented HTML and Velocity control flow.
Expand the three theme stylesheets for review and use the same neutral test-blog fixtures as Roller’s existing theme previews.
Set the create-weblog form's default theme explicitly so adding an alphabetically earlier shared theme does not change existing setup behavior.

@snoopdave snoopdave left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for these themes. Three template bugs found by rendering the templates with Velocity 2.4 (the version Roller uses); details inline. Also, CI on this PR predates the current workflow (no JDK 25 or CodeQL); merging current master would re-run it.

@@ -0,0 +1,28 @@
#foreach($entry in $entries)
<article class="story">
<div class="story-index" aria-hidden="true">$velocityCount</div>

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Velocity 2 removed $velocityCount, and Roller's velocity.properties doesn't enable the old name, so this prints the literal text $velocityCount on every entry. Rendered with Velocity 2.4: #foreach($x in $l)$velocityCount#end gives $velocityCount$velocityCount. Use $foreach.count (as gaurav and frontpage use $foreach.index).

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed. It uses $foreach.count now.

@@ -0,0 +1,30 @@
#foreach($entry in $entries)
<article class="dispatch">
<div class="dispatch-number">#if($velocityCount<10)0#end$velocityCount</div>

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Velocity 2 removed $velocityCount, and Roller's velocity.properties doesn't enable the old name, so this prints the literal text $velocityCount on every entry. Rendered with Velocity 2.4: #foreach($x in $l)$velocityCount#end gives $velocityCount$velocityCount. Use $foreach.count (as gaurav and frontpage use $foreach.index).

Here: #if($foreach.count<10)0#end$foreach.count.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed with #if($foreach.count < 10)0#end$foreach.count, so entries show 01, 02, and so on.

<footer class="site-footer">
<p>
<strong>$model.weblog.name</strong>
— #if($model.weblog.tagline)$model.weblog.tagline#elseField notes from a life in motion.#end

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Velocity reads #elseField as one unknown directive, not #else + text. With a tagline this prints My tagline#elseField notes from a life in motion.; without one, the fallback never shows. Use #{else}Field notes from a life in motion. (Horizon's footer works because it has a space after #else).

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good catch. The fallback text was hard-coded persona copy, so I removed it instead of switching to #{else}. The footer now shows the tagline only when the weblog has one.

<main id="content" class="article-shell">
<header class="page-heading">
<p class="eyebrow">Topic</p>
<h1>$model.tags</h1>

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

$model.tags is a List<String>, so this renders with list brackets, e.g. [java] or [java, roller]. Same on line 5 (<title>). Suggest joining the tags with a #foreach.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed here and in the <title> on line 5. The tags are joined with a #foreach, so a multi-tag page reads java, roller.

<main id="content" class="reading-shell">
<header class="page-title">
<p class="kicker">Stories filed under</p>
<h1>$model.tags</h1>

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

$model.tags is a List<String>, so this renders with list brackets, e.g. [java] or [java, roller]. Same on line 5 (<title>). Suggest joining the tags with a #foreach.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed here and in the <title>, the same way as Horizon.

<main id="content" class="reading-shell">
<header class="page-title">
<p class="label">FILTER / TAG</p>
<h1>$model.tags</h1>

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

$model.tags is a List<String>, so this renders with list brackets, e.g. [java] or [java, roller]. Same on line 5 (<title>). Suggest joining the tags with a #foreach.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed here and in the <title>, the same way as Horizon.

…w themes

Velocity 2 removed $velocityCount, so Alpenglow and Dispatch printed the literal text on every entry; they now use $foreach.count. Alpenglow's footer used #elseField, which Velocity reads as an unknown directive, so it now shows the tagline only when one is set. The tag pages joined $model.tags as a Java list, which rendered as [java, roller] in the heading and title; they now list the tags separated by commas.
Alpenglow, Dispatch, and Horizon shipped with hard-coded copy written for one blog, so every weblog using them showed the same headline, founding year, and about text. The hero headings now show the weblog name, Dispatch derives its founding year from the weblog's creation date, and the about and tagline sections are omitted when those fields are empty. Long weblog names now wrap in the Alpenglow and Dispatch headlines instead of overflowing on narrow screens.
@mraible

mraible commented Oct 11, 2026

Copy link
Copy Markdown
Contributor Author

Thanks for the review. I merged current master, so CI now runs on JDK 25 with CodeQL.

I also took two items from the UI audit you attached to #156:

  • UI-07: the three themes now use the weblog's own name, tagline, and about text, and hide those sections when the fields are empty. Dispatch's "EST." year comes from the weblog's creation date.
  • UI-08 Removing empty spaces #1: long names now wrap in the Dispatch and Alpenglow headlines.

I rendered the changed templates with Velocity 2.4.1, with the tagline and about fields both set and empty, and the full test suite passes.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants