From ee93e145bbd2107f6121c989a627ad54bf2261b0 Mon Sep 17 00:00:00 2001 From: Matt Raible Date: Thu, 13 Aug 2026 09:30:43 -0600 Subject: [PATCH 1/4] Add three responsive light and dark blog themes Introduce Horizon, Alpenglow, and Dispatch as modern Roller themes with responsive layouts and automatic color-scheme support. Add theme discovery coverage for all three. --- .../main/webapp/themes/alpenglow/archives.vm | 1 + .../main/webapp/themes/alpenglow/custom.css | 1 + app/src/main/webapp/themes/alpenglow/day.vm | 1 + app/src/main/webapp/themes/alpenglow/entry.vm | 1 + .../main/webapp/themes/alpenglow/footer.vm | 1 + app/src/main/webapp/themes/alpenglow/head.vm | 1 + .../main/webapp/themes/alpenglow/header.vm | 1 + .../main/webapp/themes/alpenglow/preview.svg | 1 + .../main/webapp/themes/alpenglow/search.vm | 1 + .../main/webapp/themes/alpenglow/sidebar.vm | 1 + app/src/main/webapp/themes/alpenglow/tags.vm | 1 + .../main/webapp/themes/alpenglow/theme.css | 1 + .../main/webapp/themes/alpenglow/theme.xml | 17 ++++++++++++++++ .../main/webapp/themes/alpenglow/weblog.vm | 1 + .../main/webapp/themes/dispatch/archives.vm | 1 + .../main/webapp/themes/dispatch/custom.css | 1 + app/src/main/webapp/themes/dispatch/day.vm | 1 + app/src/main/webapp/themes/dispatch/entry.vm | 1 + app/src/main/webapp/themes/dispatch/footer.vm | 1 + app/src/main/webapp/themes/dispatch/head.vm | 1 + app/src/main/webapp/themes/dispatch/header.vm | 1 + .../main/webapp/themes/dispatch/preview.svg | 1 + app/src/main/webapp/themes/dispatch/search.vm | 1 + .../main/webapp/themes/dispatch/sidebar.vm | 1 + app/src/main/webapp/themes/dispatch/tags.vm | 1 + app/src/main/webapp/themes/dispatch/theme.css | 1 + app/src/main/webapp/themes/dispatch/theme.xml | 17 ++++++++++++++++ app/src/main/webapp/themes/dispatch/weblog.vm | 1 + .../main/webapp/themes/horizon/archives.vm | 1 + app/src/main/webapp/themes/horizon/custom.css | 1 + app/src/main/webapp/themes/horizon/day.vm | 1 + app/src/main/webapp/themes/horizon/entry.vm | 1 + app/src/main/webapp/themes/horizon/footer.vm | 1 + app/src/main/webapp/themes/horizon/head.vm | 8 ++++++++ app/src/main/webapp/themes/horizon/header.vm | 8 ++++++++ .../main/webapp/themes/horizon/preview.svg | 1 + app/src/main/webapp/themes/horizon/search.vm | 1 + app/src/main/webapp/themes/horizon/sidebar.vm | 1 + app/src/main/webapp/themes/horizon/tags.vm | 1 + app/src/main/webapp/themes/horizon/theme.css | 1 + app/src/main/webapp/themes/horizon/theme.xml | 20 +++++++++++++++++++ app/src/main/webapp/themes/horizon/weblog.vm | 6 ++++++ .../weblogger/business/ThemeManagerTest.java | 7 ++++++- 43 files changed, 118 insertions(+), 1 deletion(-) create mode 100644 app/src/main/webapp/themes/alpenglow/archives.vm create mode 100644 app/src/main/webapp/themes/alpenglow/custom.css create mode 100644 app/src/main/webapp/themes/alpenglow/day.vm create mode 100644 app/src/main/webapp/themes/alpenglow/entry.vm create mode 100644 app/src/main/webapp/themes/alpenglow/footer.vm create mode 100644 app/src/main/webapp/themes/alpenglow/head.vm create mode 100644 app/src/main/webapp/themes/alpenglow/header.vm create mode 100644 app/src/main/webapp/themes/alpenglow/preview.svg create mode 100644 app/src/main/webapp/themes/alpenglow/search.vm create mode 100644 app/src/main/webapp/themes/alpenglow/sidebar.vm create mode 100644 app/src/main/webapp/themes/alpenglow/tags.vm create mode 100644 app/src/main/webapp/themes/alpenglow/theme.css create mode 100644 app/src/main/webapp/themes/alpenglow/theme.xml create mode 100644 app/src/main/webapp/themes/alpenglow/weblog.vm create mode 100644 app/src/main/webapp/themes/dispatch/archives.vm create mode 100644 app/src/main/webapp/themes/dispatch/custom.css create mode 100644 app/src/main/webapp/themes/dispatch/day.vm create mode 100644 app/src/main/webapp/themes/dispatch/entry.vm create mode 100644 app/src/main/webapp/themes/dispatch/footer.vm create mode 100644 app/src/main/webapp/themes/dispatch/head.vm create mode 100644 app/src/main/webapp/themes/dispatch/header.vm create mode 100644 app/src/main/webapp/themes/dispatch/preview.svg create mode 100644 app/src/main/webapp/themes/dispatch/search.vm create mode 100644 app/src/main/webapp/themes/dispatch/sidebar.vm create mode 100644 app/src/main/webapp/themes/dispatch/tags.vm create mode 100644 app/src/main/webapp/themes/dispatch/theme.css create mode 100644 app/src/main/webapp/themes/dispatch/theme.xml create mode 100644 app/src/main/webapp/themes/dispatch/weblog.vm create mode 100644 app/src/main/webapp/themes/horizon/archives.vm create mode 100644 app/src/main/webapp/themes/horizon/custom.css create mode 100644 app/src/main/webapp/themes/horizon/day.vm create mode 100644 app/src/main/webapp/themes/horizon/entry.vm create mode 100644 app/src/main/webapp/themes/horizon/footer.vm create mode 100644 app/src/main/webapp/themes/horizon/head.vm create mode 100644 app/src/main/webapp/themes/horizon/header.vm create mode 100644 app/src/main/webapp/themes/horizon/preview.svg create mode 100644 app/src/main/webapp/themes/horizon/search.vm create mode 100644 app/src/main/webapp/themes/horizon/sidebar.vm create mode 100644 app/src/main/webapp/themes/horizon/tags.vm create mode 100644 app/src/main/webapp/themes/horizon/theme.css create mode 100644 app/src/main/webapp/themes/horizon/theme.xml create mode 100644 app/src/main/webapp/themes/horizon/weblog.vm diff --git a/app/src/main/webapp/themes/alpenglow/archives.vm b/app/src/main/webapp/themes/alpenglow/archives.vm new file mode 100644 index 0000000000..7a5234594e --- /dev/null +++ b/app/src/main/webapp/themes/alpenglow/archives.vm @@ -0,0 +1 @@ +#includeTemplate($model.weblog "standard_head")Archives — $model.weblog.name#includeTemplate($model.weblog "standard_header")

Base camp

Archives

#showWeblogEntryCalendarBig($model.weblog "nil")

Thirty recent stories

#set($recentEntries=$model.weblog.getRecentWeblogEntries("nil",30))
    #foreach($recentEntry in $recentEntries)
  1. $recentEntry.title
  2. #end
#includeTemplate($model.weblog "standard_footer") diff --git a/app/src/main/webapp/themes/alpenglow/custom.css b/app/src/main/webapp/themes/alpenglow/custom.css new file mode 100644 index 0000000000..69ce9f2188 --- /dev/null +++ b/app/src/main/webapp/themes/alpenglow/custom.css @@ -0,0 +1 @@ +/* Add weblog-specific Alpenglow overrides here. */ diff --git a/app/src/main/webapp/themes/alpenglow/day.vm b/app/src/main/webapp/themes/alpenglow/day.vm new file mode 100644 index 0000000000..709b27b7ee --- /dev/null +++ b/app/src/main/webapp/themes/alpenglow/day.vm @@ -0,0 +1 @@ +#foreach($entry in $entries)
$entry.category.name
#if($model.permalink)

$entry.title

#else

$entry.title

#end
#if($model.permalink)$entry.displayContent#else$entry.displayContent($url.entry($entry.anchor))#end
#if($entry.tags)#foreach($tag in $entry.tags)#$tag.name#end#end#set($commentCount=$entry.commentCount)#if($entry.commentsStillAllowed || $commentCount>0)$commentCount comments#end
#end diff --git a/app/src/main/webapp/themes/alpenglow/entry.vm b/app/src/main/webapp/themes/alpenglow/entry.vm new file mode 100644 index 0000000000..f62fc85274 --- /dev/null +++ b/app/src/main/webapp/themes/alpenglow/entry.vm @@ -0,0 +1 @@ +#includeTemplate($model.weblog "standard_head")$model.weblogEntry.title — $model.weblog.name#includeTemplate($model.weblog "standard_header")
#set($pager=$model.getWeblogEntriesPager())#showWeblogEntriesPager($pager)#foreach($entry in $entries)
#showWeblogEntryComments($entry)#showWeblogEntryCommentForm($entry)
#end
#includeTemplate($model.weblog "standard_footer") diff --git a/app/src/main/webapp/themes/alpenglow/footer.vm b/app/src/main/webapp/themes/alpenglow/footer.vm new file mode 100644 index 0000000000..64c52421b2 --- /dev/null +++ b/app/src/main/webapp/themes/alpenglow/footer.vm @@ -0,0 +1 @@ + diff --git a/app/src/main/webapp/themes/alpenglow/head.vm b/app/src/main/webapp/themes/alpenglow/head.vm new file mode 100644 index 0000000000..ddc5f6043d --- /dev/null +++ b/app/src/main/webapp/themes/alpenglow/head.vm @@ -0,0 +1 @@ +#showAutodiscoveryLinks($model.weblog)#showMetaDescription()#showAnalyticsTrackingCode($model.weblog) diff --git a/app/src/main/webapp/themes/alpenglow/header.vm b/app/src/main/webapp/themes/alpenglow/header.vm new file mode 100644 index 0000000000..c935fdf0bb --- /dev/null +++ b/app/src/main/webapp/themes/alpenglow/header.vm @@ -0,0 +1 @@ + diff --git a/app/src/main/webapp/themes/alpenglow/preview.svg b/app/src/main/webapp/themes/alpenglow/preview.svg new file mode 100644 index 0000000000..a679765d51 --- /dev/null +++ b/app/src/main/webapp/themes/alpenglow/preview.svg @@ -0,0 +1 @@ +▲ ALPENGLOWFROM COLORADO TO EVERYWHERELife is betterwith a littlealtitude. diff --git a/app/src/main/webapp/themes/alpenglow/search.vm b/app/src/main/webapp/themes/alpenglow/search.vm new file mode 100644 index 0000000000..2dabd354f5 --- /dev/null +++ b/app/src/main/webapp/themes/alpenglow/search.vm @@ -0,0 +1 @@ +#includeTemplate($model.weblog "standard_head")Search — $model.weblog.name#includeTemplate($model.weblog "standard_header")

Search the trail

“$model.term”

$model.hits results

#if($model.hits>0)#set($pager=$model.getWeblogEntriesPager())#showWeblogEntriesPager($pager)#else

No stories found. Try another trail.

#end
#includeTemplate($model.weblog "standard_footer") diff --git a/app/src/main/webapp/themes/alpenglow/sidebar.vm b/app/src/main/webapp/themes/alpenglow/sidebar.vm new file mode 100644 index 0000000000..7fc3a75ac0 --- /dev/null +++ b/app/src/main/webapp/themes/alpenglow/sidebar.vm @@ -0,0 +1 @@ + diff --git a/app/src/main/webapp/themes/alpenglow/tags.vm b/app/src/main/webapp/themes/alpenglow/tags.vm new file mode 100644 index 0000000000..46687e7edf --- /dev/null +++ b/app/src/main/webapp/themes/alpenglow/tags.vm @@ -0,0 +1 @@ +#includeTemplate($model.weblog "standard_head")$model.tags — $model.weblog.name#includeTemplate($model.weblog "standard_header")

Stories filed under

$model.tags

#set($pager=$model.getWeblogEntriesPager())#showWeblogEntriesPager($pager)
#includeTemplate($model.weblog "standard_footer") diff --git a/app/src/main/webapp/themes/alpenglow/theme.css b/app/src/main/webapp/themes/alpenglow/theme.css new file mode 100644 index 0000000000..d6126b0084 --- /dev/null +++ b/app/src/main/webapp/themes/alpenglow/theme.css @@ -0,0 +1 @@ +:root{color-scheme:light dark;--night:#102d32;--bg:#eef0e9;--paper:#f9faf5;--ink:#15373b;--muted:#627376;--line:#cbd2ca;--sun:#ffb258;--rose:#e46b55;--sans:ui-sans-serif,system-ui,-apple-system,"Segoe UI",sans-serif;--display:ui-rounded,"Arial Rounded MT Bold",var(--sans);--serif:ui-serif,Georgia,serif}*{box-sizing:border-box}body{margin:0;background:var(--bg);color:var(--ink);font:1rem/1.65 var(--sans)}a{color:inherit;text-underline-offset:.2em}a:hover{color:var(--rose)}img,iframe,video{max-width:100%;height:auto}.skip-link{position:absolute;left:-999px}.skip-link:focus{left:1rem;top:1rem;background:var(--paper);padding:.6rem;z-index:10}.site-header{max-width:1320px;margin:auto;padding:1.3rem clamp(1.2rem,4vw,3rem);display:flex;gap:2rem;align-items:center}.brand{display:flex;gap:.7rem;align-items:center;text-decoration:none;font-weight:850}.brand-mark{color:var(--rose)}.site-header nav{margin-left:auto}.site-header nav ul{display:flex;list-style:none;gap:1.3rem;margin:0;padding:0}.site-header nav a,.feed-link{text-decoration:none;font-size:.85rem;font-weight:700}.feed-link{border:1px solid var(--ink);border-radius:2rem;padding:.4rem .85rem}.hero{max-width:1320px;min-height:590px;margin:0 auto;padding:clamp(2rem,7vw,6rem) clamp(1.2rem,4vw,3rem);display:grid;grid-template-columns:1fr 1.15fr;align-items:center;overflow:hidden}.hero-copy{z-index:2}.kicker{text-transform:uppercase;letter-spacing:.17em;font-weight:850;font-size:.7rem;color:var(--rose)}.hero h1{font:900 clamp(3.6rem,8vw,7.5rem)/.82 var(--display);letter-spacing:-.07em;margin:.3em 0}.hero h1 em{font-family:var(--serif);font-weight:400;color:var(--rose)}.hero-copy>p:last-child{max-width:34rem;color:var(--muted)}.hero-art{min-height:460px;position:relative}.sun{position:absolute;width:clamp(180px,30vw,390px);aspect-ratio:1;border-radius:50%;background:var(--sun);right:4%;top:3%;box-shadow:0 0 0 35px color-mix(in srgb,var(--sun) 14%,transparent)}.ridge{position:absolute;inset:auto -10% 0 0;height:65%;clip-path:polygon(0 100%,18% 54%,30% 72%,53% 20%,65% 48%,77% 32%,100% 100%)}.ridge-back{background:#8db1a4;transform:translateY(-15%)}.ridge-front{background:var(--night)}.content-shell{max-width:1320px;margin:auto;padding:5rem clamp(1.2rem,4vw,3rem);display:grid;grid-template-columns:260px 1fr;gap:clamp(3rem,7vw,7rem)}.explore{position:sticky;top:2rem;align-self:start}.explore>div,.explore form{margin-bottom:2.2rem}.explore label{font-weight:800;display:block;margin-bottom:.45rem}.explore form div,.big-search{display:flex}.explore input,.big-search input{min-width:0;width:100%;border:1px solid var(--line);background:var(--paper);color:var(--ink);padding:.75rem}.explore button,.big-search button{border:0;background:var(--night);color:#fff;padding:.75rem 1rem}.topics{display:flex;flex-wrap:wrap;gap:.45rem}.topics a{font-size:.78rem;text-decoration:none;border-bottom:1px solid var(--line)}.story{display:grid;grid-template-columns:3.5rem 1fr;gap:1rem;background:var(--paper);border-radius:1.2rem;padding:clamp(1.4rem,4vw,3.5rem);margin-bottom:2rem;box-shadow:0 14px 45px color-mix(in srgb,var(--night) 9%,transparent)}.story-index{font:700 1rem var(--serif);color:var(--rose)}.story .meta,.story footer{display:flex;gap:1rem;flex-wrap:wrap;color:var(--muted);font-size:.78rem}.story .meta a{text-transform:uppercase;letter-spacing:.12em;font-weight:850;text-decoration:none}.story h1,.story h2{font:850 clamp(2rem,4vw,3.5rem)/1 var(--display);letter-spacing:-.045em;margin:.5em 0}.story h2 a{text-decoration:none}.entry-content{font:1.1rem/1.72 var(--serif)}.entry-content blockquote{border-left:.35rem solid var(--sun);margin:2rem 0;padding:.8rem 1.5rem;color:var(--muted)}pre{overflow:auto;background:var(--night);color:#eef8f4;padding:1.2rem;border-radius:.75rem}.story footer{margin-top:2rem}.story footer a{text-decoration:none}.reading-shell{max-width:850px;margin:auto;padding:clamp(3rem,8vw,7rem) 1.3rem}.page-title h1{font:900 clamp(3rem,9vw,7rem)/.9 var(--display);letter-spacing:-.06em;margin:.2em 0}.pager{margin:3rem 0}.pager ul{display:flex;justify-content:space-between;list-style:none;padding:0}.calendar{overflow:auto}.calendar table{width:100%;border-collapse:collapse;background:var(--paper)}.calendar td,.calendar th{border:1px solid var(--line);padding:.7rem}.recent li{padding:.5rem}.site-footer{background:var(--night);color:#eaf2ee;padding:3rem max(1.2rem,calc((100vw - 1260px)/2));display:flex;justify-content:space-between;gap:2rem}.site-footer nav{display:flex;gap:1rem}.comments input,.comments textarea{max-width:100%}@media(max-width:760px){.site-header nav{order:3;width:100%;overflow:auto}.site-header{flex-wrap:wrap}.hero{grid-template-columns:1fr;min-height:auto}.hero-art{min-height:300px;margin-top:-2rem;opacity:.92}.content-shell{grid-template-columns:1fr}.explore{position:static}.story{grid-template-columns:1fr}.story-index{font-size:.8rem}.site-footer{flex-direction:column}}@media(prefers-color-scheme:dark){:root{--bg:#0c2226;--paper:#143238;--ink:#edf4ef;--muted:#a6b9b8;--line:#315158;--sun:#f5a953;--rose:#ff8a72}.ridge-front{background:#061719}.feed-link{border-color:var(--ink)}} diff --git a/app/src/main/webapp/themes/alpenglow/theme.xml b/app/src/main/webapp/themes/alpenglow/theme.xml new file mode 100644 index 0000000000..bed9f26398 --- /dev/null +++ b/app/src/main/webapp/themes/alpenglow/theme.xml @@ -0,0 +1,17 @@ + + + + alpenglowAlpenglowAn image-forward mountain journal with immersive cards and an alpine palette.Apache Roller + custom.cssAlpenglow custom stylescustom.csstext/csscustom.cssvelocity + + + + + + + + + + + + diff --git a/app/src/main/webapp/themes/alpenglow/weblog.vm b/app/src/main/webapp/themes/alpenglow/weblog.vm new file mode 100644 index 0000000000..b795bcca33 --- /dev/null +++ b/app/src/main/webapp/themes/alpenglow/weblog.vm @@ -0,0 +1 @@ +#includeTemplate($model.weblog "standard_head")$model.weblog.name#if($model.weblog.tagline) — $model.weblog.tagline#end#includeTemplate($model.weblog "standard_header")

From Colorado to everywhere

Life is better
with a little
altitude.

#if($model.weblog.tagline)

$model.weblog.tagline

#end
#includeTemplate($model.weblog "sidebar")
#set($pager=$model.getWeblogEntriesPager())#showWeblogEntriesPager($pager)
#includeTemplate($model.weblog "standard_footer") diff --git a/app/src/main/webapp/themes/dispatch/archives.vm b/app/src/main/webapp/themes/dispatch/archives.vm new file mode 100644 index 0000000000..828abf51d0 --- /dev/null +++ b/app/src/main/webapp/themes/dispatch/archives.vm @@ -0,0 +1 @@ +#includeTemplate($model.weblog "standard_head")Archives / $model.weblog.name#includeTemplate($model.weblog "standard_header")

DATABASE / ALL ENTRIES

Archive

#showWeblogEntryCalendarBig($model.weblog "nil")

LATEST_30

#set($recentEntries=$model.weblog.getRecentWeblogEntries("nil",30))
    #foreach($recentEntry in $recentEntries)
  1. $recentEntry.title
  2. #end
#includeTemplate($model.weblog "standard_footer") diff --git a/app/src/main/webapp/themes/dispatch/custom.css b/app/src/main/webapp/themes/dispatch/custom.css new file mode 100644 index 0000000000..0e9a07b1d8 --- /dev/null +++ b/app/src/main/webapp/themes/dispatch/custom.css @@ -0,0 +1 @@ +/* Add weblog-specific Dispatch overrides here. */ diff --git a/app/src/main/webapp/themes/dispatch/day.vm b/app/src/main/webapp/themes/dispatch/day.vm new file mode 100644 index 0000000000..3c391ae88a --- /dev/null +++ b/app/src/main/webapp/themes/dispatch/day.vm @@ -0,0 +1 @@ +#foreach($entry in $entries)
#if($velocityCount<10)0#end$velocityCount
/$entry.category.name
#if($model.permalink)

$entry.title

#else

$entry.title

#end
#if($model.permalink)$entry.displayContent#else$entry.displayContent($url.entry($entry.anchor))#end
#if($entry.tags)#foreach($tag in $entry.tags)[$tag.name]#end#end#set($commentCount=$entry.commentCount)#if($entry.commentsStillAllowed || $commentCount>0)COMMENTS($commentCount)#end#if($utils.isUserAuthorizedToAuthor($entry.website))EDIT#end
#end diff --git a/app/src/main/webapp/themes/dispatch/entry.vm b/app/src/main/webapp/themes/dispatch/entry.vm new file mode 100644 index 0000000000..5d0da49617 --- /dev/null +++ b/app/src/main/webapp/themes/dispatch/entry.vm @@ -0,0 +1 @@ +#includeTemplate($model.weblog "standard_head")$model.weblogEntry.title / $model.weblog.name#includeTemplate($model.weblog "standard_header")
#set($pager=$model.getWeblogEntriesPager())#showWeblogEntriesPager($pager)#foreach($entry in $entries)
#showWeblogEntryComments($entry)#showWeblogEntryCommentForm($entry)
#end
#includeTemplate($model.weblog "standard_footer") diff --git a/app/src/main/webapp/themes/dispatch/footer.vm b/app/src/main/webapp/themes/dispatch/footer.vm new file mode 100644 index 0000000000..f727d2d7e8 --- /dev/null +++ b/app/src/main/webapp/themes/dispatch/footer.vm @@ -0,0 +1 @@ + diff --git a/app/src/main/webapp/themes/dispatch/head.vm b/app/src/main/webapp/themes/dispatch/head.vm new file mode 100644 index 0000000000..ddc5f6043d --- /dev/null +++ b/app/src/main/webapp/themes/dispatch/head.vm @@ -0,0 +1 @@ +#showAutodiscoveryLinks($model.weblog)#showMetaDescription()#showAnalyticsTrackingCode($model.weblog) diff --git a/app/src/main/webapp/themes/dispatch/header.vm b/app/src/main/webapp/themes/dispatch/header.vm new file mode 100644 index 0000000000..fa3572c594 --- /dev/null +++ b/app/src/main/webapp/themes/dispatch/header.vm @@ -0,0 +1 @@ +
$model.weblog.name_
diff --git a/app/src/main/webapp/themes/dispatch/preview.svg b/app/src/main/webapp/themes/dispatch/preview.svg new file mode 100644 index 0000000000..04b556a55d --- /dev/null +++ b/app/src/main/webapp/themes/dispatch/preview.svg @@ -0,0 +1 @@ +RAIBLE DESIGNS_INDEPENDENT WEBLOG / EST. 2002IDEAS,ADVENTURES,& SOURCE CODE.012026.07.23 / GENERALCRUISING THE DANUBE diff --git a/app/src/main/webapp/themes/dispatch/search.vm b/app/src/main/webapp/themes/dispatch/search.vm new file mode 100644 index 0000000000..0e877c684a --- /dev/null +++ b/app/src/main/webapp/themes/dispatch/search.vm @@ -0,0 +1 @@ +#includeTemplate($model.weblog "standard_head")Search / $model.weblog.name#includeTemplate($model.weblog "standard_header")

QUERY / $model.hits MATCHES

$model.term

#if($model.hits>0)#set($pager=$model.getWeblogEntriesPager())#showWeblogEntriesPager($pager)#else

NO_MATCHES_FOUND

#end
#includeTemplate($model.weblog "standard_footer") diff --git a/app/src/main/webapp/themes/dispatch/sidebar.vm b/app/src/main/webapp/themes/dispatch/sidebar.vm new file mode 100644 index 0000000000..b2a24838c6 --- /dev/null +++ b/app/src/main/webapp/themes/dispatch/sidebar.vm @@ -0,0 +1 @@ + diff --git a/app/src/main/webapp/themes/dispatch/tags.vm b/app/src/main/webapp/themes/dispatch/tags.vm new file mode 100644 index 0000000000..f1722d0b3f --- /dev/null +++ b/app/src/main/webapp/themes/dispatch/tags.vm @@ -0,0 +1 @@ +#includeTemplate($model.weblog "standard_head")$model.tags / $model.weblog.name#includeTemplate($model.weblog "standard_header")

FILTER / TAG

$model.tags

#set($pager=$model.getWeblogEntriesPager())#showWeblogEntriesPager($pager)
#includeTemplate($model.weblog "standard_footer") diff --git a/app/src/main/webapp/themes/dispatch/theme.css b/app/src/main/webapp/themes/dispatch/theme.css new file mode 100644 index 0000000000..adf4f74b58 --- /dev/null +++ b/app/src/main/webapp/themes/dispatch/theme.css @@ -0,0 +1 @@ +:root{color-scheme:light dark;--bg:#f1f1ed;--paper:#fafaf7;--ink:#11120f;--muted:#676961;--grid:#cfd0c8;--acid:#d9ff43;--orange:#ff5b35;--mono:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;--sans:ui-sans-serif,system-ui,-apple-system,"Segoe UI",sans-serif}*{box-sizing:border-box}body{margin:0;background:var(--bg);color:var(--ink);font:1rem/1.6 var(--sans)}body:before{content:"";position:fixed;inset:0;pointer-events:none;opacity:.28;background-image:linear-gradient(var(--grid) 1px,transparent 1px),linear-gradient(90deg,var(--grid) 1px,transparent 1px);background-size:48px 48px;z-index:-1}a{color:inherit;text-underline-offset:.22em}a:hover{background:var(--acid);color:#111}img,video,iframe{max-width:100%;height:auto}.skip-link{position:absolute;left:-999px}.skip-link:focus{left:1rem;top:1rem;background:var(--acid);padding:.6rem;z-index:10}.masthead{border-bottom:2px solid var(--ink);display:grid;grid-template-columns:1fr auto 1fr;align-items:center;gap:2rem;padding:1rem clamp(1rem,4vw,3rem);background:var(--bg)}.wordmark{font:800 1.1rem var(--mono);text-decoration:none;text-transform:uppercase}.cursor{color:var(--orange)}.masthead nav ul{display:flex;gap:1.4rem;list-style:none;padding:0;margin:0}.masthead nav a{font:700 .72rem var(--mono);text-decoration:none;text-transform:uppercase}.masthead form{justify-self:end;display:flex;align-items:center;gap:.5rem}.masthead label{font:700 .65rem var(--mono)}.masthead input{width:6rem;border:1px solid var(--ink);background:var(--paper);color:var(--ink);padding:.4rem}.issue-header{max-width:1400px;margin:auto;padding:clamp(3rem,9vw,8rem) clamp(1rem,4vw,3rem);display:grid;grid-template-columns:2fr 1fr;align-items:end;border-bottom:2px solid var(--ink)}.label,.panel-label{font:800 .68rem var(--mono);letter-spacing:.1em}.issue-header h1{font:950 clamp(3.4rem,10vw,9rem)/.78 var(--sans);letter-spacing:-.075em;text-transform:uppercase;margin:.25em 0 0}.issue-header h1 span{color:var(--orange)}.issue-note{border-left:2px solid var(--ink);padding-left:2rem;margin-bottom:.5rem}.issue-note p{font-size:1.15rem}.issue-note a{font:800 .72rem var(--mono)}.publication-grid{max-width:1400px;margin:auto;display:grid;grid-template-columns:290px 1fr}.index-panel{border-right:2px solid var(--ink);padding:3rem 2rem}.index-panel ol{list-style:none;padding:0;margin:1rem 0 3rem}.index-panel li{border-top:1px solid var(--grid)}.index-panel li:last-child{border-bottom:1px solid var(--grid)}.index-panel li a{display:flex;justify-content:space-between;padding:.48rem 0;text-decoration:none;font:700 .76rem var(--mono);text-transform:uppercase}.panel-about{font-size:.88rem}.entries{padding:3rem clamp(1rem,5vw,5rem)}.dispatch{display:grid;grid-template-columns:3rem 1fr;gap:1.2rem;padding:0 0 4rem;margin-bottom:4rem;border-bottom:2px solid var(--ink)}.dispatch-number{font:800 .75rem var(--mono);background:var(--acid);color:#111;width:2.2rem;height:2.2rem;display:grid;place-items:center}.meta,.dispatch footer{display:flex;flex-wrap:wrap;gap:1rem;font:700 .69rem var(--mono);text-transform:uppercase;color:var(--muted)}.meta a,.dispatch footer a{text-decoration:none}.dispatch h1,.dispatch h2{font:900 clamp(2.1rem,5.2vw,5rem)/.91 var(--sans);letter-spacing:-.055em;margin:.35em 0;text-transform:uppercase}.dispatch h2 a{text-decoration:none}.entry-content{max-width:820px;font:1.08rem/1.75 var(--sans)}.entry-content h2,.entry-content h3{line-height:1.05;text-transform:uppercase}.entry-content blockquote{font-size:1.25rem;border:2px solid var(--ink);box-shadow:8px 8px 0 var(--acid);padding:1.2rem;margin:2rem 8px 2rem 0}pre{overflow:auto;background:#141712;color:#e9efdd;border-left:6px solid var(--acid);padding:1.3rem;font:14px/1.65 var(--mono)}code{font-family:var(--mono)}.dispatch footer{margin-top:2rem}.reading-shell{max-width:950px;margin:auto;padding:clamp(3rem,8vw,7rem) 1rem}.page-title{border-bottom:2px solid var(--ink);margin-bottom:4rem}.page-title h1{font:950 clamp(3rem,10vw,8rem)/.85 var(--sans);letter-spacing:-.07em;text-transform:uppercase;overflow-wrap:anywhere;margin:.25em 0}.query{margin:2rem 0 4rem}.query label{font:800 .7rem var(--mono)}.query div{display:flex;margin-top:.5rem}.query input{flex:1;min-width:0;border:2px solid var(--ink);background:var(--paper);color:var(--ink);padding:.9rem}.query button{border:2px solid var(--ink);background:var(--acid);color:#111;padding:.9rem 1.5rem;font:800 .75rem var(--mono)}.pager{margin:3rem 0}.pager ul{display:flex;justify-content:space-between;list-style:none;padding:0}.pager a{font:800 .72rem var(--mono)}.calendar{overflow:auto}.calendar table{border-collapse:collapse;width:100%;background:var(--paper)}.calendar td,.calendar th{border:1px solid var(--ink);padding:.6rem}.archive-list h2{font:800 1rem var(--mono)}.archive-list li{border-top:1px solid var(--grid);padding:.6rem}.site-footer{border-top:2px solid var(--ink);display:flex;justify-content:space-between;gap:2rem;padding:2rem clamp(1rem,4vw,3rem);font:700 .7rem var(--mono);text-transform:uppercase}.status i{display:inline-block;width:.65rem;height:.65rem;border-radius:50%;background:#39b86a;margin-right:.4rem}.comments input,.comments textarea{max-width:100%}@media(max-width:760px){.masthead{grid-template-columns:1fr auto;flex-wrap:wrap}.masthead nav{grid-column:1/-1;grid-row:2;overflow:auto}.masthead nav ul{width:max-content}.masthead form label{display:none}.issue-header{grid-template-columns:1fr}.issue-note{margin-top:2rem}.publication-grid{grid-template-columns:1fr}.index-panel{border-right:0;border-bottom:2px solid var(--ink)}.site-footer{flex-direction:column}.dispatch{grid-template-columns:2.3rem 1fr}}@media(prefers-color-scheme:dark){:root{--bg:#11120f;--paper:#1b1d19;--ink:#f1f1e9;--muted:#a5a79e;--grid:#343730;--acid:#cfff3d;--orange:#ff7756}.dispatch-number,.issue-note a:hover,.wordmark:hover{color:#111}.masthead input{border-color:var(--ink)}} diff --git a/app/src/main/webapp/themes/dispatch/theme.xml b/app/src/main/webapp/themes/dispatch/theme.xml new file mode 100644 index 0000000000..e363c1c3df --- /dev/null +++ b/app/src/main/webapp/themes/dispatch/theme.xml @@ -0,0 +1,17 @@ + + + + dispatchDispatchA precise, high-contrast publication theme built for code, essays, and deep archives.Apache Roller + custom.cssDispatch custom stylescustom.csstext/csscustom.cssvelocity + + + + + + + + + + + + diff --git a/app/src/main/webapp/themes/dispatch/weblog.vm b/app/src/main/webapp/themes/dispatch/weblog.vm new file mode 100644 index 0000000000..91c5469f23 --- /dev/null +++ b/app/src/main/webapp/themes/dispatch/weblog.vm @@ -0,0 +1 @@ +#includeTemplate($model.weblog "standard_head")$model.weblog.name#if($model.weblog.tagline) / $model.weblog.tagline#end#includeTemplate($model.weblog "standard_header")

INDEPENDENT WEBLOG / EST. 2002

Ideas,
adventures,
& source code.

#if($model.weblog.tagline)

$model.weblog.tagline

#endSUBSCRIBE TO THE SIGNAL →
#includeTemplate($model.weblog "sidebar")
#set($pager=$model.getWeblogEntriesPager())#showWeblogEntriesPager($pager)
#includeTemplate($model.weblog "standard_footer") diff --git a/app/src/main/webapp/themes/horizon/archives.vm b/app/src/main/webapp/themes/horizon/archives.vm new file mode 100644 index 0000000000..084f4f6c31 --- /dev/null +++ b/app/src/main/webapp/themes/horizon/archives.vm @@ -0,0 +1 @@ +#includeTemplate($model.weblog "standard_head")Archives — $model.weblog.name#includeTemplate($model.weblog "standard_header")

Since the beginning

Archives

Browse the complete history of $model.weblog.name.

#showWeblogEntryCalendarBig($model.weblog "nil")

Recent posts

#set($recentEntries=$model.weblog.getRecentWeblogEntries("nil",30))
    #foreach($recentEntry in $recentEntries)
  1. $recentEntry.title
  2. #end
#includeTemplate($model.weblog "standard_footer") diff --git a/app/src/main/webapp/themes/horizon/custom.css b/app/src/main/webapp/themes/horizon/custom.css new file mode 100644 index 0000000000..1a9e307368 --- /dev/null +++ b/app/src/main/webapp/themes/horizon/custom.css @@ -0,0 +1 @@ +/* Add weblog-specific Horizon overrides here. */ diff --git a/app/src/main/webapp/themes/horizon/day.vm b/app/src/main/webapp/themes/horizon/day.vm new file mode 100644 index 0000000000..a4bd00fa83 --- /dev/null +++ b/app/src/main/webapp/themes/horizon/day.vm @@ -0,0 +1 @@ +#foreach($entry in $entries)
#if($model.permalink)

$entry.title

#else

$entry.title

#end
#if($model.permalink)$entry.displayContent#else$entry.displayContent($url.entry($entry.anchor))#end
#if($entry.tags && $entry.tags.size()>0)#end#set($commentCount=$entry.commentCount)#if($entry.commentsStillAllowed || $commentCount>0)$commentCount comments#end#if($utils.isUserAuthorizedToAuthor($entry.website))Edit#end
#showTrackbackAutodiscovery($entry)
#end diff --git a/app/src/main/webapp/themes/horizon/entry.vm b/app/src/main/webapp/themes/horizon/entry.vm new file mode 100644 index 0000000000..00a0fcd7ae --- /dev/null +++ b/app/src/main/webapp/themes/horizon/entry.vm @@ -0,0 +1 @@ +#includeTemplate($model.weblog "standard_head")$model.weblogEntry.title — $model.weblog.name#includeTemplate($model.weblog "standard_header")
#set($pager=$model.getWeblogEntriesPager())#showWeblogEntriesPager($pager)#foreach($entry in $entries)
#showWeblogEntryComments($entry)#showWeblogEntryCommentForm($entry)
#end
#includeTemplate($model.weblog "standard_footer") diff --git a/app/src/main/webapp/themes/horizon/footer.vm b/app/src/main/webapp/themes/horizon/footer.vm new file mode 100644 index 0000000000..35fba99ce3 --- /dev/null +++ b/app/src/main/webapp/themes/horizon/footer.vm @@ -0,0 +1 @@ + diff --git a/app/src/main/webapp/themes/horizon/head.vm b/app/src/main/webapp/themes/horizon/head.vm new file mode 100644 index 0000000000..b5783fccd4 --- /dev/null +++ b/app/src/main/webapp/themes/horizon/head.vm @@ -0,0 +1,8 @@ + + + + + +#showAutodiscoveryLinks($model.weblog) +#showMetaDescription() +#showAnalyticsTrackingCode($model.weblog) diff --git a/app/src/main/webapp/themes/horizon/header.vm b/app/src/main/webapp/themes/horizon/header.vm new file mode 100644 index 0000000000..ae1f363549 --- /dev/null +++ b/app/src/main/webapp/themes/horizon/header.vm @@ -0,0 +1,8 @@ + + diff --git a/app/src/main/webapp/themes/horizon/preview.svg b/app/src/main/webapp/themes/horizon/preview.svg new file mode 100644 index 0000000000..0125f30ce7 --- /dev/null +++ b/app/src/main/webapp/themes/horizon/preview.svg @@ -0,0 +1 @@ +HorizonNOTES FROM THE JOURNEYStories worthkeeping.JUL 23, 2026 · GENERALCruising the Danube diff --git a/app/src/main/webapp/themes/horizon/search.vm b/app/src/main/webapp/themes/horizon/search.vm new file mode 100644 index 0000000000..5423b7a19b --- /dev/null +++ b/app/src/main/webapp/themes/horizon/search.vm @@ -0,0 +1 @@ +#includeTemplate($model.weblog "standard_head")Search — $model.weblog.name#includeTemplate($model.weblog "standard_header")

Search

Results for “$model.term”

$model.hits matches

#if($model.hits>0)#set($pager=$model.getWeblogEntriesPager())#showWeblogEntriesPager($pager)#else

No entries matched. Try a broader phrase.

#end
#includeTemplate($model.weblog "standard_footer") diff --git a/app/src/main/webapp/themes/horizon/sidebar.vm b/app/src/main/webapp/themes/horizon/sidebar.vm new file mode 100644 index 0000000000..6825fcbe1b --- /dev/null +++ b/app/src/main/webapp/themes/horizon/sidebar.vm @@ -0,0 +1 @@ + diff --git a/app/src/main/webapp/themes/horizon/tags.vm b/app/src/main/webapp/themes/horizon/tags.vm new file mode 100644 index 0000000000..3debe6546c --- /dev/null +++ b/app/src/main/webapp/themes/horizon/tags.vm @@ -0,0 +1 @@ +#includeTemplate($model.weblog "standard_head")$model.tags — $model.weblog.name#includeTemplate($model.weblog "standard_header")

Topic

$model.tags

#set($pager=$model.getWeblogEntriesPager())#showWeblogEntriesPager($pager)
#includeTemplate($model.weblog "standard_footer") diff --git a/app/src/main/webapp/themes/horizon/theme.css b/app/src/main/webapp/themes/horizon/theme.css new file mode 100644 index 0000000000..fe3ee7757d --- /dev/null +++ b/app/src/main/webapp/themes/horizon/theme.css @@ -0,0 +1 @@ +:root{color-scheme:light dark;--bg:#f7f3eb;--surface:#fffdf8;--ink:#28241f;--muted:#726b62;--line:#d9d0c2;--accent:#c94f32;--accent2:#1e6b64;--serif:ui-serif,Georgia,Cambria,"Times New Roman",serif;--sans:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif}*{box-sizing:border-box}html{scroll-behavior:smooth}body{margin:0;background:var(--bg);color:var(--ink);font:1rem/1.7 var(--sans);text-rendering:optimizeLegibility}a{color:inherit;text-decoration-color:color-mix(in srgb,var(--accent) 55%,transparent);text-underline-offset:.2em}a:hover{color:var(--accent)}img,video,iframe{max-width:100%;height:auto}.skip-link{position:absolute;left:-999px}.skip-link:focus{left:1rem;top:1rem;background:var(--surface);padding:.6rem 1rem;z-index:9}.sr-only{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0)}.site-header{border-bottom:1px solid var(--line);background:color-mix(in srgb,var(--bg) 88%,transparent);position:sticky;top:0;z-index:4;backdrop-filter:blur(12px)}.nav-shell{max-width:1180px;margin:auto;padding:1rem 1.5rem;display:flex;align-items:center;gap:2rem}.brand{font:700 1.2rem var(--serif);text-decoration:none}.site-nav{margin-left:auto}.site-nav ul{display:flex;gap:1.2rem;list-style:none;margin:0;padding:0}.site-nav a{text-decoration:none;font-size:.88rem}.quick-search input{width:8rem;border:1px solid var(--line);border-radius:2rem;background:var(--surface);color:var(--ink);padding:.55rem .9rem}.page-shell{max-width:1180px;margin:auto;padding:clamp(3rem,8vw,7rem) 1.5rem}.intro{max-width:800px;margin-bottom:clamp(3rem,7vw,6rem)}.eyebrow{text-transform:uppercase;letter-spacing:.16em;font-size:.72rem;font-weight:800;color:var(--accent)}.intro h1,.page-heading h1{font:600 clamp(3.4rem,10vw,7.8rem)/.92 var(--serif);letter-spacing:-.055em;margin:.2em 0}.lede{font:400 clamp(1.2rem,2.4vw,1.75rem)/1.45 var(--serif);color:var(--muted);max-width:42rem}.layout{display:grid;grid-template-columns:minmax(0,760px) minmax(220px,1fr);gap:clamp(3rem,8vw,8rem)}.post-card{padding:0 0 4rem;margin:0 0 4rem;border-bottom:1px solid var(--line)}.post-meta,.post-footer{display:flex;flex-wrap:wrap;gap:.55rem 1rem;color:var(--muted);font-size:.82rem}.post-meta a,.post-footer a{text-decoration:none}.post-title{font:600 clamp(2rem,5vw,3.7rem)/1.05 var(--serif);letter-spacing:-.035em;margin:.35em 0 .55em}.post-title a{text-decoration:none}.post-content{font-family:var(--serif);font-size:clamp(1.08rem,1.4vw,1.22rem)}.post-content :is(h2,h3,h4){line-height:1.2;margin-top:2em}.post-content blockquote{margin:2rem 0;padding:1rem 0 1rem 1.5rem;border-left:4px solid var(--accent);font-size:1.2em;color:var(--muted)}pre{overflow:auto;padding:1.2rem;border-radius:.6rem;background:#1e2423;color:#eff7f4;font:14px/1.6 ui-monospace,SFMono-Regular,Consolas,monospace}code{font-family:ui-monospace,SFMono-Regular,Consolas,monospace}.post-footer{justify-content:space-between;margin-top:2rem}.post-tags{display:flex;gap:.7rem;flex-wrap:wrap}.sidebar{font-size:.92rem}.sidebar section{margin-bottom:3rem}.sidebar h2,.recent h2{font:600 1.25rem var(--serif)}.tag-cloud{display:flex;gap:.5rem;flex-wrap:wrap}.tag-cloud a{border:1px solid var(--line);border-radius:2rem;padding:.22rem .7rem;text-decoration:none}.subscribe{display:flex;justify-content:space-between;background:var(--accent);color:white!important;padding:1rem 1.2rem;text-decoration:none;border-radius:.3rem}.article-shell{max-width:760px;margin:auto;padding:clamp(3rem,8vw,7rem) 1.5rem}.page-heading{margin-bottom:4rem}.page-heading h1{font-size:clamp(3rem,9vw,6rem)}.pager{display:flex;justify-content:space-between;gap:1rem;margin:2rem 0}.pager ul{display:contents}.pager li{list-style:none}.search-panel{margin:2rem 0 4rem}.search-panel label{display:block;font-weight:700;margin-bottom:.5rem}.search-panel div{display:flex}.search-panel input{flex:1;min-width:0;padding:.8rem;border:1px solid var(--line);background:var(--surface);color:var(--ink)}button{border:0;background:var(--accent);color:white;padding:.8rem 1.2rem;font-weight:700}.archive-calendar{overflow-x:auto}.archive-calendar table{width:100%;border-collapse:collapse}.archive-calendar td,.archive-calendar th{padding:.6rem;border:1px solid var(--line)}.recent ol{padding-left:1.2rem}.site-footer{max-width:1180px;margin:2rem auto 0;padding:3rem 1.5rem;border-top:1px solid var(--line);display:grid;grid-template-columns:1fr auto;gap:1rem}.site-footer p{color:var(--muted);margin:.25rem 0}.site-footer small{grid-column:1/-1;color:var(--muted)}.footer-links{display:flex;gap:1rem}.comments-area input,.comments-area textarea{max-width:100%}@media(max-width:760px){.nav-shell{flex-wrap:wrap;gap:1rem}.site-nav{order:3;width:100%;overflow:auto}.site-nav ul{width:max-content}.quick-search{margin-left:auto}.layout{grid-template-columns:1fr}.sidebar{border-top:1px solid var(--line);padding-top:2rem}.site-footer{grid-template-columns:1fr}.intro h1{overflow-wrap:anywhere}}@media(prefers-color-scheme:dark){:root{--bg:#181916;--surface:#22231f;--ink:#f3eee5;--muted:#aaa398;--line:#3d3d36;--accent:#f27b5d;--accent2:#75c4b8}}@media(prefers-reduced-motion:reduce){html{scroll-behavior:auto}} diff --git a/app/src/main/webapp/themes/horizon/theme.xml b/app/src/main/webapp/themes/horizon/theme.xml new file mode 100644 index 0000000000..5bd3b791cb --- /dev/null +++ b/app/src/main/webapp/themes/horizon/theme.xml @@ -0,0 +1,20 @@ + + + + horizonHorizon + A warm, typography-first editorial theme for stories, travel, and technical writing. + Apache Roller + + custom.cssHorizon custom stylescustom.csstext/csscustom.cssvelocity + + + + + + + + + + + + diff --git a/app/src/main/webapp/themes/horizon/weblog.vm b/app/src/main/webapp/themes/horizon/weblog.vm new file mode 100644 index 0000000000..72445678d4 --- /dev/null +++ b/app/src/main/webapp/themes/horizon/weblog.vm @@ -0,0 +1,6 @@ +#includeTemplate($model.weblog "standard_head")$model.weblog.name#if($model.weblog.tagline) — $model.weblog.tagline#end +#includeTemplate($model.weblog "standard_header") +
+

Notes from the journey

$model.weblog.name

#if($model.weblog.tagline)

$model.weblog.tagline

#end
+
#set($pager=$model.getWeblogEntriesPager())#showWeblogEntriesPager($pager)
#includeTemplate($model.weblog "sidebar")
+
#includeTemplate($model.weblog "standard_footer") diff --git a/app/src/test/java/org/apache/roller/weblogger/business/ThemeManagerTest.java b/app/src/test/java/org/apache/roller/weblogger/business/ThemeManagerTest.java index b4584c44d7..4269203eed 100644 --- a/app/src/test/java/org/apache/roller/weblogger/business/ThemeManagerTest.java +++ b/app/src/test/java/org/apache/roller/weblogger/business/ThemeManagerTest.java @@ -51,10 +51,15 @@ public void testThemeAssumptions() throws Exception { assertNotNull( themeManager.getTheme("basic") ); assertNotNull( themeManager.getTheme("basic").getStylesheet() ); assertNull( themeManager.getTheme("frontpage").getStylesheet() ); + assertNotNull( themeManager.getTheme("horizon") ); + assertNotNull( themeManager.getTheme("horizon").getStylesheet() ); + assertNotNull( themeManager.getTheme("alpenglow") ); + assertNotNull( themeManager.getTheme("alpenglow").getStylesheet() ); + assertNotNull( themeManager.getTheme("dispatch") ); + assertNotNull( themeManager.getTheme("dispatch").getStylesheet() ); } } - From 421183331967de40c723d018fcaefa2e350de0ca Mon Sep 17 00:00:00 2001 From: Matt Raible Date: Thu, 13 Aug 2026 09:44:33 -0600 Subject: [PATCH 2/4] Format the new Velocity templates Expand the compact theme templates into readable, consistently indented HTML and Velocity control flow. --- .../main/webapp/themes/alpenglow/archives.vm | 28 ++++++++++++- app/src/main/webapp/themes/alpenglow/day.vm | 29 ++++++++++++- app/src/main/webapp/themes/alpenglow/entry.vm | 19 ++++++++- .../main/webapp/themes/alpenglow/footer.vm | 11 ++++- app/src/main/webapp/themes/alpenglow/head.vm | 7 +++- .../main/webapp/themes/alpenglow/header.vm | 10 ++++- .../main/webapp/themes/alpenglow/search.vm | 28 ++++++++++++- .../main/webapp/themes/alpenglow/sidebar.vm | 24 ++++++++++- app/src/main/webapp/themes/alpenglow/tags.vm | 20 ++++++++- .../main/webapp/themes/alpenglow/weblog.vm | 41 ++++++++++++++++++- .../main/webapp/themes/dispatch/archives.vm | 28 ++++++++++++- app/src/main/webapp/themes/dispatch/day.vm | 31 +++++++++++++- app/src/main/webapp/themes/dispatch/entry.vm | 19 ++++++++- app/src/main/webapp/themes/dispatch/footer.vm | 9 +++- app/src/main/webapp/themes/dispatch/head.vm | 7 +++- app/src/main/webapp/themes/dispatch/header.vm | 13 +++++- app/src/main/webapp/themes/dispatch/search.vm | 30 +++++++++++++- .../main/webapp/themes/dispatch/sidebar.vm | 21 +++++++++- app/src/main/webapp/themes/dispatch/tags.vm | 20 ++++++++- app/src/main/webapp/themes/dispatch/weblog.vm | 39 +++++++++++++++++- .../main/webapp/themes/horizon/archives.vm | 29 ++++++++++++- app/src/main/webapp/themes/horizon/day.vm | 35 +++++++++++++++- app/src/main/webapp/themes/horizon/entry.vm | 19 ++++++++- app/src/main/webapp/themes/horizon/footer.vm | 12 +++++- app/src/main/webapp/themes/horizon/head.vm | 14 +++---- app/src/main/webapp/themes/horizon/header.vm | 5 ++- app/src/main/webapp/themes/horizon/search.vm | 31 +++++++++++++- app/src/main/webapp/themes/horizon/sidebar.vm | 24 ++++++++++- app/src/main/webapp/themes/horizon/tags.vm | 20 ++++++++- app/src/main/webapp/themes/horizon/weblog.vm | 33 ++++++++++++--- 30 files changed, 614 insertions(+), 42 deletions(-) diff --git a/app/src/main/webapp/themes/alpenglow/archives.vm b/app/src/main/webapp/themes/alpenglow/archives.vm index 7a5234594e..1d22bf4921 100644 --- a/app/src/main/webapp/themes/alpenglow/archives.vm +++ b/app/src/main/webapp/themes/alpenglow/archives.vm @@ -1 +1,27 @@ -#includeTemplate($model.weblog "standard_head")Archives — $model.weblog.name#includeTemplate($model.weblog "standard_header")

Base camp

Archives

#showWeblogEntryCalendarBig($model.weblog "nil")

Thirty recent stories

#set($recentEntries=$model.weblog.getRecentWeblogEntries("nil",30))
    #foreach($recentEntry in $recentEntries)
  1. $recentEntry.title
  2. #end
#includeTemplate($model.weblog "standard_footer") + + + + #includeTemplate($model.weblog "standard_head") + Archives — $model.weblog.name + + + #includeTemplate($model.weblog "standard_header") +
+
+

Base camp

+

Archives

+
+
#showWeblogEntryCalendarBig($model.weblog "nil")
+
+

Thirty recent stories

+ #set($recentEntries=$model.weblog.getRecentWeblogEntries("nil",30)) +
    + #foreach($recentEntry in $recentEntries) +
  1. $recentEntry.title
  2. + #end +
+
+
+ #includeTemplate($model.weblog "standard_footer") + + diff --git a/app/src/main/webapp/themes/alpenglow/day.vm b/app/src/main/webapp/themes/alpenglow/day.vm index 709b27b7ee..dc4bf4d9d7 100644 --- a/app/src/main/webapp/themes/alpenglow/day.vm +++ b/app/src/main/webapp/themes/alpenglow/day.vm @@ -1 +1,28 @@ -#foreach($entry in $entries)
$entry.category.name
#if($model.permalink)

$entry.title

#else

$entry.title

#end
#if($model.permalink)$entry.displayContent#else$entry.displayContent($url.entry($entry.anchor))#end
#if($entry.tags)#foreach($tag in $entry.tags)#$tag.name#end#end#set($commentCount=$entry.commentCount)#if($entry.commentsStillAllowed || $commentCount>0)$commentCount comments#end
#end +#foreach($entry in $entries) +
+ +
+
+ $entry.category.name + +
+ #if($model.permalink) +

$entry.title

+ #else +

$entry.title

+ #end +
+ #if($model.permalink)$entry.displayContent#else$entry.displayContent($url.entry($entry.anchor))#end +
+
+ #if($entry.tags)#foreach($tag in $entry.tags) + #$tag.name + #end#end#set($commentCount=$entry.commentCount)#if($entry.commentsStillAllowed || $commentCount>0) + $commentCount comments + #end +
+
+
+#end diff --git a/app/src/main/webapp/themes/alpenglow/entry.vm b/app/src/main/webapp/themes/alpenglow/entry.vm index f62fc85274..ab33e91238 100644 --- a/app/src/main/webapp/themes/alpenglow/entry.vm +++ b/app/src/main/webapp/themes/alpenglow/entry.vm @@ -1 +1,18 @@ -#includeTemplate($model.weblog "standard_head")$model.weblogEntry.title — $model.weblog.name#includeTemplate($model.weblog "standard_header")
#set($pager=$model.getWeblogEntriesPager())#showWeblogEntriesPager($pager)#foreach($entry in $entries)
#showWeblogEntryComments($entry)#showWeblogEntryCommentForm($entry)
#end
#includeTemplate($model.weblog "standard_footer") + + + + #includeTemplate($model.weblog "standard_head") + $model.weblogEntry.title — $model.weblog.name + + + #includeTemplate($model.weblog "standard_header") +
+ #set($pager=$model.getWeblogEntriesPager())#showWeblogEntriesPager($pager) + + #foreach($entry in $entries) +
#showWeblogEntryComments($entry)#showWeblogEntryCommentForm($entry)
+ #end +
+ #includeTemplate($model.weblog "standard_footer") + + diff --git a/app/src/main/webapp/themes/alpenglow/footer.vm b/app/src/main/webapp/themes/alpenglow/footer.vm index 64c52421b2..c6f20cc2a1 100644 --- a/app/src/main/webapp/themes/alpenglow/footer.vm +++ b/app/src/main/webapp/themes/alpenglow/footer.vm @@ -1 +1,10 @@ -

$model.weblog.name — #if($model.weblog.tagline)$model.weblog.tagline#elseField notes from a life in motion.#end

+
+

+ $model.weblog.name + — #if($model.weblog.tagline)$model.weblog.tagline#elseField notes from a life in motion.#end +

+ +
diff --git a/app/src/main/webapp/themes/alpenglow/head.vm b/app/src/main/webapp/themes/alpenglow/head.vm index ddc5f6043d..ecd7f763e2 100644 --- a/app/src/main/webapp/themes/alpenglow/head.vm +++ b/app/src/main/webapp/themes/alpenglow/head.vm @@ -1 +1,6 @@ -#showAutodiscoveryLinks($model.weblog)#showMetaDescription()#showAnalyticsTrackingCode($model.weblog) + + + + + +#showAutodiscoveryLinks($model.weblog)#showMetaDescription()#showAnalyticsTrackingCode($model.weblog) diff --git a/app/src/main/webapp/themes/alpenglow/header.vm b/app/src/main/webapp/themes/alpenglow/header.vm index c935fdf0bb..4550c87502 100644 --- a/app/src/main/webapp/themes/alpenglow/header.vm +++ b/app/src/main/webapp/themes/alpenglow/header.vm @@ -1 +1,9 @@ - + + diff --git a/app/src/main/webapp/themes/alpenglow/search.vm b/app/src/main/webapp/themes/alpenglow/search.vm index 2dabd354f5..b1cac61056 100644 --- a/app/src/main/webapp/themes/alpenglow/search.vm +++ b/app/src/main/webapp/themes/alpenglow/search.vm @@ -1 +1,27 @@ -#includeTemplate($model.weblog "standard_head")Search — $model.weblog.name#includeTemplate($model.weblog "standard_header")

Search the trail

“$model.term”

$model.hits results

#if($model.hits>0)#set($pager=$model.getWeblogEntriesPager())#showWeblogEntriesPager($pager)#else

No stories found. Try another trail.

#end
#includeTemplate($model.weblog "standard_footer") + + + + #includeTemplate($model.weblog "standard_head") + Search — $model.weblog.name + + + #includeTemplate($model.weblog "standard_header") +
+
+

Search the trail

+

“$model.term”

+

$model.hits results

+
+ + #if($model.hits>0)#set($pager=$model.getWeblogEntriesPager())#showWeblogEntriesPager($pager) + + #else +

No stories found. Try another trail.

+ #end +
+ #includeTemplate($model.weblog "standard_footer") + + diff --git a/app/src/main/webapp/themes/alpenglow/sidebar.vm b/app/src/main/webapp/themes/alpenglow/sidebar.vm index 7fc3a75ac0..62afe55039 100644 --- a/app/src/main/webapp/themes/alpenglow/sidebar.vm +++ b/app/src/main/webapp/themes/alpenglow/sidebar.vm @@ -1 +1,23 @@ - + diff --git a/app/src/main/webapp/themes/alpenglow/tags.vm b/app/src/main/webapp/themes/alpenglow/tags.vm index 46687e7edf..5f857fa9c0 100644 --- a/app/src/main/webapp/themes/alpenglow/tags.vm +++ b/app/src/main/webapp/themes/alpenglow/tags.vm @@ -1 +1,19 @@ -#includeTemplate($model.weblog "standard_head")$model.tags — $model.weblog.name#includeTemplate($model.weblog "standard_header")

Stories filed under

$model.tags

#set($pager=$model.getWeblogEntriesPager())#showWeblogEntriesPager($pager)
#includeTemplate($model.weblog "standard_footer") + + + + #includeTemplate($model.weblog "standard_head") + $model.tags — $model.weblog.name + + + #includeTemplate($model.weblog "standard_header") +
+
+

Stories filed under

+

$model.tags

+
+ #set($pager=$model.getWeblogEntriesPager())#showWeblogEntriesPager($pager) + +
+ #includeTemplate($model.weblog "standard_footer") + + diff --git a/app/src/main/webapp/themes/alpenglow/weblog.vm b/app/src/main/webapp/themes/alpenglow/weblog.vm index b795bcca33..d9adcdb7f8 100644 --- a/app/src/main/webapp/themes/alpenglow/weblog.vm +++ b/app/src/main/webapp/themes/alpenglow/weblog.vm @@ -1 +1,40 @@ -#includeTemplate($model.weblog "standard_head")$model.weblog.name#if($model.weblog.tagline) — $model.weblog.tagline#end#includeTemplate($model.weblog "standard_header")

From Colorado to everywhere

Life is better
with a little
altitude.

#if($model.weblog.tagline)

$model.weblog.tagline

#end
#includeTemplate($model.weblog "sidebar")
#set($pager=$model.getWeblogEntriesPager())#showWeblogEntriesPager($pager)
#includeTemplate($model.weblog "standard_footer") + + + + #includeTemplate($model.weblog "standard_head") + $model.weblog.name#if($model.weblog.tagline) — $model.weblog.tagline#end + + + #includeTemplate($model.weblog "standard_header") +
+
+
+

From Colorado to everywhere

+

+ Life is better +
+ with a little +
+ altitude. +

+ #if($model.weblog.tagline) +

$model.weblog.tagline

+ #end +
+ +
+
+ #includeTemplate($model.weblog "sidebar") +
+ #set($pager=$model.getWeblogEntriesPager())#showWeblogEntriesPager($pager) + +
+
+
+ #includeTemplate($model.weblog "standard_footer") + + diff --git a/app/src/main/webapp/themes/dispatch/archives.vm b/app/src/main/webapp/themes/dispatch/archives.vm index 828abf51d0..a09c6b2d02 100644 --- a/app/src/main/webapp/themes/dispatch/archives.vm +++ b/app/src/main/webapp/themes/dispatch/archives.vm @@ -1 +1,27 @@ -#includeTemplate($model.weblog "standard_head")Archives / $model.weblog.name#includeTemplate($model.weblog "standard_header")

DATABASE / ALL ENTRIES

Archive

#showWeblogEntryCalendarBig($model.weblog "nil")

LATEST_30

#set($recentEntries=$model.weblog.getRecentWeblogEntries("nil",30))
    #foreach($recentEntry in $recentEntries)
  1. $recentEntry.title
  2. #end
#includeTemplate($model.weblog "standard_footer") + + + + #includeTemplate($model.weblog "standard_head") + Archives / $model.weblog.name + + + #includeTemplate($model.weblog "standard_header") +
+
+

DATABASE / ALL ENTRIES

+

Archive

+
+
#showWeblogEntryCalendarBig($model.weblog "nil")
+
+

LATEST_30

+ #set($recentEntries=$model.weblog.getRecentWeblogEntries("nil",30)) +
    + #foreach($recentEntry in $recentEntries) +
  1. $recentEntry.title
  2. + #end +
+
+
+ #includeTemplate($model.weblog "standard_footer") + + diff --git a/app/src/main/webapp/themes/dispatch/day.vm b/app/src/main/webapp/themes/dispatch/day.vm index 3c391ae88a..7e36e259a7 100644 --- a/app/src/main/webapp/themes/dispatch/day.vm +++ b/app/src/main/webapp/themes/dispatch/day.vm @@ -1 +1,30 @@ -#foreach($entry in $entries)
#if($velocityCount<10)0#end$velocityCount
/$entry.category.name
#if($model.permalink)

$entry.title

#else

$entry.title

#end
#if($model.permalink)$entry.displayContent#else$entry.displayContent($url.entry($entry.anchor))#end
#if($entry.tags)#foreach($tag in $entry.tags)[$tag.name]#end#end#set($commentCount=$entry.commentCount)#if($entry.commentsStillAllowed || $commentCount>0)COMMENTS($commentCount)#end#if($utils.isUserAuthorizedToAuthor($entry.website))EDIT#end
#end +#foreach($entry in $entries) +
+
#if($velocityCount<10)0#end$velocityCount
+
+
+ + /$entry.category.name +
+ #if($model.permalink) +

$entry.title

+ #else +

$entry.title

+ #end +
+ #if($model.permalink)$entry.displayContent#else$entry.displayContent($url.entry($entry.anchor))#end +
+
+ #if($entry.tags)#foreach($tag in $entry.tags) + [$tag.name] + #end#end#set($commentCount=$entry.commentCount)#if($entry.commentsStillAllowed || $commentCount>0) + COMMENTS($commentCount) + #end#if($utils.isUserAuthorizedToAuthor($entry.website)) + EDIT + #end +
+
+
+#end diff --git a/app/src/main/webapp/themes/dispatch/entry.vm b/app/src/main/webapp/themes/dispatch/entry.vm index 5d0da49617..80e6df89b2 100644 --- a/app/src/main/webapp/themes/dispatch/entry.vm +++ b/app/src/main/webapp/themes/dispatch/entry.vm @@ -1 +1,18 @@ -#includeTemplate($model.weblog "standard_head")$model.weblogEntry.title / $model.weblog.name#includeTemplate($model.weblog "standard_header")
#set($pager=$model.getWeblogEntriesPager())#showWeblogEntriesPager($pager)#foreach($entry in $entries)
#showWeblogEntryComments($entry)#showWeblogEntryCommentForm($entry)
#end
#includeTemplate($model.weblog "standard_footer") + + + + #includeTemplate($model.weblog "standard_head") + $model.weblogEntry.title / $model.weblog.name + + + #includeTemplate($model.weblog "standard_header") +
+ #set($pager=$model.getWeblogEntriesPager())#showWeblogEntriesPager($pager) + + #foreach($entry in $entries) +
#showWeblogEntryComments($entry)#showWeblogEntryCommentForm($entry)
+ #end +
+ #includeTemplate($model.weblog "standard_footer") + + diff --git a/app/src/main/webapp/themes/dispatch/footer.vm b/app/src/main/webapp/themes/dispatch/footer.vm index f727d2d7e8..a12a04d529 100644 --- a/app/src/main/webapp/themes/dispatch/footer.vm +++ b/app/src/main/webapp/themes/dispatch/footer.vm @@ -1 +1,8 @@ -
Publishing since the early web$model.weblog.nameATOM.XML
+
+ + + Publishing since the early web + + $model.weblog.name + ATOM.XML +
diff --git a/app/src/main/webapp/themes/dispatch/head.vm b/app/src/main/webapp/themes/dispatch/head.vm index ddc5f6043d..ecd7f763e2 100644 --- a/app/src/main/webapp/themes/dispatch/head.vm +++ b/app/src/main/webapp/themes/dispatch/head.vm @@ -1 +1,6 @@ -#showAutodiscoveryLinks($model.weblog)#showMetaDescription()#showAnalyticsTrackingCode($model.weblog) + + + + + +#showAutodiscoveryLinks($model.weblog)#showMetaDescription()#showAnalyticsTrackingCode($model.weblog) diff --git a/app/src/main/webapp/themes/dispatch/header.vm b/app/src/main/webapp/themes/dispatch/header.vm index fa3572c594..473d396379 100644 --- a/app/src/main/webapp/themes/dispatch/header.vm +++ b/app/src/main/webapp/themes/dispatch/header.vm @@ -1 +1,12 @@ -
$model.weblog.name_
+ +
+ + $model.weblog.name + _ + + +
+ + +
+
diff --git a/app/src/main/webapp/themes/dispatch/search.vm b/app/src/main/webapp/themes/dispatch/search.vm index 0e877c684a..090a93a3d3 100644 --- a/app/src/main/webapp/themes/dispatch/search.vm +++ b/app/src/main/webapp/themes/dispatch/search.vm @@ -1 +1,29 @@ -#includeTemplate($model.weblog "standard_head")Search / $model.weblog.name#includeTemplate($model.weblog "standard_header")

QUERY / $model.hits MATCHES

$model.term

#if($model.hits>0)#set($pager=$model.getWeblogEntriesPager())#showWeblogEntriesPager($pager)#else

NO_MATCHES_FOUND

#end
#includeTemplate($model.weblog "standard_footer") + + + + #includeTemplate($model.weblog "standard_head") + Search / $model.weblog.name + + + #includeTemplate($model.weblog "standard_header") +
+
+

QUERY / $model.hits MATCHES

+

$model.term

+
+
+ +
+ + +
+
+ #if($model.hits>0)#set($pager=$model.getWeblogEntriesPager())#showWeblogEntriesPager($pager) + + #else +

NO_MATCHES_FOUND

+ #end +
+ #includeTemplate($model.weblog "standard_footer") + + diff --git a/app/src/main/webapp/themes/dispatch/sidebar.vm b/app/src/main/webapp/themes/dispatch/sidebar.vm index b2a24838c6..5a33dd2a7a 100644 --- a/app/src/main/webapp/themes/dispatch/sidebar.vm +++ b/app/src/main/webapp/themes/dispatch/sidebar.vm @@ -1 +1,20 @@ - + diff --git a/app/src/main/webapp/themes/dispatch/tags.vm b/app/src/main/webapp/themes/dispatch/tags.vm index f1722d0b3f..db0f2090dd 100644 --- a/app/src/main/webapp/themes/dispatch/tags.vm +++ b/app/src/main/webapp/themes/dispatch/tags.vm @@ -1 +1,19 @@ -#includeTemplate($model.weblog "standard_head")$model.tags / $model.weblog.name#includeTemplate($model.weblog "standard_header")

FILTER / TAG

$model.tags

#set($pager=$model.getWeblogEntriesPager())#showWeblogEntriesPager($pager)
#includeTemplate($model.weblog "standard_footer") + + + + #includeTemplate($model.weblog "standard_head") + $model.tags / $model.weblog.name + + + #includeTemplate($model.weblog "standard_header") +
+
+

FILTER / TAG

+

$model.tags

+
+ #set($pager=$model.getWeblogEntriesPager())#showWeblogEntriesPager($pager) + +
+ #includeTemplate($model.weblog "standard_footer") + + diff --git a/app/src/main/webapp/themes/dispatch/weblog.vm b/app/src/main/webapp/themes/dispatch/weblog.vm index 91c5469f23..c65baf0241 100644 --- a/app/src/main/webapp/themes/dispatch/weblog.vm +++ b/app/src/main/webapp/themes/dispatch/weblog.vm @@ -1 +1,38 @@ -#includeTemplate($model.weblog "standard_head")$model.weblog.name#if($model.weblog.tagline) / $model.weblog.tagline#end#includeTemplate($model.weblog "standard_header")

INDEPENDENT WEBLOG / EST. 2002

Ideas,
adventures,
& source code.

#if($model.weblog.tagline)

$model.weblog.tagline

#endSUBSCRIBE TO THE SIGNAL →
#includeTemplate($model.weblog "sidebar")
#set($pager=$model.getWeblogEntriesPager())#showWeblogEntriesPager($pager)
#includeTemplate($model.weblog "standard_footer") + + + + #includeTemplate($model.weblog "standard_head") + $model.weblog.name#if($model.weblog.tagline) / $model.weblog.tagline#end + + + #includeTemplate($model.weblog "standard_header") +
+
+
+

INDEPENDENT WEBLOG / EST. 2002

+

+ Ideas, +
+ adventures, +
+ & source code. +

+
+
+ #if($model.weblog.tagline) +

$model.weblog.tagline

+ #end + SUBSCRIBE TO THE SIGNAL → +
+
+
+ #includeTemplate($model.weblog "sidebar") +
+ #set($pager=$model.getWeblogEntriesPager())#showWeblogEntriesPager($pager) + +
+
+
+ #includeTemplate($model.weblog "standard_footer") + + diff --git a/app/src/main/webapp/themes/horizon/archives.vm b/app/src/main/webapp/themes/horizon/archives.vm index 084f4f6c31..dc37dea4cc 100644 --- a/app/src/main/webapp/themes/horizon/archives.vm +++ b/app/src/main/webapp/themes/horizon/archives.vm @@ -1 +1,28 @@ -#includeTemplate($model.weblog "standard_head")Archives — $model.weblog.name#includeTemplate($model.weblog "standard_header")

Since the beginning

Archives

Browse the complete history of $model.weblog.name.

#showWeblogEntryCalendarBig($model.weblog "nil")

Recent posts

#set($recentEntries=$model.weblog.getRecentWeblogEntries("nil",30))
    #foreach($recentEntry in $recentEntries)
  1. $recentEntry.title
  2. #end
#includeTemplate($model.weblog "standard_footer") + + + + #includeTemplate($model.weblog "standard_head") + Archives — $model.weblog.name + + + #includeTemplate($model.weblog "standard_header") +
+
+

Since the beginning

+

Archives

+

Browse the complete history of $model.weblog.name.

+
+
#showWeblogEntryCalendarBig($model.weblog "nil")
+
+

Recent posts

+ #set($recentEntries=$model.weblog.getRecentWeblogEntries("nil",30)) +
    + #foreach($recentEntry in $recentEntries) +
  1. $recentEntry.title
  2. + #end +
+
+
+ #includeTemplate($model.weblog "standard_footer") + + diff --git a/app/src/main/webapp/themes/horizon/day.vm b/app/src/main/webapp/themes/horizon/day.vm index a4bd00fa83..70795e11cc 100644 --- a/app/src/main/webapp/themes/horizon/day.vm +++ b/app/src/main/webapp/themes/horizon/day.vm @@ -1 +1,34 @@ -#foreach($entry in $entries)
#if($model.permalink)

$entry.title

#else

$entry.title

#end
#if($model.permalink)$entry.displayContent#else$entry.displayContent($url.entry($entry.anchor))#end
#if($entry.tags && $entry.tags.size()>0)#end#set($commentCount=$entry.commentCount)#if($entry.commentsStillAllowed || $commentCount>0)$commentCount comments#end#if($utils.isUserAuthorizedToAuthor($entry.website))Edit#end
#showTrackbackAutodiscovery($entry)
#end +#foreach($entry in $entries) +
+ + + #if($model.permalink) +

$entry.title

+ #else +

$entry.title

+ #end +
+ #if($model.permalink)$entry.displayContent#else$entry.displayContent($url.entry($entry.anchor))#end +
+
+ #if($entry.tags && $entry.tags.size()>0) + + #end#set($commentCount=$entry.commentCount)#if($entry.commentsStillAllowed || $commentCount>0) + $commentCount comments + #end#if($utils.isUserAuthorizedToAuthor($entry.website)) + Edit + #end +
+ #showTrackbackAutodiscovery($entry) +
+#end diff --git a/app/src/main/webapp/themes/horizon/entry.vm b/app/src/main/webapp/themes/horizon/entry.vm index 00a0fcd7ae..a975d1c7fd 100644 --- a/app/src/main/webapp/themes/horizon/entry.vm +++ b/app/src/main/webapp/themes/horizon/entry.vm @@ -1 +1,18 @@ -#includeTemplate($model.weblog "standard_head")$model.weblogEntry.title — $model.weblog.name#includeTemplate($model.weblog "standard_header")
#set($pager=$model.getWeblogEntriesPager())#showWeblogEntriesPager($pager)#foreach($entry in $entries)
#showWeblogEntryComments($entry)#showWeblogEntryCommentForm($entry)
#end
#includeTemplate($model.weblog "standard_footer") + + + + #includeTemplate($model.weblog "standard_head") + $model.weblogEntry.title — $model.weblog.name + + + #includeTemplate($model.weblog "standard_header") +
+ #set($pager=$model.getWeblogEntriesPager())#showWeblogEntriesPager($pager) + + #foreach($entry in $entries) +
#showWeblogEntryComments($entry)#showWeblogEntryCommentForm($entry)
+ #end +
+ #includeTemplate($model.weblog "standard_footer") + + diff --git a/app/src/main/webapp/themes/horizon/footer.vm b/app/src/main/webapp/themes/horizon/footer.vm index 35fba99ce3..ad0d7bfc12 100644 --- a/app/src/main/webapp/themes/horizon/footer.vm +++ b/app/src/main/webapp/themes/horizon/footer.vm @@ -1 +1,11 @@ -
$model.weblog.name

#if($model.weblog.tagline)$model.weblog.tagline#else Stories worth keeping.#end

© $utils.formatDate($utils.now, "yyyy") $model.weblog.creator.fullName
+
+
+ $model.weblog.name +

#if($model.weblog.tagline)$model.weblog.tagline#else Stories worth keeping.#end

+
+ + © $utils.formatDate($utils.now, "yyyy") $model.weblog.creator.fullName +
diff --git a/app/src/main/webapp/themes/horizon/head.vm b/app/src/main/webapp/themes/horizon/head.vm index b5783fccd4..af51ecc8d5 100644 --- a/app/src/main/webapp/themes/horizon/head.vm +++ b/app/src/main/webapp/themes/horizon/head.vm @@ -1,8 +1,6 @@ - - - - - -#showAutodiscoveryLinks($model.weblog) -#showMetaDescription() -#showAnalyticsTrackingCode($model.weblog) + + + + + +#showAutodiscoveryLinks($model.weblog) #showMetaDescription() #showAnalyticsTrackingCode($model.weblog) diff --git a/app/src/main/webapp/themes/horizon/header.vm b/app/src/main/webapp/themes/horizon/header.vm index ae1f363549..8f1c8702e8 100644 --- a/app/src/main/webapp/themes/horizon/header.vm +++ b/app/src/main/webapp/themes/horizon/header.vm @@ -3,6 +3,9 @@ diff --git a/app/src/main/webapp/themes/horizon/search.vm b/app/src/main/webapp/themes/horizon/search.vm index 5423b7a19b..a0afd66cd7 100644 --- a/app/src/main/webapp/themes/horizon/search.vm +++ b/app/src/main/webapp/themes/horizon/search.vm @@ -1 +1,30 @@ -#includeTemplate($model.weblog "standard_head")Search — $model.weblog.name#includeTemplate($model.weblog "standard_header")

Search

Results for “$model.term”

$model.hits matches

#if($model.hits>0)#set($pager=$model.getWeblogEntriesPager())#showWeblogEntriesPager($pager)#else

No entries matched. Try a broader phrase.

#end
#includeTemplate($model.weblog "standard_footer") + + + + #includeTemplate($model.weblog "standard_head") + Search — $model.weblog.name + + + #includeTemplate($model.weblog "standard_header") +
+
+

Search

+

Results for “$model.term”

+

$model.hits matches

+
+
+ +
+ + +
+
+ #if($model.hits>0)#set($pager=$model.getWeblogEntriesPager())#showWeblogEntriesPager($pager) + + #else +

No entries matched. Try a broader phrase.

+ #end +
+ #includeTemplate($model.weblog "standard_footer") + + diff --git a/app/src/main/webapp/themes/horizon/sidebar.vm b/app/src/main/webapp/themes/horizon/sidebar.vm index 6825fcbe1b..598b1cc373 100644 --- a/app/src/main/webapp/themes/horizon/sidebar.vm +++ b/app/src/main/webapp/themes/horizon/sidebar.vm @@ -1 +1,23 @@ - + diff --git a/app/src/main/webapp/themes/horizon/tags.vm b/app/src/main/webapp/themes/horizon/tags.vm index 3debe6546c..f63ff842d8 100644 --- a/app/src/main/webapp/themes/horizon/tags.vm +++ b/app/src/main/webapp/themes/horizon/tags.vm @@ -1 +1,19 @@ -#includeTemplate($model.weblog "standard_head")$model.tags — $model.weblog.name#includeTemplate($model.weblog "standard_header")

Topic

$model.tags

#set($pager=$model.getWeblogEntriesPager())#showWeblogEntriesPager($pager)
#includeTemplate($model.weblog "standard_footer") + + + + #includeTemplate($model.weblog "standard_head") + $model.tags — $model.weblog.name + + + #includeTemplate($model.weblog "standard_header") +
+
+

Topic

+

$model.tags

+
+ #set($pager=$model.getWeblogEntriesPager())#showWeblogEntriesPager($pager) + +
+ #includeTemplate($model.weblog "standard_footer") + + diff --git a/app/src/main/webapp/themes/horizon/weblog.vm b/app/src/main/webapp/themes/horizon/weblog.vm index 72445678d4..8e1b98d5da 100644 --- a/app/src/main/webapp/themes/horizon/weblog.vm +++ b/app/src/main/webapp/themes/horizon/weblog.vm @@ -1,6 +1,27 @@ -#includeTemplate($model.weblog "standard_head")$model.weblog.name#if($model.weblog.tagline) — $model.weblog.tagline#end -#includeTemplate($model.weblog "standard_header") -
-

Notes from the journey

$model.weblog.name

#if($model.weblog.tagline)

$model.weblog.tagline

#end
-
#set($pager=$model.getWeblogEntriesPager())#showWeblogEntriesPager($pager)
#includeTemplate($model.weblog "sidebar")
-
#includeTemplate($model.weblog "standard_footer") + + + + #includeTemplate($model.weblog "standard_head") + $model.weblog.name#if($model.weblog.tagline) — $model.weblog.tagline#end + + + #includeTemplate($model.weblog "standard_header") +
+
+

Notes from the journey

+

$model.weblog.name

+ #if($model.weblog.tagline) +

$model.weblog.tagline

+ #end +
+
+
+ #set($pager=$model.getWeblogEntriesPager())#showWeblogEntriesPager($pager) + +
+ #includeTemplate($model.weblog "sidebar") +
+
+ #includeTemplate($model.weblog "standard_footer") + + From 8f8972925f50604d7cbd5a02fdd6b9ecaa190aac Mon Sep 17 00:00:00 2001 From: Matt Raible Date: Thu, 13 Aug 2026 09:52:47 -0600 Subject: [PATCH 3/4] Format theme CSS and normalize preview content MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Expand the three theme stylesheets for review and use the same neutral test-blog fixtures as Roller’s existing theme previews. --- .../main/webapp/themes/alpenglow/preview.svg | 2 +- .../main/webapp/themes/alpenglow/theme.css | 361 +++++++++++++++- .../main/webapp/themes/dispatch/preview.svg | 2 +- app/src/main/webapp/themes/dispatch/theme.css | 391 +++++++++++++++++- .../main/webapp/themes/horizon/preview.svg | 2 +- app/src/main/webapp/themes/horizon/theme.css | 361 +++++++++++++++- 6 files changed, 1113 insertions(+), 6 deletions(-) diff --git a/app/src/main/webapp/themes/alpenglow/preview.svg b/app/src/main/webapp/themes/alpenglow/preview.svg index a679765d51..b3dde1dc8d 100644 --- a/app/src/main/webapp/themes/alpenglow/preview.svg +++ b/app/src/main/webapp/themes/alpenglow/preview.svg @@ -1 +1 @@ -▲ ALPENGLOWFROM COLORADO TO EVERYWHERELife is betterwith a littlealtitude. +▲ DAVE'S TEST BLOGTEST WEBLOG / TECHNOLOGYThere are manyblogs but thisone is mine. diff --git a/app/src/main/webapp/themes/alpenglow/theme.css b/app/src/main/webapp/themes/alpenglow/theme.css index d6126b0084..e08ea6b4bb 100644 --- a/app/src/main/webapp/themes/alpenglow/theme.css +++ b/app/src/main/webapp/themes/alpenglow/theme.css @@ -1 +1,360 @@ -:root{color-scheme:light dark;--night:#102d32;--bg:#eef0e9;--paper:#f9faf5;--ink:#15373b;--muted:#627376;--line:#cbd2ca;--sun:#ffb258;--rose:#e46b55;--sans:ui-sans-serif,system-ui,-apple-system,"Segoe UI",sans-serif;--display:ui-rounded,"Arial Rounded MT Bold",var(--sans);--serif:ui-serif,Georgia,serif}*{box-sizing:border-box}body{margin:0;background:var(--bg);color:var(--ink);font:1rem/1.65 var(--sans)}a{color:inherit;text-underline-offset:.2em}a:hover{color:var(--rose)}img,iframe,video{max-width:100%;height:auto}.skip-link{position:absolute;left:-999px}.skip-link:focus{left:1rem;top:1rem;background:var(--paper);padding:.6rem;z-index:10}.site-header{max-width:1320px;margin:auto;padding:1.3rem clamp(1.2rem,4vw,3rem);display:flex;gap:2rem;align-items:center}.brand{display:flex;gap:.7rem;align-items:center;text-decoration:none;font-weight:850}.brand-mark{color:var(--rose)}.site-header nav{margin-left:auto}.site-header nav ul{display:flex;list-style:none;gap:1.3rem;margin:0;padding:0}.site-header nav a,.feed-link{text-decoration:none;font-size:.85rem;font-weight:700}.feed-link{border:1px solid var(--ink);border-radius:2rem;padding:.4rem .85rem}.hero{max-width:1320px;min-height:590px;margin:0 auto;padding:clamp(2rem,7vw,6rem) clamp(1.2rem,4vw,3rem);display:grid;grid-template-columns:1fr 1.15fr;align-items:center;overflow:hidden}.hero-copy{z-index:2}.kicker{text-transform:uppercase;letter-spacing:.17em;font-weight:850;font-size:.7rem;color:var(--rose)}.hero h1{font:900 clamp(3.6rem,8vw,7.5rem)/.82 var(--display);letter-spacing:-.07em;margin:.3em 0}.hero h1 em{font-family:var(--serif);font-weight:400;color:var(--rose)}.hero-copy>p:last-child{max-width:34rem;color:var(--muted)}.hero-art{min-height:460px;position:relative}.sun{position:absolute;width:clamp(180px,30vw,390px);aspect-ratio:1;border-radius:50%;background:var(--sun);right:4%;top:3%;box-shadow:0 0 0 35px color-mix(in srgb,var(--sun) 14%,transparent)}.ridge{position:absolute;inset:auto -10% 0 0;height:65%;clip-path:polygon(0 100%,18% 54%,30% 72%,53% 20%,65% 48%,77% 32%,100% 100%)}.ridge-back{background:#8db1a4;transform:translateY(-15%)}.ridge-front{background:var(--night)}.content-shell{max-width:1320px;margin:auto;padding:5rem clamp(1.2rem,4vw,3rem);display:grid;grid-template-columns:260px 1fr;gap:clamp(3rem,7vw,7rem)}.explore{position:sticky;top:2rem;align-self:start}.explore>div,.explore form{margin-bottom:2.2rem}.explore label{font-weight:800;display:block;margin-bottom:.45rem}.explore form div,.big-search{display:flex}.explore input,.big-search input{min-width:0;width:100%;border:1px solid var(--line);background:var(--paper);color:var(--ink);padding:.75rem}.explore button,.big-search button{border:0;background:var(--night);color:#fff;padding:.75rem 1rem}.topics{display:flex;flex-wrap:wrap;gap:.45rem}.topics a{font-size:.78rem;text-decoration:none;border-bottom:1px solid var(--line)}.story{display:grid;grid-template-columns:3.5rem 1fr;gap:1rem;background:var(--paper);border-radius:1.2rem;padding:clamp(1.4rem,4vw,3.5rem);margin-bottom:2rem;box-shadow:0 14px 45px color-mix(in srgb,var(--night) 9%,transparent)}.story-index{font:700 1rem var(--serif);color:var(--rose)}.story .meta,.story footer{display:flex;gap:1rem;flex-wrap:wrap;color:var(--muted);font-size:.78rem}.story .meta a{text-transform:uppercase;letter-spacing:.12em;font-weight:850;text-decoration:none}.story h1,.story h2{font:850 clamp(2rem,4vw,3.5rem)/1 var(--display);letter-spacing:-.045em;margin:.5em 0}.story h2 a{text-decoration:none}.entry-content{font:1.1rem/1.72 var(--serif)}.entry-content blockquote{border-left:.35rem solid var(--sun);margin:2rem 0;padding:.8rem 1.5rem;color:var(--muted)}pre{overflow:auto;background:var(--night);color:#eef8f4;padding:1.2rem;border-radius:.75rem}.story footer{margin-top:2rem}.story footer a{text-decoration:none}.reading-shell{max-width:850px;margin:auto;padding:clamp(3rem,8vw,7rem) 1.3rem}.page-title h1{font:900 clamp(3rem,9vw,7rem)/.9 var(--display);letter-spacing:-.06em;margin:.2em 0}.pager{margin:3rem 0}.pager ul{display:flex;justify-content:space-between;list-style:none;padding:0}.calendar{overflow:auto}.calendar table{width:100%;border-collapse:collapse;background:var(--paper)}.calendar td,.calendar th{border:1px solid var(--line);padding:.7rem}.recent li{padding:.5rem}.site-footer{background:var(--night);color:#eaf2ee;padding:3rem max(1.2rem,calc((100vw - 1260px)/2));display:flex;justify-content:space-between;gap:2rem}.site-footer nav{display:flex;gap:1rem}.comments input,.comments textarea{max-width:100%}@media(max-width:760px){.site-header nav{order:3;width:100%;overflow:auto}.site-header{flex-wrap:wrap}.hero{grid-template-columns:1fr;min-height:auto}.hero-art{min-height:300px;margin-top:-2rem;opacity:.92}.content-shell{grid-template-columns:1fr}.explore{position:static}.story{grid-template-columns:1fr}.story-index{font-size:.8rem}.site-footer{flex-direction:column}}@media(prefers-color-scheme:dark){:root{--bg:#0c2226;--paper:#143238;--ink:#edf4ef;--muted:#a6b9b8;--line:#315158;--sun:#f5a953;--rose:#ff8a72}.ridge-front{background:#061719}.feed-link{border-color:var(--ink)}} +:root { + color-scheme: light dark; + --night: #102d32; + --bg: #eef0e9; + --paper: #f9faf5; + --ink: #15373b; + --muted: #627376; + --line: #cbd2ca; + --sun: #ffb258; + --rose: #e46b55; + --sans: ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif; + --display: ui-rounded, "Arial Rounded MT Bold", var(--sans); + --serif: ui-serif, Georgia, serif; +} +* { + box-sizing: border-box; +} +body { + margin: 0; + background: var(--bg); + color: var(--ink); + font: 1rem/1.65 var(--sans); +} +a { + color: inherit; + text-underline-offset: 0.2em; +} +a:hover { + color: var(--rose); +} +img, +iframe, +video { + max-width: 100%; + height: auto; +} +.skip-link { + position: absolute; + left: -999px; +} +.skip-link:focus { + left: 1rem; + top: 1rem; + background: var(--paper); + padding: 0.6rem; + z-index: 10; +} +.site-header { + max-width: 1320px; + margin: auto; + padding: 1.3rem clamp(1.2rem, 4vw, 3rem); + display: flex; + gap: 2rem; + align-items: center; +} +.brand { + display: flex; + gap: 0.7rem; + align-items: center; + text-decoration: none; + font-weight: 850; +} +.brand-mark { + color: var(--rose); +} +.site-header nav { + margin-left: auto; +} +.site-header nav ul { + display: flex; + list-style: none; + gap: 1.3rem; + margin: 0; + padding: 0; +} +.site-header nav a, +.feed-link { + text-decoration: none; + font-size: 0.85rem; + font-weight: 700; +} +.feed-link { + border: 1px solid var(--ink); + border-radius: 2rem; + padding: 0.4rem 0.85rem; +} +.hero { + max-width: 1320px; + min-height: 590px; + margin: 0 auto; + padding: clamp(2rem, 7vw, 6rem) clamp(1.2rem, 4vw, 3rem); + display: grid; + grid-template-columns: 1fr 1.15fr; + align-items: center; + overflow: hidden; +} +.hero-copy { + z-index: 2; +} +.kicker { + text-transform: uppercase; + letter-spacing: 0.17em; + font-weight: 850; + font-size: 0.7rem; + color: var(--rose); +} +.hero h1 { + font: 900 clamp(3.6rem, 8vw, 7.5rem)/0.82 var(--display); + letter-spacing: -0.07em; + margin: 0.3em 0; +} +.hero h1 em { + font-family: var(--serif); + font-weight: 400; + color: var(--rose); +} +.hero-copy > p:last-child { + max-width: 34rem; + color: var(--muted); +} +.hero-art { + min-height: 460px; + position: relative; +} +.sun { + position: absolute; + width: clamp(180px, 30vw, 390px); + aspect-ratio: 1; + border-radius: 50%; + background: var(--sun); + right: 4%; + top: 3%; + box-shadow: 0 0 0 35px color-mix(in srgb, var(--sun) 14%, transparent); +} +.ridge { + position: absolute; + inset: auto -10% 0 0; + height: 65%; + clip-path: polygon(0 100%, 18% 54%, 30% 72%, 53% 20%, 65% 48%, 77% 32%, 100% 100%); +} +.ridge-back { + background: #8db1a4; + transform: translateY(-15%); +} +.ridge-front { + background: var(--night); +} +.content-shell { + max-width: 1320px; + margin: auto; + padding: 5rem clamp(1.2rem, 4vw, 3rem); + display: grid; + grid-template-columns: 260px 1fr; + gap: clamp(3rem, 7vw, 7rem); +} +.explore { + position: sticky; + top: 2rem; + align-self: start; +} +.explore > div, +.explore form { + margin-bottom: 2.2rem; +} +.explore label { + font-weight: 800; + display: block; + margin-bottom: 0.45rem; +} +.explore form div, +.big-search { + display: flex; +} +.explore input, +.big-search input { + min-width: 0; + width: 100%; + border: 1px solid var(--line); + background: var(--paper); + color: var(--ink); + padding: 0.75rem; +} +.explore button, +.big-search button { + border: 0; + background: var(--night); + color: #fff; + padding: 0.75rem 1rem; +} +.topics { + display: flex; + flex-wrap: wrap; + gap: 0.45rem; +} +.topics a { + font-size: 0.78rem; + text-decoration: none; + border-bottom: 1px solid var(--line); +} +.story { + display: grid; + grid-template-columns: 3.5rem 1fr; + gap: 1rem; + background: var(--paper); + border-radius: 1.2rem; + padding: clamp(1.4rem, 4vw, 3.5rem); + margin-bottom: 2rem; + box-shadow: 0 14px 45px color-mix(in srgb, var(--night) 9%, transparent); +} +.story-index { + font: 700 1rem var(--serif); + color: var(--rose); +} +.story .meta, +.story footer { + display: flex; + gap: 1rem; + flex-wrap: wrap; + color: var(--muted); + font-size: 0.78rem; +} +.story .meta a { + text-transform: uppercase; + letter-spacing: 0.12em; + font-weight: 850; + text-decoration: none; +} +.story h1, +.story h2 { + font: 850 clamp(2rem, 4vw, 3.5rem)/1 var(--display); + letter-spacing: -0.045em; + margin: 0.5em 0; +} +.story h2 a { + text-decoration: none; +} +.entry-content { + font: 1.1rem/1.72 var(--serif); +} +.entry-content blockquote { + border-left: 0.35rem solid var(--sun); + margin: 2rem 0; + padding: 0.8rem 1.5rem; + color: var(--muted); +} +pre { + overflow: auto; + background: var(--night); + color: #eef8f4; + padding: 1.2rem; + border-radius: 0.75rem; +} +.story footer { + margin-top: 2rem; +} +.story footer a { + text-decoration: none; +} +.reading-shell { + max-width: 850px; + margin: auto; + padding: clamp(3rem, 8vw, 7rem) 1.3rem; +} +.page-title h1 { + font: 900 clamp(3rem, 9vw, 7rem)/0.9 var(--display); + letter-spacing: -0.06em; + margin: 0.2em 0; +} +.pager { + margin: 3rem 0; +} +.pager ul { + display: flex; + justify-content: space-between; + list-style: none; + padding: 0; +} +.calendar { + overflow: auto; +} +.calendar table { + width: 100%; + border-collapse: collapse; + background: var(--paper); +} +.calendar td, +.calendar th { + border: 1px solid var(--line); + padding: 0.7rem; +} +.recent li { + padding: 0.5rem; +} +.site-footer { + background: var(--night); + color: #eaf2ee; + padding: 3rem max(1.2rem, calc((100vw - 1260px) / 2)); + display: flex; + justify-content: space-between; + gap: 2rem; +} +.site-footer nav { + display: flex; + gap: 1rem; +} +.comments input, +.comments textarea { + max-width: 100%; +} +@media (max-width: 760px) { + .site-header nav { + order: 3; + width: 100%; + overflow: auto; + } + .site-header { + flex-wrap: wrap; + } + .hero { + grid-template-columns: 1fr; + min-height: auto; + } + .hero-art { + min-height: 300px; + margin-top: -2rem; + opacity: 0.92; + } + .content-shell { + grid-template-columns: 1fr; + } + .explore { + position: static; + } + .story { + grid-template-columns: 1fr; + } + .story-index { + font-size: 0.8rem; + } + .site-footer { + flex-direction: column; + } +} +@media (prefers-color-scheme: dark) { + :root { + --bg: #0c2226; + --paper: #143238; + --ink: #edf4ef; + --muted: #a6b9b8; + --line: #315158; + --sun: #f5a953; + --rose: #ff8a72; + } + .ridge-front { + background: #061719; + } + .feed-link { + border-color: var(--ink); + } +} diff --git a/app/src/main/webapp/themes/dispatch/preview.svg b/app/src/main/webapp/themes/dispatch/preview.svg index 04b556a55d..c8acd558f3 100644 --- a/app/src/main/webapp/themes/dispatch/preview.svg +++ b/app/src/main/webapp/themes/dispatch/preview.svg @@ -1 +1 @@ -RAIBLE DESIGNS_INDEPENDENT WEBLOG / EST. 2002IDEAS,ADVENTURES,& SOURCE CODE.012026.07.23 / GENERALCRUISING THE DANUBE +DAVE'S TEST BLOG_TEST WEBLOG / SAMPLE CONTENTDONEC ACSAPIEN,LOREM IPSUM.012019.01.20 / TECHNOLOGYPROIN NULLA LECTUS diff --git a/app/src/main/webapp/themes/dispatch/theme.css b/app/src/main/webapp/themes/dispatch/theme.css index adf4f74b58..fb4a30561e 100644 --- a/app/src/main/webapp/themes/dispatch/theme.css +++ b/app/src/main/webapp/themes/dispatch/theme.css @@ -1 +1,390 @@ -:root{color-scheme:light dark;--bg:#f1f1ed;--paper:#fafaf7;--ink:#11120f;--muted:#676961;--grid:#cfd0c8;--acid:#d9ff43;--orange:#ff5b35;--mono:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;--sans:ui-sans-serif,system-ui,-apple-system,"Segoe UI",sans-serif}*{box-sizing:border-box}body{margin:0;background:var(--bg);color:var(--ink);font:1rem/1.6 var(--sans)}body:before{content:"";position:fixed;inset:0;pointer-events:none;opacity:.28;background-image:linear-gradient(var(--grid) 1px,transparent 1px),linear-gradient(90deg,var(--grid) 1px,transparent 1px);background-size:48px 48px;z-index:-1}a{color:inherit;text-underline-offset:.22em}a:hover{background:var(--acid);color:#111}img,video,iframe{max-width:100%;height:auto}.skip-link{position:absolute;left:-999px}.skip-link:focus{left:1rem;top:1rem;background:var(--acid);padding:.6rem;z-index:10}.masthead{border-bottom:2px solid var(--ink);display:grid;grid-template-columns:1fr auto 1fr;align-items:center;gap:2rem;padding:1rem clamp(1rem,4vw,3rem);background:var(--bg)}.wordmark{font:800 1.1rem var(--mono);text-decoration:none;text-transform:uppercase}.cursor{color:var(--orange)}.masthead nav ul{display:flex;gap:1.4rem;list-style:none;padding:0;margin:0}.masthead nav a{font:700 .72rem var(--mono);text-decoration:none;text-transform:uppercase}.masthead form{justify-self:end;display:flex;align-items:center;gap:.5rem}.masthead label{font:700 .65rem var(--mono)}.masthead input{width:6rem;border:1px solid var(--ink);background:var(--paper);color:var(--ink);padding:.4rem}.issue-header{max-width:1400px;margin:auto;padding:clamp(3rem,9vw,8rem) clamp(1rem,4vw,3rem);display:grid;grid-template-columns:2fr 1fr;align-items:end;border-bottom:2px solid var(--ink)}.label,.panel-label{font:800 .68rem var(--mono);letter-spacing:.1em}.issue-header h1{font:950 clamp(3.4rem,10vw,9rem)/.78 var(--sans);letter-spacing:-.075em;text-transform:uppercase;margin:.25em 0 0}.issue-header h1 span{color:var(--orange)}.issue-note{border-left:2px solid var(--ink);padding-left:2rem;margin-bottom:.5rem}.issue-note p{font-size:1.15rem}.issue-note a{font:800 .72rem var(--mono)}.publication-grid{max-width:1400px;margin:auto;display:grid;grid-template-columns:290px 1fr}.index-panel{border-right:2px solid var(--ink);padding:3rem 2rem}.index-panel ol{list-style:none;padding:0;margin:1rem 0 3rem}.index-panel li{border-top:1px solid var(--grid)}.index-panel li:last-child{border-bottom:1px solid var(--grid)}.index-panel li a{display:flex;justify-content:space-between;padding:.48rem 0;text-decoration:none;font:700 .76rem var(--mono);text-transform:uppercase}.panel-about{font-size:.88rem}.entries{padding:3rem clamp(1rem,5vw,5rem)}.dispatch{display:grid;grid-template-columns:3rem 1fr;gap:1.2rem;padding:0 0 4rem;margin-bottom:4rem;border-bottom:2px solid var(--ink)}.dispatch-number{font:800 .75rem var(--mono);background:var(--acid);color:#111;width:2.2rem;height:2.2rem;display:grid;place-items:center}.meta,.dispatch footer{display:flex;flex-wrap:wrap;gap:1rem;font:700 .69rem var(--mono);text-transform:uppercase;color:var(--muted)}.meta a,.dispatch footer a{text-decoration:none}.dispatch h1,.dispatch h2{font:900 clamp(2.1rem,5.2vw,5rem)/.91 var(--sans);letter-spacing:-.055em;margin:.35em 0;text-transform:uppercase}.dispatch h2 a{text-decoration:none}.entry-content{max-width:820px;font:1.08rem/1.75 var(--sans)}.entry-content h2,.entry-content h3{line-height:1.05;text-transform:uppercase}.entry-content blockquote{font-size:1.25rem;border:2px solid var(--ink);box-shadow:8px 8px 0 var(--acid);padding:1.2rem;margin:2rem 8px 2rem 0}pre{overflow:auto;background:#141712;color:#e9efdd;border-left:6px solid var(--acid);padding:1.3rem;font:14px/1.65 var(--mono)}code{font-family:var(--mono)}.dispatch footer{margin-top:2rem}.reading-shell{max-width:950px;margin:auto;padding:clamp(3rem,8vw,7rem) 1rem}.page-title{border-bottom:2px solid var(--ink);margin-bottom:4rem}.page-title h1{font:950 clamp(3rem,10vw,8rem)/.85 var(--sans);letter-spacing:-.07em;text-transform:uppercase;overflow-wrap:anywhere;margin:.25em 0}.query{margin:2rem 0 4rem}.query label{font:800 .7rem var(--mono)}.query div{display:flex;margin-top:.5rem}.query input{flex:1;min-width:0;border:2px solid var(--ink);background:var(--paper);color:var(--ink);padding:.9rem}.query button{border:2px solid var(--ink);background:var(--acid);color:#111;padding:.9rem 1.5rem;font:800 .75rem var(--mono)}.pager{margin:3rem 0}.pager ul{display:flex;justify-content:space-between;list-style:none;padding:0}.pager a{font:800 .72rem var(--mono)}.calendar{overflow:auto}.calendar table{border-collapse:collapse;width:100%;background:var(--paper)}.calendar td,.calendar th{border:1px solid var(--ink);padding:.6rem}.archive-list h2{font:800 1rem var(--mono)}.archive-list li{border-top:1px solid var(--grid);padding:.6rem}.site-footer{border-top:2px solid var(--ink);display:flex;justify-content:space-between;gap:2rem;padding:2rem clamp(1rem,4vw,3rem);font:700 .7rem var(--mono);text-transform:uppercase}.status i{display:inline-block;width:.65rem;height:.65rem;border-radius:50%;background:#39b86a;margin-right:.4rem}.comments input,.comments textarea{max-width:100%}@media(max-width:760px){.masthead{grid-template-columns:1fr auto;flex-wrap:wrap}.masthead nav{grid-column:1/-1;grid-row:2;overflow:auto}.masthead nav ul{width:max-content}.masthead form label{display:none}.issue-header{grid-template-columns:1fr}.issue-note{margin-top:2rem}.publication-grid{grid-template-columns:1fr}.index-panel{border-right:0;border-bottom:2px solid var(--ink)}.site-footer{flex-direction:column}.dispatch{grid-template-columns:2.3rem 1fr}}@media(prefers-color-scheme:dark){:root{--bg:#11120f;--paper:#1b1d19;--ink:#f1f1e9;--muted:#a5a79e;--grid:#343730;--acid:#cfff3d;--orange:#ff7756}.dispatch-number,.issue-note a:hover,.wordmark:hover{color:#111}.masthead input{border-color:var(--ink)}} +:root { + color-scheme: light dark; + --bg: #f1f1ed; + --paper: #fafaf7; + --ink: #11120f; + --muted: #676961; + --grid: #cfd0c8; + --acid: #d9ff43; + --orange: #ff5b35; + --mono: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; + --sans: ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif; +} +* { + box-sizing: border-box; +} +body { + margin: 0; + background: var(--bg); + color: var(--ink); + font: 1rem/1.6 var(--sans); +} +body:before { + content: ""; + position: fixed; + inset: 0; + pointer-events: none; + opacity: 0.28; + background-image: + linear-gradient(var(--grid) 1px, transparent 1px), linear-gradient(90deg, var(--grid) 1px, transparent 1px); + background-size: 48px 48px; + z-index: -1; +} +a { + color: inherit; + text-underline-offset: 0.22em; +} +a:hover { + background: var(--acid); + color: #111; +} +img, +video, +iframe { + max-width: 100%; + height: auto; +} +.skip-link { + position: absolute; + left: -999px; +} +.skip-link:focus { + left: 1rem; + top: 1rem; + background: var(--acid); + padding: 0.6rem; + z-index: 10; +} +.masthead { + border-bottom: 2px solid var(--ink); + display: grid; + grid-template-columns: 1fr auto 1fr; + align-items: center; + gap: 2rem; + padding: 1rem clamp(1rem, 4vw, 3rem); + background: var(--bg); +} +.wordmark { + font: 800 1.1rem var(--mono); + text-decoration: none; + text-transform: uppercase; +} +.cursor { + color: var(--orange); +} +.masthead nav ul { + display: flex; + gap: 1.4rem; + list-style: none; + padding: 0; + margin: 0; +} +.masthead nav a { + font: 700 0.72rem var(--mono); + text-decoration: none; + text-transform: uppercase; +} +.masthead form { + justify-self: end; + display: flex; + align-items: center; + gap: 0.5rem; +} +.masthead label { + font: 700 0.65rem var(--mono); +} +.masthead input { + width: 6rem; + border: 1px solid var(--ink); + background: var(--paper); + color: var(--ink); + padding: 0.4rem; +} +.issue-header { + max-width: 1400px; + margin: auto; + padding: clamp(3rem, 9vw, 8rem) clamp(1rem, 4vw, 3rem); + display: grid; + grid-template-columns: 2fr 1fr; + align-items: end; + border-bottom: 2px solid var(--ink); +} +.label, +.panel-label { + font: 800 0.68rem var(--mono); + letter-spacing: 0.1em; +} +.issue-header h1 { + font: 950 clamp(3.4rem, 10vw, 9rem)/0.78 var(--sans); + letter-spacing: -0.075em; + text-transform: uppercase; + margin: 0.25em 0 0; +} +.issue-header h1 span { + color: var(--orange); +} +.issue-note { + border-left: 2px solid var(--ink); + padding-left: 2rem; + margin-bottom: 0.5rem; +} +.issue-note p { + font-size: 1.15rem; +} +.issue-note a { + font: 800 0.72rem var(--mono); +} +.publication-grid { + max-width: 1400px; + margin: auto; + display: grid; + grid-template-columns: 290px 1fr; +} +.index-panel { + border-right: 2px solid var(--ink); + padding: 3rem 2rem; +} +.index-panel ol { + list-style: none; + padding: 0; + margin: 1rem 0 3rem; +} +.index-panel li { + border-top: 1px solid var(--grid); +} +.index-panel li:last-child { + border-bottom: 1px solid var(--grid); +} +.index-panel li a { + display: flex; + justify-content: space-between; + padding: 0.48rem 0; + text-decoration: none; + font: 700 0.76rem var(--mono); + text-transform: uppercase; +} +.panel-about { + font-size: 0.88rem; +} +.entries { + padding: 3rem clamp(1rem, 5vw, 5rem); +} +.dispatch { + display: grid; + grid-template-columns: 3rem 1fr; + gap: 1.2rem; + padding: 0 0 4rem; + margin-bottom: 4rem; + border-bottom: 2px solid var(--ink); +} +.dispatch-number { + font: 800 0.75rem var(--mono); + background: var(--acid); + color: #111; + width: 2.2rem; + height: 2.2rem; + display: grid; + place-items: center; +} +.meta, +.dispatch footer { + display: flex; + flex-wrap: wrap; + gap: 1rem; + font: 700 0.69rem var(--mono); + text-transform: uppercase; + color: var(--muted); +} +.meta a, +.dispatch footer a { + text-decoration: none; +} +.dispatch h1, +.dispatch h2 { + font: 900 clamp(2.1rem, 5.2vw, 5rem)/0.91 var(--sans); + letter-spacing: -0.055em; + margin: 0.35em 0; + text-transform: uppercase; +} +.dispatch h2 a { + text-decoration: none; +} +.entry-content { + max-width: 820px; + font: 1.08rem/1.75 var(--sans); +} +.entry-content h2, +.entry-content h3 { + line-height: 1.05; + text-transform: uppercase; +} +.entry-content blockquote { + font-size: 1.25rem; + border: 2px solid var(--ink); + box-shadow: 8px 8px 0 var(--acid); + padding: 1.2rem; + margin: 2rem 8px 2rem 0; +} +pre { + overflow: auto; + background: #141712; + color: #e9efdd; + border-left: 6px solid var(--acid); + padding: 1.3rem; + font: 14px/1.65 var(--mono); +} +code { + font-family: var(--mono); +} +.dispatch footer { + margin-top: 2rem; +} +.reading-shell { + max-width: 950px; + margin: auto; + padding: clamp(3rem, 8vw, 7rem) 1rem; +} +.page-title { + border-bottom: 2px solid var(--ink); + margin-bottom: 4rem; +} +.page-title h1 { + font: 950 clamp(3rem, 10vw, 8rem)/0.85 var(--sans); + letter-spacing: -0.07em; + text-transform: uppercase; + overflow-wrap: anywhere; + margin: 0.25em 0; +} +.query { + margin: 2rem 0 4rem; +} +.query label { + font: 800 0.7rem var(--mono); +} +.query div { + display: flex; + margin-top: 0.5rem; +} +.query input { + flex: 1; + min-width: 0; + border: 2px solid var(--ink); + background: var(--paper); + color: var(--ink); + padding: 0.9rem; +} +.query button { + border: 2px solid var(--ink); + background: var(--acid); + color: #111; + padding: 0.9rem 1.5rem; + font: 800 0.75rem var(--mono); +} +.pager { + margin: 3rem 0; +} +.pager ul { + display: flex; + justify-content: space-between; + list-style: none; + padding: 0; +} +.pager a { + font: 800 0.72rem var(--mono); +} +.calendar { + overflow: auto; +} +.calendar table { + border-collapse: collapse; + width: 100%; + background: var(--paper); +} +.calendar td, +.calendar th { + border: 1px solid var(--ink); + padding: 0.6rem; +} +.archive-list h2 { + font: 800 1rem var(--mono); +} +.archive-list li { + border-top: 1px solid var(--grid); + padding: 0.6rem; +} +.site-footer { + border-top: 2px solid var(--ink); + display: flex; + justify-content: space-between; + gap: 2rem; + padding: 2rem clamp(1rem, 4vw, 3rem); + font: 700 0.7rem var(--mono); + text-transform: uppercase; +} +.status i { + display: inline-block; + width: 0.65rem; + height: 0.65rem; + border-radius: 50%; + background: #39b86a; + margin-right: 0.4rem; +} +.comments input, +.comments textarea { + max-width: 100%; +} +@media (max-width: 760px) { + .masthead { + grid-template-columns: 1fr auto; + flex-wrap: wrap; + } + .masthead nav { + grid-column: 1/-1; + grid-row: 2; + overflow: auto; + } + .masthead nav ul { + width: max-content; + } + .masthead form label { + display: none; + } + .issue-header { + grid-template-columns: 1fr; + } + .issue-note { + margin-top: 2rem; + } + .publication-grid { + grid-template-columns: 1fr; + } + .index-panel { + border-right: 0; + border-bottom: 2px solid var(--ink); + } + .site-footer { + flex-direction: column; + } + .dispatch { + grid-template-columns: 2.3rem 1fr; + } +} +@media (prefers-color-scheme: dark) { + :root { + --bg: #11120f; + --paper: #1b1d19; + --ink: #f1f1e9; + --muted: #a5a79e; + --grid: #343730; + --acid: #cfff3d; + --orange: #ff7756; + } + .dispatch-number, + .issue-note a:hover, + .wordmark:hover { + color: #111; + } + .masthead input { + border-color: var(--ink); + } +} diff --git a/app/src/main/webapp/themes/horizon/preview.svg b/app/src/main/webapp/themes/horizon/preview.svg index 0125f30ce7..6271aa0c45 100644 --- a/app/src/main/webapp/themes/horizon/preview.svg +++ b/app/src/main/webapp/themes/horizon/preview.svg @@ -1 +1 @@ -HorizonNOTES FROM THE JOURNEYStories worthkeeping.JUL 23, 2026 · GENERALCruising the Danube +Dave's Test BlogTEST WEBLOGThere are many blogsbut this one is mine.SUNDAY JANUARY 20, 2019 · TECHNOLOGYDonec ac sapien diff --git a/app/src/main/webapp/themes/horizon/theme.css b/app/src/main/webapp/themes/horizon/theme.css index fe3ee7757d..f66d8cad03 100644 --- a/app/src/main/webapp/themes/horizon/theme.css +++ b/app/src/main/webapp/themes/horizon/theme.css @@ -1 +1,360 @@ -:root{color-scheme:light dark;--bg:#f7f3eb;--surface:#fffdf8;--ink:#28241f;--muted:#726b62;--line:#d9d0c2;--accent:#c94f32;--accent2:#1e6b64;--serif:ui-serif,Georgia,Cambria,"Times New Roman",serif;--sans:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif}*{box-sizing:border-box}html{scroll-behavior:smooth}body{margin:0;background:var(--bg);color:var(--ink);font:1rem/1.7 var(--sans);text-rendering:optimizeLegibility}a{color:inherit;text-decoration-color:color-mix(in srgb,var(--accent) 55%,transparent);text-underline-offset:.2em}a:hover{color:var(--accent)}img,video,iframe{max-width:100%;height:auto}.skip-link{position:absolute;left:-999px}.skip-link:focus{left:1rem;top:1rem;background:var(--surface);padding:.6rem 1rem;z-index:9}.sr-only{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0)}.site-header{border-bottom:1px solid var(--line);background:color-mix(in srgb,var(--bg) 88%,transparent);position:sticky;top:0;z-index:4;backdrop-filter:blur(12px)}.nav-shell{max-width:1180px;margin:auto;padding:1rem 1.5rem;display:flex;align-items:center;gap:2rem}.brand{font:700 1.2rem var(--serif);text-decoration:none}.site-nav{margin-left:auto}.site-nav ul{display:flex;gap:1.2rem;list-style:none;margin:0;padding:0}.site-nav a{text-decoration:none;font-size:.88rem}.quick-search input{width:8rem;border:1px solid var(--line);border-radius:2rem;background:var(--surface);color:var(--ink);padding:.55rem .9rem}.page-shell{max-width:1180px;margin:auto;padding:clamp(3rem,8vw,7rem) 1.5rem}.intro{max-width:800px;margin-bottom:clamp(3rem,7vw,6rem)}.eyebrow{text-transform:uppercase;letter-spacing:.16em;font-size:.72rem;font-weight:800;color:var(--accent)}.intro h1,.page-heading h1{font:600 clamp(3.4rem,10vw,7.8rem)/.92 var(--serif);letter-spacing:-.055em;margin:.2em 0}.lede{font:400 clamp(1.2rem,2.4vw,1.75rem)/1.45 var(--serif);color:var(--muted);max-width:42rem}.layout{display:grid;grid-template-columns:minmax(0,760px) minmax(220px,1fr);gap:clamp(3rem,8vw,8rem)}.post-card{padding:0 0 4rem;margin:0 0 4rem;border-bottom:1px solid var(--line)}.post-meta,.post-footer{display:flex;flex-wrap:wrap;gap:.55rem 1rem;color:var(--muted);font-size:.82rem}.post-meta a,.post-footer a{text-decoration:none}.post-title{font:600 clamp(2rem,5vw,3.7rem)/1.05 var(--serif);letter-spacing:-.035em;margin:.35em 0 .55em}.post-title a{text-decoration:none}.post-content{font-family:var(--serif);font-size:clamp(1.08rem,1.4vw,1.22rem)}.post-content :is(h2,h3,h4){line-height:1.2;margin-top:2em}.post-content blockquote{margin:2rem 0;padding:1rem 0 1rem 1.5rem;border-left:4px solid var(--accent);font-size:1.2em;color:var(--muted)}pre{overflow:auto;padding:1.2rem;border-radius:.6rem;background:#1e2423;color:#eff7f4;font:14px/1.6 ui-monospace,SFMono-Regular,Consolas,monospace}code{font-family:ui-monospace,SFMono-Regular,Consolas,monospace}.post-footer{justify-content:space-between;margin-top:2rem}.post-tags{display:flex;gap:.7rem;flex-wrap:wrap}.sidebar{font-size:.92rem}.sidebar section{margin-bottom:3rem}.sidebar h2,.recent h2{font:600 1.25rem var(--serif)}.tag-cloud{display:flex;gap:.5rem;flex-wrap:wrap}.tag-cloud a{border:1px solid var(--line);border-radius:2rem;padding:.22rem .7rem;text-decoration:none}.subscribe{display:flex;justify-content:space-between;background:var(--accent);color:white!important;padding:1rem 1.2rem;text-decoration:none;border-radius:.3rem}.article-shell{max-width:760px;margin:auto;padding:clamp(3rem,8vw,7rem) 1.5rem}.page-heading{margin-bottom:4rem}.page-heading h1{font-size:clamp(3rem,9vw,6rem)}.pager{display:flex;justify-content:space-between;gap:1rem;margin:2rem 0}.pager ul{display:contents}.pager li{list-style:none}.search-panel{margin:2rem 0 4rem}.search-panel label{display:block;font-weight:700;margin-bottom:.5rem}.search-panel div{display:flex}.search-panel input{flex:1;min-width:0;padding:.8rem;border:1px solid var(--line);background:var(--surface);color:var(--ink)}button{border:0;background:var(--accent);color:white;padding:.8rem 1.2rem;font-weight:700}.archive-calendar{overflow-x:auto}.archive-calendar table{width:100%;border-collapse:collapse}.archive-calendar td,.archive-calendar th{padding:.6rem;border:1px solid var(--line)}.recent ol{padding-left:1.2rem}.site-footer{max-width:1180px;margin:2rem auto 0;padding:3rem 1.5rem;border-top:1px solid var(--line);display:grid;grid-template-columns:1fr auto;gap:1rem}.site-footer p{color:var(--muted);margin:.25rem 0}.site-footer small{grid-column:1/-1;color:var(--muted)}.footer-links{display:flex;gap:1rem}.comments-area input,.comments-area textarea{max-width:100%}@media(max-width:760px){.nav-shell{flex-wrap:wrap;gap:1rem}.site-nav{order:3;width:100%;overflow:auto}.site-nav ul{width:max-content}.quick-search{margin-left:auto}.layout{grid-template-columns:1fr}.sidebar{border-top:1px solid var(--line);padding-top:2rem}.site-footer{grid-template-columns:1fr}.intro h1{overflow-wrap:anywhere}}@media(prefers-color-scheme:dark){:root{--bg:#181916;--surface:#22231f;--ink:#f3eee5;--muted:#aaa398;--line:#3d3d36;--accent:#f27b5d;--accent2:#75c4b8}}@media(prefers-reduced-motion:reduce){html{scroll-behavior:auto}} +:root { + color-scheme: light dark; + --bg: #f7f3eb; + --surface: #fffdf8; + --ink: #28241f; + --muted: #726b62; + --line: #d9d0c2; + --accent: #c94f32; + --accent2: #1e6b64; + --serif: ui-serif, Georgia, Cambria, "Times New Roman", serif; + --sans: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; +} +* { + box-sizing: border-box; +} +html { + scroll-behavior: smooth; +} +body { + margin: 0; + background: var(--bg); + color: var(--ink); + font: 1rem/1.7 var(--sans); + text-rendering: optimizeLegibility; +} +a { + color: inherit; + text-decoration-color: color-mix(in srgb, var(--accent) 55%, transparent); + text-underline-offset: 0.2em; +} +a:hover { + color: var(--accent); +} +img, +video, +iframe { + max-width: 100%; + height: auto; +} +.skip-link { + position: absolute; + left: -999px; +} +.skip-link:focus { + left: 1rem; + top: 1rem; + background: var(--surface); + padding: 0.6rem 1rem; + z-index: 9; +} +.sr-only { + position: absolute; + width: 1px; + height: 1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); +} +.site-header { + border-bottom: 1px solid var(--line); + background: color-mix(in srgb, var(--bg) 88%, transparent); + position: sticky; + top: 0; + z-index: 4; + backdrop-filter: blur(12px); +} +.nav-shell { + max-width: 1180px; + margin: auto; + padding: 1rem 1.5rem; + display: flex; + align-items: center; + gap: 2rem; +} +.brand { + font: 700 1.2rem var(--serif); + text-decoration: none; +} +.site-nav { + margin-left: auto; +} +.site-nav ul { + display: flex; + gap: 1.2rem; + list-style: none; + margin: 0; + padding: 0; +} +.site-nav a { + text-decoration: none; + font-size: 0.88rem; +} +.quick-search input { + width: 8rem; + border: 1px solid var(--line); + border-radius: 2rem; + background: var(--surface); + color: var(--ink); + padding: 0.55rem 0.9rem; +} +.page-shell { + max-width: 1180px; + margin: auto; + padding: clamp(3rem, 8vw, 7rem) 1.5rem; +} +.intro { + max-width: 800px; + margin-bottom: clamp(3rem, 7vw, 6rem); +} +.eyebrow { + text-transform: uppercase; + letter-spacing: 0.16em; + font-size: 0.72rem; + font-weight: 800; + color: var(--accent); +} +.intro h1, +.page-heading h1 { + font: 600 clamp(3.4rem, 10vw, 7.8rem)/0.92 var(--serif); + letter-spacing: -0.055em; + margin: 0.2em 0; +} +.lede { + font: 400 clamp(1.2rem, 2.4vw, 1.75rem)/1.45 var(--serif); + color: var(--muted); + max-width: 42rem; +} +.layout { + display: grid; + grid-template-columns: minmax(0, 760px) minmax(220px, 1fr); + gap: clamp(3rem, 8vw, 8rem); +} +.post-card { + padding: 0 0 4rem; + margin: 0 0 4rem; + border-bottom: 1px solid var(--line); +} +.post-meta, +.post-footer { + display: flex; + flex-wrap: wrap; + gap: 0.55rem 1rem; + color: var(--muted); + font-size: 0.82rem; +} +.post-meta a, +.post-footer a { + text-decoration: none; +} +.post-title { + font: 600 clamp(2rem, 5vw, 3.7rem)/1.05 var(--serif); + letter-spacing: -0.035em; + margin: 0.35em 0 0.55em; +} +.post-title a { + text-decoration: none; +} +.post-content { + font-family: var(--serif); + font-size: clamp(1.08rem, 1.4vw, 1.22rem); +} +.post-content :is(h2, h3, h4) { + line-height: 1.2; + margin-top: 2em; +} +.post-content blockquote { + margin: 2rem 0; + padding: 1rem 0 1rem 1.5rem; + border-left: 4px solid var(--accent); + font-size: 1.2em; + color: var(--muted); +} +pre { + overflow: auto; + padding: 1.2rem; + border-radius: 0.6rem; + background: #1e2423; + color: #eff7f4; + font: + 14px/1.6 ui-monospace, + SFMono-Regular, + Consolas, + monospace; +} +code { + font-family: ui-monospace, SFMono-Regular, Consolas, monospace; +} +.post-footer { + justify-content: space-between; + margin-top: 2rem; +} +.post-tags { + display: flex; + gap: 0.7rem; + flex-wrap: wrap; +} +.sidebar { + font-size: 0.92rem; +} +.sidebar section { + margin-bottom: 3rem; +} +.sidebar h2, +.recent h2 { + font: 600 1.25rem var(--serif); +} +.tag-cloud { + display: flex; + gap: 0.5rem; + flex-wrap: wrap; +} +.tag-cloud a { + border: 1px solid var(--line); + border-radius: 2rem; + padding: 0.22rem 0.7rem; + text-decoration: none; +} +.subscribe { + display: flex; + justify-content: space-between; + background: var(--accent); + color: white !important; + padding: 1rem 1.2rem; + text-decoration: none; + border-radius: 0.3rem; +} +.article-shell { + max-width: 760px; + margin: auto; + padding: clamp(3rem, 8vw, 7rem) 1.5rem; +} +.page-heading { + margin-bottom: 4rem; +} +.page-heading h1 { + font-size: clamp(3rem, 9vw, 6rem); +} +.pager { + display: flex; + justify-content: space-between; + gap: 1rem; + margin: 2rem 0; +} +.pager ul { + display: contents; +} +.pager li { + list-style: none; +} +.search-panel { + margin: 2rem 0 4rem; +} +.search-panel label { + display: block; + font-weight: 700; + margin-bottom: 0.5rem; +} +.search-panel div { + display: flex; +} +.search-panel input { + flex: 1; + min-width: 0; + padding: 0.8rem; + border: 1px solid var(--line); + background: var(--surface); + color: var(--ink); +} +button { + border: 0; + background: var(--accent); + color: white; + padding: 0.8rem 1.2rem; + font-weight: 700; +} +.archive-calendar { + overflow-x: auto; +} +.archive-calendar table { + width: 100%; + border-collapse: collapse; +} +.archive-calendar td, +.archive-calendar th { + padding: 0.6rem; + border: 1px solid var(--line); +} +.recent ol { + padding-left: 1.2rem; +} +.site-footer { + max-width: 1180px; + margin: 2rem auto 0; + padding: 3rem 1.5rem; + border-top: 1px solid var(--line); + display: grid; + grid-template-columns: 1fr auto; + gap: 1rem; +} +.site-footer p { + color: var(--muted); + margin: 0.25rem 0; +} +.site-footer small { + grid-column: 1/-1; + color: var(--muted); +} +.footer-links { + display: flex; + gap: 1rem; +} +.comments-area input, +.comments-area textarea { + max-width: 100%; +} +@media (max-width: 760px) { + .nav-shell { + flex-wrap: wrap; + gap: 1rem; + } + .site-nav { + order: 3; + width: 100%; + overflow: auto; + } + .site-nav ul { + width: max-content; + } + .quick-search { + margin-left: auto; + } + .layout { + grid-template-columns: 1fr; + } + .sidebar { + border-top: 1px solid var(--line); + padding-top: 2rem; + } + .site-footer { + grid-template-columns: 1fr; + } + .intro h1 { + overflow-wrap: anywhere; + } +} +@media (prefers-color-scheme: dark) { + :root { + --bg: #181916; + --surface: #22231f; + --ink: #f3eee5; + --muted: #aaa398; + --line: #3d3d36; + --accent: #f27b5d; + --accent2: #75c4b8; + } +} +@media (prefers-reduced-motion: reduce) { + html { + scroll-behavior: auto; + } +} From 834a1ffb566f8bd8b49f123c67355af6dde66b1b Mon Sep 17 00:00:00 2001 From: Matt Raible Date: Thu, 13 Aug 2026 10:10:51 -0600 Subject: [PATCH 4/4] Preserve Basic as the default weblog theme Set the create-weblog form's default theme explicitly so adding an alphabetically earlier shared theme does not change existing setup behavior. --- .../apache/roller/weblogger/ui/struts2/core/CreateWeblog.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/core/CreateWeblog.java b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/core/CreateWeblog.java index f2ffe2b3be..d819be54e5 100644 --- a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/core/CreateWeblog.java +++ b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/core/CreateWeblog.java @@ -48,6 +48,7 @@ public class CreateWeblog extends UIAction { private static final Log log = LogFactory.getLog(CreateWeblog.class); private static final String DISABLED_RETURN_CODE = "disabled"; + private static final String DEFAULT_THEME = "basic"; private CreateWeblogBean bean = new CreateWeblogBean(); @@ -97,6 +98,7 @@ public String execute() { getBean().setLocale(user.getLocale()); getBean().setTimeZone(user.getTimeZone()); getBean().setEmailAddress(user.getEmailAddress()); + getBean().setTheme(DEFAULT_THEME); return INPUT; }