Cleaned up default website css. Renamed app.css to website.css'

This commit is contained in:
Griatch 2021-05-23 00:18:27 +02:00
parent b1b26bf489
commit 07f994ce91
15 changed files with 257 additions and 997 deletions

View file

@ -77,15 +77,15 @@ class AccountChangeForm(UserChangeForm):
required=False,
)
# is_superuser = forms.BooleanField(
# label = "Superuser status",
# required=False,
# help_text="Superusers bypass all in-game locks and has all "
# "permissions without explicitly assigning them. Usually "
# "only one superuser (user #1) is needed, new superusers "
# "can be created by setting the `is_superuser` flag in code "
# "or by the `evennia createsuperuser` CLI command."
# )
is_superuser = forms.BooleanField(
label = "Superuser status",
required=False,
help_text="Superusers bypass all in-game locks and has all "
"permissions without explicitly assigning them. Usually "
"only one superuser (user #1) is needed and only a superuser "
"can create another superuser.<BR>"
"Only Superusers can change the user/group permissions below."
)
def clean_username(self):
"""
@ -312,7 +312,17 @@ class AccountAdmin(BaseUserAdmin):
help_texts["puppeted_objects"] = self.puppeted_objects.help_text
kwargs["help_texts"] = help_texts
return super().get_form(request, obj, **kwargs)
# security disabling for non-superusers
form = super().get_form(request, obj, **kwargs)
disabled_fields = set()
if not request.user.is_superuser:
disabled_fields |= {
'is_superuser', 'user_permissions', 'user_groups'
}
for field_name in disabled_fields:
if field_name in form.base_fields:
form.base_fields[field_name].disabled = True
return form
@sensitive_post_parameters_m
def user_change_password(self, request, id, form_url=""):

View file

@ -1,225 +0,0 @@
/**************************************
* TITLE: Prosimii Print Stylesheet *
* URI : prosimii/prosimii-print.css *
* MODIF: 2003-Apr-30 19:15 +0800 *
**************************************/
/* ##### Common Styles ##### */
body {
color: black;
background-color: white;
font-family: "times new roman", times, roman, serif;
font-size: 12pt;
margin: 0;
padding: 0;
}
acronym, .titleTip {
font-style: italic;
border-bottom: none;
}
acronym:after, .titleTip:after { /* Prints titles after the acronyms/titletips. Doesn't work in MSIE */
content: "(" attr(title) ")";
font-size: 90%;
font-style: normal;
padding-left: 1ex;
}
a {
color: black;
background-color: transparent;
text-decoration: none;
}
a[href]:after { /* Prints the links' URIs after the links' texts. Doesn't work in MSIE */
content: "<" attr(href) ">";
font-size: 90%;
padding-left: 1ex;
}
ol {
margin: -0.25em 0 1em 0;
padding: 0;
}
ul {
list-style-type: square;
margin: -0.25em 0 1em 0;
padding: 0;
}
dl {
margin: 0 0 1em 0;
padding: 0;
}
ul li {
margin: 1ex 0 0 1.5em;
padding: 0;
}
ol li {
margin: 1ex 0 0 1.5em;
padding: 0;
}
dt {
font-weight: bold;
margin: 0;
padding: 0;
}
dd {
margin: 0 0 0 1.5em;
padding: 0;
}
.doNotPrint {
display: none;
}
/* ##### Header ##### */
#header {
}
.superHeader {
display: none;
}
.midHeader {
color: black;
background-color: transparent;
margin: 0;
padding: 0;
border-bottom: 1px solid black;
}
.headerTitle {
font-family: "trebuchet ms", verdana, helvetica, arial, sans-serif;
font-size: 200%;
font-weight: normal;
margin: 0;
padding: 0;
}
.headerSubTitle {
font-family: "trebuchet ms", verdana, helvetica, arial, sans-serif;
font-size: 110%;
font-weight: normal;
font-style: italic;
margin: 0;
padding: 0 0 1ex 0;
}
.headerLinks {
display: none;
}
.subHeader {
display: none;
}
/* ##### Side Menu ##### */
#side-bar {
display: none !important;
}
/* ##### Main Copy ##### */
#main-copy {
text-align: justify;
margin: 0 !important;
padding: 0;
}
#main-copy h1 {
font-family: "trebuchet ms", verdana, helvetica, arial, sans-serif;
font-size: 120%;
margin: 2ex 0 1ex 0;
padding: 0;
}
#main-copy h2 {
font-family: "trebuchet ms", verdana, helvetica, arial, sans-serif;
font-weight: normal;
font-size: 100%;
margin: 0;
padding: 2ex 0 0.5ex 0;
}
#main-copy h1 + h2 {
padding-top: 0;
}
#main-copy p {
margin: 0 0 2ex 0;
padding: 0;
}
h2 a:after {
content: "" !important;
}
.newsDate {
font-style: italic;
margin: 0;
padding: 0;
display: inline;
}
.newsDate:before { /* Prints an '[' before the news item's date. Doesn't work in MSIE */
content: "[";
font-style: normal;
}
.newsDate:after { /* Prints a ']' after the news item's date. Doesn't work in MSIE */
content: "]";
font-style: normal;
}
.newsSummary {
display: inline;
margin: 0 0 0 1ex !important;
padding: 0;
}
.more {
display: none;
}
.smallCaps {
font-variant: small-caps;
}
.quarter, .oneThird, .half, .twoThirds, .fullWidth {
margin: 0;
padding: 0;
}
/* ##### Footer ##### */
#footer {
color: black;
background-color: transparent;
font-size: 100%;
text-align: center;
margin: 2em 0 0 0;
padding: 1ex 0 0 0;
border-top: 1px solid black;
display: block;
}
#footer a {
color: black;
background-color: transparent;
text-decoration: none;
}

View file

@ -1,342 +0,0 @@
/*************************************************
* TITLE: Prosimii Alternative Screen Stylesheet *
* URI : prosimii/prosimii-screen-alt.css *
* MODIF: 2004-Apr-28 21:56 +0800 *
*************************************************/
/* ##### Common Styles ##### */
body {
font-family: verdana, helvetica, arial, sans-serif;
font-size: 73%; /* Enables font size scaling in MSIE */
margin: 0;
padding: 0;
}
html > body {
font-size: 9pt;
}
acronym, .titleTip {
border-bottom: 1px dotted rgb(61,92,122);
cursor: help;
margin: 0;
padding: 0 0 0.4px 0;
}
a {
color: rgb(61,92,122);
background-color: transparent;
text-decoration: underline;
margin: 0;
padding: 0 1px 2px 1px;
}
a:hover {
color: rgb(117,144,174);
text-decoration: none;
}
ol {
margin: 1em 0 1.5em 0;
padding: 0;
}
ul {
list-style-type: square;
margin: 1em 0 1.5em 0;
padding: 0;
}
dl {
margin: 1em 0 0.5em 0;
padding: 0;
}
ul li {
line-height: 1.5em;
margin: 1.25ex 0 0 1.5em;
padding: 0;
}
ol li {
line-height: 1.5em;
margin: 1.25ex 0 0 2em;
padding: 0;
}
dt {
font-weight: bold;
margin: 0;
padding: 0 0 1ex 0;
}
dd {
line-height: 1.75em;
margin: 0 0 1.5em 1.5em;
padding: 0;
}
.doNotDisplay {
display: none !important;
}
.smallCaps {
font-size: 117%;
font-variant: small-caps;
}
/* ##### Header ##### */
.superHeader {
color: rgb(130,128,154);
background-color: rgb(33,50,66);
text-align: right;
margin: 0;
padding: 0.5ex 10px;
}
.superHeader span {
color: rgb(195,196,210);
background-color: transparent;
font-weight: bold;
text-transform: uppercase;
}
.superHeader a {
color: rgb(195,196,210);
background-color: transparent;
text-decoration: none;
margin: 0;
padding: 0 0.25ex 0 0;
}
.superHeader a:hover {
color: rgb(193,102,90);
background-color: transparent;
text-decoration: none;
}
.midHeader {
color: white;
background-color: rgb(61,92,122);
margin: 0;
padding: 0.26ex 10px;
}
.headerTitle {
font-size: 300%;
margin: 0;
padding: 0;
}
.headerSubTitle {
font-size: 151%;
font-weight: normal;
font-style: italic;
margin: 0 0 1ex 0;
padding: 0;
}
.headerLinks {
text-align: right;
margin: 0;
padding: 0 0 2ex 0;
position: absolute;
right: 1.5em;
top: 3.5em;
}
.headerLinks a {
color: white;
background-color: transparent;
text-decoration: none;
margin: 0;
padding: 0 0 0.5ex 0;
display: block;
}
.headerLinks a:hover {
color: rgb(195,196,210);
background-color: transparent;
text-decoration: underline;
}
.subHeader {
color: white;
background-color: rgb(117,144,174);
margin: 0;
padding: 0.5ex 10px;
}
.subHeader a, .subHeader .highlight {
color: white;
background-color: transparent;
font-size: 110%;
font-weight: bold;
text-decoration: none;
margin: 0;
padding: 0 0.25ex 0 0;
}
.subHeader a:hover, .subHeader .highlight {
color: rgb(255,204,0);
background-color: transparent;
text-decoration: none;
}
/* ##### Side Menu ##### */
#side-bar {
color: rgb(204,204,204);
background-color: transparent;
list-style-type: square;
list-style-position: inside;
width: 10em;
margin: 0;
padding: 1ex 0;
border: 1px solid rgb(204,204,204);
position: absolute;
left: 1.5ex;
top: 12em;
}
[id="side-bar"] {
position: fixed !important; /* Makes the side menu scroll with the page. Doesn't work in MSIE */
}
#side-bar a {
text-decoration: none;
}
#side-bar:hover {
color: rgb(117,144,174);
background-color: transparent;
border-color: rgb(117,144,174);
}
#side-bar li {
margin: 0;
padding: 0.75ex 0 1ex 1.75ex;
}
#side-bar li:hover {
color: rgb(61,92,122);
background-color: transparent;
}
#side-bar li a:hover {
text-decoration: underline;
}
/* ##### Main Copy ##### */
#main-copy {
text-align: justify;
margin: -0.5ex 1em 1em 12.5em;
padding: 0.5em 10px;
clear: left;
}
#main-copy h1 {
color: rgb(117,144,174);
background-color: transparent;
font-family: "trebuchet ms", verdana, helvetica, arial, sans-serif;
font-size: 186%;
margin: 0;
padding: 1.5ex 0 0 0;
}
#main-copy h2 {
color: rgb(61,92,122);
background-color: transparent;
font-family: "trebuchet ms", verdana, helvetica, arial, sans-serif;
font-weight: normal;
font-size: 151%;
margin: 0;
padding: 1ex 0 0 0;
}
#main-copy p {
line-height: 1.75em;
margin: 1em 0 1.5em 0;
padding: 0;
}
.newsHeading {
color: rgb(61,92,122);
background-color: transparent;
font-family: "trebuchet ms", verdana, helvetica, arial, sans-serif;
font-size: 145%;
text-decoration: none;
margin: 0;
padding: 1ex 0 0 0;
display: block;
}
.newsHeading:hover {
color: rgb(117,144,174);
background-color: transparent;
text-decoration: underline;
}
.newsDate {
font-style: italic;
margin: 0 !important;
padding: 0;
}
.newsSummary {
margin: 1.5ex 0 2.5ex 0.75ex !important;
padding: 0;
}
.more {
text-align: right;
margin: 0;
padding: 0.5em 0;
}
.more a {
color: rgb(61,92,122);
background-color: transparent;
font-size: 92%;
text-decoration: underline;
margin: 0;
padding: 0.25ex 0.75ex;
}
.more a:hover {
color: rgb(117,144,174);
text-decoration: none;
}
/* ##### Footer ##### */
#footer {
color: rgb(51,51,102);
background-color: rgb(239,239,239);
font-size: 87%;
text-align: center;
line-height: 1.25em;
margin: 2em 0 0 0;
padding: 1ex 10px;
clear: left;
}
#footer a {
color: rgb(0,68,204);
background-color: transparent;
text-decoration: underline;
}
#footer a:hover {
text-decoration: none;
}

View file

@ -1,359 +0,0 @@
/***************************************
* TITLE: Prosimii Screen Stylesheet *
* URI : prosimii/prosimii-screen.css *
* MODIF: 2004-Apr-28 21:43 +0800 *
***************************************/
/* ##### Common Styles ##### */
body {
font-family: verdana, helvetica, arial, sans-serif;
font-size: 73%; /* Enables font size scaling in MSIE */
margin: 0;
padding: 0;
}
html > body {
font-size: 9pt;
}
acronym, .titleTip {
border-bottom: 1px dotted rgb(61,92,122);
cursor: help;
margin: 0;
padding: 0 0 0.4px 0;
}
a {
color: rgb(61,92,122);
background-color: transparent;
text-decoration: underline;
margin: 0;
padding: 0 1px 2px 1px;
}
a:hover {
color: rgb(117,144,174);
text-decoration: none;
}
ol {
margin: 1em 0 1.5em 0;
padding: 0;
}
ul {
list-style-type: square;
margin: 1em 0 1.5em 0;
padding: 0;
}
dl {
margin: 1em 0 0.5em 0;
padding: 0;
}
ul li {
line-height: 1.5em;
margin: 1.25ex 0 0 1.5em;
padding: 0;
}
ol li {
line-height: 1.5em;
margin: 1.25ex 0 0 2em;
padding: 0;
}
dt {
font-weight: bold;
margin: 0;
padding: 0 0 1ex 0;
}
dd {
line-height: 1.75em;
margin: 0 0 1.5em 1.5em;
padding: 0;
}
.doNotDisplay {
display: none !important;
}
.smallCaps {
font-size: 117%;
font-variant: small-caps;
}
/* ##### Header ##### */
.superHeader {
color: rgb(130,128,154);
background-color: rgb(33,50,66);
text-align: right;
margin: 0;
padding: 0.5ex 10px;
}
.superHeader span {
color: rgb(195,196,210);
background-color: transparent;
font-weight: bold;
text-transform: uppercase;
}
.superHeader a {
color: rgb(195,196,210);
background-color: transparent;
text-decoration: none;
margin: 0;
padding: 0 0.25ex 0 0;
}
.superHeader a:hover {
color: rgb(193,102,90);
background-color: transparent;
text-decoration: none;
}
.midHeader {
color: white;
background-color: rgb(61,92,122);
margin: 0;
padding: 0.26ex 10px;
}
.headerTitle {
font-size: 300%;
margin: 0;
padding: 0;
}
.headerSubTitle {
font-size: 151%;
font-weight: normal;
font-style: italic;
margin: 0 0 1ex 0;
padding: 0;
}
.headerLinks {
text-align: right;
margin: 0;
padding: 0 0 2ex 0;
position: absolute;
right: 1.5em;
top: 3.5em;
}
.headerLinks a {
color: white;
background-color: transparent;
text-decoration: none;
margin: 0;
padding: 0 0 0.5ex 0;
display: block;
}
.headerLinks a:hover {
color: rgb(195,196,210);
background-color: transparent;
text-decoration: underline;
}
.subHeader {
color: white;
background-color: rgb(117,144,174);
margin: 0;
padding: 0.5ex 10px;
}
.subHeader a, .subHeader .highlight {
color: white;
background-color: transparent;
font-size: 110%;
font-weight: bold;
text-decoration: none;
margin: 0;
padding: 0 0.25ex 0 0;
}
.subHeader a:hover, .subHeader .highlight {
color: rgb(255,204,0);
background-color: transparent;
text-decoration: none;
}
/* ##### Main Copy ##### */
#main-copy {
margin: 0;
padding: 0.5em 10px;
clear: left;
}
#main-copy h1 {
color: rgb(117,144,174);
background-color: transparent;
font-family: "trebuchet ms", verdana, helvetica, arial, sans-serif;
font-size: 200%;
margin: 0;
padding: 0;
}
#main-copy h2 {
color: rgb(61,92,122);
background-color: transparent;
font-family: "trebuchet ms", verdana, helvetica, arial, sans-serif;
font-weight: normal;
font-size: 151%;
margin: 0;
padding: 1ex 0 0 0;
}
#main-copy p {
line-height: 1.75em;
margin: 1em 0 1.5em 0;
padding: 0;
}
.newsHeading {
color: rgb(61,92,122);
background-color: transparent;
font-family: "trebuchet ms", verdana, helvetica, arial, sans-serif;
font-size: 145%;
text-decoration: none;
margin: 0;
padding: 1ex 0 0 0;
display: block;
}
.newsHeading:hover {
color: rgb(117,144,174);
background-color: transparent;
text-decoration: underline;
}
.newsDate {
font-style: italic;
margin: 0 !important;
padding: 0;
}
.newsSummary {
margin: 1.5ex 0 2.5ex 0.75ex !important;
padding: 0;
}
.more {
text-align: right;
margin: 0;
padding: 0.5em 0;
}
.more a {
color: rgb(61,92,122);
background-color: transparent;
font-size: 92%;
text-decoration: underline;
margin: 0;
padding: 0.25ex 0.75ex;
}
.more a:hover {
color: rgb(117,144,174);
text-decoration: none;
}
.rowOfBoxes {
clear: both;
}
.quarter, .oneThird, .half, .twoThirds, .fullWidth {
margin: 1em 0;
float: left;
border-left: 1px solid rgb(204,204,204);
}
.quarter {
width: 21%;
padding: 0 1.9%;
}
.oneThird {
width: 28%;
padding: 0 1.9%;
}
.half {
text-align: justify;
width: 46%;
padding: 0 1.9%;
}
.twoThirds {
text-align: justify;
width: 63%;
padding: 0 1.9%;
}
.fullWidth {
text-align: justify;
width: 96%;
padding: 0 1.2em;
border-left: none;
}
.filler { /* use with an empty <p> element to add padding to the end of a text box */
border: 1px solid white;
}
.noBorderOnLeft {
border-left: none;
}
.dividingBorderAbove {
border-top: 1px solid rgb(204,204,204);
}
/* More elegant alternatives to .noBorderOnLeft & .dividingBorderAbove
* that don't require the creation of new classes - but which are not
* supported by MSIE - are the following:
*
* .rowOfBoxes > div:first-child {
* border-left: none;
* }
*
* .rowOfBoxes + .rowOfBoxes {
* border-top: 1px solid rgb(204,204,204);
* }
*/
/* ##### Footer ##### */
#footer {
color: rgb(51,51,102);
background-color: rgb(239,239,239);
font-size: 87%;
text-align: center;
line-height: 1.25em;
margin: 2em 0 0 0;
padding: 1ex 10px;
clear: left;
}
#footer a {
color: rgb(0,68,204);
background-color: transparent;
text-decoration: underline;
}
#footer a:hover {
text-decoration: none;
}

View file

@ -1,3 +1,6 @@
/* Evennia CSS styles for the game website */
/* Old site styles, left in just in case.
Shouldn't break anything! */
@media (max-width: 570px) {
@ -49,16 +52,6 @@ body {
background-color: #eee;
}
.footer {
position: absolute;
bottom: 0;
width: 100%;
/* Set the fixed height of the footer here */
height: 60px;
line-height: 60px; /* Vertically center the text there */
background-color: #7590ae;
}
.navbar-brand-logo {
height: 64px;
width: 64px;
@ -69,3 +62,40 @@ body {
.navbar {
background-color: #3d5c7a;
}
.footer {
position: absolute;
bottom: 0;
width: 100%;
/* Set the fixed height of the footer here */
height: 60px;
line-height: 60px; /* Vertically center the text there */
background-color: #3d5c7a;
}
/* Fancy play - button */
a.playbutton {
box-shadow: 0px 1px 10px 5px #9fb4f2;
background:linear-gradient(to bottom, #7892c2 5%, #476e9e 100%);
background-color:#7892c2;
border-radius:12px;
border:1px solid #4e6096;
display:inline-block;
cursor:pointer;
color:#ffffff;
font-family:Arial;
font-size:19px;
padding:14px 37px;
text-decoration:none;
text-shadow:0px 1px 0px #283966;
}
a.playbutton:hover {
background:linear-gradient(to bottom, #476e9e 5%, #7892c2 100%);
background-color:#476e9e;
}
a.playbutton:active {
position:relative;
top:1px;
}

View file

@ -25,13 +25,6 @@ folder and edit it to add/remove links to the menu.
<li>
<a class="nav-link" href="{% url 'index' %}">Home</a>
</li>
<!-- evennia documentation -->
<li>
<a class="nav-link" href="https://www.evennia.com/docs/latest/Evennia-Introduction.html">About</a>
</li>
<li><a class="nav-link" href="https://www.evennia.com/docs/latest">Documentation</a></li>
<!-- end evennia documentation -->
<!-- game views -->
<li><a class="nav-link" href="{% url 'characters' %}">Characters</a></li>
<li><a class="nav-link" href="{% url 'channels' %}">Channels</a></li>

View file

@ -12,10 +12,11 @@
<link rel="icon" type="image/x-icon" href="/static/website/images/evennia_logo.png" />
<!-- Bootstrap CSS -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
<!--link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.6.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous"-->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/css/bootstrap.min.css" integrity="sha384-B0vP5xmATw1+K9KRQjQERJvTumQW0nPEzvF6L/Z6nronJ3oUOFUFpCjEUQouq2+l" crossorigin="anonymous">
<!-- Base CSS -->
<link rel="stylesheet" type="text/css" href="{% static "website/css/app.css" %}">
<link rel="stylesheet" type="text/css" href="{% static "website/css/website.css" %}">
{% comment %}
Allows for loading custom styles without overriding the base site styles
@ -55,7 +56,9 @@
<footer class="footer">
{% block footer %}
<div class="container">
<div class="row justify-content-center">
<span class="text-white">Powered by <a class="text-white font-weight-bold" href="https://evennia.com">Evennia.</a></span>
</div>
</div>
{% endblock %}
</footer>

View file

@ -8,42 +8,37 @@
{% block content %}
<div class="row">
<div class="col">
<div class="card">
<div class="card text-center">
<div class="card-body">
<h1 class="card-title">Welcome!</h1>
<h1 class="card-title">Welcome to Evennia!</h1>
<hr />
<p class="lead">
Welcome to your new installation of <a href="https://evennia.com">Evennia</a>, your friendly
neighborhood next-generation MUD development system and server.
The Python MUD/MU* creation system.
</p>
<p>
You are looking at Evennia's web
presence, which can be expanded to a full-fledged site as needed.<br />
Through the <a href="{% url 'admin:index' %}">admin interface</a> you can view and edit the
database without logging into the game.
You are looking at the start of your game's website, generated out of
the box by Evennia. It has several example pages and can be expanded
into a full-fledged home for your game.
</p>
{% if webclient_enabled %}
<p>
You can also connect to the game directly from your browser using our
<a href="{% url 'webclient:index' %}">online client</a>!<br>
<a href="{% url 'webclient:index' %}" class="playbutton">Play in the browser!</a>
</p>
{% endif %}
<p>
For more info, take your time to
peruse our extensive online <a href="https://evennia.com/docs/latest">documentation</a>.
peruse Evennia's extensive online <a href="https://evennia.com/docs/latest">manual</a>.
</p>
<p>
Should you have any questions, concerns, bug reports, or
if you want to help out, don't hesitate to join the Evennia community
to make your voice heard! Drop a mail to the <a
href="https://github.com/evennia/evennia/discussions">mailing
list</a> or to come say hi in the <a
href="http://webchat.freenode.net/?channels=evennia">developer chatroom</a>.
If you have any questions, don't hesitate to join the Evennia community! Drop a message in the <a href="https://github.com/evennia/evennia/discussions">Evennia forums</a>
or come say hi in the support/chat channels (<a href="http://webchat.freenode.net/?channels=evennia">IRC</a>
or <a href="https://discord.gg/NecFePw">Discord</a>).
</p>
<p>
If you find bugs, please report them to our <a href="https://github.com/evennia/evennia/issues">Issue tracker</a>.
If you find bugs, please report them to our <a href="https://github.com/evennia/evennia/issues">Issue tracker</a> on GitHub.
</p>
</div>
</div>
@ -99,16 +94,16 @@
<div class="row">
<div class="col">
<div class="card">
<div class="card text-center">
<h4 class="card-header text-center">Evennia</h4>
<div class="card-body">
<p><a href="https://evennia.com">Evennia</a> is an open-source MUD server built in
<a href="http://python.org">Python</a>, on top of the
<p><a href="https://evennia.com">Evennia</a> is an open-source MUD/MU*-creation framework built in
<a href="http://python.org">Python</a>, using
<a href="http://twistedmatrix.com">Twisted</a> and
<a href="http://djangoproject.com">Django</a> frameworks. This
combination of technologies allows for the quick and easy creation
of the game of your dreams - as simple or as complex as you like.</p>
<a href="http://djangoproject.com">Django</a>.<br>
Create the text-based multiplayer-game of your dreams - as
simple or as complex as you like.</p>
</div>
</div>
</div>