Add Eternity classica and larry projects

This commit is contained in:
2026-09-19 14:26:37 +03:00
parent b8fce3cacb
commit 5ac55a5cb3
13 changed files with 523 additions and 0 deletions
+34
View File
@@ -62,6 +62,28 @@ Install it with the same procedure above, copying `eternity-wasteland-v2` and co
$config['skin'] = 'eternity-wasteland-v2';
```
## Eternity Larry And Classic
`eternity-larry` and `eternity-classic` apply the Eternity paper, ink, acid-green, and orange visual system to Roundcube's legacy Larry and Classic interfaces. They retain the original legacy layouts and require their corresponding base skins to be installed.
Install the required base package from the Roundcube application directory before copying the child skin:
```sh
composer require "roundcube/larry:~1.6.0"
# or
composer require "roundcube/classic:~1.6.0"
```
Then copy the selected Eternity child directory into `skins` and configure one of the following:
```php
$config['skin'] = 'eternity-larry';
// or
$config['skin'] = 'eternity-classic';
```
Both variants use their own Eternity Project logo and browser icon. They are intended for Roundcube 1.6 installations where the matching legacy base skin is available.
## Docker Install
### Docker Compose (persistent)
@@ -168,6 +190,18 @@ eternity-wasteland-v2/
styles/styles.css Source-theme Daylight and Wasteland visual overrides
templates/login.html Login form with the Daylight/Wasteland control
watermark.html Login background that follows ep-theme
eternity-larry/
images/ Eternity Project logo and browser icon
meta.json Larry child-skin registration
styles.css Larry import and Eternity legacy UI overrides
eternity-classic/
images/ Eternity Project logo and browser icon
common.css Classic common UI import and Eternity overrides
includes/links.html Classic shared asset links and browser icon
mail.css Classic mail stylesheet import
meta.json Classic child-skin registration
templates/login.html Classic login template with the child stylesheet
styles.css Compatibility entry point for manual stylesheet loading
```
`styles/styles.css` imports Elastic before applying Eternity's overrides. Do not remove the import: the base skin provides the complete component layout and image assets.
+126
View File
@@ -0,0 +1,126 @@
@import "../classic/common.css";
:root {
--ink: #11212b;
--paper: #f1f1e9;
--acid: #c7ef4b;
--orange: #ff6b35;
--line: #b9c5bc;
--muted: #59706b;
--field: #fbfbf6;
}
html,
body,
#mainscreen,
#layout,
#main-menu,
#taskbar,
#mailboxlist,
#messagelist,
#messageframe {
background: var(--paper);
color: var(--ink);
}
body {
font-family: "Space Grotesk", "Helvetica Neue", sans-serif;
background-image: linear-gradient(90deg, transparent 49.5%, rgb(17 33 43 / 5%) 50%, transparent 50.5%), linear-gradient(rgb(17 33 43 / 4%) 1px, transparent 1px);
background-size: 70px 70px, 7px 7px;
}
a,
#taskbar a,
#mailboxlist li a,
#messagelist tr td {
color: var(--ink);
}
a:hover,
#taskbar a:hover,
#mailboxlist li a:hover {
color: var(--orange);
}
#taskbar,
#mailboxlist,
#messagelist,
#messagelist-header,
#mailboxlist-header,
.box,
.boxcontent,
.popupmenu,
.menu,
.toolbar {
border-color: var(--ink);
box-shadow: none;
}
#taskbar a.selected,
#taskbar a:hover,
#mailboxlist li.selected > a,
#mailboxlist li a:hover,
#messagelist tr:hover td {
background: var(--acid);
color: var(--ink);
}
#messagelist tr.selected td {
background: var(--ink);
color: var(--paper);
}
input[type="text"],
input[type="password"],
textarea,
select {
border: 1px solid var(--ink);
border-radius: 0;
box-shadow: none;
background: var(--field);
color: var(--ink);
}
input:focus,
textarea:focus,
select:focus {
outline: 3px solid var(--acid);
outline-offset: 1px;
}
input[type="submit"],
input[type="button"],
button,
.button,
.toolbar .button {
border: 1px solid var(--ink);
border-radius: 0;
box-shadow: none;
background: var(--ink);
color: var(--paper);
font-family: "DM Mono", "Courier New", monospace;
}
input[type="submit"]:hover,
input[type="button"]:hover,
button:hover,
.button:hover,
.toolbar .button:hover {
background: var(--acid);
color: var(--ink);
}
#login-form,
#login-form .boxcontent,
#login-form .boxtitle {
border-color: var(--ink);
border-radius: 0;
box-shadow: none;
background: var(--paper);
color: var(--ink);
}
#login-form #logo {
max-width: 260px;
height: auto;
}
+9
View File
@@ -0,0 +1,9 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" role="img" aria-label="Eternity Project">
<rect width="64" height="64" fill="#11212b"/>
<circle cx="32" cy="32" r="22" fill="none" stroke="#f1f1e9" stroke-width="3"/>
<circle cx="22" cy="22" r="4" fill="#ff6b35"/>
<circle cx="41" cy="28" r="2.5" fill="#f1f1e9"/>
<circle cx="27" cy="43" r="3" fill="#ff6b35"/>
<line x1="22" y1="22" x2="41" y2="28" stroke="#f1f1e9" stroke-width="1.5"/>
<line x1="22" y1="22" x2="27" y2="43" stroke="#f1f1e9" stroke-width="1.5"/>
</svg>

After

Width:  |  Height:  |  Size: 542 B

+10
View File
@@ -0,0 +1,10 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 300 60" role="img" aria-label="Eternity Project">
<circle cx="30" cy="30" r="22" fill="none" stroke="#11212b" stroke-width="2"/>
<circle cx="21" cy="21" r="3" fill="#ff6b35"/>
<circle cx="38" cy="26" r="2" fill="#11212b"/>
<circle cx="26" cy="40" r="2.5" fill="#ff6b35"/>
<line x1="21" y1="21" x2="38" y2="26" stroke="#11212b" stroke-width="1"/>
<line x1="21" y1="21" x2="26" y2="40" stroke="#11212b" stroke-width="1"/>
<text x="66" y="30" font-family="'Space Grotesk','Helvetica Neue',sans-serif" font-size="24" font-weight="700" letter-spacing="1" fill="#11212b">ETERNITY</text>
<text x="67" y="46" font-family="'DM Mono','Courier New',monospace" font-size="11" letter-spacing="2" fill="#59706b">PROJECT / FI</text>
</svg>

After

Width:  |  Height:  |  Size: 793 B

+12
View File
@@ -0,0 +1,12 @@
<link rel="index" href="$__comm_path" />
<roundcube:object name="meta" />
<roundcube:object name="links" />
<link rel="icon" type="image/svg+xml" href="/images/favicon.svg" />
<link rel="shortcut icon" type="image/svg+xml" href="/images/favicon.svg" />
<link rel="stylesheet" type="text/css" href="/common.css" />
<roundcube:if condition="in_array(env:task, array('mail', 'addressbook', 'settings'))" />
<link rel="stylesheet" type="text/css" href="/<roundcube:var name="env:task" />.css" />
<roundcube:endif />
<roundcube:if condition="browser:safari" />
<link rel="stylesheet" type="text/css" href="/safari.css" />
<roundcube:endif />
+1
View File
@@ -0,0 +1 @@
@import "../classic/mail.css";
+13
View File
@@ -0,0 +1,13 @@
{
"name": "Eternity Classic",
"author": "Eternity Project",
"license": "GNU Affero General Public License",
"version": "1.0.0",
"extends": "classic",
"localization": false,
"config": {
"product_name": "eternityproject.fi",
"skin_logo": "skins/eternity-classic/images/logo.svg",
"skin_favicon": "skins/eternity-classic/images/favicon.svg"
}
}
+126
View File
@@ -0,0 +1,126 @@
@import "common.css";
:root {
--ink: #11212b;
--paper: #f1f1e9;
--acid: #c7ef4b;
--orange: #ff6b35;
--line: #b9c5bc;
--muted: #59706b;
--field: #fbfbf6;
}
html,
body,
#mainscreen,
#layout,
#main-menu,
#taskbar,
#mailboxlist,
#messagelist,
#messageframe {
background: var(--paper);
color: var(--ink);
}
body {
font-family: "Space Grotesk", "Helvetica Neue", sans-serif;
background-image: linear-gradient(90deg, transparent 49.5%, rgb(17 33 43 / 5%) 50%, transparent 50.5%), linear-gradient(rgb(17 33 43 / 4%) 1px, transparent 1px);
background-size: 70px 70px, 7px 7px;
}
a,
#taskbar a,
#mailboxlist li a,
#messagelist tr td {
color: var(--ink);
}
a:hover,
#taskbar a:hover,
#mailboxlist li a:hover {
color: var(--orange);
}
#taskbar,
#mailboxlist,
#messagelist,
#messagelist-header,
#mailboxlist-header,
.box,
.boxcontent,
.popupmenu,
.menu,
.toolbar {
border-color: var(--ink);
box-shadow: none;
}
#taskbar a.selected,
#taskbar a:hover,
#mailboxlist li.selected > a,
#mailboxlist li a:hover,
#messagelist tr:hover td {
background: var(--acid);
color: var(--ink);
}
#messagelist tr.selected td {
background: var(--ink);
color: var(--paper);
}
input[type="text"],
input[type="password"],
textarea,
select {
border: 1px solid var(--ink);
border-radius: 0;
box-shadow: none;
background: var(--field);
color: var(--ink);
}
input:focus,
textarea:focus,
select:focus {
outline: 3px solid var(--acid);
outline-offset: 1px;
}
input[type="submit"],
input[type="button"],
button,
.button,
.toolbar .button {
border: 1px solid var(--ink);
border-radius: 0;
box-shadow: none;
background: var(--ink);
color: var(--paper);
font-family: "DM Mono", "Courier New", monospace;
}
input[type="submit"]:hover,
input[type="button"]:hover,
button:hover,
.button:hover,
.toolbar .button:hover {
background: var(--acid);
color: var(--ink);
}
#login-form,
#login-form .boxcontent,
#login-form .boxtitle {
border-color: var(--ink);
border-radius: 0;
box-shadow: none;
background: var(--paper);
color: var(--ink);
}
#login-form #logo {
max-width: 260px;
height: auto;
}
+35
View File
@@ -0,0 +1,35 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<link rel="stylesheet" type="text/css" href="/common.css" />
</head>
<body>
<roundcube:object name="logo" src="/images/logo.svg" id="logo" border="0" style="margin:0 11px" />
<roundcube:object name="message" id="message" />
<div id="login-form">
<div class="boxtitle"><roundcube:label name="welcome" /></div>
<div class="boxcontent">
<roundcube:form name="form" method="post">
<roundcube:object name="loginform" form="form" submit=true />
</form>
</div>
</div>
<noscript>
<p id="login-noscriptwarning"><roundcube:label name="noscriptwarning" /></p>
</noscript>
<div id="login-bottomline">
<roundcube:var name="config:product_name" condition="config:display_product_info &gt; 0" />
<roundcube:object name="version" condition="config:display_product_info == 2" />
<roundcube:if condition="config:support_url" />
&nbsp;&#9679;&nbsp; <a href="<roundcube:var name='config:support_url' />" target="_blank" class="support-link"><roundcube:label name="support" /></a>
<roundcube:endif />
<roundcube:container name="loginfooter" id="bottomline" />
</div>
</body>
</html>
+9
View File
@@ -0,0 +1,9 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" role="img" aria-label="Eternity Project">
<rect width="64" height="64" fill="#11212b"/>
<circle cx="32" cy="32" r="22" fill="none" stroke="#f1f1e9" stroke-width="3"/>
<circle cx="22" cy="22" r="4" fill="#ff6b35"/>
<circle cx="41" cy="28" r="2.5" fill="#f1f1e9"/>
<circle cx="27" cy="43" r="3" fill="#ff6b35"/>
<line x1="22" y1="22" x2="41" y2="28" stroke="#f1f1e9" stroke-width="1.5"/>
<line x1="22" y1="22" x2="27" y2="43" stroke="#f1f1e9" stroke-width="1.5"/>
</svg>

After

Width:  |  Height:  |  Size: 542 B

+10
View File
@@ -0,0 +1,10 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 300 60" role="img" aria-label="Eternity Project">
<circle cx="30" cy="30" r="22" fill="none" stroke="#11212b" stroke-width="2"/>
<circle cx="21" cy="21" r="3" fill="#ff6b35"/>
<circle cx="38" cy="26" r="2" fill="#11212b"/>
<circle cx="26" cy="40" r="2.5" fill="#ff6b35"/>
<line x1="21" y1="21" x2="38" y2="26" stroke="#11212b" stroke-width="1"/>
<line x1="21" y1="21" x2="26" y2="40" stroke="#11212b" stroke-width="1"/>
<text x="66" y="30" font-family="'Space Grotesk','Helvetica Neue',sans-serif" font-size="24" font-weight="700" letter-spacing="1" fill="#11212b">ETERNITY</text>
<text x="67" y="46" font-family="'DM Mono','Courier New',monospace" font-size="11" letter-spacing="2" fill="#59706b">PROJECT / FI</text>
</svg>

After

Width:  |  Height:  |  Size: 793 B

+13
View File
@@ -0,0 +1,13 @@
{
"name": "Eternity Larry",
"author": "Eternity Project",
"license": "GNU Affero General Public License",
"version": "1.0.0",
"extends": "larry",
"localization": false,
"config": {
"product_name": "eternityproject.fi",
"skin_logo": "skins/eternity-larry/images/logo.svg",
"skin_favicon": "skins/eternity-larry/images/favicon.svg"
}
}
+125
View File
@@ -0,0 +1,125 @@
@import "../larry/styles.css";
:root {
--ink: #11212b;
--paper: #f1f1e9;
--acid: #c7ef4b;
--orange: #ff6b35;
--line: #b9c5bc;
--muted: #59706b;
--field: #fbfbf6;
}
html,
body,
#mainscreen,
#layout,
#main-menu,
#taskbar,
#mailboxlist,
#messagelist,
#messageframe {
background: var(--paper);
color: var(--ink);
}
body {
font-family: "Space Grotesk", "Helvetica Neue", sans-serif;
background-image: linear-gradient(90deg, transparent 49.5%, rgb(17 33 43 / 5%) 50%, transparent 50.5%), linear-gradient(rgb(17 33 43 / 4%) 1px, transparent 1px);
background-size: 70px 70px, 7px 7px;
}
a,
#taskbar a,
#mailboxlist li a,
#messagelist tr td {
color: var(--ink);
}
a:hover,
#taskbar a:hover,
#mailboxlist li a:hover {
color: var(--orange);
}
#taskbar,
#mailboxlist,
#messagelist,
#messagelist-header,
#mailboxlist-header,
.box,
.boxcontent,
.popupmenu,
.menu,
.toolbar {
border-color: var(--ink);
box-shadow: none;
}
#taskbar a.selected,
#taskbar a:hover,
#mailboxlist li.selected > a,
#mailboxlist li a:hover,
#messagelist tr:hover td {
background: var(--acid);
color: var(--ink);
}
#messagelist tr.selected td {
background: var(--ink);
color: var(--paper);
}
input[type="text"],
input[type="password"],
textarea,
select {
border: 1px solid var(--ink);
border-radius: 0;
box-shadow: none;
background: var(--field);
color: var(--ink);
}
input:focus,
textarea:focus,
select:focus {
outline: 3px solid var(--acid);
outline-offset: 1px;
}
input[type="submit"],
input[type="button"],
button,
.button,
.toolbar .button {
border: 1px solid var(--ink);
border-radius: 0;
box-shadow: none;
background: var(--ink);
color: var(--paper);
font-family: "DM Mono", "Courier New", monospace;
}
input[type="submit"]:hover,
input[type="button"]:hover,
button:hover,
.button:hover,
.toolbar .button:hover {
background: var(--acid);
color: var(--ink);
}
#login-form,
#login-form .box-inner,
#login-form .boxcontent {
border-color: var(--ink);
border-radius: 0;
box-shadow: none;
background: var(--paper);
}
#login-form #logo {
max-width: 260px;
height: auto;
}