merge all stylesheets into one

Sat, 21 Feb 2026 13:41:41 +0100

author
Mike Becker <universe@uap-core.de>
date
Sat, 21 Feb 2026 13:41:41 +0100
changeset 414
1f1bce90127e
parent 413
0523585f1742
child 415
f0a1631eaf00

merge all stylesheets into one

src/main/kotlin/de/uapcore/lightpit/AbstractServlet.kt file | annotate | diff | comparison | revisions
src/main/kotlin/de/uapcore/lightpit/Constants.kt file | annotate | diff | comparison | revisions
src/main/kotlin/de/uapcore/lightpit/RequestMapping.kt file | annotate | diff | comparison | revisions
src/main/kotlin/de/uapcore/lightpit/logic/IssueLogic.kt file | annotate | diff | comparison | revisions
src/main/kotlin/de/uapcore/lightpit/servlet/AboutServlet.kt file | annotate | diff | comparison | revisions
src/main/kotlin/de/uapcore/lightpit/servlet/IssuesServlet.kt file | annotate | diff | comparison | revisions
src/main/kotlin/de/uapcore/lightpit/servlet/ProjectServlet.kt file | annotate | diff | comparison | revisions
src/main/kotlin/de/uapcore/lightpit/servlet/SettingsServlet.kt file | annotate | diff | comparison | revisions
src/main/webapp/WEB-INF/jsp/about.jsp file | annotate | diff | comparison | revisions
src/main/webapp/WEB-INF/jsp/site.jsp file | annotate | diff | comparison | revisions
src/main/webapp/about.css file | annotate | diff | comparison | revisions
src/main/webapp/error.css file | annotate | diff | comparison | revisions
src/main/webapp/lightpit.css file | annotate | diff | comparison | revisions
src/main/webapp/projects.css file | annotate | diff | comparison | revisions
src/main/webapp/settings.css file | annotate | diff | comparison | revisions
--- a/src/main/kotlin/de/uapcore/lightpit/AbstractServlet.kt	Fri Feb 20 16:30:17 2026 +0100
+++ b/src/main/kotlin/de/uapcore/lightpit/AbstractServlet.kt	Sat Feb 21 13:41:41 2026 +0100
@@ -192,7 +192,6 @@
         // if this is an error path, bypass the normal flow
         if (fullPath.startsWith("/error/")) {
             val http = HttpRequest(null, req, resp)
-            http.styleSheets = listOf("error")
             http.render("error")
             return
         }
--- a/src/main/kotlin/de/uapcore/lightpit/Constants.kt	Fri Feb 20 16:30:17 2026 +0100
+++ b/src/main/kotlin/de/uapcore/lightpit/Constants.kt	Sat Feb 21 13:41:41 2026 +0100
@@ -29,7 +29,7 @@
     /**
      * A date in yyyy-mm-dd format to identify the release.
      */
-    const val VERSION_DATE = "2026-02-20"
+    const val VERSION_DATE = "2026-02-21"
 
     /**
      * The path where the JSP files reside.
@@ -92,11 +92,6 @@
     const val REQ_ATTR_VIEWMODEL = "viewmodel"
 
     /**
-     * Key for the name of the additional stylesheet used by a module.
-     */
-    const val REQ_ATTR_STYLESHEET = "extraCss"
-
-    /**
      * Key for the name of the optional java script file.
      */
     const val REQ_ATTR_JAVASCRIPT = "javascriptFile"
--- a/src/main/kotlin/de/uapcore/lightpit/RequestMapping.kt	Fri Feb 20 16:30:17 2026 +0100
+++ b/src/main/kotlin/de/uapcore/lightpit/RequestMapping.kt	Sat Feb 21 13:41:41 2026 +0100
@@ -85,19 +85,6 @@
 
     /**
      * A list of additional style sheets.
-     * TODO: remove this unnecessary attribute and merge all style sheets into one global
-     * @see Constants#REQ_ATTR_STYLESHEET
-     */
-    var styleSheets = emptyList<String>()
-        set(value) {
-            field = value
-            request.setAttribute(Constants.REQ_ATTR_STYLESHEET,
-                value.map { "$it.css" }
-            )
-        }
-
-    /**
-     * A list of additional style sheets.
      *
      * @see Constants#REQ_ATTR_JAVASCRIPT
      */
--- a/src/main/kotlin/de/uapcore/lightpit/logic/IssueLogic.kt	Fri Feb 20 16:30:17 2026 +0100
+++ b/src/main/kotlin/de/uapcore/lightpit/logic/IssueLogic.kt	Sat Feb 21 13:41:41 2026 +0100
@@ -209,7 +209,6 @@
         if (pathInfos is PathInfosFull) {
             navigationMenu = projectNavMenu(dao.listProjects(), pathInfos)
         }
-        styleSheets = listOf("projects")
         javascript = "issue-editor"
         render("issue-view")
     }
--- a/src/main/kotlin/de/uapcore/lightpit/servlet/AboutServlet.kt	Fri Feb 20 16:30:17 2026 +0100
+++ b/src/main/kotlin/de/uapcore/lightpit/servlet/AboutServlet.kt	Sat Feb 21 13:41:41 2026 +0100
@@ -38,9 +38,6 @@
     }
 
     private fun viewAboutPage(http: HttpRequest, dao: DataAccessObject) {
-        with(http) {
-            styleSheets = listOf("about")
-            render("about")
-        }
+        http.render("about")
     }
 }
\ No newline at end of file
--- a/src/main/kotlin/de/uapcore/lightpit/servlet/IssuesServlet.kt	Fri Feb 20 16:30:17 2026 +0100
+++ b/src/main/kotlin/de/uapcore/lightpit/servlet/IssuesServlet.kt	Sat Feb 21 13:41:41 2026 +0100
@@ -39,7 +39,6 @@
         with(http) {
             pageTitle = i18n("issues")
             view = IssueOverview(issues, filter)
-            styleSheets = listOf("projects")
             javascript = "issue-overview"
             render("issues")
         }
@@ -131,7 +130,6 @@
                 issue.project,
                 PathInfosSimple()
             )
-            styleSheets = listOf("projects")
             javascript = "issue-editor"
             render("issue-form")
         }
--- a/src/main/kotlin/de/uapcore/lightpit/servlet/ProjectServlet.kt	Fri Feb 20 16:30:17 2026 +0100
+++ b/src/main/kotlin/de/uapcore/lightpit/servlet/ProjectServlet.kt	Sat Feb 21 13:41:41 2026 +0100
@@ -90,7 +90,6 @@
         with(http) {
             view = ProjectsView(projectInfos)
             navigationMenu = projectNavMenu(projects)
-            styleSheets = listOf("projects")
             render("projects")
         }
     }
@@ -129,7 +128,6 @@
                 pageTitle = project.name
                 view = ProjectDetails(path, issues, filter)
                 navigationMenu = projectNavMenu(dao.listProjects(), path)
-                styleSheets = listOf("projects")
                 javascript = "issue-overview"
                 render("project-details")
             }
@@ -137,7 +135,6 @@
     }
 
     private fun projectForm(http: HttpRequest, dao: DataAccessObject) {
-        http.styleSheets = listOf("projects")
         if (!http.pathParams.containsKey("project")) {
             http.view = ProjectEditView(Project(-1), dao.listUsers())
             http.navigationMenu = projectNavMenu(dao.listProjects())
@@ -202,7 +199,6 @@
                     dao.listVersionSummaries(path.project)
                 )
                 navigationMenu = projectNavMenu(dao.listProjects(), path)
-                styleSheets = listOf("projects")
                 javascript = "issue-overview"
                 render("versions")
             }
@@ -220,7 +216,6 @@
             with(http) {
                 view = VersionEditView(path.projectInfo, version, returnLink)
                 navigationMenu = projectNavMenu(dao.listProjects(), path)
-                styleSheets = listOf("projects")
                 render("version-form")
             }
         }
@@ -289,7 +284,6 @@
                 pageTitle = "${project.name} - ${i18n("version.planning.title")} ${versionInfo.elem.name}"
                 view = VersionPlanning(path.projectInfo, versionInfo.elem, issues, filter)
                 navigationMenu = projectNavMenu(dao.listProjects(), path)
-                styleSheets = listOf("projects")
                 javascript = "issue-overview"
                 render("version-plan")
             }
@@ -327,7 +321,6 @@
                     dao.listComponentSummaries(path.project)
                 )
                 navigationMenu = projectNavMenu(dao.listProjects(), path)
-                styleSheets = listOf("projects")
                 javascript = "issue-overview"
                 render("components")
             }
@@ -345,7 +338,6 @@
             with(http) {
                 view = ComponentEditView(path.projectInfo, component, dao.listUsers(), returnLink)
                 navigationMenu = projectNavMenu(dao.listProjects(), path)
-                styleSheets = listOf("projects")
                 render("component-form")
             }
         }
@@ -390,7 +382,6 @@
                     dao.listVariantSummaries(path.project)
                 )
                 navigationMenu = projectNavMenu(dao.listProjects(), path)
-                styleSheets = listOf("projects")
                 javascript = "issue-overview"
                 render("variants")
             }
@@ -408,7 +399,6 @@
             with(http) {
                 view = VariantEditView(path.projectInfo, variant, returnLink)
                 navigationMenu = projectNavMenu(dao.listProjects(), path)
-                styleSheets = listOf("projects")
                 render("variant-form")
             }
         }
@@ -554,7 +544,6 @@
                     path
                 )
                 navigationMenu = projectNavMenu(dao.listProjects(), path)
-                styleSheets = listOf("projects")
                 javascript = "issue-editor"
                 render("issue-form")
             }
--- a/src/main/kotlin/de/uapcore/lightpit/servlet/SettingsServlet.kt	Fri Feb 20 16:30:17 2026 +0100
+++ b/src/main/kotlin/de/uapcore/lightpit/servlet/SettingsServlet.kt	Sat Feb 21 13:41:41 2026 +0100
@@ -49,7 +49,6 @@
                 request.locale,
                 sessionTimezone(http)
             )
-            styleSheets = listOf("settings")
             render("settings")
         }
     }
--- a/src/main/webapp/WEB-INF/jsp/about.jsp	Fri Feb 20 16:30:17 2026 +0100
+++ b/src/main/webapp/WEB-INF/jsp/about.jsp	Sat Feb 21 13:41:41 2026 +0100
@@ -26,6 +26,7 @@
 <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
 <%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
 
+<div id="about">
 <h1>LightPIT</h1>
 
 <fmt:message key="app.name"/>
@@ -65,3 +66,4 @@
 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+</div>
--- a/src/main/webapp/WEB-INF/jsp/site.jsp	Fri Feb 20 16:30:17 2026 +0100
+++ b/src/main/webapp/WEB-INF/jsp/site.jsp	Sat Feb 21 13:41:41 2026 +0100
@@ -51,9 +51,6 @@
 <%-- Define an alias for the optional redirect location --%>
 <c:set scope="page" var="redirectLocation" value="${requestScope[Constants.REQ_ATTR_REDIRECT_LOCATION]}"/>
 
-<%-- Define an alias for the additional stylesheet --%>
-<c:set scope="page" var="extraCss" value="${requestScope[Constants.REQ_ATTR_STYLESHEET]}"/>
-
 <%-- Define an alias for the optional JS file --%>
 <c:set scope="page" var="javascriptFile" value="${requestScope[Constants.REQ_ATTR_JAVASCRIPT]}"/>
 
@@ -80,11 +77,6 @@
     <c:if test="${not empty requestScope[Constants.REQ_ATTR_VIEWMODEL].feedHref}">
         <link rel="alternate" type="application/rss+xml" title="RSS Feed" href="${requestScope[Constants.REQ_ATTR_VIEWMODEL].feedHref}"/>
     </c:if>
-    <c:if test="${not empty extraCss}">
-        <c:forEach items="${extraCss}" var="cssFile">
-            <link rel="stylesheet" href="${cssFile}?v=${versionSuffix}" type="text/css">
-        </c:forEach>
-    </c:if>
     <script>
         const baseHref='${baseHref}';
         <c:if test="${showWhatsNew}">
--- a/src/main/webapp/about.css	Fri Feb 20 16:30:17 2026 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,29 +0,0 @@
-/*
- * Copyright 2021 Mike Becker. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-h1, h2 {
-    font-variant-caps: small-caps;
-    color: #505050;
-}
\ No newline at end of file
--- a/src/main/webapp/error.css	Fri Feb 20 16:30:17 2026 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,56 +0,0 @@
-/*
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
- * 
- * Copyright 2021 Mike Becker. All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   1. Redistributions of source code must retain the above copyright
- *      notice, this list of conditions and the following disclaimer.
- *
- *   2. Redistributions in binary form must reproduce the above copyright
- *      notice, this list of conditions and the following disclaimer in the
- *      documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- * 
- */
-
-#error-page h1 {
-    font-size: 1.5em;
-}
-
-#error-page table {
-    width: 100%;
-
-    border-top-style: solid;
-    border-top-width: thin;
-    border-top-color: #606060;
-
-    border-bottom-style: solid;
-    border-bottom-width: thin;
-    border-bottom-color: #505050;
-
-    border-collapse: separate;
-    border-spacing: .5em;
-}
-
-#error-page table th {
-    text-align: right;
-    white-space: nowrap;
-}
-
-#error-page table td {
-    width: 100%;
-}
--- a/src/main/webapp/lightpit.css	Fri Feb 20 16:30:17 2026 +0100
+++ b/src/main/webapp/lightpit.css	Sat Feb 21 13:41:41 2026 +0100
@@ -377,3 +377,261 @@
     border-color: darkgray;
     border-width: thin;
 }
+
+#language-choice {
+    display: flex;
+    flex-basis: content;
+    flex-direction: column;
+    align-items: flex-start;
+}
+
+#language-choice input {
+    margin: .5em;
+}
+
+#settings-form button {
+    margin-top: 1.5em;
+}
+
+/* browser language not available */
+span.blNA {
+    margin: .5em;
+    color: red;
+    font-style: italic;
+    font-size: smaller;
+}
+
+#error-page h1 {
+    font-size: 1.5em;
+}
+
+#error-page table {
+    width: 100%;
+
+    border-top-style: solid;
+    border-top-width: thin;
+    border-top-color: #606060;
+
+    border-bottom-style: solid;
+    border-bottom-width: thin;
+    border-bottom-color: #505050;
+
+    border-collapse: separate;
+    border-spacing: .5em;
+}
+
+#error-page table th {
+    text-align: right;
+    white-space: nowrap;
+}
+
+#error-page table td {
+    width: 100%;
+}
+
+#about h1, #about h2 {
+    font-variant-caps: small-caps;
+    color: #505050;
+}
+
+.project-attributes {
+    margin-bottom: 1em;
+}
+
+.project-attributes .row > div + div {
+    padding-left: 2em;
+}
+
+span.phase-2 {
+    text-decoration: line-through;
+}
+
+.issue-progress-bar {
+    box-sizing: border-box;
+    width: 100%;
+    height: 0.5em;
+    display: flex;
+    position: relative;
+    border-style: solid;
+    border-width: thin;
+    border-color: #6060cc;
+}
+
+.issue-progress-bar .open {
+    height: 100%;
+    background: steelblue;
+}
+
+.issue-progress-bar .active {
+    height: 100%;
+    background: gold;
+}
+
+.issue-progress-bar .done {
+    height: 100%;
+    background: green;
+}
+
+.issue-tag, .version-tag, .issue-tag-auto-color {
+    padding: .1em 2ex .1em 2ex;
+    display: inline-block;
+    box-sizing: border-box;
+    border-style: solid;
+    border-width: thin;
+    border-color: silver;
+    border-radius: 4pt;
+    background: darkgray;
+    text-align: center;
+    font-weight: bolder;
+    font-size: x-small;
+}
+
+.issue-tag, .version-tag {
+    color: whitesmoke;
+}
+
+.issue-tag.Bug {
+    background: red;
+}
+
+.issue-tag.Improvement, .issue-tag.Feature {
+    background: limegreen;
+}
+
+.issue-tag.Task {
+    background: deepskyblue;
+}
+
+.issue-tag.Test {
+    background: lightskyblue;
+}
+
+.issue-tag.phase-0 {
+    background: steelblue;
+}
+
+.issue-tag.phase-1 {
+    background: gold;
+    color: black;
+}
+
+.issue-tag.phase-2 {
+    background: green;
+}
+
+div.navmenu-icon {
+    display: inline-block;
+    width: .5em;
+    height: .5em;
+    margin-right: .25em;
+}
+
+.version-Future {
+    background: lightskyblue;
+}
+
+.version-Unreleased {
+    background: gold;
+    color: black;
+}
+
+.version-Released {
+    background: limegreen;
+}
+
+.version-LTS {
+    background: green;
+}
+
+.version-Deprecated {
+    color: lightgray;
+    background: darkgray;
+}
+
+hr.issue-view-separator {
+    border-image-source: linear-gradient(to right, rgba(60, 60, 60, .1), rgba(96, 96, 96, 1), rgba(60, 60, 60, .1));
+    border-image-slice: 1;
+    border-width: thin;
+    border-style: none;
+    border-top-style: solid;
+}
+
+div.comment {
+    padding-left: .25rem;
+    margin-bottom: 1.25em;
+}
+
+.comment-author {
+    color: #3060f8;
+    background: #e7e7ef;
+    margin-left: -.25rem;
+    padding: .25rem;
+}
+
+.comment-author-name {
+    color: inherit;
+}
+
+span.comment-edit-info {
+    margin-left: 1ex;
+    color: #556080;
+}
+
+div.mde-toolbar {
+    margin-bottom: .25em;
+}
+
+div.mde-toolbar button {
+    font-size: small;
+}
+
+div.mde-preview {
+    border-style: solid;
+    border-width: 2px;
+    border-color: silver;
+    padding: .25em;
+    border-radius: 8px;
+}
+
+span.eta-overdue {
+    color: red;
+}
+
+table.issue-view {
+    border-collapse: collapse;
+    margin-bottom: 1em;
+}
+
+table.issue-view td, table.issue-view th {
+    background: #f7f7f7;
+    border: solid silver 1pt;
+    padding: .5em;
+}
+
+table.issue-view th {
+    white-space: nowrap;
+}
+
+.issue-variant-status {
+    display: flex;
+    gap: 1em;
+    flex-wrap: wrap;
+}
+
+.selected-variant {
+    font-weight: bolder;
+    text-decoration: underline;
+}
+
+table.relation-editor input,
+table.relation-editor button,
+table.relation-editor .button {
+    box-sizing: border-box;
+    width: 100%;
+}
+
+table.relation-editor button,
+table.relation-editor .button {
+    text-align: center;
+    padding: .1em .25em .1em .25em;
+}
--- a/src/main/webapp/projects.css	Fri Feb 20 16:30:17 2026 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,230 +0,0 @@
-/*
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
- *
- * Copyright 2021 Mike Becker. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   1. Redistributions of source code must retain the above copyright
- *      notice, this list of conditions and the following disclaimer.
- *
- *   2. Redistributions in binary form must reproduce the above copyright
- *      notice, this list of conditions and the following disclaimer in the
- *      documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- */
-
-.project-attributes {
-    margin-bottom: 1em;
-}
-
-.project-attributes .row > div + div {
-    padding-left: 2em;
-}
-
-span.phase-2 {
-    text-decoration: line-through;
-}
-
-.issue-progress-bar {
-    box-sizing: border-box;
-    width: 100%;
-    height: 0.5em;
-    display: flex;
-    position: relative;
-    border-style: solid;
-    border-width: thin;
-    border-color: #6060cc;
-}
-
-.issue-progress-bar .open {
-    height: 100%;
-    background: steelblue;
-}
-
-.issue-progress-bar .active {
-    height: 100%;
-    background: gold;
-}
-
-.issue-progress-bar .done {
-    height: 100%;
-    background: green;
-}
-
-.issue-tag, .version-tag, .issue-tag-auto-color {
-    padding: .1em 2ex .1em 2ex;
-    display: inline-block;
-    box-sizing: border-box;
-    border-style: solid;
-    border-width: thin;
-    border-color: silver;
-    border-radius: 4pt;
-    background: darkgray;
-    text-align: center;
-    font-weight: bolder;
-    font-size: x-small;
-}
-
-.issue-tag, .version-tag {
-    color: whitesmoke;
-}
-
-.issue-tag.Bug {
-    background: red;
-}
-
-.issue-tag.Improvement, .issue-tag.Feature {
-    background: limegreen;
-}
-
-.issue-tag.Task {
-    background: deepskyblue;
-}
-
-.issue-tag.Test {
-    background: lightskyblue;
-}
-
-.issue-tag.phase-0 {
-    background: steelblue;
-}
-
-.issue-tag.phase-1 {
-    background: gold;
-    color: black;
-}
-
-.issue-tag.phase-2 {
-    background: green;
-}
-
-div.navmenu-icon {
-    display: inline-block;
-    width: .5em;
-    height: .5em;
-    margin-right: .25em;
-}
-
-.version-Future {
-    background: lightskyblue;
-}
-
-.version-Unreleased {
-    background: gold;
-    color: black;
-}
-
-.version-Released {
-    background: limegreen;
-}
-
-.version-LTS {
-    background: green;
-}
-
-.version-Deprecated {
-    color: lightgray;
-    background: darkgray;
-}
-
-hr.issue-view-separator {
-    border-image-source: linear-gradient(to right, rgba(60, 60, 60, .1), rgba(96, 96, 96, 1), rgba(60, 60, 60, .1));
-    border-image-slice: 1;
-    border-width: thin;
-    border-style: none;
-    border-top-style: solid;
-}
-
-div.comment {
-    padding-left: .25rem;
-    margin-bottom: 1.25em;
-}
-
-.comment-author {
-    color: #3060f8;
-    background: #e7e7ef;
-    margin-left: -.25rem;
-    padding: .25rem;
-}
-
-.comment-author-name {
-    color: inherit;
-}
-
-span.comment-edit-info {
-    margin-left: 1ex;
-    color: #556080;
-}
-
-div.mde-toolbar {
-    margin-bottom: .25em;
-}
-
-div.mde-toolbar button {
-    font-size: small;
-}
-
-div.mde-preview {
-    border-style: solid;
-    border-width: 2px;
-    border-color: silver;
-    padding: .25em;
-    border-radius: 8px;
-}
-
-span.eta-overdue {
-    color: red;
-}
-
-table.issue-view {
-    border-collapse: collapse;
-    margin-bottom: 1em;
-}
-
-table.issue-view td, table.issue-view th {
-    background: #f7f7f7;
-    border: solid silver 1pt;
-    padding: .5em;
-}
-
-table.issue-view th {
-    white-space: nowrap;
-}
-
-.issue-variant-status {
-    display: flex;
-    gap: 1em;
-    flex-wrap: wrap;
-}
-
-.selected-variant {
-    font-weight: bolder;
-    text-decoration: underline;
-}
-
-table.relation-editor input,
-table.relation-editor button,
-table.relation-editor .button {
-    box-sizing: border-box;
-    width: 100%;
-}
-
-table.relation-editor button,
-table.relation-editor .button {
-    text-align: center;
-    padding: .1em .25em .1em .25em;
-}
--- a/src/main/webapp/settings.css	Fri Feb 20 16:30:17 2026 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,51 +0,0 @@
-/*
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
- * 
- * Copyright 2021 Mike Becker. All rights reserved.
- * 
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *   1. Redistributions of source code must retain the above copyright
- *      notice, this list of conditions and the following disclaimer.
- *
- *   2. Redistributions in binary form must reproduce the above copyright
- *      notice, this list of conditions and the following disclaimer in the
- *      documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- * 
- */
-
-#language-choice {
-    display: flex;
-    flex-basis: content;
-    flex-direction: column;
-    align-items: flex-start;
-}
-
-#language-choice input {
-    margin: .5em;
-}
-
-#settings-form button {
-    margin-top: 1.5em;
-}
-
-/* browser language not available */
-span.blNA {
-    margin: .5em;
-    color: red;
-    font-style: italic;
-    font-size: smaller;
-}

mercurial