diff --git a/jspwiki-main/src/main/java/org/apache/wiki/preferences/Preferences.java b/jspwiki-main/src/main/java/org/apache/wiki/preferences/Preferences.java
index f44e9d4e63..5e6b0fa290 100644
--- a/jspwiki-main/src/main/java/org/apache/wiki/preferences/Preferences.java
+++ b/jspwiki-main/src/main/java/org/apache/wiki/preferences/Preferences.java
@@ -105,7 +105,7 @@ public static void reloadPreferences( final PageContext pageContext ) {
prefs.put("Layout", TextUtil.getStringProperty( props, "jspwiki.defaultprefs.template.layout", "fluid" ) );
prefs.put("Language", TextUtil.getStringProperty( props, "jspwiki.defaultprefs.template.language", getLocale( ctx ).toString() ) );
prefs.put("SectionEditing", TextUtil.getStringProperty( props, "jspwiki.defaultprefs.template.sectionediting", "true" ) );
- prefs.put("Appearance", TextUtil.getStringProperty( props, "jspwiki.defaultprefs.template.appearance", "true" ) );
+ //prefs.put("Appearance", TextUtil.getStringProperty( props, "jspwiki.defaultprefs.template.appearance", "true" ) );
//editor cookies
prefs.put("autosuggest", TextUtil.getStringProperty( props, "jspwiki.defaultprefs.template.autosuggest", "true" ) );
diff --git a/jspwiki-main/src/main/resources/ini/jspwiki.properties b/jspwiki-main/src/main/resources/ini/jspwiki.properties
index 99a14bc460..167c8b1352 100644
--- a/jspwiki-main/src/main/resources/ini/jspwiki.properties
+++ b/jspwiki-main/src/main/resources/ini/jspwiki.properties
@@ -1014,7 +1014,7 @@ jspwiki.use.external.logconfig = true
#
# Set the name of the skin.
# Default value is PlainVanilla
-jspwiki.defaultprefs.template.skinname =PlainVanilla
+jspwiki.defaultprefs.template.skinname=default
# Set the format of dates
jspwiki.defaultprefs.template.dateformat =dd-MMM-yyyy HH:mm
diff --git a/jspwiki-war/pom.xml b/jspwiki-war/pom.xml
index 20783f292d..a882be852c 100644
--- a/jspwiki-war/pom.xml
+++ b/jspwiki-war/pom.xml
@@ -243,9 +243,12 @@
${project.build.directory}/generated-sources/wro
+
diff --git a/jspwiki-war/src/main/scripts/wiki/Prefs.js b/jspwiki-war/src/main/scripts/wiki/Prefs.js
index 0b687529bb..d22f13fd92 100644
--- a/jspwiki-war/src/main/scripts/wiki/Prefs.js
+++ b/jspwiki-war/src/main/scripts/wiki/Prefs.js
@@ -87,7 +87,7 @@ Javascript routines to support JSPWiki UserPreferences
});
//FFS: add click-triggers to some preferences: prefLayout, prefOrientation,
- form.prefAppearance.onchange = function(event){
+ form.prefSkin.onchange = function(event){
console.log( this, getValue(this) );
}
diff --git a/jspwiki-war/src/main/webapp/templates/default/PreferencesTab.jsp b/jspwiki-war/src/main/webapp/templates/default/PreferencesTab.jsp
index 0d08b93725..8715c41c39 100644
--- a/jspwiki-war/src/main/webapp/templates/default/PreferencesTab.jsp
+++ b/jspwiki-war/src/main/webapp/templates/default/PreferencesTab.jsp
@@ -132,16 +132,6 @@
-
diff --git a/jspwiki-war/src/main/webapp/templates/default/commonheader.jsp b/jspwiki-war/src/main/webapp/templates/default/commonheader.jsp
index f1aba997f9..fd78354ee8 100644
--- a/jspwiki-war/src/main/webapp/templates/default/commonheader.jsp
+++ b/jspwiki-war/src/main/webapp/templates/default/commonheader.jsp
@@ -74,10 +74,6 @@ String.I18N.PREFIX = "javascript.";
-
-
-
diff --git a/jspwiki-war/src/main/webapp/templates/default/skins/black-n-gold/skin.css b/jspwiki-war/src/main/webapp/templates/default/skins/black-n-gold/skin.css
new file mode 100644
index 0000000000..61266f8be9
--- /dev/null
+++ b/jspwiki-war/src/main/webapp/templates/default/skins/black-n-gold/skin.css
@@ -0,0 +1,739 @@
+/*
+Copyright 2025 The Apache Software Foundation.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+
+html {
+ /* 1. Core Hue Shifts */
+ --hue: 45; /* Gold/Yellow Hue */
+ --accent-hue: 45;
+
+ /* 2. Text Colors */
+ --text-color-normal: #e0e0e0; /* Light gray for better readability than pure white */
+ --text-color-light: #a3a3a3; /* Muted gray */
+ --text-color-richer: #ffffff; /* Pure white for headers */
+ --text-color-highlight: #ffcc00; /* Bright Gold for emphasis */
+
+ /* 3. Links and Accents */
+ --link-color: #ffcc00; /* Army Gold */
+ --accent-color: #d4af37; /* Metallic Gold */
+ --error-color: #ff4444;
+
+ /* 4. Buttons */
+ --button-background: #ffcc00; /* Gold buttons */
+ --button-text-color: #000000; /* Black text on gold buttons for high contrast */
+ --button-active: #e6b800;
+ --button-active-darker: #cca300;
+
+ /* 5. Backgrounds */
+ --background: #111111; /* Deep Rich Black */
+ --background-sidebar: #1a1a1a; /* Slightly lighter charcoal for sidebars */
+ --background-light: #222222; /* For panels/cards */
+ --background-lighter: #333333;
+ --background-light-solid: #1a1a1a;
+
+ /* Navbar / PageName Specific Background */
+ --navbar-bg: #000000; /* Pure Black Navbar */
+
+ --background-dropdown: #222222;
+ --background-dialog: #111111;
+
+ /* 6. Borders */
+ --border-color: #333333; /* Dark gray borders */
+
+ /* 7. Contextual Colors */
+ --context-primary: #ffcc00; /* Gold */
+ --context-success: #4b5320; /* Army Green */
+ --context-info: #3498db;
+ --context-warning: #f39c12;
+ --context-error: #e74c3c;
+
+ --color-black: #000000;
+ --color-white: #ffffff;
+
+ --wikiTriangleColor: var(--link-color);
+}
+
+
+::selection {
+ color:var(--accent-color);
+ background-color: var(--color-black);
+}
+
+/* --- BOOTSTRAP --- */
+.titlebox {
+ background-color: var(--background-light);
+}
+.panel {
+ background-color: var(--background-light);
+ border-color: var(--border-color);
+}
+.panel-default .panel-heading {
+ background-color: var(--background-lighter);
+ border-color: var(--border-color);
+ color:inherit;
+}
+
+.list-group-item {
+ background-color: var(--background-light);
+ border-color: var(--border-color);
+}
+
+.nav-tabs {
+ border-color: var(--border-color);
+}
+.nav-tabs > li > a {
+ color:inherit;
+}
+.nav-tabs > li > a:hover {
+ background-color: var(--background-light);
+ border-color: var(--border-color);
+ color:inherit;
+}
+.nav-tabs > li.active > a,
+.nav-tabs > li.active {
+ background:transparent;
+ color:var(--text-color-richer);
+ border-color: var(--border-color);
+ border-bottom-color: var(--background);
+}
+.nav-tabs > li.active > a:hover,
+.nav-tabs > li.active > a:focus {
+ background-color: var(--background-lighter);
+ border-color: var(--border-color);
+ color:var(--text-color-richer);
+}
+
+/*.nav-pills > li.active > a,
+.nav-pills > li.active > a:hover,
+.nav-pills > li.active > a:focus {
+
+}*/
+.nav > li > a:hover, .nav > li > a:focus {
+ background-color: var(--background-lighter);
+ border-color: var(--border-color);
+ color:var(--text-color-richer);
+}
+
+
+.btn-default,
+.default {
+ background-color: var(--background-light);
+ border-color: var(--border-color);
+ color:var(--text-color-richer);
+}
+.btn:hover, .btn:focus, .btn.focus,
+.btn-default:hover {
+ background-color: var(--background-lighter);
+ border-color: var(--border-color);
+ color:var(--text-color-richer);
+}
+.btn.disabled:hover {
+ background-color: var(--background-lighter);
+ border-color: var(--border-color);
+}
+.btn-default:active,
+.btn-default:active:hover,
+.btn-default.active,
+.btn-default.active:hover {
+ background-color: var(--background-lighter);
+ border-color: var(--border-color);
+ color:var(--accent-color);
+}
+
+.dropdown-menu {
+ background-color: var(--background-dropdown);
+ border-color: var(--border-color);
+}
+.dropdown-header {
+ color:var(--text-color-richer);
+}
+.dropdown-menu .divider {
+ background-color: var(--border-color);
+}
+.dropdown-menu > li > a {
+ color:var(--text-color-normal);
+}
+.dropdown-menu > li > a:hover {
+ background-color: var(--background-lighter);
+ color:inherit;
+}
+
+.form-control {
+ background-color: var(--background-light);
+ border-color: var(--border-color);
+ color:var(--text-color-normal);
+}
+.form-control:focus {
+ border-color: var(--accent-color);
+}
+.form-control[disabled] {
+ background-color: transparent;
+ border-color: var(--border-color);
+}
+.form-frame {
+ border-color: var(--border-color);
+}
+
+label.form-switch > input[type=checkbox],
+input[type=checkbox].form-switch {
+ box-shadow:inset -1.25em 0 0 1px var(--text-color-normal);
+ background-color:var(--background-light);
+ border:1px solid var(--text-color-normal);
+}
+label.form-switch > input[type=checkbox]:hover,
+input[type=checkbox].form-switch:hover {
+ box-shadow:inset -1.25em 0 0 1px var(--text-color-normal);
+ border: 1px solid var(--text-color-normal);
+}
+label.form-switch > input[type=checkbox]:checked,
+input[type=checkbox].form-switch:checked {
+ box-shadow: inset 1.25em 0 0 1px var(--button-active);
+ border: 1px solid var(--button-active);
+}
+label.form-switch > input[type=checkbox]:checked:hover,
+input[type=checkbox].form-switch:checked:hover {
+ box-shadow:inset 1.25em 0 0 1px var(--button-active-darker);
+ border: 1px solid var(--button-active-darker);
+}
+label.form-switch > input[type=checkbox]:focus,
+input[type=checkbox].form-switch:focus {
+ background:none !important;
+}
+/*
+.form-group .btn.active {
+ color:var(--text-color-normal);
+ background-color:var(--context-info);
+}
+*/
+
+select,
+.form-group select {
+ border-color: var(--border-color);
+ color:var(--text-color-normal);
+
+ background-color: var(--background-light);
+ background-image:
+ linear-gradient(120deg, var(--wikiTriangleColor) var(--wikiTriangleSize), transparent var(--wikiTriangleSize) ),
+ linear-gradient(-120deg, var(--wikiTriangleColor) var(--wikiTriangleSize), transparent var(--wikiTriangleSize) );
+
+ background-position:
+ calc( var(--padding-base-horizontal) - 1px + var(--wikiTriangleSize)/2 ) calc(var(--padding-base-vertical)*2),
+ calc( var(--padding-base-horizontal) - var(--wikiTriangleSize)*3/2 ) calc(var(--padding-base-vertical)*2);
+
+
+}
+
+input[type=checkbox]:focus,
+select:focus,
+.form-group select:focus {
+ outline-color: var(--accent-color);
+}
+
+.modal {
+ background-color: var(--background-dropdown);
+ color:var(--text-color-normal);
+}
+
+/*pagination.less*/
+.pagination {
+ background-color: var(--background-light);
+ border-color: var(--border-color);
+}
+.pagination a {
+ color:var(--link-color);
+ text-decoration:none;
+}
+.pagination .cursor,
+.pagination a:hover {
+ background-color: var(--background-lighter);
+ border-color: var(--border-color);
+ color: var(--accent-color);
+}
+
+/* --- JSPWiki --- */
+
+/* --- variables.less --- */
+
+/* --- type.less --- */
+
+hr,.hr {
+ border-color: var(--border-color);
+}
+
+mark, .highlight {
+ background-color: var(--accent-color) !important;
+ color:var(--text-color-highlight);
+}
+
+span.text-white, div.text-white, .bg.dark + .bg-overlay { color:var(--text-color-normal); }
+/*span.text-black, div.text-black, .bg.light + .bg-overlay { color:(var(--text-???); } */
+
+.text-primary { color: var(--context-primary); }
+.text-success { color: var(--context-success); }
+.text-info { color: var(--context-info); }
+.text-warning { color: var(--context-warning); }
+.text-error,
+.text-danger { color: var(--context-error); }
+
+/* primary */
+.panel-primary > .panel-heading,
+.bg-primary {
+ background-color: var(--context-primary);
+ border-color: var(--context-primary);
+ color:var(--color-white);
+}
+.panel-primary > .panel-heading a:link,
+.bg-primary a:link {
+ color:var(--color-black);
+}
+/* success */
+.panel-success > .panel-heading,
+.success,
+.bg-success {
+ background-color: var(--context-success);
+ border-color: var(--context-success);
+ color:var(--color-black);
+}
+.panel-success > .panel-heading a:link,
+.success a:link,
+.bg-success a:link {
+ text-decoration:underline;
+}
+/* info */
+.panel-info > .panel-heading,
+.info, .information,
+.bg-info {
+ background-color: var(--context-info);
+ border-color: var(--context-info);
+ color:var(--color-black);
+}
+.panel-info > .panel-heading a:link,
+.info a:link, .information a:link,
+.bg-info a:link {
+ text-decoration:underline;
+}
+/* warning */
+.panel-warning > .panel-heading,
+.alert-warning,
+.warning,
+.bg-warning {
+ background-color: var(--context-warning);
+ border-color: var(--context-warning);
+ color:var(--color-black);
+}
+.panel-warning > .panel-heading a:link,
+.alert-warning a:link,
+.warning a:link,
+.bg-warning a:link {
+ text-decoration:underline;
+}
+/* danger, error */
+.panel-danger > .panel-heading,
+.error,.danger,
+.bg-danger {
+ background-color: var(--context-error);
+ border-color: var(--context-error);
+ color:var(--color-black);
+}
+.panel-danger > .panel-heading a:link,
+.error a:link,.danger a:link,
+.bg-danger a:link {
+ text-decoration:underline;
+}
+
+span.label { color:var(--color-black); }
+
+pre {
+ background-color:var(--background-light);
+ border-color:var(--border-color);
+ color:var(--text-color-richer);
+}
+
+code,
+tt {
+ background-color:var(--background-light);
+ border-color:var(--border-color);
+ color:var(--text-color-richer);
+}
+
+a.list-group-item:hover,
+.list-hover li:hover {
+ background-color:var(--background-lighter);
+ color:inherit;
+}
+
+.tree ul li::before,
+.tree ul li::after {
+ background: var(--border-color);
+}
+
+.list-hover li:hover {
+ background-color:var(--background-lighter);
+}
+
+.hover {
+ background-color:var(--background-lighter);
+}
+
+a.slimbox-link:after,
+.slimbox-btn:before,
+a:visited,
+a:link { color:var(--link-color); }
+
+a.createpage {
+ color:var(--error-color);
+}
+
+.interwiki-raw::after,
+a.interwiki[href$="skin=raw"]::after,
+.interwiki-reader::after,
+a.interwiki[href$="skin=reader"]::after,
+.interwiki-edit::after,
+a.interwiki[href*="Edit.jsp?page="]::after,
+.interwiki-group::after,
+a.interwiki[href*="Group.jsp?group="]::after,
+a.interwiki[href^="rss.jsp"]::after {
+ background-color:var(--background-lighter);
+ color:var(--accent-color);
+}
+
+.editsection,
+.hashlink {
+ background-color: var(--background-light);
+ border-color: var(--border-color);
+ color:var(--link-color);
+}
+.editsection:hover,
+h2 .editsection:hover,
+h3 .editsection:hover,
+h4 .editsection:hover,
+h2 .hashlink:hover,
+h3 .hashlink:hover,
+h4 .hashlink:hover {
+ background-color: var(--background-lighter);
+ border-color: var(--border-color);
+ color:var(--link-color);
+ opacity:1;
+}
+
+div.dropcaps > span.dropcaps {
+ color: var(--text-color-highlight);
+}
+blockquote,
+.dialog .quote-item {
+ border-color:var(--text-color-highlight);
+}
+.page-break {
+ border-color: var(--border-color);
+}
+
+
+/* --- grid.less --- */
+/* --- tables.less --- */
+
+.table > thead > tr > th,
+.table > tbody > tr > th,
+.table > tfoot > tr > th,
+.table > thead > tr > td,
+.table > tbody > tr > td,
+.table > tfoot > tr > td {
+ border-color: var(--border-color);
+}
+
+.wikitable > thead > tr > th,
+.wikitable > tbody > tr > th,
+.wikitable > tfoot > tr > th,
+.wikitable > thead > tr > td,
+.wikitable > tbody > tr > td,
+.wikitable > tfoot > tr > td,
+.wikitable tr:first-child th {
+ border-color: var(--border-color);
+}
+
+.table-bordered,
+.table-bordered tr:first-child th,
+.table-bordered tr:first-child td {
+ border-color: var(--border-color);
+}
+.table-bordered > thead > tr > th,
+.table-bordered > tbody > tr > th,
+.table-bordered > tfoot > tr > th,
+.table-bordered > thead > tr > td,
+.table-bordered > tbody > tr > td,
+.table-bordered > tfoot > tr > td {
+ border-color: var(--border-color);
+}
+
+.table-hover > tbody > tr:nth-of-type(odd):hover,
+.table-hover > tbody > tr:nth-child(odd):hover > td,
+.table-hover > tbody > tr:nth-child(odd):hover > th,
+.table-hover > tbody > tr:hover {
+ background-color: var(--background-lighter);
+}
+
+.table-striped > tbody > tr:nth-of-type(odd) ,
+.table-striped > tbody > tr:nth-child(odd) > td,
+.table-striped > tbody > tr:nth-child(odd) > th {
+ background-color: var(--background-light);
+}
+[class*=zebra] .odd {
+ background-color: var(--background-light);
+}
+
+
+/* --- TableX.Sort.less --- */
+.sortable th:hover {
+ background-color: var(--background-lighter);;
+}
+.sortable th.up:after,
+.sortable th.up:hover:after {
+ border-bottom-color: var(--accent-color);
+ opacity:1;
+}
+.sortable th:hover:after,
+.sortable th.down:after,
+.sortable th.down:hover:after {
+ border-top-color: var(--accent-color);
+ opacity:1;
+}
+
+/* --- TableX.Filter.less --- */
+/* --- forms.less --- */
+/* --- modals.less --- */
+
+/* --- fontjspwiki/font-jspwiki.less --- */
+/* --- dropdown.less --- */
+
+/* --- pagination.less --- */
+/* --- Tips.less --- */
+.tip-link,
+.tip-link:hover {
+ color: var(--link-color);
+}
+/* --- Magnify.less --- */
+/* --- Viewer.less --- */
+/* --- Viewer.Slimbox.less --- */
+/* --- Viewer.Carousel.less --- */
+/* --- Template.View.less --- */
+html body .header, html body .footer {
+ background-image: -webkit-radial-gradient(circle, var(--background-light), var(--background));
+ background-image: radial-gradient(circle, var(--background-light), var(--background) );
+ color:var(--text-color-normal);
+}
+a.logo { border-color: var(--border-color); }
+
+
+div.admin .formcontainer {
+ /*.default*/
+ background-color: var(--background-light);
+ border-color: var(--border-color);
+ color:var(--text-color-richer);
+}
+
+.admin .formcontainer table {
+ border-color: var(--border-color);
+ /*
+ .table;
+ .table-bordered;
+ .table-striped;
+ */
+}
+.admin-user-form > div#userlist .list-group-item.new-user{
+ background-color: var(--background-light);
+ border-color: var(--border-color);
+ color:var(--text-color-richer);
+}
+
+
+
+
+/* --- Template.UserBox.less --- */
+.login-form {
+ background-color: var(--background-dialog);
+ border:1px solid var(--border-color);
+}
+.login-form hr { border-color:var(--border-color); }
+
+
+/* --- Template.SearchBox.less --- */
+/* --- Template.Nav.less --- */
+.badge,
+.header > .navigation .nav > li > a > .badge {
+ background-color:var(--background-lighter);
+ color:var(--text-color-normal);
+}
+
+.header > .navigation .nav .btn-xs .badge {
+ background-color: var(--background-lighter);
+}
+
+/* --- Template.Content.less --- */
+body, .content {
+ background-color: var(--background);
+ color:var(--text-color-normal);
+ overflow-y: auto;
+}
+.content:after {
+ background: var(--background-sidebar);
+}
+/* --- Template.Attach.less --- */
+/* --- Template.Diff.less --- */
+.diffadd { background-color:var(--context-success); color:var(--color-black); }
+.diffrem { background:var(--context-error); color:var(--color-black); }
+
+/* --- Template.Search.less --- */
+
+form#searchform2 + div .fragment {
+ color: var(--text-color-richer);
+}
+form#searchform2 + div .gb-bar {
+ background-color: var(--context-warning);
+}
+
+/* --- Template.Workflow.less --- */
+/* --- Template.Edit.less --- */
+
+.editform input[type="text"]:focus,
+.dialog.find input[type="text"]:focus,
+.editform textarea:focus,
+.dialog.find textarea:focus {
+ background-color:var(--background-lighter);
+ border-color:var(--border-color);
+ color:var(--text-color-richer);
+}
+.ajaxpreview {
+ border-color:var(--border-color);
+}
+.edit-area ~ .ajaxpreview {
+ border-left-color:var(--border-color);
+}
+
+/* --- Dialog.less --- */
+.dialog {
+ background-color: var(--background-dialog);
+ border-color: var(--border-color);
+}
+.dialog .caption {
+ border-color: var(--border-color);
+ color: var(--text-color-normal);
+}
+.dialog.selection .body .item:hover {
+ background-color: var(--background-lighter);
+}
+.dialog.selection .body .divider {
+ background-color: var(--border-color);
+}
+
+.dialog.find [name=tbTEXTSEL] { /*same as selected text*/
+ color:var(--accent-color);
+ background-color: var(--color-black);
+}
+
+
+
+/* --- Template.Preview.less --- */
+
+/* --- ImagePlugin.less --- */
+/* --- IndexPlugin.less --- */
+
+.index .header {
+ background-color:var(--background-light);
+ border-color:var(--border-color);
+}
+.index .header:hover {
+ background-color:var(--background-light);
+}
+.index .header a {
+ color:var(--text-color-richer);
+}
+.index .header a:hover {
+ background-color:var(--background-lighter);
+}
+.index > .section a {
+ color:var(--text-color-richer);
+}
+
+
+/* --- TOCPlugin.less --- */
+
+.toc ul li:hover {
+ background-color:var(--background-lighter);
+}
+
+/* --- WeblogPlugin.less --- */
+/* --- RecentChangesPlugin.less --- */
+
+.recentchanges .date {
+ border-color:var(--border-color);
+}
+/* --- CommentBox.less --- */
+
+
+/* --- GraphBar.less --- */
+.gb-group {
+ background-color:var(--background-light);
+ border:1px solid var(--border-color);
+}
+
+/* --- Tabs.less --- */
+/* --- Accordion.less --- */
+/* --- Columns.less --- */
+.columns.border,
+.columns.border > .col:not(:last-child) {
+ border-color:var(--border-color);
+}
+.columns.hover .col:hover {
+ background-color: var(--background-lighter);
+}
+
+
+/* --- Collapsible.less --- */
+.bullet, .bullet.clpse { border-left-color: var(--text-color-normal); }
+.bullet.clpse:hover { border-left-color: var(--text-color-richer); }
+
+.bullet.xpand { border-top-color: var(--text-color-normal); }
+.bullet.xpand:hover { border-top-color: var(--text-color-richer); }
+
+/* --- Category.less --- */
+.category-link {
+ border-color:var(--border-color);
+}
+/* --- Flip.less --- */
+/* --- Invisibles.less --- */
+/* --- prettify.less --- */
+ .prettify pre, .prettify-nonum pre, pre.prettylines {
+ background-color:var(--background-light);
+ border-color:var(--border-color);
+ color:var(--text-color-richer);
+ }
+ .pln { color: #cccccc; } /* plain text */
+ .str { color: #99cc99; } /* string content */
+ .kwd { color: #ffeea6; } /* keyword */
+ .com { color: #8a8a80; } /* comment */
+ .typ { color: #bbdaff; } /* type name */
+ .lit { color: #FCA369; } /* literal value */
+ .pun { color: #cda869; } /* punctuation */
+ .opn { color: #ffffff; } /* lisp open bracket */
+ .clo { color: #ffffff; } /* lisp close bracket */
+ .tag { color: #78AAD6; } /* markup tag name */
+ .atn { color: #ffc58f; } /* markup attribute name */
+ .atv { color: #FFD479; } /* markup attribute value */
+ .dec { color: #D6ACD6; } /* declaration */
+ .var { color: #76D4D6; } /* variable name */
+ .fun { color: #d6acd6; } /* function name */
+
+/* --- responsive-viewport.less --- */
+/* --- print.less --- */
diff --git a/jspwiki-war/src/main/webapp/templates/default/skins/black-n-gold/skin.js b/jspwiki-war/src/main/webapp/templates/default/skins/black-n-gold/skin.js
new file mode 100644
index 0000000000..39d50ac082
--- /dev/null
+++ b/jspwiki-war/src/main/webapp/templates/default/skins/black-n-gold/skin.js
@@ -0,0 +1,17 @@
+/*
+ * Copyright 2025 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
diff --git a/jspwiki-war/src/main/webapp/templates/default/skins/bootstrap/skin.css b/jspwiki-war/src/main/webapp/templates/default/skins/bootstrap/skin.css
new file mode 100644
index 0000000000..9c5e3e70e6
--- /dev/null
+++ b/jspwiki-war/src/main/webapp/templates/default/skins/bootstrap/skin.css
@@ -0,0 +1,728 @@
+/*
+inspired by default Bootswatch theme, which is based on bootstrap itself
+from https://github.com/thomaspark/bootswatch/
+MIT Licensed
+*/
+html {
+ /* 1. Core Hue Shifts */
+ --hue: 211; /* Standard Bootstrap Blue Hue */
+ --accent-hue: 211;
+
+ /* 2. Text Colors */
+ --text-color-normal: #212529; /* Bootstrap Dark Gray/Black */
+ --text-color-light: #6c757d; /* Muted Text */
+ --text-color-richer: #000000;
+ --text-color-highlight: #0d6efd; /* Primary Blue */
+
+ /* 3. Links and Accents */
+ --link-color: #0d6efd; /* Bootstrap Primary Blue */
+ --accent-color: #0d6efd;
+ --error-color: #dc3545; /* Danger Red */
+
+ /* 4. Buttons */
+ --button-background: #0d6efd;
+ --button-text-color: #ffffff;
+ --button-active: #0b5ed7; /* Slightly darker blue for hover */
+ --button-active-darker: #0a58ca;
+
+ /* 5. Backgrounds */
+ --background: #ffffff; /* Pure White */
+ --background-sidebar: #f8f9fa; /* Very Light Gray (standard for sidebars) */
+ --background-light: #f8f9fa;
+ --background-lighter: #e9ecef;
+ --background-light-solid: #ffffff;
+
+ /* Navbar / PageName Specific Background */
+ --navbar-bg: #f8f9fa; /* Light Navbar theme */
+
+ --background-dropdown: #ffffff;
+ --background-dialog: #ffffff;
+
+ /* 6. Borders */
+ --border-color: #dee2e6; /* Standard Bootstrap subtle border */
+
+ /* 7. Contextual Colors (Bootstrap 5 Standards) */
+ --context-primary: #0d6efd;
+ --context-success: #198754;
+ --context-info: #0dcaf0;
+ --context-warning: #ffc107;
+ --context-error: #dc3545;
+
+ --color-black: #000000;
+ --color-white: #ffffff;
+
+ --wikiTriangleColor: var(--link-color);
+ /*--navbar-bg to #212529 */
+}
+
+
+::selection {
+ color:var(--accent-color);
+ background-color: var(--color-black);
+}
+
+/* --- BOOTSTRAP --- */
+.titlebox {
+ background-color: var(--background-light);
+}
+.panel {
+ background-color: var(--background-light);
+ border-color: var(--border-color);
+}
+.panel-default .panel-heading {
+ background-color: var(--background-lighter);
+ border-color: var(--border-color);
+ color:inherit;
+}
+
+.list-group-item {
+ background-color: var(--background-light);
+ border-color: var(--border-color);
+}
+
+.nav-tabs {
+ border-color: var(--border-color);
+}
+.nav-tabs > li > a {
+ color:inherit;
+}
+.nav-tabs > li > a:hover {
+ background-color: var(--background-light);
+ border-color: var(--border-color);
+ color:inherit;
+}
+.nav-tabs > li.active > a,
+.nav-tabs > li.active {
+ background:transparent;
+ color:var(--text-color-richer);
+ border-color: var(--border-color);
+ border-bottom-color: var(--background);
+}
+.nav-tabs > li.active > a:hover,
+.nav-tabs > li.active > a:focus {
+ background-color: var(--background-lighter);
+ border-color: var(--border-color);
+ color:var(--text-color-richer);
+}
+
+/*.nav-pills > li.active > a,
+.nav-pills > li.active > a:hover,
+.nav-pills > li.active > a:focus {
+
+}*/
+.nav > li > a:hover, .nav > li > a:focus {
+ background-color: var(--background-lighter);
+ border-color: var(--border-color);
+ color:var(--text-color-richer);
+}
+
+
+.btn-default,
+.default {
+ background-color: var(--background-light);
+ border-color: var(--border-color);
+ color:var(--text-color-richer);
+}
+.btn:hover, .btn:focus, .btn.focus,
+.btn-default:hover {
+ background-color: var(--background-lighter);
+ border-color: var(--border-color);
+ color:var(--text-color-richer);
+}
+.btn.disabled:hover {
+ background-color: var(--background-lighter);
+ border-color: var(--border-color);
+}
+.btn-default:active,
+.btn-default:active:hover,
+.btn-default.active,
+.btn-default.active:hover {
+ background-color: var(--background-lighter);
+ border-color: var(--border-color);
+ color:var(--accent-color);
+}
+
+.dropdown-menu {
+ background-color: var(--background-dropdown);
+ border-color: var(--border-color);
+}
+.dropdown-header {
+ color:var(--text-color-richer);
+}
+.dropdown-menu .divider {
+ background-color: var(--border-color);
+}
+.dropdown-menu > li > a {
+ color:var(--text-color-normal);
+}
+.dropdown-menu > li > a:hover {
+ background-color: var(--background-lighter);
+ color:inherit;
+}
+
+.form-control {
+ background-color: var(--background-light);
+ border-color: var(--border-color);
+ color:var(--text-color-normal);
+}
+.form-control:focus {
+ border-color: var(--accent-color);
+}
+.form-control[disabled] {
+ background-color: transparent;
+ border-color: var(--border-color);
+}
+.form-frame {
+ border-color: var(--border-color);
+}
+
+label.form-switch > input[type=checkbox],
+input[type=checkbox].form-switch {
+ box-shadow:inset -1.25em 0 0 1px var(--text-color-normal);
+ background-color:var(--background-light);
+ border:1px solid var(--text-color-normal);
+}
+label.form-switch > input[type=checkbox]:hover,
+input[type=checkbox].form-switch:hover {
+ box-shadow:inset -1.25em 0 0 1px var(--text-color-normal);
+ border: 1px solid var(--text-color-normal);
+}
+label.form-switch > input[type=checkbox]:checked,
+input[type=checkbox].form-switch:checked {
+ box-shadow: inset 1.25em 0 0 1px var(--button-active);
+ border: 1px solid var(--button-active);
+}
+label.form-switch > input[type=checkbox]:checked:hover,
+input[type=checkbox].form-switch:checked:hover {
+ box-shadow:inset 1.25em 0 0 1px var(--button-active-darker);
+ border: 1px solid var(--button-active-darker);
+}
+label.form-switch > input[type=checkbox]:focus,
+input[type=checkbox].form-switch:focus {
+ background:none !important;
+}
+/*
+.form-group .btn.active {
+ color:var(--text-color-normal);
+ background-color:var(--context-info);
+}
+*/
+
+select,
+.form-group select {
+ border-color: var(--border-color);
+ color:var(--text-color-normal);
+
+ background-color: var(--background-light);
+ background-image:
+ linear-gradient(120deg, var(--wikiTriangleColor) var(--wikiTriangleSize), transparent var(--wikiTriangleSize) ),
+ linear-gradient(-120deg, var(--wikiTriangleColor) var(--wikiTriangleSize), transparent var(--wikiTriangleSize) );
+
+ background-position:
+ calc( var(--padding-base-horizontal) - 1px + var(--wikiTriangleSize)/2 ) calc(var(--padding-base-vertical)*2),
+ calc( var(--padding-base-horizontal) - var(--wikiTriangleSize)*3/2 ) calc(var(--padding-base-vertical)*2);
+
+
+}
+
+input[type=checkbox]:focus,
+select:focus,
+.form-group select:focus {
+ outline-color: var(--accent-color);
+}
+
+.modal {
+ background-color: var(--background-dropdown);
+ color:var(--text-color-normal);
+}
+
+/*pagination.less*/
+.pagination {
+ background-color: var(--background-light);
+ border-color: var(--border-color);
+}
+.pagination a {
+ color:var(--link-color);
+ text-decoration:none;
+}
+.pagination .cursor,
+.pagination a:hover {
+ background-color: var(--background-lighter);
+ border-color: var(--border-color);
+ color: var(--accent-color);
+}
+
+/* --- JSPWiki --- */
+
+/* --- variables.less --- */
+
+/* --- type.less --- */
+
+hr,.hr {
+ border-color: var(--border-color);
+}
+
+mark, .highlight {
+ background-color: var(--accent-color) !important;
+ color:var(--text-color-highlight);
+}
+
+span.text-white, div.text-white, .bg.dark + .bg-overlay { color:var(--text-color-normal); }
+/*span.text-black, div.text-black, .bg.light + .bg-overlay { color:(var(--text-???); } */
+
+.text-primary { color: var(--context-primary); }
+.text-success { color: var(--context-success); }
+.text-info { color: var(--context-info); }
+.text-warning { color: var(--context-warning); }
+.text-error,
+.text-danger { color: var(--context-error); }
+
+/* primary */
+.panel-primary > .panel-heading,
+.bg-primary {
+ background-color: var(--context-primary);
+ border-color: var(--context-primary);
+ color:var(--color-white);
+}
+.panel-primary > .panel-heading a:link,
+.bg-primary a:link {
+ color:var(--color-black);
+}
+/* success */
+.panel-success > .panel-heading,
+.success,
+.bg-success {
+ background-color: var(--context-success);
+ border-color: var(--context-success);
+ color:var(--color-black);
+}
+.panel-success > .panel-heading a:link,
+.success a:link,
+.bg-success a:link {
+ text-decoration:underline;
+}
+/* info */
+.panel-info > .panel-heading,
+.info, .information,
+.bg-info {
+ background-color: var(--context-info);
+ border-color: var(--context-info);
+ color:var(--color-black);
+}
+.panel-info > .panel-heading a:link,
+.info a:link, .information a:link,
+.bg-info a:link {
+ text-decoration:underline;
+}
+/* warning */
+.panel-warning > .panel-heading,
+.alert-warning,
+.warning,
+.bg-warning {
+ background-color: var(--context-warning);
+ border-color: var(--context-warning);
+ color:var(--color-black);
+}
+.panel-warning > .panel-heading a:link,
+.alert-warning a:link,
+.warning a:link,
+.bg-warning a:link {
+ text-decoration:underline;
+}
+/* danger, error */
+.panel-danger > .panel-heading,
+.error,.danger,
+.bg-danger {
+ background-color: var(--context-error);
+ border-color: var(--context-error);
+ color:var(--color-black);
+}
+.panel-danger > .panel-heading a:link,
+.error a:link,.danger a:link,
+.bg-danger a:link {
+ text-decoration:underline;
+}
+
+span.label { color:var(--color-black); }
+
+pre {
+ background-color:var(--background-light);
+ border-color:var(--border-color);
+ color:var(--text-color-richer);
+}
+
+code,
+tt {
+ background-color:var(--background-light);
+ border-color:var(--border-color);
+ color:var(--text-color-richer);
+}
+
+a.list-group-item:hover,
+.list-hover li:hover {
+ background-color:var(--background-lighter);
+ color:inherit;
+}
+
+.tree ul li::before,
+.tree ul li::after {
+ background: var(--border-color);
+}
+
+.list-hover li:hover {
+ background-color:var(--background-lighter);
+}
+
+.hover {
+ background-color:var(--background-lighter);
+}
+
+a.slimbox-link:after,
+.slimbox-btn:before,
+a:visited,
+a:link { color:var(--link-color); }
+
+a.createpage {
+ color:var(--error-color);
+}
+
+.interwiki-raw::after,
+a.interwiki[href$="skin=raw"]::after,
+.interwiki-reader::after,
+a.interwiki[href$="skin=reader"]::after,
+.interwiki-edit::after,
+a.interwiki[href*="Edit.jsp?page="]::after,
+.interwiki-group::after,
+a.interwiki[href*="Group.jsp?group="]::after,
+a.interwiki[href^="rss.jsp"]::after {
+ background-color:var(--background-lighter);
+ color:var(--accent-color);
+}
+
+.editsection,
+.hashlink {
+ background-color: var(--background-light);
+ border-color: var(--border-color);
+ color:var(--link-color);
+}
+.editsection:hover,
+h2 .editsection:hover,
+h3 .editsection:hover,
+h4 .editsection:hover,
+h2 .hashlink:hover,
+h3 .hashlink:hover,
+h4 .hashlink:hover {
+ background-color: var(--background-lighter);
+ border-color: var(--border-color);
+ color:var(--link-color);
+ opacity:1;
+}
+
+div.dropcaps > span.dropcaps {
+ color: var(--text-color-highlight);
+}
+blockquote,
+.dialog .quote-item {
+ border-color:var(--text-color-highlight);
+}
+.page-break {
+ border-color: var(--border-color);
+}
+
+
+/* --- grid.less --- */
+/* --- tables.less --- */
+
+.table > thead > tr > th,
+.table > tbody > tr > th,
+.table > tfoot > tr > th,
+.table > thead > tr > td,
+.table > tbody > tr > td,
+.table > tfoot > tr > td {
+ border-color: var(--border-color);
+}
+
+.wikitable > thead > tr > th,
+.wikitable > tbody > tr > th,
+.wikitable > tfoot > tr > th,
+.wikitable > thead > tr > td,
+.wikitable > tbody > tr > td,
+.wikitable > tfoot > tr > td,
+.wikitable tr:first-child th {
+ border-color: var(--border-color);
+}
+
+.table-bordered,
+.table-bordered tr:first-child th,
+.table-bordered tr:first-child td {
+ border-color: var(--border-color);
+}
+.table-bordered > thead > tr > th,
+.table-bordered > tbody > tr > th,
+.table-bordered > tfoot > tr > th,
+.table-bordered > thead > tr > td,
+.table-bordered > tbody > tr > td,
+.table-bordered > tfoot > tr > td {
+ border-color: var(--border-color);
+}
+
+.table-hover > tbody > tr:nth-of-type(odd):hover,
+.table-hover > tbody > tr:nth-child(odd):hover > td,
+.table-hover > tbody > tr:nth-child(odd):hover > th,
+.table-hover > tbody > tr:hover {
+ background-color: var(--background-lighter);
+}
+
+.table-striped > tbody > tr:nth-of-type(odd) ,
+.table-striped > tbody > tr:nth-child(odd) > td,
+.table-striped > tbody > tr:nth-child(odd) > th {
+ background-color: var(--background-light);
+}
+[class*=zebra] .odd {
+ background-color: var(--background-light);
+}
+
+
+/* --- TableX.Sort.less --- */
+.sortable th:hover {
+ background-color: var(--background-lighter);;
+}
+.sortable th.up:after,
+.sortable th.up:hover:after {
+ border-bottom-color: var(--accent-color);
+ opacity:1;
+}
+.sortable th:hover:after,
+.sortable th.down:after,
+.sortable th.down:hover:after {
+ border-top-color: var(--accent-color);
+ opacity:1;
+}
+
+/* --- TableX.Filter.less --- */
+/* --- forms.less --- */
+/* --- modals.less --- */
+
+/* --- fontjspwiki/font-jspwiki.less --- */
+/* --- dropdown.less --- */
+
+/* --- pagination.less --- */
+/* --- Tips.less --- */
+.tip-link,
+.tip-link:hover {
+ color: var(--link-color);
+}
+/* --- Magnify.less --- */
+/* --- Viewer.less --- */
+/* --- Viewer.Slimbox.less --- */
+/* --- Viewer.Carousel.less --- */
+/* --- Template.View.less --- */
+html body .header, html body .footer {
+ background-image: -webkit-radial-gradient(circle, var(--background-light), var(--background));
+ background-image: radial-gradient(circle, var(--background-light), var(--background) );
+ color:var(--text-color-normal);
+}
+a.logo { border-color: var(--border-color); }
+
+
+div.admin .formcontainer {
+ /*.default*/
+ background-color: var(--background-light);
+ border-color: var(--border-color);
+ color:var(--text-color-richer);
+}
+
+.admin .formcontainer table {
+ border-color: var(--border-color);
+ /*
+ .table;
+ .table-bordered;
+ .table-striped;
+ */
+}
+.admin-user-form > div#userlist .list-group-item.new-user{
+ background-color: var(--background-light);
+ border-color: var(--border-color);
+ color:var(--text-color-richer);
+}
+
+
+
+
+/* --- Template.UserBox.less --- */
+.login-form {
+ background-color: var(--background-dialog);
+ border:1px solid var(--border-color);
+}
+.login-form hr { border-color:var(--border-color); }
+
+
+/* --- Template.SearchBox.less --- */
+/* --- Template.Nav.less --- */
+.badge,
+.header > .navigation .nav > li > a > .badge {
+ background-color:var(--background-lighter);
+ color:var(--text-color-normal);
+}
+
+.header > .navigation .nav .btn-xs .badge {
+ background-color: var(--background-lighter);
+}
+
+/* --- Template.Content.less --- */
+body, .content {
+ background-color: var(--background);
+ color:var(--text-color-normal);
+ overflow-y: auto;
+}
+.content:after {
+ background: var(--background-sidebar);
+}
+/* --- Template.Attach.less --- */
+/* --- Template.Diff.less --- */
+.diffadd { background-color:var(--context-success); color:var(--color-black); }
+.diffrem { background:var(--context-error); color:var(--color-black); }
+
+/* --- Template.Search.less --- */
+
+form#searchform2 + div .fragment {
+ color: var(--text-color-richer);
+}
+form#searchform2 + div .gb-bar {
+ background-color: var(--context-warning);
+}
+
+/* --- Template.Workflow.less --- */
+/* --- Template.Edit.less --- */
+
+.editform input[type="text"]:focus,
+.dialog.find input[type="text"]:focus,
+.editform textarea:focus,
+.dialog.find textarea:focus {
+ background-color:var(--background-lighter);
+ border-color:var(--border-color);
+ color:var(--text-color-richer);
+}
+.ajaxpreview {
+ border-color:var(--border-color);
+}
+.edit-area ~ .ajaxpreview {
+ border-left-color:var(--border-color);
+}
+
+/* --- Dialog.less --- */
+.dialog {
+ background-color: var(--background-dialog);
+ border-color: var(--border-color);
+}
+.dialog .caption {
+ border-color: var(--border-color);
+ color: var(--text-color-normal);
+}
+.dialog.selection .body .item:hover {
+ background-color: var(--background-lighter);
+}
+.dialog.selection .body .divider {
+ background-color: var(--border-color);
+}
+
+.dialog.find [name=tbTEXTSEL] { /*same as selected text*/
+ color:var(--accent-color);
+ background-color: var(--color-black);
+}
+
+
+
+/* --- Template.Preview.less --- */
+
+/* --- ImagePlugin.less --- */
+/* --- IndexPlugin.less --- */
+
+.index .header {
+ background-color:var(--background-light);
+ border-color:var(--border-color);
+}
+.index .header:hover {
+ background-color:var(--background-light);
+}
+.index .header a {
+ color:var(--text-color-richer);
+}
+.index .header a:hover {
+ background-color:var(--background-lighter);
+}
+.index > .section a {
+ color:var(--text-color-richer);
+}
+
+
+/* --- TOCPlugin.less --- */
+
+.toc ul li:hover {
+ background-color:var(--background-lighter);
+}
+
+/* --- WeblogPlugin.less --- */
+/* --- RecentChangesPlugin.less --- */
+
+.recentchanges .date {
+ border-color:var(--border-color);
+}
+/* --- CommentBox.less --- */
+
+
+/* --- GraphBar.less --- */
+.gb-group {
+ background-color:var(--background-light);
+ border:1px solid var(--border-color);
+}
+
+/* --- Tabs.less --- */
+/* --- Accordion.less --- */
+/* --- Columns.less --- */
+.columns.border,
+.columns.border > .col:not(:last-child) {
+ border-color:var(--border-color);
+}
+.columns.hover .col:hover {
+ background-color: var(--background-lighter);
+}
+
+
+/* --- Collapsible.less --- */
+.bullet, .bullet.clpse { border-left-color: var(--text-color-normal); }
+.bullet.clpse:hover { border-left-color: var(--text-color-richer); }
+
+.bullet.xpand { border-top-color: var(--text-color-normal); }
+.bullet.xpand:hover { border-top-color: var(--text-color-richer); }
+
+/* --- Category.less --- */
+.category-link {
+ border-color:var(--border-color);
+}
+/* --- Flip.less --- */
+/* --- Invisibles.less --- */
+/* --- prettify.less --- */
+ .prettify pre, .prettify-nonum pre, pre.prettylines {
+ background-color:var(--background-light);
+ border-color:var(--border-color);
+ color:var(--text-color-richer);
+ }
+ .pln { color: #cccccc; } /* plain text */
+ .str { color: #99cc99; } /* string content */
+ .kwd { color: #ffeea6; } /* keyword */
+ .com { color: #8a8a80; } /* comment */
+ .typ { color: #bbdaff; } /* type name */
+ .lit { color: #FCA369; } /* literal value */
+ .pun { color: #cda869; } /* punctuation */
+ .opn { color: #ffffff; } /* lisp open bracket */
+ .clo { color: #ffffff; } /* lisp close bracket */
+ .tag { color: #78AAD6; } /* markup tag name */
+ .atn { color: #ffc58f; } /* markup attribute name */
+ .atv { color: #FFD479; } /* markup attribute value */
+ .dec { color: #D6ACD6; } /* declaration */
+ .var { color: #76D4D6; } /* variable name */
+ .fun { color: #d6acd6; } /* function name */
+
+/* --- responsive-viewport.less --- */
+/* --- print.less --- */
diff --git a/jspwiki-war/src/main/webapp/templates/default/skins/bootstrap/skin.js b/jspwiki-war/src/main/webapp/templates/default/skins/bootstrap/skin.js
new file mode 100644
index 0000000000..39d50ac082
--- /dev/null
+++ b/jspwiki-war/src/main/webapp/templates/default/skins/bootstrap/skin.js
@@ -0,0 +1,17 @@
+/*
+ * Copyright 2025 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
diff --git a/jspwiki-war/src/main/webapp/templates/default/skins/cyborg/skin.css b/jspwiki-war/src/main/webapp/templates/default/skins/cyborg/skin.css
new file mode 100644
index 0000000000..0ffc70c991
--- /dev/null
+++ b/jspwiki-war/src/main/webapp/templates/default/skins/cyborg/skin.css
@@ -0,0 +1,728 @@
+/*
+inspired by Bootswatch theme of the same name
+from https://github.com/thomaspark/bootswatch/
+MIT Licensed
+*/
+
+html {
+ /* 1. Core Hue Shifts */
+ --hue: 200; /* Shifted toward Electric Blue */
+ --accent-hue: 200;
+
+ /* 2. Text Colors */
+ --text-color-normal: #eeeeee; /* Off-white for high contrast */
+ --text-color-light: #999999; /* Muted gray */
+ --text-color-richer: #ffffff;
+ --text-color-highlight: #2a9fd6; /* Cyborg Electric Blue */
+
+ /* 3. Links and Accents */
+ --link-color: #2a9fd6; /* Electric Blue */
+ --accent-color: #2a9fd6;
+ --error-color: #cc0000; /* Deeper Red for Cyborg */
+
+ /* 4. Buttons */
+ --button-background: #2a9fd6;
+ --button-text-color: #ffffff;
+ --button-active: #2180ac; /* Darker blue for hover state */
+ --button-active-darker: #196081;
+
+ /* 5. Backgrounds */
+ --background: #060606; /* Jet Black */
+ --background-sidebar: #151515; /* Near Black for subtle depth */
+ --background-light: #222222;
+ --background-lighter: #282828;
+ --background-light-solid: #151515;
+
+ /* Navbar / PageName Specific Background */
+ --navbar-bg: #222222; /* Slightly lighter than body for visibility */
+
+ --background-dropdown: #222222;
+ --background-dialog: #060606;
+
+ /* 6. Borders */
+ --border-color: #282828; /* Very dark gray borders */
+
+ /* 7. Contextual Colors (Cyborg Standards) */
+ --context-primary: #2a9fd6;
+ --context-success: #77b300; /* Cyborg's specific neon-lime success */
+ --context-info: #9933cc; /* Purple used in Cyborg for Info */
+ --context-warning: #ff8800; /* Bright Orange */
+ --context-error: #cc0000;
+
+ --color-black: #000000;
+ --color-white: #ffffff;
+
+ --wikiTriangleColor: var(--link-color);
+}
+
+
+::selection {
+ color:var(--accent-color);
+ background-color: var(--color-black);
+}
+
+/* --- BOOTSTRAP --- */
+.titlebox {
+ background-color: var(--background-light);
+}
+.panel {
+ background-color: var(--background-light);
+ border-color: var(--border-color);
+}
+.panel-default .panel-heading {
+ background-color: var(--background-lighter);
+ border-color: var(--border-color);
+ color:inherit;
+}
+
+.list-group-item {
+ background-color: var(--background-light);
+ border-color: var(--border-color);
+}
+
+.nav-tabs {
+ border-color: var(--border-color);
+}
+.nav-tabs > li > a {
+ color:inherit;
+}
+.nav-tabs > li > a:hover {
+ background-color: var(--background-light);
+ border-color: var(--border-color);
+ color:inherit;
+}
+.nav-tabs > li.active > a,
+.nav-tabs > li.active {
+ background:transparent;
+ color:var(--text-color-richer);
+ border-color: var(--border-color);
+ border-bottom-color: var(--background);
+}
+.nav-tabs > li.active > a:hover,
+.nav-tabs > li.active > a:focus {
+ background-color: var(--background-lighter);
+ border-color: var(--border-color);
+ color:var(--text-color-richer);
+}
+
+/*.nav-pills > li.active > a,
+.nav-pills > li.active > a:hover,
+.nav-pills > li.active > a:focus {
+
+}*/
+.nav > li > a:hover, .nav > li > a:focus {
+ background-color: var(--background-lighter);
+ border-color: var(--border-color);
+ color:var(--text-color-richer);
+}
+
+
+.btn-default,
+.default {
+ background-color: var(--background-light);
+ border-color: var(--border-color);
+ color:var(--text-color-richer);
+}
+.btn:hover, .btn:focus, .btn.focus,
+.btn-default:hover {
+ background-color: var(--background-lighter);
+ border-color: var(--border-color);
+ color:var(--text-color-richer);
+}
+.btn.disabled:hover {
+ background-color: var(--background-lighter);
+ border-color: var(--border-color);
+}
+.btn-default:active,
+.btn-default:active:hover,
+.btn-default.active,
+.btn-default.active:hover {
+ background-color: var(--background-lighter);
+ border-color: var(--border-color);
+ color:var(--accent-color);
+}
+
+.dropdown-menu {
+ background-color: var(--background-dropdown);
+ border-color: var(--border-color);
+}
+.dropdown-header {
+ color:var(--text-color-richer);
+}
+.dropdown-menu .divider {
+ background-color: var(--border-color);
+}
+.dropdown-menu > li > a {
+ color:var(--text-color-normal);
+}
+.dropdown-menu > li > a:hover {
+ background-color: var(--background-lighter);
+ color:inherit;
+}
+
+.form-control {
+ background-color: var(--background-light);
+ border-color: var(--border-color);
+ color:var(--text-color-normal);
+}
+.form-control:focus {
+ border-color: var(--accent-color);
+}
+.form-control[disabled] {
+ background-color: transparent;
+ border-color: var(--border-color);
+}
+.form-frame {
+ border-color: var(--border-color);
+}
+
+label.form-switch > input[type=checkbox],
+input[type=checkbox].form-switch {
+ box-shadow:inset -1.25em 0 0 1px var(--text-color-normal);
+ background-color:var(--background-light);
+ border:1px solid var(--text-color-normal);
+}
+label.form-switch > input[type=checkbox]:hover,
+input[type=checkbox].form-switch:hover {
+ box-shadow:inset -1.25em 0 0 1px var(--text-color-normal);
+ border: 1px solid var(--text-color-normal);
+}
+label.form-switch > input[type=checkbox]:checked,
+input[type=checkbox].form-switch:checked {
+ box-shadow: inset 1.25em 0 0 1px var(--button-active);
+ border: 1px solid var(--button-active);
+}
+label.form-switch > input[type=checkbox]:checked:hover,
+input[type=checkbox].form-switch:checked:hover {
+ box-shadow:inset 1.25em 0 0 1px var(--button-active-darker);
+ border: 1px solid var(--button-active-darker);
+}
+label.form-switch > input[type=checkbox]:focus,
+input[type=checkbox].form-switch:focus {
+ background:none !important;
+}
+/*
+.form-group .btn.active {
+ color:var(--text-color-normal);
+ background-color:var(--context-info);
+}
+*/
+
+select,
+.form-group select {
+ border-color: var(--border-color);
+ color:var(--text-color-normal);
+
+ background-color: var(--background-light);
+ background-image:
+ linear-gradient(120deg, var(--wikiTriangleColor) var(--wikiTriangleSize), transparent var(--wikiTriangleSize) ),
+ linear-gradient(-120deg, var(--wikiTriangleColor) var(--wikiTriangleSize), transparent var(--wikiTriangleSize) );
+
+ background-position:
+ calc( var(--padding-base-horizontal) - 1px + var(--wikiTriangleSize)/2 ) calc(var(--padding-base-vertical)*2),
+ calc( var(--padding-base-horizontal) - var(--wikiTriangleSize)*3/2 ) calc(var(--padding-base-vertical)*2);
+
+
+}
+
+input[type=checkbox]:focus,
+select:focus,
+.form-group select:focus {
+ outline-color: var(--accent-color);
+}
+
+.modal {
+ background-color: var(--background-dropdown);
+ color:var(--text-color-normal);
+}
+
+/*pagination.less*/
+.pagination {
+ background-color: var(--background-light);
+ border-color: var(--border-color);
+}
+.pagination a {
+ color:var(--link-color);
+ text-decoration:none;
+}
+.pagination .cursor,
+.pagination a:hover {
+ background-color: var(--background-lighter);
+ border-color: var(--border-color);
+ color: var(--accent-color);
+}
+
+/* --- JSPWiki --- */
+
+/* --- variables.less --- */
+
+/* --- type.less --- */
+
+hr,.hr {
+ border-color: var(--border-color);
+}
+
+mark, .highlight {
+ background-color: var(--accent-color) !important;
+ color:var(--text-color-highlight);
+}
+
+span.text-white, div.text-white, .bg.dark + .bg-overlay { color:var(--text-color-normal); }
+/*span.text-black, div.text-black, .bg.light + .bg-overlay { color:(var(--text-???); } */
+
+.text-primary { color: var(--context-primary); }
+.text-success { color: var(--context-success); }
+.text-info { color: var(--context-info); }
+.text-warning { color: var(--context-warning); }
+.text-error,
+.text-danger { color: var(--context-error); }
+
+/* primary */
+.panel-primary > .panel-heading,
+.bg-primary {
+ background-color: var(--context-primary);
+ border-color: var(--context-primary);
+ color:var(--color-white);
+}
+.panel-primary > .panel-heading a:link,
+.bg-primary a:link {
+ color:var(--color-black);
+}
+/* success */
+.panel-success > .panel-heading,
+.success,
+.bg-success {
+ background-color: var(--context-success);
+ border-color: var(--context-success);
+ color:var(--color-black);
+}
+.panel-success > .panel-heading a:link,
+.success a:link,
+.bg-success a:link {
+ text-decoration:underline;
+}
+/* info */
+.panel-info > .panel-heading,
+.info, .information,
+.bg-info {
+ background-color: var(--context-info);
+ border-color: var(--context-info);
+ color:var(--color-black);
+}
+.panel-info > .panel-heading a:link,
+.info a:link, .information a:link,
+.bg-info a:link {
+ text-decoration:underline;
+}
+/* warning */
+.panel-warning > .panel-heading,
+.alert-warning,
+.warning,
+.bg-warning {
+ background-color: var(--context-warning);
+ border-color: var(--context-warning);
+ color:var(--color-black);
+}
+.panel-warning > .panel-heading a:link,
+.alert-warning a:link,
+.warning a:link,
+.bg-warning a:link {
+ text-decoration:underline;
+}
+/* danger, error */
+.panel-danger > .panel-heading,
+.error,.danger,
+.bg-danger {
+ background-color: var(--context-error);
+ border-color: var(--context-error);
+ color:var(--color-black);
+}
+.panel-danger > .panel-heading a:link,
+.error a:link,.danger a:link,
+.bg-danger a:link {
+ text-decoration:underline;
+}
+
+span.label { color:var(--color-black); }
+
+pre {
+ background-color:var(--background-light);
+ border-color:var(--border-color);
+ color:var(--text-color-richer);
+}
+
+code,
+tt {
+ background-color:var(--background-light);
+ border-color:var(--border-color);
+ color:var(--text-color-richer);
+}
+
+a.list-group-item:hover,
+.list-hover li:hover {
+ background-color:var(--background-lighter);
+ color:inherit;
+}
+
+.tree ul li::before,
+.tree ul li::after {
+ background: var(--border-color);
+}
+
+.list-hover li:hover {
+ background-color:var(--background-lighter);
+}
+
+.hover {
+ background-color:var(--background-lighter);
+}
+
+a.slimbox-link:after,
+.slimbox-btn:before,
+a:visited,
+a:link { color:var(--link-color); }
+
+a.createpage {
+ color:var(--error-color);
+}
+
+.interwiki-raw::after,
+a.interwiki[href$="skin=raw"]::after,
+.interwiki-reader::after,
+a.interwiki[href$="skin=reader"]::after,
+.interwiki-edit::after,
+a.interwiki[href*="Edit.jsp?page="]::after,
+.interwiki-group::after,
+a.interwiki[href*="Group.jsp?group="]::after,
+a.interwiki[href^="rss.jsp"]::after {
+ background-color:var(--background-lighter);
+ color:var(--accent-color);
+}
+
+.editsection,
+.hashlink {
+ background-color: var(--background-light);
+ border-color: var(--border-color);
+ color:var(--link-color);
+}
+.editsection:hover,
+h2 .editsection:hover,
+h3 .editsection:hover,
+h4 .editsection:hover,
+h2 .hashlink:hover,
+h3 .hashlink:hover,
+h4 .hashlink:hover {
+ background-color: var(--background-lighter);
+ border-color: var(--border-color);
+ color:var(--link-color);
+ opacity:1;
+}
+
+div.dropcaps > span.dropcaps {
+ color: var(--text-color-highlight);
+}
+blockquote,
+.dialog .quote-item {
+ border-color:var(--text-color-highlight);
+}
+.page-break {
+ border-color: var(--border-color);
+}
+
+
+/* --- grid.less --- */
+/* --- tables.less --- */
+
+.table > thead > tr > th,
+.table > tbody > tr > th,
+.table > tfoot > tr > th,
+.table > thead > tr > td,
+.table > tbody > tr > td,
+.table > tfoot > tr > td {
+ border-color: var(--border-color);
+}
+
+.wikitable > thead > tr > th,
+.wikitable > tbody > tr > th,
+.wikitable > tfoot > tr > th,
+.wikitable > thead > tr > td,
+.wikitable > tbody > tr > td,
+.wikitable > tfoot > tr > td,
+.wikitable tr:first-child th {
+ border-color: var(--border-color);
+}
+
+.table-bordered,
+.table-bordered tr:first-child th,
+.table-bordered tr:first-child td {
+ border-color: var(--border-color);
+}
+.table-bordered > thead > tr > th,
+.table-bordered > tbody > tr > th,
+.table-bordered > tfoot > tr > th,
+.table-bordered > thead > tr > td,
+.table-bordered > tbody > tr > td,
+.table-bordered > tfoot > tr > td {
+ border-color: var(--border-color);
+}
+
+.table-hover > tbody > tr:nth-of-type(odd):hover,
+.table-hover > tbody > tr:nth-child(odd):hover > td,
+.table-hover > tbody > tr:nth-child(odd):hover > th,
+.table-hover > tbody > tr:hover {
+ background-color: var(--background-lighter);
+}
+
+.table-striped > tbody > tr:nth-of-type(odd) ,
+.table-striped > tbody > tr:nth-child(odd) > td,
+.table-striped > tbody > tr:nth-child(odd) > th {
+ background-color: var(--background-light);
+}
+[class*=zebra] .odd {
+ background-color: var(--background-light);
+}
+
+
+/* --- TableX.Sort.less --- */
+.sortable th:hover {
+ background-color: var(--background-lighter);;
+}
+.sortable th.up:after,
+.sortable th.up:hover:after {
+ border-bottom-color: var(--accent-color);
+ opacity:1;
+}
+.sortable th:hover:after,
+.sortable th.down:after,
+.sortable th.down:hover:after {
+ border-top-color: var(--accent-color);
+ opacity:1;
+}
+
+/* --- TableX.Filter.less --- */
+/* --- forms.less --- */
+/* --- modals.less --- */
+
+/* --- fontjspwiki/font-jspwiki.less --- */
+/* --- dropdown.less --- */
+
+/* --- pagination.less --- */
+/* --- Tips.less --- */
+.tip-link,
+.tip-link:hover {
+ color: var(--link-color);
+}
+/* --- Magnify.less --- */
+/* --- Viewer.less --- */
+/* --- Viewer.Slimbox.less --- */
+/* --- Viewer.Carousel.less --- */
+/* --- Template.View.less --- */
+html body .header, html body .footer {
+ background-image: -webkit-radial-gradient(circle, var(--background-light), var(--background));
+ background-image: radial-gradient(circle, var(--background-light), var(--background) );
+ color:var(--text-color-normal);
+}
+a.logo { border-color: var(--border-color); }
+
+
+div.admin .formcontainer {
+ /*.default*/
+ background-color: var(--background-light);
+ border-color: var(--border-color);
+ color:var(--text-color-richer);
+}
+
+.admin .formcontainer table {
+ border-color: var(--border-color);
+ /*
+ .table;
+ .table-bordered;
+ .table-striped;
+ */
+}
+.admin-user-form > div#userlist .list-group-item.new-user{
+ background-color: var(--background-light);
+ border-color: var(--border-color);
+ color:var(--text-color-richer);
+}
+
+
+
+
+/* --- Template.UserBox.less --- */
+.login-form {
+ background-color: var(--background-dialog);
+ border:1px solid var(--border-color);
+}
+.login-form hr { border-color:var(--border-color); }
+
+
+/* --- Template.SearchBox.less --- */
+/* --- Template.Nav.less --- */
+.badge,
+.header > .navigation .nav > li > a > .badge {
+ background-color:var(--background-lighter);
+ color:var(--text-color-normal);
+}
+
+.header > .navigation .nav .btn-xs .badge {
+ background-color: var(--background-lighter);
+}
+
+/* --- Template.Content.less --- */
+body, .content {
+ background-color: var(--background);
+ color:var(--text-color-normal);
+ overflow-y: auto;
+}
+.content:after {
+ background: var(--background-sidebar);
+}
+/* --- Template.Attach.less --- */
+/* --- Template.Diff.less --- */
+.diffadd { background-color:var(--context-success); color:var(--color-black); }
+.diffrem { background:var(--context-error); color:var(--color-black); }
+
+/* --- Template.Search.less --- */
+
+form#searchform2 + div .fragment {
+ color: var(--text-color-richer);
+}
+form#searchform2 + div .gb-bar {
+ background-color: var(--context-warning);
+}
+
+/* --- Template.Workflow.less --- */
+/* --- Template.Edit.less --- */
+
+.editform input[type="text"]:focus,
+.dialog.find input[type="text"]:focus,
+.editform textarea:focus,
+.dialog.find textarea:focus {
+ background-color:var(--background-lighter);
+ border-color:var(--border-color);
+ color:var(--text-color-richer);
+}
+.ajaxpreview {
+ border-color:var(--border-color);
+}
+.edit-area ~ .ajaxpreview {
+ border-left-color:var(--border-color);
+}
+
+/* --- Dialog.less --- */
+.dialog {
+ background-color: var(--background-dialog);
+ border-color: var(--border-color);
+}
+.dialog .caption {
+ border-color: var(--border-color);
+ color: var(--text-color-normal);
+}
+.dialog.selection .body .item:hover {
+ background-color: var(--background-lighter);
+}
+.dialog.selection .body .divider {
+ background-color: var(--border-color);
+}
+
+.dialog.find [name=tbTEXTSEL] { /*same as selected text*/
+ color:var(--accent-color);
+ background-color: var(--color-black);
+}
+
+
+
+/* --- Template.Preview.less --- */
+
+/* --- ImagePlugin.less --- */
+/* --- IndexPlugin.less --- */
+
+.index .header {
+ background-color:var(--background-light);
+ border-color:var(--border-color);
+}
+.index .header:hover {
+ background-color:var(--background-light);
+}
+.index .header a {
+ color:var(--text-color-richer);
+}
+.index .header a:hover {
+ background-color:var(--background-lighter);
+}
+.index > .section a {
+ color:var(--text-color-richer);
+}
+
+
+/* --- TOCPlugin.less --- */
+
+.toc ul li:hover {
+ background-color:var(--background-lighter);
+}
+
+/* --- WeblogPlugin.less --- */
+/* --- RecentChangesPlugin.less --- */
+
+.recentchanges .date {
+ border-color:var(--border-color);
+}
+/* --- CommentBox.less --- */
+
+
+/* --- GraphBar.less --- */
+.gb-group {
+ background-color:var(--background-light);
+ border:1px solid var(--border-color);
+}
+
+/* --- Tabs.less --- */
+/* --- Accordion.less --- */
+/* --- Columns.less --- */
+.columns.border,
+.columns.border > .col:not(:last-child) {
+ border-color:var(--border-color);
+}
+.columns.hover .col:hover {
+ background-color: var(--background-lighter);
+}
+
+
+/* --- Collapsible.less --- */
+.bullet, .bullet.clpse { border-left-color: var(--text-color-normal); }
+.bullet.clpse:hover { border-left-color: var(--text-color-richer); }
+
+.bullet.xpand { border-top-color: var(--text-color-normal); }
+.bullet.xpand:hover { border-top-color: var(--text-color-richer); }
+
+/* --- Category.less --- */
+.category-link {
+ border-color:var(--border-color);
+}
+/* --- Flip.less --- */
+/* --- Invisibles.less --- */
+/* --- prettify.less --- */
+ .prettify pre, .prettify-nonum pre, pre.prettylines {
+ background-color:var(--background-light);
+ border-color:var(--border-color);
+ color:var(--text-color-richer);
+ }
+ .pln { color: #cccccc; } /* plain text */
+ .str { color: #99cc99; } /* string content */
+ .kwd { color: #ffeea6; } /* keyword */
+ .com { color: #8a8a80; } /* comment */
+ .typ { color: #bbdaff; } /* type name */
+ .lit { color: #FCA369; } /* literal value */
+ .pun { color: #cda869; } /* punctuation */
+ .opn { color: #ffffff; } /* lisp open bracket */
+ .clo { color: #ffffff; } /* lisp close bracket */
+ .tag { color: #78AAD6; } /* markup tag name */
+ .atn { color: #ffc58f; } /* markup attribute name */
+ .atv { color: #FFD479; } /* markup attribute value */
+ .dec { color: #D6ACD6; } /* declaration */
+ .var { color: #76D4D6; } /* variable name */
+ .fun { color: #d6acd6; } /* function name */
+
+/* --- responsive-viewport.less --- */
+/* --- print.less --- */
diff --git a/jspwiki-war/src/main/webapp/templates/default/skins/cyborg/skin.js b/jspwiki-war/src/main/webapp/templates/default/skins/cyborg/skin.js
new file mode 100644
index 0000000000..39d50ac082
--- /dev/null
+++ b/jspwiki-war/src/main/webapp/templates/default/skins/cyborg/skin.js
@@ -0,0 +1,17 @@
+/*
+ * Copyright 2025 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
diff --git a/jspwiki-war/src/main/styles/static/templates/default/haddock-dark.css b/jspwiki-war/src/main/webapp/templates/default/skins/dark/skin.css
similarity index 99%
rename from jspwiki-war/src/main/styles/static/templates/default/haddock-dark.css
rename to jspwiki-war/src/main/webapp/templates/default/skins/dark/skin.css
index 528e6a6773..28125ec8d0 100644
--- a/jspwiki-war/src/main/styles/static/templates/default/haddock-dark.css
+++ b/jspwiki-war/src/main/webapp/templates/default/skins/dark/skin.css
@@ -82,7 +82,9 @@ html {
}
/* --- BOOTSTRAP --- */
-
+.titlebox {
+ background-color: var(--background-light);
+}
.panel {
background-color: var(--background-light);
border-color: var(--border-color);
@@ -285,7 +287,7 @@ mark, .highlight {
color:var(--text-color-highlight);
}
-span.text-white, div.text-white, .bg.dark + .bg-overlay { color:var(--text-color-normal;); }
+span.text-white, div.text-white, .bg.dark + .bg-overlay { color:var(--text-color-normal); }
/*span.text-black, div.text-black, .bg.light + .bg-overlay { color:(var(--text-???); } */
.text-primary { color: var(--context-primary); }
diff --git a/jspwiki-war/src/main/webapp/templates/default/skins/dark/skin.js b/jspwiki-war/src/main/webapp/templates/default/skins/dark/skin.js
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/jspwiki-war/src/main/webapp/templates/default/skins/darkly/skin.css b/jspwiki-war/src/main/webapp/templates/default/skins/darkly/skin.css
new file mode 100644
index 0000000000..9572890f42
--- /dev/null
+++ b/jspwiki-war/src/main/webapp/templates/default/skins/darkly/skin.css
@@ -0,0 +1,728 @@
+/*
+inspired by Bootswatch theme of the same name
+from https://github.com/thomaspark/bootswatch/
+MIT Licensed
+*/
+
+html {
+ /* 1. Core Hue Shifts */
+ --hue: 209;
+ --accent-hue: 165; /* Shifted toward Teal/Green */
+
+ /* 2. Text Colors */
+ --text-color-normal: #ebebeb;
+ --text-color-light: #999999;
+ --text-color-richer: #ffffff;
+ --text-color-highlight: #00bc8c; /* Changed to Darkly Green */
+
+ /* 3. Links and Accents - THE GREEN FIX */
+ --link-color: #00bc8c; /* Darkly Success Green */
+ --accent-color: #00bc8c;
+ --error-color: #000000;
+
+ /* 4. Buttons */
+ --button-background: #375a7f; /* Primary Blue for buttons */
+ --button-text-color: #ffffff;
+ --button-active: #00bc8c; /* Green for active/hover */
+ --button-active-darker: #008f6a;
+
+ /* 5. Backgrounds */
+ --background: #222222;
+ --background-sidebar: #303030;
+ --background-light: #303030;
+ --background-lighter: #444444;
+ --background-light-solid: #303030;
+
+ /* Navbar / PageName Specific Background */
+ --navbar-bg: #375a7f; /* Darkly's Navbar Blue */
+
+ --background-dropdown: #303030;
+ --background-dialog: #222222;
+
+ /* 6. Borders */
+ --border-color: #444444;
+
+ /* 7. Contextual Colors */
+ --context-primary: #375a7f;
+ --context-success: #00bc8c;
+ --context-info: #3498db;
+ --context-warning: #f39c12;
+ --context-error: #e74c3c;
+
+ --color-black: #000000;
+ --color-white: #ffffff;
+
+ --wikiTriangleColor: var(--link-color);
+}
+
+
+::selection {
+ color:var(--accent-color);
+ background-color: var(--color-black);
+}
+
+/* --- BOOTSTRAP --- */
+.titlebox {
+ background-color: var(--background-light);
+}
+.panel {
+ background-color: var(--background-light);
+ border-color: var(--border-color);
+}
+.panel-default .panel-heading {
+ background-color: var(--background-lighter);
+ border-color: var(--border-color);
+ color:inherit;
+}
+
+.list-group-item {
+ background-color: var(--background-light);
+ border-color: var(--border-color);
+}
+
+.nav-tabs {
+ border-color: var(--border-color);
+}
+.nav-tabs > li > a {
+ color:inherit;
+}
+.nav-tabs > li > a:hover {
+ background-color: var(--background-light);
+ border-color: var(--border-color);
+ color:inherit;
+}
+.nav-tabs > li.active > a,
+.nav-tabs > li.active {
+ background:transparent;
+ color:var(--text-color-richer);
+ border-color: var(--border-color);
+ border-bottom-color: var(--background);
+}
+.nav-tabs > li.active > a:hover,
+.nav-tabs > li.active > a:focus {
+ background-color: var(--background-lighter);
+ border-color: var(--border-color);
+ color:var(--text-color-richer);
+}
+
+/*.nav-pills > li.active > a,
+.nav-pills > li.active > a:hover,
+.nav-pills > li.active > a:focus {
+
+}*/
+.nav > li > a:hover, .nav > li > a:focus {
+ background-color: var(--background-lighter);
+ border-color: var(--border-color);
+ color:var(--text-color-richer);
+}
+
+
+.btn-default,
+.default {
+ background-color: var(--background-light);
+ border-color: var(--border-color);
+ color:var(--text-color-richer);
+}
+.btn:hover, .btn:focus, .btn.focus,
+.btn-default:hover {
+ background-color: var(--background-lighter);
+ border-color: var(--border-color);
+ color:var(--text-color-richer);
+}
+.btn.disabled:hover {
+ background-color: var(--background-lighter);
+ border-color: var(--border-color);
+}
+.btn-default:active,
+.btn-default:active:hover,
+.btn-default.active,
+.btn-default.active:hover {
+ background-color: var(--background-lighter);
+ border-color: var(--border-color);
+ color:var(--accent-color);
+}
+
+.dropdown-menu {
+ background-color: var(--background-dropdown);
+ border-color: var(--border-color);
+}
+.dropdown-header {
+ color:var(--text-color-richer);
+}
+.dropdown-menu .divider {
+ background-color: var(--border-color);
+}
+.dropdown-menu > li > a {
+ color:var(--text-color-normal);
+}
+.dropdown-menu > li > a:hover {
+ background-color: var(--background-lighter);
+ color:inherit;
+}
+
+.form-control {
+ background-color: var(--background-light);
+ border-color: var(--border-color);
+ color:var(--text-color-normal);
+}
+.form-control:focus {
+ border-color: var(--accent-color);
+}
+.form-control[disabled] {
+ background-color: transparent;
+ border-color: var(--border-color);
+}
+.form-frame {
+ border-color: var(--border-color);
+}
+
+label.form-switch > input[type=checkbox],
+input[type=checkbox].form-switch {
+ box-shadow:inset -1.25em 0 0 1px var(--text-color-normal);
+ background-color:var(--background-light);
+ border:1px solid var(--text-color-normal);
+}
+label.form-switch > input[type=checkbox]:hover,
+input[type=checkbox].form-switch:hover {
+ box-shadow:inset -1.25em 0 0 1px var(--text-color-normal);
+ border: 1px solid var(--text-color-normal);
+}
+label.form-switch > input[type=checkbox]:checked,
+input[type=checkbox].form-switch:checked {
+ box-shadow: inset 1.25em 0 0 1px var(--button-active);
+ border: 1px solid var(--button-active);
+}
+label.form-switch > input[type=checkbox]:checked:hover,
+input[type=checkbox].form-switch:checked:hover {
+ box-shadow:inset 1.25em 0 0 1px var(--button-active-darker);
+ border: 1px solid var(--button-active-darker);
+}
+label.form-switch > input[type=checkbox]:focus,
+input[type=checkbox].form-switch:focus {
+ background:none !important;
+}
+/*
+.form-group .btn.active {
+ color:var(--text-color-normal);
+ background-color:var(--context-info);
+}
+*/
+
+select,
+.form-group select {
+ border-color: var(--border-color);
+ color:var(--text-color-normal);
+
+ background-color: var(--background-light);
+ background-image:
+ linear-gradient(120deg, var(--wikiTriangleColor) var(--wikiTriangleSize), transparent var(--wikiTriangleSize) ),
+ linear-gradient(-120deg, var(--wikiTriangleColor) var(--wikiTriangleSize), transparent var(--wikiTriangleSize) );
+
+ background-position:
+ calc( var(--padding-base-horizontal) - 1px + var(--wikiTriangleSize)/2 ) calc(var(--padding-base-vertical)*2),
+ calc( var(--padding-base-horizontal) - var(--wikiTriangleSize)*3/2 ) calc(var(--padding-base-vertical)*2);
+
+
+}
+
+input[type=checkbox]:focus,
+select:focus,
+.form-group select:focus {
+ outline-color: var(--accent-color);
+}
+
+.modal {
+ background-color: var(--background-dropdown);
+ color:var(--text-color-normal);
+}
+
+/*pagination.less*/
+.pagination {
+ background-color: var(--background-light);
+ border-color: var(--border-color);
+}
+.pagination a {
+ color:var(--link-color);
+ text-decoration:none;
+}
+.pagination .cursor,
+.pagination a:hover {
+ background-color: var(--background-lighter);
+ border-color: var(--border-color);
+ color: var(--accent-color);
+}
+
+/* --- JSPWiki --- */
+
+/* --- variables.less --- */
+
+/* --- type.less --- */
+
+hr,.hr {
+ border-color: var(--border-color);
+}
+
+mark, .highlight {
+ background-color: var(--accent-color) !important;
+ color:var(--text-color-highlight);
+}
+
+span.text-white, div.text-white, .bg.dark + .bg-overlay { color:var(--text-color-normal); }
+/*span.text-black, div.text-black, .bg.light + .bg-overlay { color:(var(--text-???); } */
+
+.text-primary { color: var(--context-primary); }
+.text-success { color: var(--context-success); }
+.text-info { color: var(--context-info); }
+.text-warning { color: var(--context-warning); }
+.text-error,
+.text-danger { color: var(--context-error); }
+
+/* primary */
+.panel-primary > .panel-heading,
+.bg-primary {
+ background-color: var(--context-primary);
+ border-color: var(--context-primary);
+ color:var(--color-white);
+}
+.panel-primary > .panel-heading a:link,
+.bg-primary a:link {
+ color:var(--color-black);
+}
+/* success */
+.panel-success > .panel-heading,
+.success,
+.bg-success {
+ background-color: var(--context-success);
+ border-color: var(--context-success);
+ color:var(--color-black);
+}
+.panel-success > .panel-heading a:link,
+.success a:link,
+.bg-success a:link {
+ text-decoration:underline;
+}
+/* info */
+.panel-info > .panel-heading,
+.info, .information,
+.bg-info {
+ background-color: var(--context-info);
+ border-color: var(--context-info);
+ color:var(--color-black);
+}
+.panel-info > .panel-heading a:link,
+.info a:link, .information a:link,
+.bg-info a:link {
+ text-decoration:underline;
+}
+/* warning */
+.panel-warning > .panel-heading,
+.alert-warning,
+.warning,
+.bg-warning {
+ background-color: var(--context-warning);
+ border-color: var(--context-warning);
+ color:var(--color-black);
+}
+.panel-warning > .panel-heading a:link,
+.alert-warning a:link,
+.warning a:link,
+.bg-warning a:link {
+ text-decoration:underline;
+}
+/* danger, error */
+.panel-danger > .panel-heading,
+.error,.danger,
+.bg-danger {
+ background-color: var(--context-error);
+ border-color: var(--context-error);
+ color:var(--color-black);
+}
+.panel-danger > .panel-heading a:link,
+.error a:link,.danger a:link,
+.bg-danger a:link {
+ text-decoration:underline;
+}
+
+span.label { color:var(--color-black); }
+
+pre {
+ background-color:var(--background-light);
+ border-color:var(--border-color);
+ color:var(--text-color-richer);
+}
+
+code,
+tt {
+ background-color:var(--background-light);
+ border-color:var(--border-color);
+ color:var(--text-color-richer);
+}
+
+a.list-group-item:hover,
+.list-hover li:hover {
+ background-color:var(--background-lighter);
+ color:inherit;
+}
+
+.tree ul li::before,
+.tree ul li::after {
+ background: var(--border-color);
+}
+
+.list-hover li:hover {
+ background-color:var(--background-lighter);
+}
+
+.hover {
+ background-color:var(--background-lighter);
+}
+
+a.slimbox-link:after,
+.slimbox-btn:before,
+a:visited,
+a:link { color:var(--link-color); }
+
+a.createpage {
+ color:var(--error-color);
+}
+
+.interwiki-raw::after,
+a.interwiki[href$="skin=raw"]::after,
+.interwiki-reader::after,
+a.interwiki[href$="skin=reader"]::after,
+.interwiki-edit::after,
+a.interwiki[href*="Edit.jsp?page="]::after,
+.interwiki-group::after,
+a.interwiki[href*="Group.jsp?group="]::after,
+a.interwiki[href^="rss.jsp"]::after {
+ background-color:var(--background-lighter);
+ color:var(--accent-color);
+}
+
+.editsection,
+.hashlink {
+ background-color: var(--background-light);
+ border-color: var(--border-color);
+ color:var(--link-color);
+}
+.editsection:hover,
+h2 .editsection:hover,
+h3 .editsection:hover,
+h4 .editsection:hover,
+h2 .hashlink:hover,
+h3 .hashlink:hover,
+h4 .hashlink:hover {
+ background-color: var(--background-lighter);
+ border-color: var(--border-color);
+ color:var(--link-color);
+ opacity:1;
+}
+
+div.dropcaps > span.dropcaps {
+ color: var(--text-color-highlight);
+}
+blockquote,
+.dialog .quote-item {
+ border-color:var(--text-color-highlight);
+}
+.page-break {
+ border-color: var(--border-color);
+}
+
+
+/* --- grid.less --- */
+/* --- tables.less --- */
+
+.table > thead > tr > th,
+.table > tbody > tr > th,
+.table > tfoot > tr > th,
+.table > thead > tr > td,
+.table > tbody > tr > td,
+.table > tfoot > tr > td {
+ border-color: var(--border-color);
+}
+
+.wikitable > thead > tr > th,
+.wikitable > tbody > tr > th,
+.wikitable > tfoot > tr > th,
+.wikitable > thead > tr > td,
+.wikitable > tbody > tr > td,
+.wikitable > tfoot > tr > td,
+.wikitable tr:first-child th {
+ border-color: var(--border-color);
+}
+
+.table-bordered,
+.table-bordered tr:first-child th,
+.table-bordered tr:first-child td {
+ border-color: var(--border-color);
+}
+.table-bordered > thead > tr > th,
+.table-bordered > tbody > tr > th,
+.table-bordered > tfoot > tr > th,
+.table-bordered > thead > tr > td,
+.table-bordered > tbody > tr > td,
+.table-bordered > tfoot > tr > td {
+ border-color: var(--border-color);
+}
+
+.table-hover > tbody > tr:nth-of-type(odd):hover,
+.table-hover > tbody > tr:nth-child(odd):hover > td,
+.table-hover > tbody > tr:nth-child(odd):hover > th,
+.table-hover > tbody > tr:hover {
+ background-color: var(--background-lighter);
+}
+
+.table-striped > tbody > tr:nth-of-type(odd) ,
+.table-striped > tbody > tr:nth-child(odd) > td,
+.table-striped > tbody > tr:nth-child(odd) > th {
+ background-color: var(--background-light);
+}
+[class*=zebra] .odd {
+ background-color: var(--background-light);
+}
+
+
+/* --- TableX.Sort.less --- */
+.sortable th:hover {
+ background-color: var(--background-lighter);;
+}
+.sortable th.up:after,
+.sortable th.up:hover:after {
+ border-bottom-color: var(--accent-color);
+ opacity:1;
+}
+.sortable th:hover:after,
+.sortable th.down:after,
+.sortable th.down:hover:after {
+ border-top-color: var(--accent-color);
+ opacity:1;
+}
+
+/* --- TableX.Filter.less --- */
+/* --- forms.less --- */
+/* --- modals.less --- */
+
+/* --- fontjspwiki/font-jspwiki.less --- */
+/* --- dropdown.less --- */
+
+/* --- pagination.less --- */
+/* --- Tips.less --- */
+.tip-link,
+.tip-link:hover {
+ color: var(--link-color);
+}
+/* --- Magnify.less --- */
+/* --- Viewer.less --- */
+/* --- Viewer.Slimbox.less --- */
+/* --- Viewer.Carousel.less --- */
+/* --- Template.View.less --- */
+html body .header, html body .footer {
+ background-image: -webkit-radial-gradient(circle, var(--background-light), var(--background));
+ background-image: radial-gradient(circle, var(--background-light), var(--background) );
+ color:var(--text-color-normal);
+}
+a.logo { border-color: var(--border-color); }
+
+
+div.admin .formcontainer {
+ /*.default*/
+ background-color: var(--background-light);
+ border-color: var(--border-color);
+ color:var(--text-color-richer);
+}
+
+.admin .formcontainer table {
+ border-color: var(--border-color);
+ /*
+ .table;
+ .table-bordered;
+ .table-striped;
+ */
+}
+.admin-user-form > div#userlist .list-group-item.new-user{
+ background-color: var(--background-light);
+ border-color: var(--border-color);
+ color:var(--text-color-richer);
+}
+
+
+
+
+/* --- Template.UserBox.less --- */
+.login-form {
+ background-color: var(--background-dialog);
+ border:1px solid var(--border-color);
+}
+.login-form hr { border-color:var(--border-color); }
+
+
+/* --- Template.SearchBox.less --- */
+/* --- Template.Nav.less --- */
+.badge,
+.header > .navigation .nav > li > a > .badge {
+ background-color:var(--background-lighter);
+ color:var(--text-color-normal);
+}
+
+.header > .navigation .nav .btn-xs .badge {
+ background-color: var(--background-lighter);
+}
+
+/* --- Template.Content.less --- */
+body, .content {
+ background-color: var(--background);
+ color:var(--text-color-normal);
+ overflow-y: auto;
+}
+.content:after {
+ background: var(--background-sidebar);
+}
+/* --- Template.Attach.less --- */
+/* --- Template.Diff.less --- */
+.diffadd { background-color:var(--context-success); color:var(--color-black); }
+.diffrem { background:var(--context-error); color:var(--color-black); }
+
+/* --- Template.Search.less --- */
+
+form#searchform2 + div .fragment {
+ color: var(--text-color-richer);
+}
+form#searchform2 + div .gb-bar {
+ background-color: var(--context-warning);
+}
+
+/* --- Template.Workflow.less --- */
+/* --- Template.Edit.less --- */
+
+.editform input[type="text"]:focus,
+.dialog.find input[type="text"]:focus,
+.editform textarea:focus,
+.dialog.find textarea:focus {
+ background-color:var(--background-lighter);
+ border-color:var(--border-color);
+ color:var(--text-color-richer);
+}
+.ajaxpreview {
+ border-color:var(--border-color);
+}
+.edit-area ~ .ajaxpreview {
+ border-left-color:var(--border-color);
+}
+
+/* --- Dialog.less --- */
+.dialog {
+ background-color: var(--background-dialog);
+ border-color: var(--border-color);
+}
+.dialog .caption {
+ border-color: var(--border-color);
+ color: var(--text-color-normal);
+}
+.dialog.selection .body .item:hover {
+ background-color: var(--background-lighter);
+}
+.dialog.selection .body .divider {
+ background-color: var(--border-color);
+}
+
+.dialog.find [name=tbTEXTSEL] { /*same as selected text*/
+ color:var(--accent-color);
+ background-color: var(--color-black);
+}
+
+
+
+/* --- Template.Preview.less --- */
+
+/* --- ImagePlugin.less --- */
+/* --- IndexPlugin.less --- */
+
+.index .header {
+ background-color:var(--background-light);
+ border-color:var(--border-color);
+}
+.index .header:hover {
+ background-color:var(--background-light);
+}
+.index .header a {
+ color:var(--text-color-richer);
+}
+.index .header a:hover {
+ background-color:var(--background-lighter);
+}
+.index > .section a {
+ color:var(--text-color-richer);
+}
+
+
+/* --- TOCPlugin.less --- */
+
+.toc ul li:hover {
+ background-color:var(--background-lighter);
+}
+
+/* --- WeblogPlugin.less --- */
+/* --- RecentChangesPlugin.less --- */
+
+.recentchanges .date {
+ border-color:var(--border-color);
+}
+/* --- CommentBox.less --- */
+
+
+/* --- GraphBar.less --- */
+.gb-group {
+ background-color:var(--background-light);
+ border:1px solid var(--border-color);
+}
+
+/* --- Tabs.less --- */
+/* --- Accordion.less --- */
+/* --- Columns.less --- */
+.columns.border,
+.columns.border > .col:not(:last-child) {
+ border-color:var(--border-color);
+}
+.columns.hover .col:hover {
+ background-color: var(--background-lighter);
+}
+
+
+/* --- Collapsible.less --- */
+.bullet, .bullet.clpse { border-left-color: var(--text-color-normal); }
+.bullet.clpse:hover { border-left-color: var(--text-color-richer); }
+
+.bullet.xpand { border-top-color: var(--text-color-normal); }
+.bullet.xpand:hover { border-top-color: var(--text-color-richer); }
+
+/* --- Category.less --- */
+.category-link {
+ border-color:var(--border-color);
+}
+/* --- Flip.less --- */
+/* --- Invisibles.less --- */
+/* --- prettify.less --- */
+ .prettify pre, .prettify-nonum pre, pre.prettylines {
+ background-color:var(--background-light);
+ border-color:var(--border-color);
+ color:var(--text-color-richer);
+ }
+ .pln { color: #cccccc; } /* plain text */
+ .str { color: #99cc99; } /* string content */
+ .kwd { color: #ffeea6; } /* keyword */
+ .com { color: #8a8a80; } /* comment */
+ .typ { color: #bbdaff; } /* type name */
+ .lit { color: #FCA369; } /* literal value */
+ .pun { color: #cda869; } /* punctuation */
+ .opn { color: #ffffff; } /* lisp open bracket */
+ .clo { color: #ffffff; } /* lisp close bracket */
+ .tag { color: #78AAD6; } /* markup tag name */
+ .atn { color: #ffc58f; } /* markup attribute name */
+ .atv { color: #FFD479; } /* markup attribute value */
+ .dec { color: #D6ACD6; } /* declaration */
+ .var { color: #76D4D6; } /* variable name */
+ .fun { color: #d6acd6; } /* function name */
+
+/* --- responsive-viewport.less --- */
+/* --- print.less --- */
diff --git a/jspwiki-war/src/main/webapp/templates/default/skins/darkly/skin.js b/jspwiki-war/src/main/webapp/templates/default/skins/darkly/skin.js
new file mode 100644
index 0000000000..39d50ac082
--- /dev/null
+++ b/jspwiki-war/src/main/webapp/templates/default/skins/darkly/skin.js
@@ -0,0 +1,17 @@
+/*
+ * Copyright 2025 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
diff --git a/jspwiki-war/src/main/webapp/templates/default/skins/default/skin.css b/jspwiki-war/src/main/webapp/templates/default/skins/default/skin.css
new file mode 100644
index 0000000000..6b3e563a81
--- /dev/null
+++ b/jspwiki-war/src/main/webapp/templates/default/skins/default/skin.css
@@ -0,0 +1,15 @@
+/*
+Copyright 2025 The Apache Software Foundation.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
\ No newline at end of file
diff --git a/jspwiki-war/src/main/webapp/templates/default/skins/default/skin.js b/jspwiki-war/src/main/webapp/templates/default/skins/default/skin.js
new file mode 100644
index 0000000000..39d50ac082
--- /dev/null
+++ b/jspwiki-war/src/main/webapp/templates/default/skins/default/skin.js
@@ -0,0 +1,17 @@
+/*
+ * Copyright 2025 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
diff --git a/jspwiki-war/src/main/webapp/templates/default/skins/materia/skin.css b/jspwiki-war/src/main/webapp/templates/default/skins/materia/skin.css
new file mode 100644
index 0000000000..2e766b34da
--- /dev/null
+++ b/jspwiki-war/src/main/webapp/templates/default/skins/materia/skin.css
@@ -0,0 +1,729 @@
+/*
+inspired by Bootswatch theme of the same name
+from https://github.com/thomaspark/bootswatch/
+MIT Licensed
+*/
+
+
+html {
+ /* 1. Core Hue Shifts */
+ --hue: 188; /* Material Teal/Cyan Hue */
+ --accent-hue: 188;
+
+ /* 2. Text Colors */
+ --text-color-normal: #444444; /* Material Dark Gray */
+ --text-color-light: #777777; /* Muted Gray */
+ --text-color-richer: #212121; /* Material "Near Black" */
+ --text-color-highlight: #009688; /* Teal Accent */
+
+ /* 3. Links and Accents */
+ --link-color: #2196f3; /* Material Primary Blue */
+ --accent-color: #009688; /* Material Teal */
+ --error-color: #f44336; /* Material Red */
+
+ /* 4. Buttons */
+ --button-background: #2196f3;
+ --button-text-color: #ffffff;
+ --button-active: #1e88e5; /* Slightly deeper blue */
+ --button-active-darker: #1976d2;
+
+ /* 5. Backgrounds */
+ --background: #ffffff; /* Pure White */
+ --background-sidebar: #fafafa; /* Very subtle off-white */
+ --background-light: #f5f5f5; /* "Elevated" background */
+ --background-lighter: #eeeeee;
+ --background-light-solid: #ffffff;
+
+ /* Navbar / PageName Specific Background */
+ --navbar-bg: #2196f3; /* Distinct Material Blue Navbar */
+
+ --background-dropdown: #ffffff;
+ --background-dialog: #ffffff;
+
+ /* 6. Borders */
+ --border-color: #e0e0e0; /* Very thin, light borders */
+
+ /* 7. Contextual Colors (Material Design Palette) */
+ --context-primary: #2196f3; /* Material Blue */
+ --context-success: #4caf50; /* Material Green */
+ --context-info: #00bcd4; /* Material Cyan */
+ --context-warning: #ff9800; /* Material Orange */
+ --context-error: #f44336; /* Material Red */
+
+ --color-black: #000000;
+ --color-white: #ffffff;
+
+ --wikiTriangleColor: var(--link-color);
+}
+
+
+::selection {
+ color:var(--accent-color);
+ background-color: var(--color-black);
+}
+
+/* --- BOOTSTRAP --- */
+.titlebox {
+ background-color: var(--background-light);
+}
+.panel {
+ background-color: var(--background-light);
+ border-color: var(--border-color);
+}
+.panel-default .panel-heading {
+ background-color: var(--background-lighter);
+ border-color: var(--border-color);
+ color:inherit;
+}
+
+.list-group-item {
+ background-color: var(--background-light);
+ border-color: var(--border-color);
+}
+
+.nav-tabs {
+ border-color: var(--border-color);
+}
+.nav-tabs > li > a {
+ color:inherit;
+}
+.nav-tabs > li > a:hover {
+ background-color: var(--background-light);
+ border-color: var(--border-color);
+ color:inherit;
+}
+.nav-tabs > li.active > a,
+.nav-tabs > li.active {
+ background:transparent;
+ color:var(--text-color-richer);
+ border-color: var(--border-color);
+ border-bottom-color: var(--background);
+}
+.nav-tabs > li.active > a:hover,
+.nav-tabs > li.active > a:focus {
+ background-color: var(--background-lighter);
+ border-color: var(--border-color);
+ color:var(--text-color-richer);
+}
+
+/*.nav-pills > li.active > a,
+.nav-pills > li.active > a:hover,
+.nav-pills > li.active > a:focus {
+
+}*/
+.nav > li > a:hover, .nav > li > a:focus {
+ background-color: var(--background-lighter);
+ border-color: var(--border-color);
+ color:var(--text-color-richer);
+}
+
+
+.btn-default,
+.default {
+ background-color: var(--background-light);
+ border-color: var(--border-color);
+ color:var(--text-color-richer);
+}
+.btn:hover, .btn:focus, .btn.focus,
+.btn-default:hover {
+ background-color: var(--background-lighter);
+ border-color: var(--border-color);
+ color:var(--text-color-richer);
+}
+.btn.disabled:hover {
+ background-color: var(--background-lighter);
+ border-color: var(--border-color);
+}
+.btn-default:active,
+.btn-default:active:hover,
+.btn-default.active,
+.btn-default.active:hover {
+ background-color: var(--background-lighter);
+ border-color: var(--border-color);
+ color:var(--accent-color);
+}
+
+.dropdown-menu {
+ background-color: var(--background-dropdown);
+ border-color: var(--border-color);
+}
+.dropdown-header {
+ color:var(--text-color-richer);
+}
+.dropdown-menu .divider {
+ background-color: var(--border-color);
+}
+.dropdown-menu > li > a {
+ color:var(--text-color-normal);
+}
+.dropdown-menu > li > a:hover {
+ background-color: var(--background-lighter);
+ color:inherit;
+}
+
+.form-control {
+ background-color: var(--background-light);
+ border-color: var(--border-color);
+ color:var(--text-color-normal);
+}
+.form-control:focus {
+ border-color: var(--accent-color);
+}
+.form-control[disabled] {
+ background-color: transparent;
+ border-color: var(--border-color);
+}
+.form-frame {
+ border-color: var(--border-color);
+}
+
+label.form-switch > input[type=checkbox],
+input[type=checkbox].form-switch {
+ box-shadow:inset -1.25em 0 0 1px var(--text-color-normal);
+ background-color:var(--background-light);
+ border:1px solid var(--text-color-normal);
+}
+label.form-switch > input[type=checkbox]:hover,
+input[type=checkbox].form-switch:hover {
+ box-shadow:inset -1.25em 0 0 1px var(--text-color-normal);
+ border: 1px solid var(--text-color-normal);
+}
+label.form-switch > input[type=checkbox]:checked,
+input[type=checkbox].form-switch:checked {
+ box-shadow: inset 1.25em 0 0 1px var(--button-active);
+ border: 1px solid var(--button-active);
+}
+label.form-switch > input[type=checkbox]:checked:hover,
+input[type=checkbox].form-switch:checked:hover {
+ box-shadow:inset 1.25em 0 0 1px var(--button-active-darker);
+ border: 1px solid var(--button-active-darker);
+}
+label.form-switch > input[type=checkbox]:focus,
+input[type=checkbox].form-switch:focus {
+ background:none !important;
+}
+/*
+.form-group .btn.active {
+ color:var(--text-color-normal);
+ background-color:var(--context-info);
+}
+*/
+
+select,
+.form-group select {
+ border-color: var(--border-color);
+ color:var(--text-color-normal);
+
+ background-color: var(--background-light);
+ background-image:
+ linear-gradient(120deg, var(--wikiTriangleColor) var(--wikiTriangleSize), transparent var(--wikiTriangleSize) ),
+ linear-gradient(-120deg, var(--wikiTriangleColor) var(--wikiTriangleSize), transparent var(--wikiTriangleSize) );
+
+ background-position:
+ calc( var(--padding-base-horizontal) - 1px + var(--wikiTriangleSize)/2 ) calc(var(--padding-base-vertical)*2),
+ calc( var(--padding-base-horizontal) - var(--wikiTriangleSize)*3/2 ) calc(var(--padding-base-vertical)*2);
+
+
+}
+
+input[type=checkbox]:focus,
+select:focus,
+.form-group select:focus {
+ outline-color: var(--accent-color);
+}
+
+.modal {
+ background-color: var(--background-dropdown);
+ color:var(--text-color-normal);
+}
+
+/*pagination.less*/
+.pagination {
+ background-color: var(--background-light);
+ border-color: var(--border-color);
+}
+.pagination a {
+ color:var(--link-color);
+ text-decoration:none;
+}
+.pagination .cursor,
+.pagination a:hover {
+ background-color: var(--background-lighter);
+ border-color: var(--border-color);
+ color: var(--accent-color);
+}
+
+/* --- JSPWiki --- */
+
+/* --- variables.less --- */
+
+/* --- type.less --- */
+
+hr,.hr {
+ border-color: var(--border-color);
+}
+
+mark, .highlight {
+ background-color: var(--accent-color) !important;
+ color:var(--text-color-highlight);
+}
+
+span.text-white, div.text-white, .bg.dark + .bg-overlay { color:var(--text-color-normal); }
+/*span.text-black, div.text-black, .bg.light + .bg-overlay { color:(var(--text-???); } */
+
+.text-primary { color: var(--context-primary); }
+.text-success { color: var(--context-success); }
+.text-info { color: var(--context-info); }
+.text-warning { color: var(--context-warning); }
+.text-error,
+.text-danger { color: var(--context-error); }
+
+/* primary */
+.panel-primary > .panel-heading,
+.bg-primary {
+ background-color: var(--context-primary);
+ border-color: var(--context-primary);
+ color:var(--color-white);
+}
+.panel-primary > .panel-heading a:link,
+.bg-primary a:link {
+ color:var(--color-black);
+}
+/* success */
+.panel-success > .panel-heading,
+.success,
+.bg-success {
+ background-color: var(--context-success);
+ border-color: var(--context-success);
+ color:var(--color-black);
+}
+.panel-success > .panel-heading a:link,
+.success a:link,
+.bg-success a:link {
+ text-decoration:underline;
+}
+/* info */
+.panel-info > .panel-heading,
+.info, .information,
+.bg-info {
+ background-color: var(--context-info);
+ border-color: var(--context-info);
+ color:var(--color-black);
+}
+.panel-info > .panel-heading a:link,
+.info a:link, .information a:link,
+.bg-info a:link {
+ text-decoration:underline;
+}
+/* warning */
+.panel-warning > .panel-heading,
+.alert-warning,
+.warning,
+.bg-warning {
+ background-color: var(--context-warning);
+ border-color: var(--context-warning);
+ color:var(--color-black);
+}
+.panel-warning > .panel-heading a:link,
+.alert-warning a:link,
+.warning a:link,
+.bg-warning a:link {
+ text-decoration:underline;
+}
+/* danger, error */
+.panel-danger > .panel-heading,
+.error,.danger,
+.bg-danger {
+ background-color: var(--context-error);
+ border-color: var(--context-error);
+ color:var(--color-black);
+}
+.panel-danger > .panel-heading a:link,
+.error a:link,.danger a:link,
+.bg-danger a:link {
+ text-decoration:underline;
+}
+
+span.label { color:var(--color-black); }
+
+pre {
+ background-color:var(--background-light);
+ border-color:var(--border-color);
+ color:var(--text-color-richer);
+}
+
+code,
+tt {
+ background-color:var(--background-light);
+ border-color:var(--border-color);
+ color:var(--text-color-richer);
+}
+
+a.list-group-item:hover,
+.list-hover li:hover {
+ background-color:var(--background-lighter);
+ color:inherit;
+}
+
+.tree ul li::before,
+.tree ul li::after {
+ background: var(--border-color);
+}
+
+.list-hover li:hover {
+ background-color:var(--background-lighter);
+}
+
+.hover {
+ background-color:var(--background-lighter);
+}
+
+a.slimbox-link:after,
+.slimbox-btn:before,
+a:visited,
+a:link { color:var(--link-color); }
+
+a.createpage {
+ color:var(--error-color);
+}
+
+.interwiki-raw::after,
+a.interwiki[href$="skin=raw"]::after,
+.interwiki-reader::after,
+a.interwiki[href$="skin=reader"]::after,
+.interwiki-edit::after,
+a.interwiki[href*="Edit.jsp?page="]::after,
+.interwiki-group::after,
+a.interwiki[href*="Group.jsp?group="]::after,
+a.interwiki[href^="rss.jsp"]::after {
+ background-color:var(--background-lighter);
+ color:var(--accent-color);
+}
+
+.editsection,
+.hashlink {
+ background-color: var(--background-light);
+ border-color: var(--border-color);
+ color:var(--link-color);
+}
+.editsection:hover,
+h2 .editsection:hover,
+h3 .editsection:hover,
+h4 .editsection:hover,
+h2 .hashlink:hover,
+h3 .hashlink:hover,
+h4 .hashlink:hover {
+ background-color: var(--background-lighter);
+ border-color: var(--border-color);
+ color:var(--link-color);
+ opacity:1;
+}
+
+div.dropcaps > span.dropcaps {
+ color: var(--text-color-highlight);
+}
+blockquote,
+.dialog .quote-item {
+ border-color:var(--text-color-highlight);
+}
+.page-break {
+ border-color: var(--border-color);
+}
+
+
+/* --- grid.less --- */
+/* --- tables.less --- */
+
+.table > thead > tr > th,
+.table > tbody > tr > th,
+.table > tfoot > tr > th,
+.table > thead > tr > td,
+.table > tbody > tr > td,
+.table > tfoot > tr > td {
+ border-color: var(--border-color);
+}
+
+.wikitable > thead > tr > th,
+.wikitable > tbody > tr > th,
+.wikitable > tfoot > tr > th,
+.wikitable > thead > tr > td,
+.wikitable > tbody > tr > td,
+.wikitable > tfoot > tr > td,
+.wikitable tr:first-child th {
+ border-color: var(--border-color);
+}
+
+.table-bordered,
+.table-bordered tr:first-child th,
+.table-bordered tr:first-child td {
+ border-color: var(--border-color);
+}
+.table-bordered > thead > tr > th,
+.table-bordered > tbody > tr > th,
+.table-bordered > tfoot > tr > th,
+.table-bordered > thead > tr > td,
+.table-bordered > tbody > tr > td,
+.table-bordered > tfoot > tr > td {
+ border-color: var(--border-color);
+}
+
+.table-hover > tbody > tr:nth-of-type(odd):hover,
+.table-hover > tbody > tr:nth-child(odd):hover > td,
+.table-hover > tbody > tr:nth-child(odd):hover > th,
+.table-hover > tbody > tr:hover {
+ background-color: var(--background-lighter);
+}
+
+.table-striped > tbody > tr:nth-of-type(odd) ,
+.table-striped > tbody > tr:nth-child(odd) > td,
+.table-striped > tbody > tr:nth-child(odd) > th {
+ background-color: var(--background-light);
+}
+[class*=zebra] .odd {
+ background-color: var(--background-light);
+}
+
+
+/* --- TableX.Sort.less --- */
+.sortable th:hover {
+ background-color: var(--background-lighter);;
+}
+.sortable th.up:after,
+.sortable th.up:hover:after {
+ border-bottom-color: var(--accent-color);
+ opacity:1;
+}
+.sortable th:hover:after,
+.sortable th.down:after,
+.sortable th.down:hover:after {
+ border-top-color: var(--accent-color);
+ opacity:1;
+}
+
+/* --- TableX.Filter.less --- */
+/* --- forms.less --- */
+/* --- modals.less --- */
+
+/* --- fontjspwiki/font-jspwiki.less --- */
+/* --- dropdown.less --- */
+
+/* --- pagination.less --- */
+/* --- Tips.less --- */
+.tip-link,
+.tip-link:hover {
+ color: var(--link-color);
+}
+/* --- Magnify.less --- */
+/* --- Viewer.less --- */
+/* --- Viewer.Slimbox.less --- */
+/* --- Viewer.Carousel.less --- */
+/* --- Template.View.less --- */
+html body .header, html body .footer {
+ background-image: -webkit-radial-gradient(circle, var(--background-light), var(--background));
+ background-image: radial-gradient(circle, var(--background-light), var(--background) );
+ color:var(--text-color-normal);
+}
+a.logo { border-color: var(--border-color); }
+
+
+div.admin .formcontainer {
+ /*.default*/
+ background-color: var(--background-light);
+ border-color: var(--border-color);
+ color:var(--text-color-richer);
+}
+
+.admin .formcontainer table {
+ border-color: var(--border-color);
+ /*
+ .table;
+ .table-bordered;
+ .table-striped;
+ */
+}
+.admin-user-form > div#userlist .list-group-item.new-user{
+ background-color: var(--background-light);
+ border-color: var(--border-color);
+ color:var(--text-color-richer);
+}
+
+
+
+
+/* --- Template.UserBox.less --- */
+.login-form {
+ background-color: var(--background-dialog);
+ border:1px solid var(--border-color);
+}
+.login-form hr { border-color:var(--border-color); }
+
+
+/* --- Template.SearchBox.less --- */
+/* --- Template.Nav.less --- */
+.badge,
+.header > .navigation .nav > li > a > .badge {
+ background-color:var(--background-lighter);
+ color:var(--text-color-normal);
+}
+
+.header > .navigation .nav .btn-xs .badge {
+ background-color: var(--background-lighter);
+}
+
+/* --- Template.Content.less --- */
+body, .content {
+ background-color: var(--background);
+ color:var(--text-color-normal);
+ overflow-y: auto;
+}
+.content:after {
+ background: var(--background-sidebar);
+}
+/* --- Template.Attach.less --- */
+/* --- Template.Diff.less --- */
+.diffadd { background-color:var(--context-success); color:var(--color-black); }
+.diffrem { background:var(--context-error); color:var(--color-black); }
+
+/* --- Template.Search.less --- */
+
+form#searchform2 + div .fragment {
+ color: var(--text-color-richer);
+}
+form#searchform2 + div .gb-bar {
+ background-color: var(--context-warning);
+}
+
+/* --- Template.Workflow.less --- */
+/* --- Template.Edit.less --- */
+
+.editform input[type="text"]:focus,
+.dialog.find input[type="text"]:focus,
+.editform textarea:focus,
+.dialog.find textarea:focus {
+ background-color:var(--background-lighter);
+ border-color:var(--border-color);
+ color:var(--text-color-richer);
+}
+.ajaxpreview {
+ border-color:var(--border-color);
+}
+.edit-area ~ .ajaxpreview {
+ border-left-color:var(--border-color);
+}
+
+/* --- Dialog.less --- */
+.dialog {
+ background-color: var(--background-dialog);
+ border-color: var(--border-color);
+}
+.dialog .caption {
+ border-color: var(--border-color);
+ color: var(--text-color-normal);
+}
+.dialog.selection .body .item:hover {
+ background-color: var(--background-lighter);
+}
+.dialog.selection .body .divider {
+ background-color: var(--border-color);
+}
+
+.dialog.find [name=tbTEXTSEL] { /*same as selected text*/
+ color:var(--accent-color);
+ background-color: var(--color-black);
+}
+
+
+
+/* --- Template.Preview.less --- */
+
+/* --- ImagePlugin.less --- */
+/* --- IndexPlugin.less --- */
+
+.index .header {
+ background-color:var(--background-light);
+ border-color:var(--border-color);
+}
+.index .header:hover {
+ background-color:var(--background-light);
+}
+.index .header a {
+ color:var(--text-color-richer);
+}
+.index .header a:hover {
+ background-color:var(--background-lighter);
+}
+.index > .section a {
+ color:var(--text-color-richer);
+}
+
+
+/* --- TOCPlugin.less --- */
+
+.toc ul li:hover {
+ background-color:var(--background-lighter);
+}
+
+/* --- WeblogPlugin.less --- */
+/* --- RecentChangesPlugin.less --- */
+
+.recentchanges .date {
+ border-color:var(--border-color);
+}
+/* --- CommentBox.less --- */
+
+
+/* --- GraphBar.less --- */
+.gb-group {
+ background-color:var(--background-light);
+ border:1px solid var(--border-color);
+}
+
+/* --- Tabs.less --- */
+/* --- Accordion.less --- */
+/* --- Columns.less --- */
+.columns.border,
+.columns.border > .col:not(:last-child) {
+ border-color:var(--border-color);
+}
+.columns.hover .col:hover {
+ background-color: var(--background-lighter);
+}
+
+
+/* --- Collapsible.less --- */
+.bullet, .bullet.clpse { border-left-color: var(--text-color-normal); }
+.bullet.clpse:hover { border-left-color: var(--text-color-richer); }
+
+.bullet.xpand { border-top-color: var(--text-color-normal); }
+.bullet.xpand:hover { border-top-color: var(--text-color-richer); }
+
+/* --- Category.less --- */
+.category-link {
+ border-color:var(--border-color);
+}
+/* --- Flip.less --- */
+/* --- Invisibles.less --- */
+/* --- prettify.less --- */
+ .prettify pre, .prettify-nonum pre, pre.prettylines {
+ background-color:var(--background-light);
+ border-color:var(--border-color);
+ color:var(--text-color-richer);
+ }
+ .pln { color: #cccccc; } /* plain text */
+ .str { color: #99cc99; } /* string content */
+ .kwd { color: #ffeea6; } /* keyword */
+ .com { color: #8a8a80; } /* comment */
+ .typ { color: #bbdaff; } /* type name */
+ .lit { color: #FCA369; } /* literal value */
+ .pun { color: #cda869; } /* punctuation */
+ .opn { color: #ffffff; } /* lisp open bracket */
+ .clo { color: #ffffff; } /* lisp close bracket */
+ .tag { color: #78AAD6; } /* markup tag name */
+ .atn { color: #ffc58f; } /* markup attribute name */
+ .atv { color: #FFD479; } /* markup attribute value */
+ .dec { color: #D6ACD6; } /* declaration */
+ .var { color: #76D4D6; } /* variable name */
+ .fun { color: #d6acd6; } /* function name */
+
+/* --- responsive-viewport.less --- */
+/* --- print.less --- */
diff --git a/jspwiki-war/src/main/webapp/templates/default/skins/materia/skin.js b/jspwiki-war/src/main/webapp/templates/default/skins/materia/skin.js
new file mode 100644
index 0000000000..39d50ac082
--- /dev/null
+++ b/jspwiki-war/src/main/webapp/templates/default/skins/materia/skin.js
@@ -0,0 +1,17 @@
+/*
+ * Copyright 2025 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
diff --git a/jspwiki-war/src/main/webapp/templates/default/skins/slate/skin.css b/jspwiki-war/src/main/webapp/templates/default/skins/slate/skin.css
new file mode 100644
index 0000000000..a32763e0d8
--- /dev/null
+++ b/jspwiki-war/src/main/webapp/templates/default/skins/slate/skin.css
@@ -0,0 +1,730 @@
+/*
+inspired by Bootswatch theme of the same name
+from https://github.com/thomaspark/bootswatch/
+MIT Licensed
+*/
+
+html {
+ /* 1. Core Hue Shifts */
+ --hue: 210; /* Gunmetal Blue/Gray */
+ --accent-hue: 210;
+
+ /* 2. Text Colors */
+ --text-color-normal: #ced4da; /* Soft Light Gray */
+ --text-color-light: #999999; /* Muted Slate */
+ --text-color-richer: #ffffff;
+ --text-color-highlight: #ffffff; /* Slate uses White for emphasis */
+
+ /* 3. Links and Accents */
+ --link-color: #ffffff; /* Slate often uses white or very light blue links */
+ --accent-color: #7a8288; /* Mid-tone Slate */
+ --error-color: #ee5f5b;
+
+ /* 4. Buttons */
+ --button-background: #3a3f44; /* Gradient base / Gunmetal */
+ --button-text-color: #ffffff;
+ --button-active: #272b30; /* Deep slate hover */
+ --button-active-darker: #1c1e22;
+
+ /* 5. Backgrounds */
+ --background: #272b30; /* "Charcoal" Slate */
+ --background-sidebar: #1c1e22; /* Darker accent for sidebars */
+ --background-light: #3a3f44; /* Lighter slate for cards/panels */
+ --background-lighter: #495057;
+ --background-light-solid: #3a3f44;
+
+ /* Navbar / PageName Specific Background */
+ --navbar-bg: #1c1e22; /* Deepest Slate */
+
+ --background-dropdown: #3a3f44;
+ --background-dialog: #272b30;
+
+ /* 6. Borders */
+ --border-color: #1c1e22; /* Subtle dark borders */
+
+ /* 7. Contextual Colors (Slate-Specific Muted Tones) */
+ --context-primary: #7a8288; /* Slate Gray */
+ --context-success: #62c462; /* Muted Green */
+ --context-info: #5bc0de; /* Soft Blue */
+ --context-warning: #f89406; /* Golden Orange */
+ --context-error: #ee5f5b; /* Softened Red */
+
+ --color-black: #000000;
+ --color-white: #ffffff;
+
+ --wikiTriangleColor: var(--link-color);
+ /*If you want to get fancy with JSPWiki's button class, you can apply a subtle gradient using:
+ linear-gradient(#484e55, #3a3f44 60%, #313539)*/
+}
+
+
+::selection {
+ color:var(--accent-color);
+ background-color: var(--color-black);
+}
+
+/* --- BOOTSTRAP --- */
+.titlebox {
+ background-color: var(--background-light);
+}
+.panel {
+ background-color: var(--background-light);
+ border-color: var(--border-color);
+}
+.panel-default .panel-heading {
+ background-color: var(--background-lighter);
+ border-color: var(--border-color);
+ color:inherit;
+}
+
+.list-group-item {
+ background-color: var(--background-light);
+ border-color: var(--border-color);
+}
+
+.nav-tabs {
+ border-color: var(--border-color);
+}
+.nav-tabs > li > a {
+ color:inherit;
+}
+.nav-tabs > li > a:hover {
+ background-color: var(--background-light);
+ border-color: var(--border-color);
+ color:inherit;
+}
+.nav-tabs > li.active > a,
+.nav-tabs > li.active {
+ background:transparent;
+ color:var(--text-color-richer);
+ border-color: var(--border-color);
+ border-bottom-color: var(--background);
+}
+.nav-tabs > li.active > a:hover,
+.nav-tabs > li.active > a:focus {
+ background-color: var(--background-lighter);
+ border-color: var(--border-color);
+ color:var(--text-color-richer);
+}
+
+/*.nav-pills > li.active > a,
+.nav-pills > li.active > a:hover,
+.nav-pills > li.active > a:focus {
+
+}*/
+.nav > li > a:hover, .nav > li > a:focus {
+ background-color: var(--background-lighter);
+ border-color: var(--border-color);
+ color:var(--text-color-richer);
+}
+
+
+.btn-default,
+.default {
+ background-color: var(--background-light);
+ border-color: var(--border-color);
+ color:var(--text-color-richer);
+}
+.btn:hover, .btn:focus, .btn.focus,
+.btn-default:hover {
+ background-color: var(--background-lighter);
+ border-color: var(--border-color);
+ color:var(--text-color-richer);
+}
+.btn.disabled:hover {
+ background-color: var(--background-lighter);
+ border-color: var(--border-color);
+}
+.btn-default:active,
+.btn-default:active:hover,
+.btn-default.active,
+.btn-default.active:hover {
+ background-color: var(--background-lighter);
+ border-color: var(--border-color);
+ color:var(--accent-color);
+}
+
+.dropdown-menu {
+ background-color: var(--background-dropdown);
+ border-color: var(--border-color);
+}
+.dropdown-header {
+ color:var(--text-color-richer);
+}
+.dropdown-menu .divider {
+ background-color: var(--border-color);
+}
+.dropdown-menu > li > a {
+ color:var(--text-color-normal);
+}
+.dropdown-menu > li > a:hover {
+ background-color: var(--background-lighter);
+ color:inherit;
+}
+
+.form-control {
+ background-color: var(--background-light);
+ border-color: var(--border-color);
+ color:var(--text-color-normal);
+}
+.form-control:focus {
+ border-color: var(--accent-color);
+}
+.form-control[disabled] {
+ background-color: transparent;
+ border-color: var(--border-color);
+}
+.form-frame {
+ border-color: var(--border-color);
+}
+
+label.form-switch > input[type=checkbox],
+input[type=checkbox].form-switch {
+ box-shadow:inset -1.25em 0 0 1px var(--text-color-normal);
+ background-color:var(--background-light);
+ border:1px solid var(--text-color-normal);
+}
+label.form-switch > input[type=checkbox]:hover,
+input[type=checkbox].form-switch:hover {
+ box-shadow:inset -1.25em 0 0 1px var(--text-color-normal);
+ border: 1px solid var(--text-color-normal);
+}
+label.form-switch > input[type=checkbox]:checked,
+input[type=checkbox].form-switch:checked {
+ box-shadow: inset 1.25em 0 0 1px var(--button-active);
+ border: 1px solid var(--button-active);
+}
+label.form-switch > input[type=checkbox]:checked:hover,
+input[type=checkbox].form-switch:checked:hover {
+ box-shadow:inset 1.25em 0 0 1px var(--button-active-darker);
+ border: 1px solid var(--button-active-darker);
+}
+label.form-switch > input[type=checkbox]:focus,
+input[type=checkbox].form-switch:focus {
+ background:none !important;
+}
+/*
+.form-group .btn.active {
+ color:var(--text-color-normal);
+ background-color:var(--context-info);
+}
+*/
+
+select,
+.form-group select {
+ border-color: var(--border-color);
+ color:var(--text-color-normal);
+
+ background-color: var(--background-light);
+ background-image:
+ linear-gradient(120deg, var(--wikiTriangleColor) var(--wikiTriangleSize), transparent var(--wikiTriangleSize) ),
+ linear-gradient(-120deg, var(--wikiTriangleColor) var(--wikiTriangleSize), transparent var(--wikiTriangleSize) );
+
+ background-position:
+ calc( var(--padding-base-horizontal) - 1px + var(--wikiTriangleSize)/2 ) calc(var(--padding-base-vertical)*2),
+ calc( var(--padding-base-horizontal) - var(--wikiTriangleSize)*3/2 ) calc(var(--padding-base-vertical)*2);
+
+
+}
+
+input[type=checkbox]:focus,
+select:focus,
+.form-group select:focus {
+ outline-color: var(--accent-color);
+}
+
+.modal {
+ background-color: var(--background-dropdown);
+ color:var(--text-color-normal);
+}
+
+/*pagination.less*/
+.pagination {
+ background-color: var(--background-light);
+ border-color: var(--border-color);
+}
+.pagination a {
+ color:var(--link-color);
+ text-decoration:none;
+}
+.pagination .cursor,
+.pagination a:hover {
+ background-color: var(--background-lighter);
+ border-color: var(--border-color);
+ color: var(--accent-color);
+}
+
+/* --- JSPWiki --- */
+
+/* --- variables.less --- */
+
+/* --- type.less --- */
+
+hr,.hr {
+ border-color: var(--border-color);
+}
+
+mark, .highlight {
+ background-color: var(--accent-color) !important;
+ color:var(--text-color-highlight);
+}
+
+span.text-white, div.text-white, .bg.dark + .bg-overlay { color:var(--text-color-normal); }
+/*span.text-black, div.text-black, .bg.light + .bg-overlay { color:(var(--text-???); } */
+
+.text-primary { color: var(--context-primary); }
+.text-success { color: var(--context-success); }
+.text-info { color: var(--context-info); }
+.text-warning { color: var(--context-warning); }
+.text-error,
+.text-danger { color: var(--context-error); }
+
+/* primary */
+.panel-primary > .panel-heading,
+.bg-primary {
+ background-color: var(--context-primary);
+ border-color: var(--context-primary);
+ color:var(--color-white);
+}
+.panel-primary > .panel-heading a:link,
+.bg-primary a:link {
+ color:var(--color-black);
+}
+/* success */
+.panel-success > .panel-heading,
+.success,
+.bg-success {
+ background-color: var(--context-success);
+ border-color: var(--context-success);
+ color:var(--color-black);
+}
+.panel-success > .panel-heading a:link,
+.success a:link,
+.bg-success a:link {
+ text-decoration:underline;
+}
+/* info */
+.panel-info > .panel-heading,
+.info, .information,
+.bg-info {
+ background-color: var(--context-info);
+ border-color: var(--context-info);
+ color:var(--color-black);
+}
+.panel-info > .panel-heading a:link,
+.info a:link, .information a:link,
+.bg-info a:link {
+ text-decoration:underline;
+}
+/* warning */
+.panel-warning > .panel-heading,
+.alert-warning,
+.warning,
+.bg-warning {
+ background-color: var(--context-warning);
+ border-color: var(--context-warning);
+ color:var(--color-black);
+}
+.panel-warning > .panel-heading a:link,
+.alert-warning a:link,
+.warning a:link,
+.bg-warning a:link {
+ text-decoration:underline;
+}
+/* danger, error */
+.panel-danger > .panel-heading,
+.error,.danger,
+.bg-danger {
+ background-color: var(--context-error);
+ border-color: var(--context-error);
+ color:var(--color-black);
+}
+.panel-danger > .panel-heading a:link,
+.error a:link,.danger a:link,
+.bg-danger a:link {
+ text-decoration:underline;
+}
+
+span.label { color:var(--color-black); }
+
+pre {
+ background-color:var(--background-light);
+ border-color:var(--border-color);
+ color:var(--text-color-richer);
+}
+
+code,
+tt {
+ background-color:var(--background-light);
+ border-color:var(--border-color);
+ color:var(--text-color-richer);
+}
+
+a.list-group-item:hover,
+.list-hover li:hover {
+ background-color:var(--background-lighter);
+ color:inherit;
+}
+
+.tree ul li::before,
+.tree ul li::after {
+ background: var(--border-color);
+}
+
+.list-hover li:hover {
+ background-color:var(--background-lighter);
+}
+
+.hover {
+ background-color:var(--background-lighter);
+}
+
+a.slimbox-link:after,
+.slimbox-btn:before,
+a:visited,
+a:link { color:var(--link-color); }
+
+a.createpage {
+ color:var(--error-color);
+}
+
+.interwiki-raw::after,
+a.interwiki[href$="skin=raw"]::after,
+.interwiki-reader::after,
+a.interwiki[href$="skin=reader"]::after,
+.interwiki-edit::after,
+a.interwiki[href*="Edit.jsp?page="]::after,
+.interwiki-group::after,
+a.interwiki[href*="Group.jsp?group="]::after,
+a.interwiki[href^="rss.jsp"]::after {
+ background-color:var(--background-lighter);
+ color:var(--accent-color);
+}
+
+.editsection,
+.hashlink {
+ background-color: var(--background-light);
+ border-color: var(--border-color);
+ color:var(--link-color);
+}
+.editsection:hover,
+h2 .editsection:hover,
+h3 .editsection:hover,
+h4 .editsection:hover,
+h2 .hashlink:hover,
+h3 .hashlink:hover,
+h4 .hashlink:hover {
+ background-color: var(--background-lighter);
+ border-color: var(--border-color);
+ color:var(--link-color);
+ opacity:1;
+}
+
+div.dropcaps > span.dropcaps {
+ color: var(--text-color-highlight);
+}
+blockquote,
+.dialog .quote-item {
+ border-color:var(--text-color-highlight);
+}
+.page-break {
+ border-color: var(--border-color);
+}
+
+
+/* --- grid.less --- */
+/* --- tables.less --- */
+
+.table > thead > tr > th,
+.table > tbody > tr > th,
+.table > tfoot > tr > th,
+.table > thead > tr > td,
+.table > tbody > tr > td,
+.table > tfoot > tr > td {
+ border-color: var(--border-color);
+}
+
+.wikitable > thead > tr > th,
+.wikitable > tbody > tr > th,
+.wikitable > tfoot > tr > th,
+.wikitable > thead > tr > td,
+.wikitable > tbody > tr > td,
+.wikitable > tfoot > tr > td,
+.wikitable tr:first-child th {
+ border-color: var(--border-color);
+}
+
+.table-bordered,
+.table-bordered tr:first-child th,
+.table-bordered tr:first-child td {
+ border-color: var(--border-color);
+}
+.table-bordered > thead > tr > th,
+.table-bordered > tbody > tr > th,
+.table-bordered > tfoot > tr > th,
+.table-bordered > thead > tr > td,
+.table-bordered > tbody > tr > td,
+.table-bordered > tfoot > tr > td {
+ border-color: var(--border-color);
+}
+
+.table-hover > tbody > tr:nth-of-type(odd):hover,
+.table-hover > tbody > tr:nth-child(odd):hover > td,
+.table-hover > tbody > tr:nth-child(odd):hover > th,
+.table-hover > tbody > tr:hover {
+ background-color: var(--background-lighter);
+}
+
+.table-striped > tbody > tr:nth-of-type(odd) ,
+.table-striped > tbody > tr:nth-child(odd) > td,
+.table-striped > tbody > tr:nth-child(odd) > th {
+ background-color: var(--background-light);
+}
+[class*=zebra] .odd {
+ background-color: var(--background-light);
+}
+
+
+/* --- TableX.Sort.less --- */
+.sortable th:hover {
+ background-color: var(--background-lighter);;
+}
+.sortable th.up:after,
+.sortable th.up:hover:after {
+ border-bottom-color: var(--accent-color);
+ opacity:1;
+}
+.sortable th:hover:after,
+.sortable th.down:after,
+.sortable th.down:hover:after {
+ border-top-color: var(--accent-color);
+ opacity:1;
+}
+
+/* --- TableX.Filter.less --- */
+/* --- forms.less --- */
+/* --- modals.less --- */
+
+/* --- fontjspwiki/font-jspwiki.less --- */
+/* --- dropdown.less --- */
+
+/* --- pagination.less --- */
+/* --- Tips.less --- */
+.tip-link,
+.tip-link:hover {
+ color: var(--link-color);
+}
+/* --- Magnify.less --- */
+/* --- Viewer.less --- */
+/* --- Viewer.Slimbox.less --- */
+/* --- Viewer.Carousel.less --- */
+/* --- Template.View.less --- */
+html body .header, html body .footer {
+ background-image: -webkit-radial-gradient(circle, var(--background-light), var(--background));
+ background-image: radial-gradient(circle, var(--background-light), var(--background) );
+ color:var(--text-color-normal);
+}
+a.logo { border-color: var(--border-color); }
+
+
+div.admin .formcontainer {
+ /*.default*/
+ background-color: var(--background-light);
+ border-color: var(--border-color);
+ color:var(--text-color-richer);
+}
+
+.admin .formcontainer table {
+ border-color: var(--border-color);
+ /*
+ .table;
+ .table-bordered;
+ .table-striped;
+ */
+}
+.admin-user-form > div#userlist .list-group-item.new-user{
+ background-color: var(--background-light);
+ border-color: var(--border-color);
+ color:var(--text-color-richer);
+}
+
+
+
+
+/* --- Template.UserBox.less --- */
+.login-form {
+ background-color: var(--background-dialog);
+ border:1px solid var(--border-color);
+}
+.login-form hr { border-color:var(--border-color); }
+
+
+/* --- Template.SearchBox.less --- */
+/* --- Template.Nav.less --- */
+.badge,
+.header > .navigation .nav > li > a > .badge {
+ background-color:var(--background-lighter);
+ color:var(--text-color-normal);
+}
+
+.header > .navigation .nav .btn-xs .badge {
+ background-color: var(--background-lighter);
+}
+
+/* --- Template.Content.less --- */
+body, .content {
+ background-color: var(--background);
+ color:var(--text-color-normal);
+ overflow-y: auto;
+}
+.content:after {
+ background: var(--background-sidebar);
+}
+/* --- Template.Attach.less --- */
+/* --- Template.Diff.less --- */
+.diffadd { background-color:var(--context-success); color:var(--color-black); }
+.diffrem { background:var(--context-error); color:var(--color-black); }
+
+/* --- Template.Search.less --- */
+
+form#searchform2 + div .fragment {
+ color: var(--text-color-richer);
+}
+form#searchform2 + div .gb-bar {
+ background-color: var(--context-warning);
+}
+
+/* --- Template.Workflow.less --- */
+/* --- Template.Edit.less --- */
+
+.editform input[type="text"]:focus,
+.dialog.find input[type="text"]:focus,
+.editform textarea:focus,
+.dialog.find textarea:focus {
+ background-color:var(--background-lighter);
+ border-color:var(--border-color);
+ color:var(--text-color-richer);
+}
+.ajaxpreview {
+ border-color:var(--border-color);
+}
+.edit-area ~ .ajaxpreview {
+ border-left-color:var(--border-color);
+}
+
+/* --- Dialog.less --- */
+.dialog {
+ background-color: var(--background-dialog);
+ border-color: var(--border-color);
+}
+.dialog .caption {
+ border-color: var(--border-color);
+ color: var(--text-color-normal);
+}
+.dialog.selection .body .item:hover {
+ background-color: var(--background-lighter);
+}
+.dialog.selection .body .divider {
+ background-color: var(--border-color);
+}
+
+.dialog.find [name=tbTEXTSEL] { /*same as selected text*/
+ color:var(--accent-color);
+ background-color: var(--color-black);
+}
+
+
+
+/* --- Template.Preview.less --- */
+
+/* --- ImagePlugin.less --- */
+/* --- IndexPlugin.less --- */
+
+.index .header {
+ background-color:var(--background-light);
+ border-color:var(--border-color);
+}
+.index .header:hover {
+ background-color:var(--background-light);
+}
+.index .header a {
+ color:var(--text-color-richer);
+}
+.index .header a:hover {
+ background-color:var(--background-lighter);
+}
+.index > .section a {
+ color:var(--text-color-richer);
+}
+
+
+/* --- TOCPlugin.less --- */
+
+.toc ul li:hover {
+ background-color:var(--background-lighter);
+}
+
+/* --- WeblogPlugin.less --- */
+/* --- RecentChangesPlugin.less --- */
+
+.recentchanges .date {
+ border-color:var(--border-color);
+}
+/* --- CommentBox.less --- */
+
+
+/* --- GraphBar.less --- */
+.gb-group {
+ background-color:var(--background-light);
+ border:1px solid var(--border-color);
+}
+
+/* --- Tabs.less --- */
+/* --- Accordion.less --- */
+/* --- Columns.less --- */
+.columns.border,
+.columns.border > .col:not(:last-child) {
+ border-color:var(--border-color);
+}
+.columns.hover .col:hover {
+ background-color: var(--background-lighter);
+}
+
+
+/* --- Collapsible.less --- */
+.bullet, .bullet.clpse { border-left-color: var(--text-color-normal); }
+.bullet.clpse:hover { border-left-color: var(--text-color-richer); }
+
+.bullet.xpand { border-top-color: var(--text-color-normal); }
+.bullet.xpand:hover { border-top-color: var(--text-color-richer); }
+
+/* --- Category.less --- */
+.category-link {
+ border-color:var(--border-color);
+}
+/* --- Flip.less --- */
+/* --- Invisibles.less --- */
+/* --- prettify.less --- */
+ .prettify pre, .prettify-nonum pre, pre.prettylines {
+ background-color:var(--background-light);
+ border-color:var(--border-color);
+ color:var(--text-color-richer);
+ }
+ .pln { color: #cccccc; } /* plain text */
+ .str { color: #99cc99; } /* string content */
+ .kwd { color: #ffeea6; } /* keyword */
+ .com { color: #8a8a80; } /* comment */
+ .typ { color: #bbdaff; } /* type name */
+ .lit { color: #FCA369; } /* literal value */
+ .pun { color: #cda869; } /* punctuation */
+ .opn { color: #ffffff; } /* lisp open bracket */
+ .clo { color: #ffffff; } /* lisp close bracket */
+ .tag { color: #78AAD6; } /* markup tag name */
+ .atn { color: #ffc58f; } /* markup attribute name */
+ .atv { color: #FFD479; } /* markup attribute value */
+ .dec { color: #D6ACD6; } /* declaration */
+ .var { color: #76D4D6; } /* variable name */
+ .fun { color: #d6acd6; } /* function name */
+
+/* --- responsive-viewport.less --- */
+/* --- print.less --- */
diff --git a/jspwiki-war/src/main/webapp/templates/default/skins/slate/skin.js b/jspwiki-war/src/main/webapp/templates/default/skins/slate/skin.js
new file mode 100644
index 0000000000..39d50ac082
--- /dev/null
+++ b/jspwiki-war/src/main/webapp/templates/default/skins/slate/skin.js
@@ -0,0 +1,17 @@
+/*
+ * Copyright 2025 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
diff --git a/jspwiki-war/src/main/webapp/templates/default/skins/uswds/skin.css b/jspwiki-war/src/main/webapp/templates/default/skins/uswds/skin.css
new file mode 100644
index 0000000000..35accabae3
--- /dev/null
+++ b/jspwiki-war/src/main/webapp/templates/default/skins/uswds/skin.css
@@ -0,0 +1,743 @@
+/*
+Copyright 2025 The Apache Software Foundation.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+/*
+Loosly based on the US Web Design System
+https://designsystem.digital.gov/templates/
+
+*/
+html {
+ /* 1. Core Hue Shifts */
+ --hue: 212; /* USWDS Blue Hue */
+ --accent-hue: 212;
+
+ /* 2. Text Colors */
+ --text-color-normal: #1b1b1b; /* Gray-90: High contrast for readability */
+ --text-color-light: #565c65; /* Gray-50: Accessible muted text */
+ --text-color-richer: #1b1b1b; /* USWDS prefers dark gray over pure black */
+ --text-color-highlight: #005ea2; /* Blue-60v (Primary) */
+
+ /* 3. Links and Accents */
+ --link-color: #005ea2; /* USWDS Blue 60v - Standard Link */
+ --accent-color: #005ea2;
+ --error-color: #b50909; /* Red-60v - Error/Danger */
+
+ /* 4. Buttons */
+ --button-background: #005ea2; /* Primary Blue */
+ --button-text-color: #ffffff;
+ --button-active: #1a4480; /* Blue-70v - Hover state */
+ --button-active-darker: #162e4d; /* Blue-80v - Pressed state */
+
+ /* 5. Backgrounds */
+ --background: #ffffff; /* Pure White */
+ --background-sidebar: #f0f0f0; /* Gray-5: Neutral background */
+ --background-light: #f0f0f0;
+ --background-lighter: #dfe1e2; /* Gray-10 */
+ --background-light-solid: #ffffff;
+
+ /* Navbar / PageName Specific Background */
+ --navbar-bg: #1b1b1b; /* Gray-90: Standard for Header/Global nav */
+
+ --background-dropdown: #ffffff;
+ --background-dialog: #ffffff;
+
+ /* 6. Borders */
+ --border-color: #adade2; /* Using a light blue-gray for borders */
+
+ /* 7. Contextual Colors (USWDS Vivid Palette) */
+ --context-primary: #005ea2; /* Blue 60v */
+ --context-success: #00a91c; /* Green 50v */
+ --context-info: #00bde3; /* Cyan 40v */
+ --context-warning: #ffbe2e; /* Gold 20v */
+ --context-error: #b50909; /* Red 60v */
+
+ --color-black: #000000;
+ --color-white: #ffffff;
+
+ --wikiTriangleColor: var(--link-color);
+}
+
+
+
+::selection {
+ color:var(--accent-color);
+ background-color: var(--color-black);
+}
+
+/* --- BOOTSTRAP --- */
+.titlebox {
+ background-color: var(--background-light);
+}
+.panel {
+ background-color: var(--background-light);
+ border-color: var(--border-color);
+}
+.panel-default .panel-heading {
+ background-color: var(--background-lighter);
+ border-color: var(--border-color);
+ color:inherit;
+}
+
+.list-group-item {
+ background-color: var(--background-light);
+ border-color: var(--border-color);
+}
+
+.nav-tabs {
+ border-color: var(--border-color);
+}
+.nav-tabs > li > a {
+ color:inherit;
+}
+.nav-tabs > li > a:hover {
+ background-color: var(--background-light);
+ border-color: var(--border-color);
+ color:inherit;
+}
+.nav-tabs > li.active > a,
+.nav-tabs > li.active {
+ background:transparent;
+ color:var(--text-color-richer);
+ border-color: var(--border-color);
+ border-bottom-color: var(--background);
+}
+.nav-tabs > li.active > a:hover,
+.nav-tabs > li.active > a:focus {
+ background-color: var(--background-lighter);
+ border-color: var(--border-color);
+ color:var(--text-color-richer);
+}
+
+/*.nav-pills > li.active > a,
+.nav-pills > li.active > a:hover,
+.nav-pills > li.active > a:focus {
+
+}*/
+.nav > li > a:hover, .nav > li > a:focus {
+ background-color: var(--background-lighter);
+ border-color: var(--border-color);
+ color:var(--text-color-richer);
+}
+
+
+.btn-default,
+.default {
+ background-color: var(--background-light);
+ border-color: var(--border-color);
+ color:var(--text-color-richer);
+}
+.btn:hover, .btn:focus, .btn.focus,
+.btn-default:hover {
+ background-color: var(--background-lighter);
+ border-color: var(--border-color);
+ color:var(--text-color-richer);
+}
+.btn.disabled:hover {
+ background-color: var(--background-lighter);
+ border-color: var(--border-color);
+}
+.btn-default:active,
+.btn-default:active:hover,
+.btn-default.active,
+.btn-default.active:hover {
+ background-color: var(--background-lighter);
+ border-color: var(--border-color);
+ color:var(--accent-color);
+}
+
+.dropdown-menu {
+ background-color: var(--background-dropdown);
+ border-color: var(--border-color);
+}
+.dropdown-header {
+ color:var(--text-color-richer);
+}
+.dropdown-menu .divider {
+ background-color: var(--border-color);
+}
+.dropdown-menu > li > a {
+ color:var(--text-color-normal);
+}
+.dropdown-menu > li > a:hover {
+ background-color: var(--background-lighter);
+ color:inherit;
+}
+
+.form-control {
+ background-color: var(--background-light);
+ border-color: var(--border-color);
+ color:var(--text-color-normal);
+}
+.form-control:focus {
+ border-color: var(--accent-color);
+}
+.form-control[disabled] {
+ background-color: transparent;
+ border-color: var(--border-color);
+}
+.form-frame {
+ border-color: var(--border-color);
+}
+
+label.form-switch > input[type=checkbox],
+input[type=checkbox].form-switch {
+ box-shadow:inset -1.25em 0 0 1px var(--text-color-normal);
+ background-color:var(--background-light);
+ border:1px solid var(--text-color-normal);
+}
+label.form-switch > input[type=checkbox]:hover,
+input[type=checkbox].form-switch:hover {
+ box-shadow:inset -1.25em 0 0 1px var(--text-color-normal);
+ border: 1px solid var(--text-color-normal);
+}
+label.form-switch > input[type=checkbox]:checked,
+input[type=checkbox].form-switch:checked {
+ box-shadow: inset 1.25em 0 0 1px var(--button-active);
+ border: 1px solid var(--button-active);
+}
+label.form-switch > input[type=checkbox]:checked:hover,
+input[type=checkbox].form-switch:checked:hover {
+ box-shadow:inset 1.25em 0 0 1px var(--button-active-darker);
+ border: 1px solid var(--button-active-darker);
+}
+label.form-switch > input[type=checkbox]:focus,
+input[type=checkbox].form-switch:focus {
+ background:none !important;
+}
+/*
+.form-group .btn.active {
+ color:var(--text-color-normal);
+ background-color:var(--context-info);
+}
+*/
+
+select,
+.form-group select {
+ border-color: var(--border-color);
+ color:var(--text-color-normal);
+
+ background-color: var(--background-light);
+ background-image:
+ linear-gradient(120deg, var(--wikiTriangleColor) var(--wikiTriangleSize), transparent var(--wikiTriangleSize) ),
+ linear-gradient(-120deg, var(--wikiTriangleColor) var(--wikiTriangleSize), transparent var(--wikiTriangleSize) );
+
+ background-position:
+ calc( var(--padding-base-horizontal) - 1px + var(--wikiTriangleSize)/2 ) calc(var(--padding-base-vertical)*2),
+ calc( var(--padding-base-horizontal) - var(--wikiTriangleSize)*3/2 ) calc(var(--padding-base-vertical)*2);
+
+
+}
+
+input[type=checkbox]:focus,
+select:focus,
+.form-group select:focus {
+ outline-color: var(--accent-color);
+}
+
+.modal {
+ background-color: var(--background-dropdown);
+ color:var(--text-color-normal);
+}
+
+/*pagination.less*/
+.pagination {
+ background-color: var(--background-light);
+ border-color: var(--border-color);
+}
+.pagination a {
+ color:var(--link-color);
+ text-decoration:none;
+}
+.pagination .cursor,
+.pagination a:hover {
+ background-color: var(--background-lighter);
+ border-color: var(--border-color);
+ color: var(--accent-color);
+}
+
+/* --- JSPWiki --- */
+
+/* --- variables.less --- */
+
+/* --- type.less --- */
+
+hr,.hr {
+ border-color: var(--border-color);
+}
+
+mark, .highlight {
+ background-color: var(--accent-color) !important;
+ color:var(--text-color-highlight);
+}
+
+span.text-white, div.text-white, .bg.dark + .bg-overlay { color:var(--text-color-normal); }
+/*span.text-black, div.text-black, .bg.light + .bg-overlay { color:(var(--text-???); } */
+
+.text-primary { color: var(--context-primary); }
+.text-success { color: var(--context-success); }
+.text-info { color: var(--context-info); }
+.text-warning { color: var(--context-warning); }
+.text-error,
+.text-danger { color: var(--context-error); }
+
+/* primary */
+.panel-primary > .panel-heading,
+.bg-primary {
+ background-color: var(--context-primary);
+ border-color: var(--context-primary);
+ color:var(--color-white);
+}
+.panel-primary > .panel-heading a:link,
+.bg-primary a:link {
+ color:var(--color-black);
+}
+/* success */
+.panel-success > .panel-heading,
+.success,
+.bg-success {
+ background-color: var(--context-success);
+ border-color: var(--context-success);
+ color:var(--color-black);
+}
+.panel-success > .panel-heading a:link,
+.success a:link,
+.bg-success a:link {
+ text-decoration:underline;
+}
+/* info */
+.panel-info > .panel-heading,
+.info, .information,
+.bg-info {
+ background-color: var(--context-info);
+ border-color: var(--context-info);
+ color:var(--color-black);
+}
+.panel-info > .panel-heading a:link,
+.info a:link, .information a:link,
+.bg-info a:link {
+ text-decoration:underline;
+}
+/* warning */
+.panel-warning > .panel-heading,
+.alert-warning,
+.warning,
+.bg-warning {
+ background-color: var(--context-warning);
+ border-color: var(--context-warning);
+ color:var(--color-black);
+}
+.panel-warning > .panel-heading a:link,
+.alert-warning a:link,
+.warning a:link,
+.bg-warning a:link {
+ text-decoration:underline;
+}
+/* danger, error */
+.panel-danger > .panel-heading,
+.error,.danger,
+.bg-danger {
+ background-color: var(--context-error);
+ border-color: var(--context-error);
+ color:var(--color-black);
+}
+.panel-danger > .panel-heading a:link,
+.error a:link,.danger a:link,
+.bg-danger a:link {
+ text-decoration:underline;
+}
+
+span.label { color:var(--color-black); }
+
+pre {
+ background-color:var(--background-light);
+ border-color:var(--border-color);
+ color:var(--text-color-richer);
+}
+
+code,
+tt {
+ background-color:var(--background-light);
+ border-color:var(--border-color);
+ color:var(--text-color-richer);
+}
+
+a.list-group-item:hover,
+.list-hover li:hover {
+ background-color:var(--background-lighter);
+ color:inherit;
+}
+
+.tree ul li::before,
+.tree ul li::after {
+ background: var(--border-color);
+}
+
+.list-hover li:hover {
+ background-color:var(--background-lighter);
+}
+
+.hover {
+ background-color:var(--background-lighter);
+}
+
+a.slimbox-link:after,
+.slimbox-btn:before,
+a:visited,
+a:link { color:var(--link-color); }
+
+a.createpage {
+ color:var(--error-color);
+}
+
+.interwiki-raw::after,
+a.interwiki[href$="skin=raw"]::after,
+.interwiki-reader::after,
+a.interwiki[href$="skin=reader"]::after,
+.interwiki-edit::after,
+a.interwiki[href*="Edit.jsp?page="]::after,
+.interwiki-group::after,
+a.interwiki[href*="Group.jsp?group="]::after,
+a.interwiki[href^="rss.jsp"]::after {
+ background-color:var(--background-lighter);
+ color:var(--accent-color);
+}
+
+.editsection,
+.hashlink {
+ background-color: var(--background-light);
+ border-color: var(--border-color);
+ color:var(--link-color);
+}
+.editsection:hover,
+h2 .editsection:hover,
+h3 .editsection:hover,
+h4 .editsection:hover,
+h2 .hashlink:hover,
+h3 .hashlink:hover,
+h4 .hashlink:hover {
+ background-color: var(--background-lighter);
+ border-color: var(--border-color);
+ color:var(--link-color);
+ opacity:1;
+}
+
+div.dropcaps > span.dropcaps {
+ color: var(--text-color-highlight);
+}
+blockquote,
+.dialog .quote-item {
+ border-color:var(--text-color-highlight);
+}
+.page-break {
+ border-color: var(--border-color);
+}
+
+
+/* --- grid.less --- */
+/* --- tables.less --- */
+
+.table > thead > tr > th,
+.table > tbody > tr > th,
+.table > tfoot > tr > th,
+.table > thead > tr > td,
+.table > tbody > tr > td,
+.table > tfoot > tr > td {
+ border-color: var(--border-color);
+}
+
+.wikitable > thead > tr > th,
+.wikitable > tbody > tr > th,
+.wikitable > tfoot > tr > th,
+.wikitable > thead > tr > td,
+.wikitable > tbody > tr > td,
+.wikitable > tfoot > tr > td,
+.wikitable tr:first-child th {
+ border-color: var(--border-color);
+}
+
+.table-bordered,
+.table-bordered tr:first-child th,
+.table-bordered tr:first-child td {
+ border-color: var(--border-color);
+}
+.table-bordered > thead > tr > th,
+.table-bordered > tbody > tr > th,
+.table-bordered > tfoot > tr > th,
+.table-bordered > thead > tr > td,
+.table-bordered > tbody > tr > td,
+.table-bordered > tfoot > tr > td {
+ border-color: var(--border-color);
+}
+
+.table-hover > tbody > tr:nth-of-type(odd):hover,
+.table-hover > tbody > tr:nth-child(odd):hover > td,
+.table-hover > tbody > tr:nth-child(odd):hover > th,
+.table-hover > tbody > tr:hover {
+ background-color: var(--background-lighter);
+}
+
+.table-striped > tbody > tr:nth-of-type(odd) ,
+.table-striped > tbody > tr:nth-child(odd) > td,
+.table-striped > tbody > tr:nth-child(odd) > th {
+ background-color: var(--background-light);
+}
+[class*=zebra] .odd {
+ background-color: var(--background-light);
+}
+
+
+/* --- TableX.Sort.less --- */
+.sortable th:hover {
+ background-color: var(--background-lighter);;
+}
+.sortable th.up:after,
+.sortable th.up:hover:after {
+ border-bottom-color: var(--accent-color);
+ opacity:1;
+}
+.sortable th:hover:after,
+.sortable th.down:after,
+.sortable th.down:hover:after {
+ border-top-color: var(--accent-color);
+ opacity:1;
+}
+
+/* --- TableX.Filter.less --- */
+/* --- forms.less --- */
+/* --- modals.less --- */
+
+/* --- fontjspwiki/font-jspwiki.less --- */
+/* --- dropdown.less --- */
+
+/* --- pagination.less --- */
+/* --- Tips.less --- */
+.tip-link,
+.tip-link:hover {
+ color: var(--link-color);
+}
+/* --- Magnify.less --- */
+/* --- Viewer.less --- */
+/* --- Viewer.Slimbox.less --- */
+/* --- Viewer.Carousel.less --- */
+/* --- Template.View.less --- */
+html body .header, html body .footer {
+ background-image: -webkit-radial-gradient(circle, var(--background-light), var(--background));
+ background-image: radial-gradient(circle, var(--background-light), var(--background) );
+ color:var(--text-color-normal);
+}
+a.logo { border-color: var(--border-color); }
+
+
+div.admin .formcontainer {
+ /*.default*/
+ background-color: var(--background-light);
+ border-color: var(--border-color);
+ color:var(--text-color-richer);
+}
+
+.admin .formcontainer table {
+ border-color: var(--border-color);
+ /*
+ .table;
+ .table-bordered;
+ .table-striped;
+ */
+}
+.admin-user-form > div#userlist .list-group-item.new-user{
+ background-color: var(--background-light);
+ border-color: var(--border-color);
+ color:var(--text-color-richer);
+}
+
+
+
+
+/* --- Template.UserBox.less --- */
+.login-form {
+ background-color: var(--background-dialog);
+ border:1px solid var(--border-color);
+}
+.login-form hr { border-color:var(--border-color); }
+
+
+/* --- Template.SearchBox.less --- */
+/* --- Template.Nav.less --- */
+.badge,
+.header > .navigation .nav > li > a > .badge {
+ background-color:var(--background-lighter);
+ color:var(--text-color-normal);
+}
+
+.header > .navigation .nav .btn-xs .badge {
+ background-color: var(--background-lighter);
+}
+
+/* --- Template.Content.less --- */
+body, .content {
+ background-color: var(--background);
+ color:var(--text-color-normal);
+ overflow-y: auto;
+}
+.content:after {
+ background: var(--background-sidebar);
+}
+/* --- Template.Attach.less --- */
+/* --- Template.Diff.less --- */
+.diffadd { background-color:var(--context-success); color:var(--color-black); }
+.diffrem { background:var(--context-error); color:var(--color-black); }
+
+/* --- Template.Search.less --- */
+
+form#searchform2 + div .fragment {
+ color: var(--text-color-richer);
+}
+form#searchform2 + div .gb-bar {
+ background-color: var(--context-warning);
+}
+
+/* --- Template.Workflow.less --- */
+/* --- Template.Edit.less --- */
+
+.editform input[type="text"]:focus,
+.dialog.find input[type="text"]:focus,
+.editform textarea:focus,
+.dialog.find textarea:focus {
+ background-color:var(--background-lighter);
+ border-color:var(--border-color);
+ color:var(--text-color-richer);
+}
+.ajaxpreview {
+ border-color:var(--border-color);
+}
+.edit-area ~ .ajaxpreview {
+ border-left-color:var(--border-color);
+}
+
+/* --- Dialog.less --- */
+.dialog {
+ background-color: var(--background-dialog);
+ border-color: var(--border-color);
+}
+.dialog .caption {
+ border-color: var(--border-color);
+ color: var(--text-color-normal);
+}
+.dialog.selection .body .item:hover {
+ background-color: var(--background-lighter);
+}
+.dialog.selection .body .divider {
+ background-color: var(--border-color);
+}
+
+.dialog.find [name=tbTEXTSEL] { /*same as selected text*/
+ color:var(--accent-color);
+ background-color: var(--color-black);
+}
+
+
+
+/* --- Template.Preview.less --- */
+
+/* --- ImagePlugin.less --- */
+/* --- IndexPlugin.less --- */
+
+.index .header {
+ background-color:var(--background-light);
+ border-color:var(--border-color);
+}
+.index .header:hover {
+ background-color:var(--background-light);
+}
+.index .header a {
+ color:var(--text-color-richer);
+}
+.index .header a:hover {
+ background-color:var(--background-lighter);
+}
+.index > .section a {
+ color:var(--text-color-richer);
+}
+
+
+/* --- TOCPlugin.less --- */
+
+.toc ul li:hover {
+ background-color:var(--background-lighter);
+}
+
+/* --- WeblogPlugin.less --- */
+/* --- RecentChangesPlugin.less --- */
+
+.recentchanges .date {
+ border-color:var(--border-color);
+}
+/* --- CommentBox.less --- */
+
+
+/* --- GraphBar.less --- */
+.gb-group {
+ background-color:var(--background-light);
+ border:1px solid var(--border-color);
+}
+
+/* --- Tabs.less --- */
+/* --- Accordion.less --- */
+/* --- Columns.less --- */
+.columns.border,
+.columns.border > .col:not(:last-child) {
+ border-color:var(--border-color);
+}
+.columns.hover .col:hover {
+ background-color: var(--background-lighter);
+}
+
+
+/* --- Collapsible.less --- */
+.bullet, .bullet.clpse { border-left-color: var(--text-color-normal); }
+.bullet.clpse:hover { border-left-color: var(--text-color-richer); }
+
+.bullet.xpand { border-top-color: var(--text-color-normal); }
+.bullet.xpand:hover { border-top-color: var(--text-color-richer); }
+
+/* --- Category.less --- */
+.category-link {
+ border-color:var(--border-color);
+}
+/* --- Flip.less --- */
+/* --- Invisibles.less --- */
+/* --- prettify.less --- */
+ .prettify pre, .prettify-nonum pre, pre.prettylines {
+ background-color:var(--background-light);
+ border-color:var(--border-color);
+ color:var(--text-color-richer);
+ }
+ .pln { color: #cccccc; } /* plain text */
+ .str { color: #99cc99; } /* string content */
+ .kwd { color: #ffeea6; } /* keyword */
+ .com { color: #8a8a80; } /* comment */
+ .typ { color: #bbdaff; } /* type name */
+ .lit { color: #FCA369; } /* literal value */
+ .pun { color: #cda869; } /* punctuation */
+ .opn { color: #ffffff; } /* lisp open bracket */
+ .clo { color: #ffffff; } /* lisp close bracket */
+ .tag { color: #78AAD6; } /* markup tag name */
+ .atn { color: #ffc58f; } /* markup attribute name */
+ .atv { color: #FFD479; } /* markup attribute value */
+ .dec { color: #D6ACD6; } /* declaration */
+ .var { color: #76D4D6; } /* variable name */
+ .fun { color: #d6acd6; } /* function name */
+
+/* --- responsive-viewport.less --- */
+/* --- print.less --- */
diff --git a/jspwiki-war/src/main/webapp/templates/default/skins/uswds/skin.js b/jspwiki-war/src/main/webapp/templates/default/skins/uswds/skin.js
new file mode 100644
index 0000000000..39d50ac082
--- /dev/null
+++ b/jspwiki-war/src/main/webapp/templates/default/skins/uswds/skin.js
@@ -0,0 +1,17 @@
+/*
+ * Copyright 2025 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
diff --git a/jspwiki-war/src/main/webapp/templates/default/skins/vapor/skin.css b/jspwiki-war/src/main/webapp/templates/default/skins/vapor/skin.css
new file mode 100644
index 0000000000..0f94d5b614
--- /dev/null
+++ b/jspwiki-war/src/main/webapp/templates/default/skins/vapor/skin.css
@@ -0,0 +1,729 @@
+/*
+inspired by Bootswatch theme of the same name
+from https://github.com/thomaspark/bootswatch/
+MIT Licensed
+*/
+html {
+ /* 1. Core Hue Shifts (Vapor is Purple/Violet based) */
+ --hue: 275;
+ --accent-hue: 320; /* Hot Pink / Magenta */
+
+ /* 2. Text Colors */
+ --text-color-normal: #cdb9df; /* Soft Purple-White */
+ --text-color-light: #80679b; /* Muted Purple */
+ --text-color-richer: #ffffff; /* Bright White */
+ --text-color-highlight: #ff00ab; /* Neon Pink */
+
+ /* 3. Links and Accents */
+ --link-color: #32fbe2; /* Neon Cyan */
+ --accent-color: #ff00ab; /* Neon Pink */
+ --error-color: #ff5e9c; /* Vapor Pink-Red */
+
+ /* 4. Buttons */
+ --button-background: #442671; /* Deep Purple */
+ --button-text-color: #ffffff;
+ --button-active: #ff00ab;
+ --button-active-darker: #c20082;
+
+ /* 5. Backgrounds (The deep space purple) */
+ --background: #1a0933; /* Dark Space Background */
+ --background-sidebar: #261447; /* Lighter Purple */
+ --background-light: #261447;
+ --background-lighter: #442671;
+ --background-light-solid: #261447;
+
+ --background-dropdown: #1a0933;
+ --background-dialog: #1a0933;
+
+ /* 6. Borders (Neon outlines) */
+ --border-color: #442671;
+
+ /* 7. Contextual Colors (Vapor Neon Palette) */
+ --context-primary: #6f42c1; /* Deep Purple */
+ --context-success: #32fbe2; /* Cyan */
+ --context-info: #00d5ff; /* Bright Blue */
+ --context-info-darker: #00a8cc;
+ --context-warning: #ff9100; /* Neon Orange */
+ --context-error: #ff5e9c; /* Hot Pink/Red */
+
+ --color-black: #0d0221;
+ --color-white: #ffffff;
+
+ /* 8. UI Constants */
+ --wikiTriangleColor: #32fbe2; /* Cyan Triangles */
+ --wikiTriangleSize: 4.8px;
+ --padding-base-horizontal: 12px;
+ --padding-base-vertical: 6px;
+}
+
+
+::selection {
+ color:var(--accent-color);
+ background-color: var(--color-black);
+}
+
+/* --- BOOTSTRAP --- */
+.titlebox {
+ background-color: var(--background-light);
+}
+.panel {
+ background-color: var(--background-light);
+ border-color: var(--border-color);
+}
+.panel-default .panel-heading {
+ background-color: var(--background-lighter);
+ border-color: var(--border-color);
+ color:inherit;
+}
+
+.list-group-item {
+ background-color: var(--background-light);
+ border-color: var(--border-color);
+}
+
+.nav-tabs {
+ border-color: var(--border-color);
+}
+.nav-tabs > li > a {
+ color:inherit;
+}
+.nav-tabs > li > a:hover {
+ background-color: var(--background-light);
+ border-color: var(--border-color);
+ color:inherit;
+}
+.nav-tabs > li.active > a,
+.nav-tabs > li.active {
+ background:transparent;
+ color:var(--text-color-richer);
+ border-color: var(--border-color);
+ border-bottom-color: var(--background);
+}
+.nav-tabs > li.active > a:hover,
+.nav-tabs > li.active > a:focus {
+ background-color: var(--background-lighter);
+ border-color: var(--border-color);
+ color:var(--text-color-richer);
+}
+
+/*.nav-pills > li.active > a,
+.nav-pills > li.active > a:hover,
+.nav-pills > li.active > a:focus {
+
+}*/
+.nav > li > a:hover, .nav > li > a:focus {
+ background-color: var(--background-lighter);
+ border-color: var(--border-color);
+ color:var(--text-color-richer);
+}
+
+
+.btn-default,
+.default {
+ background-color: var(--background-light);
+ border-color: var(--border-color);
+ color:var(--text-color-richer);
+}
+.btn:hover, .btn:focus, .btn.focus,
+.btn-default:hover {
+ background-color: var(--background-lighter);
+ border-color: var(--border-color);
+ color:var(--text-color-richer);
+}
+.btn.disabled:hover {
+ background-color: var(--background-lighter);
+ border-color: var(--border-color);
+}
+.btn-default:active,
+.btn-default:active:hover,
+.btn-default.active,
+.btn-default.active:hover {
+ background-color: var(--background-lighter);
+ border-color: var(--border-color);
+ color:var(--accent-color);
+}
+
+.dropdown-menu {
+ background-color: var(--background-dropdown);
+ border-color: var(--border-color);
+}
+.dropdown-header {
+ color:var(--text-color-richer);
+}
+.dropdown-menu .divider {
+ background-color: var(--border-color);
+}
+.dropdown-menu > li > a {
+ color:var(--text-color-normal);
+}
+.dropdown-menu > li > a:hover {
+ background-color: var(--background-lighter);
+ color:inherit;
+}
+
+.form-control {
+ background-color: var(--background-light);
+ border-color: var(--border-color);
+ color:var(--text-color-normal);
+}
+.form-control:focus {
+ border-color: var(--accent-color);
+}
+.form-control[disabled] {
+ background-color: transparent;
+ border-color: var(--border-color);
+}
+.form-frame {
+ border-color: var(--border-color);
+}
+
+label.form-switch > input[type=checkbox],
+input[type=checkbox].form-switch {
+ box-shadow:inset -1.25em 0 0 1px var(--text-color-normal);
+ background-color:var(--background-light);
+ border:1px solid var(--text-color-normal);
+}
+label.form-switch > input[type=checkbox]:hover,
+input[type=checkbox].form-switch:hover {
+ box-shadow:inset -1.25em 0 0 1px var(--text-color-normal);
+ border: 1px solid var(--text-color-normal);
+}
+label.form-switch > input[type=checkbox]:checked,
+input[type=checkbox].form-switch:checked {
+ box-shadow: inset 1.25em 0 0 1px var(--button-active);
+ border: 1px solid var(--button-active);
+}
+label.form-switch > input[type=checkbox]:checked:hover,
+input[type=checkbox].form-switch:checked:hover {
+ box-shadow:inset 1.25em 0 0 1px var(--button-active-darker);
+ border: 1px solid var(--button-active-darker);
+}
+label.form-switch > input[type=checkbox]:focus,
+input[type=checkbox].form-switch:focus {
+ background:none !important;
+}
+/*
+.form-group .btn.active {
+ color:var(--text-color-normal);
+ background-color:var(--context-info);
+}
+*/
+
+select,
+.form-group select {
+ border-color: var(--border-color);
+ color:var(--text-color-normal);
+
+ background-color: var(--background-light);
+ background-image:
+ linear-gradient(120deg, var(--wikiTriangleColor) var(--wikiTriangleSize), transparent var(--wikiTriangleSize) ),
+ linear-gradient(-120deg, var(--wikiTriangleColor) var(--wikiTriangleSize), transparent var(--wikiTriangleSize) );
+
+ background-position:
+ calc( var(--padding-base-horizontal) - 1px + var(--wikiTriangleSize)/2 ) calc(var(--padding-base-vertical)*2),
+ calc( var(--padding-base-horizontal) - var(--wikiTriangleSize)*3/2 ) calc(var(--padding-base-vertical)*2);
+
+
+}
+
+input[type=checkbox]:focus,
+select:focus,
+.form-group select:focus {
+ outline-color: var(--accent-color);
+}
+
+.modal {
+ background-color: var(--background-dropdown);
+ color:var(--text-color-normal);
+}
+
+/*pagination.less*/
+.pagination {
+ background-color: var(--background-light);
+ border-color: var(--border-color);
+}
+.pagination a {
+ color:var(--link-color);
+ text-decoration:none;
+}
+.pagination .cursor,
+.pagination a:hover {
+ background-color: var(--background-lighter);
+ border-color: var(--border-color);
+ color: var(--accent-color);
+}
+
+/* --- JSPWiki --- */
+
+/* --- variables.less --- */
+
+/* --- type.less --- */
+
+hr,.hr {
+ border-color: var(--border-color);
+}
+
+mark, .highlight {
+ background-color: var(--accent-color) !important;
+ color:var(--text-color-highlight);
+}
+
+span.text-white, div.text-white, .bg.dark + .bg-overlay { color:var(--text-color-normal); }
+/*span.text-black, div.text-black, .bg.light + .bg-overlay { color:(var(--text-???); } */
+
+.text-primary { color: var(--context-primary); }
+.text-success { color: var(--context-success); }
+.text-info { color: var(--context-info); }
+.text-warning { color: var(--context-warning); }
+.text-error,
+.text-danger { color: var(--context-error); }
+
+/* primary */
+.panel-primary > .panel-heading,
+.bg-primary {
+ background-color: var(--context-primary);
+ border-color: var(--context-primary);
+ color:var(--color-white);
+}
+.panel-primary > .panel-heading a:link,
+.bg-primary a:link {
+ color:var(--color-black);
+}
+/* success */
+.panel-success > .panel-heading,
+.success,
+.bg-success {
+ background-color: var(--context-success);
+ border-color: var(--context-success);
+ color:var(--color-black);
+}
+.panel-success > .panel-heading a:link,
+.success a:link,
+.bg-success a:link {
+ text-decoration:underline;
+}
+/* info */
+.panel-info > .panel-heading,
+.info, .information,
+.bg-info {
+ background-color: var(--context-info);
+ border-color: var(--context-info);
+ color:var(--color-black);
+}
+.panel-info > .panel-heading a:link,
+.info a:link, .information a:link,
+.bg-info a:link {
+ text-decoration:underline;
+}
+/* warning */
+.panel-warning > .panel-heading,
+.alert-warning,
+.warning,
+.bg-warning {
+ background-color: var(--context-warning);
+ border-color: var(--context-warning);
+ color:var(--color-black);
+}
+.panel-warning > .panel-heading a:link,
+.alert-warning a:link,
+.warning a:link,
+.bg-warning a:link {
+ text-decoration:underline;
+}
+/* danger, error */
+.panel-danger > .panel-heading,
+.error,.danger,
+.bg-danger {
+ background-color: var(--context-error);
+ border-color: var(--context-error);
+ color:var(--color-black);
+}
+.panel-danger > .panel-heading a:link,
+.error a:link,.danger a:link,
+.bg-danger a:link {
+ text-decoration:underline;
+}
+
+span.label { color:var(--color-black); }
+
+pre {
+ background-color:var(--background-light);
+ border-color:var(--border-color);
+ color:var(--text-color-richer);
+}
+
+code,
+tt {
+ background-color:var(--background-light);
+ border-color:var(--border-color);
+ color:var(--text-color-richer);
+}
+
+a.list-group-item:hover,
+.list-hover li:hover {
+ background-color:var(--background-lighter);
+ color:inherit;
+}
+
+.tree ul li::before,
+.tree ul li::after {
+ background: var(--border-color);
+}
+
+.list-hover li:hover {
+ background-color:var(--background-lighter);
+}
+
+.hover {
+ background-color:var(--background-lighter);
+}
+
+a.slimbox-link:after,
+.slimbox-btn:before,
+a:visited,
+a:link { color:var(--link-color); }
+
+a.createpage {
+ color:var(--error-color);
+}
+
+.interwiki-raw::after,
+a.interwiki[href$="skin=raw"]::after,
+.interwiki-reader::after,
+a.interwiki[href$="skin=reader"]::after,
+.interwiki-edit::after,
+a.interwiki[href*="Edit.jsp?page="]::after,
+.interwiki-group::after,
+a.interwiki[href*="Group.jsp?group="]::after,
+a.interwiki[href^="rss.jsp"]::after {
+ background-color:var(--background-lighter);
+ color:var(--accent-color);
+}
+
+.editsection,
+.hashlink {
+ background-color: var(--background-light);
+ border-color: var(--border-color);
+ color:var(--link-color);
+}
+.editsection:hover,
+h2 .editsection:hover,
+h3 .editsection:hover,
+h4 .editsection:hover,
+h2 .hashlink:hover,
+h3 .hashlink:hover,
+h4 .hashlink:hover {
+ background-color: var(--background-lighter);
+ border-color: var(--border-color);
+ color:var(--link-color);
+ opacity:1;
+}
+
+div.dropcaps > span.dropcaps {
+ color: var(--text-color-highlight);
+}
+blockquote,
+.dialog .quote-item {
+ border-color:var(--text-color-highlight);
+}
+.page-break {
+ border-color: var(--border-color);
+}
+
+
+/* --- grid.less --- */
+/* --- tables.less --- */
+
+.table > thead > tr > th,
+.table > tbody > tr > th,
+.table > tfoot > tr > th,
+.table > thead > tr > td,
+.table > tbody > tr > td,
+.table > tfoot > tr > td {
+ border-color: var(--border-color);
+}
+
+.wikitable > thead > tr > th,
+.wikitable > tbody > tr > th,
+.wikitable > tfoot > tr > th,
+.wikitable > thead > tr > td,
+.wikitable > tbody > tr > td,
+.wikitable > tfoot > tr > td,
+.wikitable tr:first-child th {
+ border-color: var(--border-color);
+}
+
+.table-bordered,
+.table-bordered tr:first-child th,
+.table-bordered tr:first-child td {
+ border-color: var(--border-color);
+}
+.table-bordered > thead > tr > th,
+.table-bordered > tbody > tr > th,
+.table-bordered > tfoot > tr > th,
+.table-bordered > thead > tr > td,
+.table-bordered > tbody > tr > td,
+.table-bordered > tfoot > tr > td {
+ border-color: var(--border-color);
+}
+
+.table-hover > tbody > tr:nth-of-type(odd):hover,
+.table-hover > tbody > tr:nth-child(odd):hover > td,
+.table-hover > tbody > tr:nth-child(odd):hover > th,
+.table-hover > tbody > tr:hover {
+ background-color: var(--background-lighter);
+}
+
+.table-striped > tbody > tr:nth-of-type(odd) ,
+.table-striped > tbody > tr:nth-child(odd) > td,
+.table-striped > tbody > tr:nth-child(odd) > th {
+ background-color: var(--background-light);
+}
+[class*=zebra] .odd {
+ background-color: var(--background-light);
+}
+
+
+/* --- TableX.Sort.less --- */
+.sortable th:hover {
+ background-color: var(--background-lighter);;
+}
+.sortable th.up:after,
+.sortable th.up:hover:after {
+ border-bottom-color: var(--accent-color);
+ opacity:1;
+}
+.sortable th:hover:after,
+.sortable th.down:after,
+.sortable th.down:hover:after {
+ border-top-color: var(--accent-color);
+ opacity:1;
+}
+
+/* --- TableX.Filter.less --- */
+/* --- forms.less --- */
+/* --- modals.less --- */
+
+/* --- fontjspwiki/font-jspwiki.less --- */
+/* --- dropdown.less --- */
+
+/* --- pagination.less --- */
+/* --- Tips.less --- */
+.tip-link,
+.tip-link:hover {
+ color: var(--link-color);
+}
+/* --- Magnify.less --- */
+/* --- Viewer.less --- */
+/* --- Viewer.Slimbox.less --- */
+/* --- Viewer.Carousel.less --- */
+/* --- Template.View.less --- */
+html body .header, html body .footer {
+ background-image: -webkit-radial-gradient(circle, var(--background-light), var(--background));
+ background-image: radial-gradient(circle, var(--background-light), var(--background) );
+ color:var(--text-color-normal);
+}
+a.logo { border-color: var(--border-color); }
+
+
+div.admin .formcontainer {
+ /*.default*/
+ background-color: var(--background-light);
+ border-color: var(--border-color);
+ color:var(--text-color-richer);
+}
+
+.admin .formcontainer table {
+ border-color: var(--border-color);
+ /*
+ .table;
+ .table-bordered;
+ .table-striped;
+ */
+}
+.admin-user-form > div#userlist .list-group-item.new-user{
+ background-color: var(--background-light);
+ border-color: var(--border-color);
+ color:var(--text-color-richer);
+}
+
+
+
+
+/* --- Template.UserBox.less --- */
+.login-form {
+ background-color: var(--background-dialog);
+ border:1px solid var(--border-color);
+}
+.login-form hr { border-color:var(--border-color); }
+
+
+/* --- Template.SearchBox.less --- */
+/* --- Template.Nav.less --- */
+.badge,
+.header > .navigation .nav > li > a > .badge {
+ background-color:var(--background-lighter);
+ color:var(--text-color-normal);
+}
+
+.header > .navigation .nav .btn-xs .badge {
+ background-color: var(--background-lighter);
+}
+
+/* --- Template.Content.less --- */
+body, .content {
+ background-color: var(--background);
+ color:var(--text-color-normal);
+ overflow-y: auto;
+}
+.content:after {
+ background: var(--background-sidebar);
+}
+/* --- Template.Attach.less --- */
+/* --- Template.Diff.less --- */
+.diffadd { background-color:var(--context-success); color:var(--color-black); }
+.diffrem { background:var(--context-error); color:var(--color-black); }
+
+/* --- Template.Search.less --- */
+
+form#searchform2 + div .fragment {
+ color: var(--text-color-richer);
+}
+form#searchform2 + div .gb-bar {
+ background-color: var(--context-warning);
+}
+
+/* --- Template.Workflow.less --- */
+/* --- Template.Edit.less --- */
+
+.editform input[type="text"]:focus,
+.dialog.find input[type="text"]:focus,
+.editform textarea:focus,
+.dialog.find textarea:focus {
+ background-color:var(--background-lighter);
+ border-color:var(--border-color);
+ color:var(--text-color-richer);
+}
+.ajaxpreview {
+ border-color:var(--border-color);
+}
+.edit-area ~ .ajaxpreview {
+ border-left-color:var(--border-color);
+}
+
+/* --- Dialog.less --- */
+.dialog {
+ background-color: var(--background-dialog);
+ border-color: var(--border-color);
+}
+.dialog .caption {
+ border-color: var(--border-color);
+ color: var(--text-color-normal);
+}
+.dialog.selection .body .item:hover {
+ background-color: var(--background-lighter);
+}
+.dialog.selection .body .divider {
+ background-color: var(--border-color);
+}
+
+.dialog.find [name=tbTEXTSEL] { /*same as selected text*/
+ color:var(--accent-color);
+ background-color: var(--color-black);
+}
+
+
+
+/* --- Template.Preview.less --- */
+
+/* --- ImagePlugin.less --- */
+/* --- IndexPlugin.less --- */
+
+.index .header {
+ background-color:var(--background-light);
+ border-color:var(--border-color);
+}
+.index .header:hover {
+ background-color:var(--background-light);
+}
+.index .header a {
+ color:var(--text-color-richer);
+}
+.index .header a:hover {
+ background-color:var(--background-lighter);
+}
+.index > .section a {
+ color:var(--text-color-richer);
+}
+
+
+/* --- TOCPlugin.less --- */
+
+.toc ul li:hover {
+ background-color:var(--background-lighter);
+}
+
+/* --- WeblogPlugin.less --- */
+/* --- RecentChangesPlugin.less --- */
+
+.recentchanges .date {
+ border-color:var(--border-color);
+}
+/* --- CommentBox.less --- */
+
+
+/* --- GraphBar.less --- */
+.gb-group {
+ background-color:var(--background-light);
+ border:1px solid var(--border-color);
+}
+
+/* --- Tabs.less --- */
+/* --- Accordion.less --- */
+/* --- Columns.less --- */
+.columns.border,
+.columns.border > .col:not(:last-child) {
+ border-color:var(--border-color);
+}
+.columns.hover .col:hover {
+ background-color: var(--background-lighter);
+}
+
+
+/* --- Collapsible.less --- */
+.bullet, .bullet.clpse { border-left-color: var(--text-color-normal); }
+.bullet.clpse:hover { border-left-color: var(--text-color-richer); }
+
+.bullet.xpand { border-top-color: var(--text-color-normal); }
+.bullet.xpand:hover { border-top-color: var(--text-color-richer); }
+
+/* --- Category.less --- */
+.category-link {
+ border-color:var(--border-color);
+}
+/* --- Flip.less --- */
+/* --- Invisibles.less --- */
+/* --- prettify.less --- */
+ .prettify pre, .prettify-nonum pre, pre.prettylines {
+ background-color:var(--background-light);
+ border-color:var(--border-color);
+ color:var(--text-color-richer);
+ }
+ .pln { color: #cccccc; } /* plain text */
+ .str { color: #99cc99; } /* string content */
+ .kwd { color: #ffeea6; } /* keyword */
+ .com { color: #8a8a80; } /* comment */
+ .typ { color: #bbdaff; } /* type name */
+ .lit { color: #FCA369; } /* literal value */
+ .pun { color: #cda869; } /* punctuation */
+ .opn { color: #ffffff; } /* lisp open bracket */
+ .clo { color: #ffffff; } /* lisp close bracket */
+ .tag { color: #78AAD6; } /* markup tag name */
+ .atn { color: #ffc58f; } /* markup attribute name */
+ .atv { color: #FFD479; } /* markup attribute value */
+ .dec { color: #D6ACD6; } /* declaration */
+ .var { color: #76D4D6; } /* variable name */
+ .fun { color: #d6acd6; } /* function name */
+
+/* --- responsive-viewport.less --- */
+/* --- print.less --- */
diff --git a/jspwiki-war/src/main/webapp/templates/default/skins/vapor/skin.js b/jspwiki-war/src/main/webapp/templates/default/skins/vapor/skin.js
new file mode 100644
index 0000000000..39d50ac082
--- /dev/null
+++ b/jspwiki-war/src/main/webapp/templates/default/skins/vapor/skin.js
@@ -0,0 +1,17 @@
+/*
+ * Copyright 2025 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+