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

@ -56,6 +56,7 @@ Up requirements to Django 3.2+
- New Channel-System using the `channel` command and nicks. Removed the `ChannelHandler` and the
concept of a dynamically created `ChannelCmdSet`.
- Add `Msg.db_receiver_external` field to allowe external, string-id message-receivers.
- Renamed `app.css` to `website.css` for consistency. Removed old prosimii-css files.
### Evennia 0.9.5 (2019-2020)

View file

@ -1,9 +1,158 @@
# The Web Admin
The Evennia _Web admin_ is a customized [Django admin site](https://docs.djangoproject.com/en/3.2/ref/contrib/admin/)
and is used for manipulating the game database using a graphical interface.
used for manipulating the game database using a graphical interface. You
have to be logged into the site to use it. It then appears as an `Admin` link
the top of your website. You can also go to [http://localhost:4001/admin](http://localhost:4001/admin) when
running locally.
All actions done in the admin can also be done in-game by use of Admin- or
Builder-commands. The only exception is the assigning of `staff` flags for
allowing users access to the admin itself.
Almost all actions done in the admin can also be done in-game by use of Admin-
or Builder-commands.
## Usage
The admin is pretty self-explanatory - you can see lists of each object type,
create new instances of each type and also add new Attributes/tags them. The
admin frontpage will give a summary of all relevant entities and how they are
used.
There are a few use cases that requires some additional explanation though.
### Adding objects to Attributes
The `value` field of an Attribute is pickled into a special form. This is usually not
something you need to worry about (the admin will pickle/unpickle) the value
for you), _except_ if you want to store a database-object in an attribute. Such
objects are actually stored as a `tuple` with object-unique data.
1. Find the object you want to add to the Attribute. At the bottom of the first section
you'll find the field _Serialized string_. This string shows a Python tuple like
('__packed_dbobj__', ('objects', 'objectdb'), '2021:05:15-08:59:30:624660', 358)
Mark and copy this tuple-string to your clipboard exactly as it stands (parentheses and all).
2. Go to the entity that should have the new Attribute and create the Attribute. In its `value`
field, paste the tuple-string you copied before. Save!
3. If you want to store multiple objects in, say, a list, you can do so by literally
typing a python list `[tuple, tuple, tuple, ...]` where you paste in the serialized
tuple-strings with commas. At some point it's probably easier to do this in code though ...
### Linking Accounts and Characters
In `MULTISESSION_MODE` 0 or 1, each connection can have one Account and one
Character, usually with the same name. Normally this is done by the user
creating a new account and logging in - a matching Character will then be
created for them. You can however also do so manually in the admin:
1. First create the complete Account in the admin.
2. Next, create the Object (usually of `Character` typeclass) and name it the same
as the Account. It also needs a command-set. The default CharacterCmdset is a good bet.
3. In the `Puppeting Account` field, select the Account.
4. Make sure to save everything.
5. Click the `Link to Account` button (this will only work if you saved first). This will
add the needed locks and Attributes to the Account to allow them to immediately
connect to the Character when they next log in. This will (where possible):
- Set `account.db._last_puppet` to the Character.
- Add Character to `account.db._playabel_characters` list.
- Add/extend the `puppet:` lock on the Character to include `puppet:pid(<Character.id>)`
### Building with the Admin
It's possible (if probably not very practical at scale) to build and describe
rooms in the Admin.
1. Create an `Object` of a Room-typeclass with a suitable room-name.
2. Set an Attribute 'desc' on the room - the value of this Attribute is the
room's description.
3. Add `Tags` of `type` 'alias' to add room-aliases (no type for regular tags)
Exits:
1. Exits are `Objects` of an `Exit` typeclass, so create one.
2. The exit has `Location` of the room you just created.
3. Set `Destination` set to where the exit leads to.
4. Set a 'desc' Attribute, this is shown if someone looks at the exit.
5. `Tags` of `type` 'alias' are alternative names users can use to go through
this exit.
## Grant others access to the admin
The access to the admin is controlled by the `Staff status` flag on the
Account. Without this flag set, even superusers will not even see the admin
link on the web page. The staff-status has no in-game equivalence.
Only Superusers can change the `Superuser status` flag, and grant new
permissions to accounts. The superuser is the only permission level that is
also relevant in-game. `User Permissions` and `Groups` found on the `Account`
admin page _only_ affects the admin - they have no connection to the in-game
[Permissions](Permissions) (Player, Builder, Admin etc).
For a staffer with `Staff status` to be able to actually do anything, the
superuser must grant at least some permissions for them on their Account. This
can also be good in order to limit mistakes. It can be a good idea to not allow
the `Can delete Account` permission, for example.
```important::
If you grant staff-status and permissions to an Account and they still cannot
access the admin's content, try reloading the server.
```
```warning::
If a staff member has access to the in-game ``py`` command, they can just as
well have their admin ``Superuser status`` set too. The reason is that ``py``
grants them all the power they need to set the ``is_superuser`` flag on their
account manually. There is a reason access to the ``py`` command must be
considered carefully ...
```
## Customizing the web admin
Customizing the admin is a big topic and something beyond the scope of this
documentation. See the [official Django docs](https://docs.djangoproject.com/en/3.2/ref/contrib/admin/) for
the details. This is just a brief summary.
See the [Website](./Website) page for an overview of the components going into
generating a web page. The Django admin uses the same principle except that
Django provides a lot of tools to automate the admin-generation for us.
Admin templates are found in `evennia/web/templates/admin/` but you'll find
this is relatively empty. This is because most of the templates are just
inherited directly from their original location in the Django package
(`django/contrib/admin/templates/`). So if you wanted to override one you'd have
to copy it from _there_ into your `mygame/templates/admin/` folder. Same is true
for CSS files.
The admin site's backend code (the views) is found in `evennia/web/admin/`. It
is organized into `admin`-classes, like `ObjectAdmin`, `AccountAdmin` etc.
These automatically use the underlying database models to generate useful views
for us without us havint go code the forms etc ourselves.
The top level `AdminSite` (the admin configuration referenced in django docs)
is found in `evennia/web/utils/adminsite.py`.
### Change the title of the admin
By default the admin's title is `Evennia web admin`. To change this, add the
following to your `mygame/web/urls.py`:
```python
# in mygame/web/urls.py
# ...
from django.conf.admin import site
#...
site.site_header = "My great game admin"
```
Reload the server and the admin's title header will have changed.

View file

@ -1,6 +1,4 @@
# Webclient
# **Web client**
# Web Client
Evennia comes with a MUD client accessible from a normal web browser. During development you can try
it at `http://localhost:4001/webclient`. The client consists of several parts, all under

View file

@ -17,7 +17,7 @@ environment. It leverages the Django web framework and provides:
game. Users logged into the website will be auto-logged into the game if they
do so with the webclient since they share the same login credentials (there
is no way to safely do auto-login with telnet clients).
- The [Web Admin](Web-Admin) is based on the Django web admin and allows you to
- The [Web Admin](./Web-Admin) is based on the Django web admin and allows you to
edit the game database in a graphical interface.
- The [Webclient](./Webclient) page is served by the webserver, but the actual
game communication (sending/receiving data) is done by the javascript client

View file

@ -1,9 +1,10 @@
# Game Website
# Game website
When Evennia starts it will also start a [Webserver](./Webserver) as part of the
[Server](./Portal-And-Server) process. This uses [Django](https://docs.djangoproject.com)
to present a simple but functional default game website. With the default setup,
open your browser to `localhost:4001` or `127.0.0.1:4001` to see it.
open your browser to [localhost:4001](http://localhost:4001) or [127.0.0.1:4001](http://127.0.0.1:4001)
to see it.
The website allows existing players to log in using an account-name and
password they previously used to register with the game. If a user logs in with
@ -16,22 +17,27 @@ resources. It also shows some statistics about how many players are currently
connected.
In the top menu you can find
- Home - Get back to front page.
- Document - A link to the latest stable Evennia documentation.
- Characters - This is a demo of connecting in-game characters to the website.
- _Home_ - Get back to front page.
- _Documentation_ - A link to the latest stable Evennia documentation.
- _Characters_ - This is a demo of connecting in-game characters to the website.
It will display a list of all entities of the
_typeclasses.characters.Character` typeclass and allow you to view their
description with an optional image. The list is only available to logged-in
users.
- Channels - This is a demo of connecting in-game chats to the website. It will
- _Channels_ - This is a demo of connecting in-game chats to the website. It will
show a list of all channels available to you and allow you to view the latest
discussions. Most channels require logging in, but the `Public` channel can
also be viewed by non-loggedin users.
- Help - This ties the in-game [Help system](./Help-System) to the website. All
- _Help_ - This ties the in-game [Help system](./Help-System) to the website. All
database-based help entries that are publicly available or accessible to your
account can be read. This is a good way to present a body of help for people
to read outside of the game.
- Play Online - This opens the [Webclient](./Webclient) in the browser.
- _Play Online_ - This opens the [Webclient](./Webclient) in the browser.
- _Admin_ The [Web admin](Web admin) will only show if you are logged in.
- _Log in/out_ - Allows you to authenticate using the same credentials you use
in the game.
- _Register_ - Allows you to register a new account. This is the same as
creating a new account upon first logging into the game).
## Modifying the default Website
@ -263,7 +269,7 @@ your copy. Just remember to reload.
### Using Flat Pages
The absolutely simplest way to add a new web page is to use the `Flat Pages`
app available in the [Web Admin](Web-Admin). The page will appear with the same
app available in the [Web Admin](./Web-Admin). The page will appear with the same
styling as the rest of the site.
For the `Flat pages` module to work you must first set up a _Site_ (or

View file

@ -48,6 +48,7 @@
- [Components/Tags](Components/Tags)
- [Components/TickerHandler](Components/TickerHandler)
- [Components/Typeclasses](Components/Typeclasses)
- [Components/Web Admin](Components/Web-Admin)
- [Components/Webclient](Components/Webclient)
- [Components/Webserver](Components/Webserver)
- [Components/Website](Components/Website)

View file

@ -26,7 +26,7 @@ import sys
SERVERNAME = "Evennia"
# Short one-sentence blurb describing your game. Shown under the title
# on the website and could be used in online listings of your game etc.
GAME_SLOGAN = "Python MU* creation system"
GAME_SLOGAN = "The Python MUD/MU* creation system"
# Lockdown mode will cut off the game from any external connections
# and only allow connections from localhost. Requires a cold reboot.
LOCKDOWN_MODE = False

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>