@ -327,7 +327,6 @@ jobs:
|
||||
paths:
|
||||
- ~/offen/packages/node_modules
|
||||
key: offen-packages-{{ checksum "package.json" }}
|
||||
|
||||
- restore_cache:
|
||||
key: offen-auditorium-{{ checksum "auditorium/package.json" }}
|
||||
- run:
|
||||
@ -363,6 +362,56 @@ jobs:
|
||||
$(npm bin)/sls deploy --config vault/serverless.yml
|
||||
$(npm bin)/sls client deploy --config vault/serverless.yml --no-confirm
|
||||
|
||||
deploy_homepage:
|
||||
docker:
|
||||
- image: circleci/python:3.6
|
||||
working_directory: ~/offen/homepage
|
||||
environment:
|
||||
- SOURCE_BRANCH: master
|
||||
- TARGET_BRANCH: gh-pages
|
||||
steps:
|
||||
- checkout:
|
||||
path: ~/offen
|
||||
- restore_cache:
|
||||
key: offen-homepage-{{ checksum "requirements.txt" }}
|
||||
- run:
|
||||
name: Install dependencies
|
||||
command: |
|
||||
python -m venv venv
|
||||
source venv/bin/activate
|
||||
pip install -r requirements.txt
|
||||
- save_cache:
|
||||
paths:
|
||||
- ~/offen/homepage/venv
|
||||
key: offen-homepage-{{ checksum "requirements.txt" }}
|
||||
- run:
|
||||
name: Deploy
|
||||
command: |
|
||||
source venv/bin/activate
|
||||
|
||||
git config --global user.email $GH_EMAIL
|
||||
git config --global user.name $GH_NAME
|
||||
|
||||
git clone $CIRCLE_REPOSITORY_URL out
|
||||
|
||||
cd out
|
||||
git checkout $TARGET_BRANCH || git checkout --orphan $TARGET_BRANCH
|
||||
git rm -rf .
|
||||
cd ..
|
||||
|
||||
make publish
|
||||
|
||||
cp -a output/. out/.
|
||||
|
||||
mkdir -p out/.circleci && cp -a .circleci/. out/.circleci/.
|
||||
cp CNAME out/CNAME
|
||||
cd out
|
||||
|
||||
git add -A
|
||||
git commit -m "Automated deployment to GitHub Pages: ${CIRCLE_SHA1}" --allow-empty
|
||||
|
||||
git push origin $TARGET_BRANCH
|
||||
|
||||
workflows:
|
||||
version: 2
|
||||
test_build_deploy:
|
||||
@ -381,3 +430,5 @@ workflows:
|
||||
<<: *deploy_preconditions
|
||||
- deploy_python:
|
||||
<<: *deploy_preconditions
|
||||
- deploy_homepage:
|
||||
<<: *deploy_preconditions
|
||||
|
2
Makefile
@ -2,7 +2,7 @@ help:
|
||||
@echo " setup"
|
||||
@echo " Build the containers and install dependencies."
|
||||
@echo " bootstrap"
|
||||
@echo " Create a KMS key and initialize the database."
|
||||
@echo " Set up keys and seed databases."
|
||||
@echo " IMPORTANT: this wipes any existing data in your local database."
|
||||
|
||||
setup:
|
||||
|
14
README.md
@ -37,7 +37,19 @@ You can test your setup by starting the application:
|
||||
$ docker-compose up
|
||||
```
|
||||
|
||||
which should enable you to access <http://localhost:8080/status> seeing a successful response.
|
||||
which should enable you to access <http://localhost:9955/> and use the `auditorium`
|
||||
|
||||
### Developing the homepage
|
||||
|
||||
In order to ease sharing of styles, the <https://www.offen.dev> site is also part of this repository. It runs in a separate development environment:
|
||||
|
||||
```
|
||||
$ cd homepage
|
||||
$ make setup
|
||||
$ docker-compose up
|
||||
```
|
||||
|
||||
A live reloading development server will run on <http://localhost:8000>.
|
||||
|
||||
### License
|
||||
|
||||
|
110
homepage/.gitignore
vendored
Normal file
@ -0,0 +1,110 @@
|
||||
# built pelican site
|
||||
output/
|
||||
|
||||
# Byte-compiled / optimized / DLL files
|
||||
__pycache__/
|
||||
*.py[cod]
|
||||
*$py.class
|
||||
|
||||
# C extensions
|
||||
*.so
|
||||
|
||||
# Distribution / packaging
|
||||
.Python
|
||||
build/
|
||||
develop-eggs/
|
||||
dist/
|
||||
downloads/
|
||||
eggs/
|
||||
.eggs/
|
||||
lib/
|
||||
lib64/
|
||||
parts/
|
||||
sdist/
|
||||
var/
|
||||
wheels/
|
||||
*.egg-info/
|
||||
.installed.cfg
|
||||
*.egg
|
||||
MANIFEST
|
||||
|
||||
# PyInstaller
|
||||
# Usually these files are written by a python script from a template
|
||||
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
||||
*.manifest
|
||||
*.spec
|
||||
|
||||
# Installer logs
|
||||
pip-log.txt
|
||||
pip-delete-this-directory.txt
|
||||
|
||||
# Unit test / coverage reports
|
||||
htmlcov/
|
||||
.tox/
|
||||
.coverage
|
||||
.coverage.*
|
||||
.cache
|
||||
nosetests.xml
|
||||
coverage.xml
|
||||
*.cover
|
||||
.hypothesis/
|
||||
.pytest_cache/
|
||||
|
||||
# Translations
|
||||
*.mo
|
||||
*.pot
|
||||
|
||||
# Django stuff:
|
||||
*.log
|
||||
local_settings.py
|
||||
db.sqlite3
|
||||
|
||||
# Flask stuff:
|
||||
instance/
|
||||
.webassets-cache
|
||||
|
||||
# Scrapy stuff:
|
||||
.scrapy
|
||||
|
||||
# Sphinx documentation
|
||||
docs/_build/
|
||||
|
||||
# PyBuilder
|
||||
target/
|
||||
|
||||
# Jupyter Notebook
|
||||
.ipynb_checkpoints
|
||||
|
||||
# pyenv
|
||||
.python-version
|
||||
|
||||
# celery beat schedule file
|
||||
celerybeat-schedule
|
||||
|
||||
# SageMath parsed files
|
||||
*.sage.py
|
||||
|
||||
# Environments
|
||||
.env
|
||||
.venv
|
||||
env/
|
||||
venv/
|
||||
ENV/
|
||||
env.bak/
|
||||
venv.bak/
|
||||
|
||||
# Spyder project settings
|
||||
.spyderproject
|
||||
.spyproject
|
||||
|
||||
# Rope project settings
|
||||
.ropeproject
|
||||
|
||||
# mkdocs documentation
|
||||
/site
|
||||
|
||||
# mypy
|
||||
.mypy_cache/
|
||||
|
||||
test.py
|
||||
*.json
|
1
homepage/CNAME
Normal file
@ -0,0 +1 @@
|
||||
www.offen.dev
|
78
homepage/Makefile
Normal file
@ -0,0 +1,78 @@
|
||||
PY?=python3
|
||||
PELICAN?=pelican
|
||||
PELICANOPTS=
|
||||
|
||||
BASEDIR=$(CURDIR)
|
||||
INPUTDIR=$(BASEDIR)/content
|
||||
OUTPUTDIR=$(BASEDIR)/output
|
||||
CONFFILE=$(BASEDIR)/pelicanconf.py
|
||||
PUBLISHCONF=$(BASEDIR)/publishconf.py
|
||||
|
||||
|
||||
DEBUG ?= 0
|
||||
ifeq ($(DEBUG), 1)
|
||||
PELICANOPTS += -D
|
||||
endif
|
||||
|
||||
RELATIVE ?= 0
|
||||
ifeq ($(RELATIVE), 1)
|
||||
PELICANOPTS += --relative-urls
|
||||
endif
|
||||
|
||||
help:
|
||||
@echo 'Makefile for a pelican Web site '
|
||||
@echo ' '
|
||||
@echo 'Usage: '
|
||||
@echo ' make html (re)generate the web site '
|
||||
@echo ' make clean remove the generated files '
|
||||
@echo ' make regenerate regenerate files upon modification '
|
||||
@echo ' make publish generate using production settings '
|
||||
@echo ' make serve [PORT=8000] serve site at http://localhost:8000'
|
||||
@echo ' make serve-global [SERVER=0.0.0.0] serve (as root) to $(SERVER):80 '
|
||||
@echo ' make devserver [PORT=8000] serve and regenerate together '
|
||||
@echo ' make ssh_upload upload the web site via SSH '
|
||||
@echo ' make rsync_upload upload the web site via rsync+ssh '
|
||||
@echo ' '
|
||||
@echo 'Set the DEBUG variable to 1 to enable debugging, e.g. make DEBUG=1 html '
|
||||
@echo 'Set the RELATIVE variable to 1 to enable relative urls '
|
||||
@echo ' '
|
||||
|
||||
html:
|
||||
$(PELICAN) $(INPUTDIR) -o $(OUTPUTDIR) -s $(CONFFILE) $(PELICANOPTS)
|
||||
|
||||
clean:
|
||||
[ ! -d $(OUTPUTDIR) ] || rm -rf $(OUTPUTDIR)
|
||||
|
||||
regenerate:
|
||||
$(PELICAN) -r $(INPUTDIR) -o $(OUTPUTDIR) -s $(CONFFILE) $(PELICANOPTS)
|
||||
|
||||
serve:
|
||||
ifdef PORT
|
||||
$(PELICAN) -l $(INPUTDIR) -o $(OUTPUTDIR) -s $(CONFFILE) $(PELICANOPTS) -p $(PORT)
|
||||
else
|
||||
$(PELICAN) -l $(INPUTDIR) -o $(OUTPUTDIR) -s $(CONFFILE) $(PELICANOPTS)
|
||||
endif
|
||||
|
||||
serve-global:
|
||||
ifdef SERVER
|
||||
$(PELICAN) -l $(INPUTDIR) -o $(OUTPUTDIR) -s $(CONFFILE) $(PELICANOPTS) -p $(PORT) -b $(SERVER)
|
||||
else
|
||||
$(PELICAN) -l $(INPUTDIR) -o $(OUTPUTDIR) -s $(CONFFILE) $(PELICANOPTS) -p $(PORT) -b 0.0.0.0
|
||||
endif
|
||||
|
||||
|
||||
devserver:
|
||||
ifdef PORT
|
||||
$(PELICAN) -lr $(INPUTDIR) -o $(OUTPUTDIR) -s $(CONFFILE) $(PELICANOPTS) -p $(PORT)
|
||||
else
|
||||
$(PELICAN) -lr $(INPUTDIR) -o $(OUTPUTDIR) -s $(CONFFILE) $(PELICANOPTS)
|
||||
endif
|
||||
|
||||
publish:
|
||||
$(PELICAN) $(INPUTDIR) -o $(OUTPUTDIR) -s $(PUBLISHCONF) $(PELICANOPTS)
|
||||
|
||||
setup:
|
||||
@docker-compose run homepage pip install --user -r requirements.txt
|
||||
|
||||
|
||||
.PHONY: html help clean regenerate serve serve-global devserver stopserver publish
|
22
homepage/README.md
Normal file
@ -0,0 +1,22 @@
|
||||
# offen.dev
|
||||
> Organization homepage
|
||||
|
||||
The site is using Pelican
|
||||
|
||||
## Site development
|
||||
Create a Python virtual environment using the tools of your choice and install the requirements. E.g.:
|
||||
|
||||
```
|
||||
python3 -m venv venv
|
||||
source venv/bin/activate
|
||||
pip install -r requirements.txt
|
||||
```
|
||||
|
||||
Serve the site locally on http://localhost:8000:
|
||||
```
|
||||
make devserver
|
||||
```
|
||||
|
||||
### License
|
||||
|
||||
MIT © [Frederik Ring](https://www.frederikring.com), [Hendrik Niefeld](http://niefeld.com/)
|
80
homepage/content/pages/deep-dive.md
Normal file
@ -0,0 +1,80 @@
|
||||
Title: Deep dive | offen
|
||||
description: offen is a free and open source analytics software for websites and web applications that allows respectful handling of data.
|
||||
save_as: deep-dive/index.html
|
||||
href: /deep-dive/
|
||||
|
||||
### What is this thing called "my data" and why does seemingly everyone want to get hold of it?
|
||||
|
||||
It has a ring, gives a slight spine-chilling sensation and generates a whole lot of clicks: consumer magazines like German "Computer Bild" caution about "Google espionage" [^1] just like the internet has countless tutorials on turning off numerous "data leeches" [^2]. Interestingly, diving into these realms will have you accidentally catching the next toolbar, malware infection or even worse [^3].
|
||||
|
||||
[^1]: Gegen Google-Spionage wehren <https://www.computerbild.de/artikel/cb-Ratgeber-Kurse-Wissen-Was-weiss-Google-ueber-Sie-2799009.html>
|
||||
[^2]: Datenkrake Windows 10: So schalten Sie auffällige Funktionen ab <https://praxistipps.chip.de/datenkrake-windows-10-so-schalten-sie-auffaellige-funktionen-ab_99652>
|
||||
[^3]: Pick a Download, Any Download! <https://blog.malwarebytes.com/cybercrime/2012/10/pick-a-download-any-download/>
|
||||
|
||||
Yet, many internet users still don't know what really is happening to their data. Public relation activities trying to calm the public - as undertaken by Facebook for example [^4] - end up being rather disturbing instead of creating transparency, or adding real value to the public debate. Denelle Dixon, COO of Mozilla, just publicly warned the European Commission [^5] about the dangerous effects an opaque apparatus such as Facebook can have on society. Updated Terms and Conditions only parenthetically mention that newly created Google accounts will now hand over real names to third parties for advertising purposes [^6].
|
||||
|
||||
[^4]: Sometimes People Assume Facebook Does Things It Doesn't Do <https://www.zeit.de/digital/datenschutz/2019-01/social-media-facebook-mark-zuckerberg-ads-privacy-business-model-transparency>
|
||||
[^5]: Mozilla Raises Concerns Over Facebook's Lack of Transparency <https://blog.mozilla.org/blog/2019/01/31/mozilla-raises-concerns-over-facebooks-lack-of-transparency/>
|
||||
[^6]: Google Has Quietly Dropped Ban on Personally Identifiable Web Tracking <https://www.propublica.org/article/google-has-quietly-dropped-ban-on-personally-identifiable-web-tracking>
|
||||
|
||||
As a regular user of the internet, are you really being spied upon? *What exactly is "my data"?* Can a website operator see my name when I'm using it? Does it know about my Email address or my phone number? Does it know which other websites I have been visiting, which search query led me to the site in the first place, what I have recently purchased online, or who I am acquainted with?
|
||||
|
||||
> If you have something that you don't want anyone to know, maybe you shouldn't be doing it in the first place. [^7]
|
||||
>
|
||||
> Eric Schmidt (at this time CEO of Google), 2009
|
||||
|
||||
[^7]: Google CEO Eric Schmidt Dismisses the Importance of Privacy <https://www.eff.org/de/deeplinks/2009/12/google-ceo-eric-schmidt-dismisses-privacy>
|
||||
|
||||
We would like to turn the tables on this much quoted statement and apply it to the operators of services and websites instead of their users. The analytics software __offen__ *transparently and uncompromisingly discloses what data is being collected and what it is being used for* to the users.
|
||||
|
||||
---
|
||||
|
||||
### For users
|
||||
|
||||
Visiting a website or using a web application that utilizes __offen__, the user gains access to and ownership of the usage data collected. The cookie used by __offen__ allows viewing all of the associated metrics, the users can *assert themselves what is being collected and what isn't*. Data is being displayed in an accessible and articulate manner and each metric comes with explanations about its usage, relevance and possible privacy implications.
|
||||
|
||||
Users can choose to export their data, delete it selectively or in its entirety, or simply opt out of any data collection.
|
||||
|
||||
### For operators
|
||||
|
||||
Operators of small and mid-sized websites and web applications are faced with growing challenges not only since the introduction of GDPR: how do they gain insights into what users are interested in and which of the features offered are being used? Is it possible to showcase *transparent and considerate handling of user data* - i.e. neither being spy or data leech - without surrendering and abandoning usage metrics altogether?
|
||||
|
||||
Choosing __offen__, websites and web applications obtain a free, open and robust tool for collecting and analyzing relevant usage data. The insights gained enable continuous improvement of these services while still respecting their user's privacy. *Opening up the data to the users does not constitute a disadvantage, but strengthens the relationship with them* by being entirely transparent.
|
||||
|
||||
### Part of the public debate
|
||||
|
||||
Transparently handling usage data in the open creates mutual trust while still enabling operators to collect needed usage statistics. __offen__ is designed to be a mediating agent only, and does not side with either users or operators. Sharing knowledge between the two parties creates opportunities for an *open and fact based discussion* about user data and privacy. Users gain insights into what data is being collected and what these data points are used for, just like they learn about which kind of data is not part of the collection. They are enabled to reach self-determined decisions about what they consent with and what they disagree with when it comes to privacy on the web, also in other contexts than analytics.
|
||||
|
||||
We want to exemplify that it is time to depart the age of "data capitalism" [^8] and to create *technologies and infrastructure that are transparent, open and oriented towards the common good*
|
||||
|
||||
[^8]: Vielleicht wird in Zukunft auch mit Gewalt um Daten gekämpft <https://www.zeit.de/digital/datenschutz/2019-01/datenschutz-nick-couldry-datenkolonialismus-datenhandel/komplettansicht>
|
||||
|
||||
---
|
||||
|
||||
### offen as a technology
|
||||
|
||||
At runtime, __offen__ is just mediating exchange between users and operators. Usage data is collected in conformance to GDPR and with the concept of "Datensparsamkeit" [^9] in mind. All user data is encrypted in the browser so that it can only be accessed by the users themselves or the matching operator. While being collected in the context of a website or application, neither operators nor third party scripts have any possibilty to access the usage data. __offen__ itself doesn't have any way of decrypting, processing or even selling the gathered data at any point.
|
||||
|
||||
[^9]: Datensparsamkeit <https://martinfowler.com/bliki/Datensparsamkeit.html>
|
||||
|
||||
The software itself, as well as *all the used tools are open source*, [project planning][pivotal-tracker]{: target="_blank"} and [technical specification][rfcs-repo]{: target="_blank"} take place in the open and actively solicit feedback from the general public. The infrastructure the service is deployed to is split into three isolated environments in order to minimize possible attack vectors.
|
||||
|
||||
[pivotal-tracker]: https://www.pivotaltracker.com/n/projects/2334535
|
||||
[rfcs-repo]: https://github.com/offen/rfcs
|
||||
|
||||
Users and operators are given intuitive and accessibility-focused tools for analyzing and managing their data in the form of a web application and a browser extension. Operators deploy the service using a simple script tag. More sophisticated use cases are covered by a dedicated SDK.
|
||||
|
||||
---
|
||||
|
||||
### Modus Operandi
|
||||
|
||||
Developing and running __offen__ can only work out when it is entirely *free of any kind of economic constraints or goals* and its only objective is *contributing to the common good*. Development of a prototype is reliant on public grants or similar funding sources. Long term operation of the software, just like its maintenance and continued development, is tied to resources granted by foundations or being donated by the public.
|
||||
|
||||
### Status Quo
|
||||
|
||||
__offen__ is created by [Frederik Ring][frederik-ring]{: target="_blank"} and [Hendrik Niefeld][hendrik-niefeld]{: target="_blank"} and is currently being conceptually designed, both as a product as well as as a software.
|
||||
|
||||
We are happy about any kind of feedback. From *criticism and praise to contributions or support*, everything is welcome.
|
||||
|
||||
[hendrik-niefeld]: http://niefeld.com/
|
||||
[frederik-ring]: https://www.frederikring.com/
|
12
homepage/content/pages/index.md
Normal file
@ -0,0 +1,12 @@
|
||||
Title: Transparent web analytics | offen
|
||||
description: offen is a free and open source analytics software for websites and web applications that allows respectful handling of data.
|
||||
save_as: index.html
|
||||
href: /
|
||||
|
||||
__offen__ is a web analytics software that gives users access to the data they are generating. Not only operators running sites or applications are given able to use the analytics tools, but also *the users themselves are granted access to and ownership of their data*.
|
||||
|
||||
Usage metrics come with explanations about their meaning, relevance, usage and possible privacy implications. __offen__ also details *which kind of data is not collected*. All data can be deleted selectively or in its entirety by the users, or the collection can be disabled altogether.
|
||||
|
||||
__offen__ treats both users and operators as parties of equal importance. Users can expect full transparency and are encouraged to make *autonomous and informed decisions regarding the use of their data*. Operators are enabled to gain insights while respecting their users' privacy and their data.
|
||||
|
||||
__offen__ is currently in the early stages of development and is applying for funds to sustain its development. An early alpha version is running on this site: you can visit the [auditorium](https://auditorium-alpha.offen.dev) to access your data.
|
11
homepage/content/pages/opt-out.md
Normal file
@ -0,0 +1,11 @@
|
||||
Title: Opt-out | offen
|
||||
description: offen is a free and open source analytics software for websites and web applications that allows respectful handling of data.
|
||||
save_as: opt-out/index.html
|
||||
|
||||
### You are opted out
|
||||
|
||||
This will prevent __offen__ from aggregating the actions you have taken on participating websites.
|
||||
|
||||
Operators now cannot draw any conclusions from your actions via __offen__. At the same time, however, they *cannot create a better experience* for you and other users.
|
||||
|
||||
<img style="-webkit-user-select: none; display:none;" src="https://server-alpha.offen.dev/opt-out">
|
32
homepage/content/pages/status.md
Normal file
@ -0,0 +1,32 @@
|
||||
Title: Status | offen
|
||||
description: offen is a free and open source analytics software for websites and web applications that allows respectful handling of data.
|
||||
save_as: status/index.html
|
||||
href: /status/
|
||||
|
||||
### Current status
|
||||
|
||||
#### July 2019
|
||||
We have deployed an alpha version of __offen__ that we are currently testing on a few select sites. Usage data is collected and can be accessed by both users and site operators. Users can opt out and delete their data at any time. You can *follow the development at [github.com/offen/offen](https://github.com/offen/offen)*
|
||||
|
||||
---
|
||||
|
||||
### Next up
|
||||
|
||||
#### Tech
|
||||
The next big task from a technical perspective is enabling account creation by third parties. This will allow us to open up a beta version of to select operators and collect their - as well as their user's - feedback.
|
||||
|
||||
#### Explainer
|
||||
|
||||
Once the user interface starts to get less volatile at the end of our alpha test, we will start to add explanations to all of the metrics as well as create additional content to educate users about the privacy measures we are taking and about their implications.
|
||||
|
||||
#### Milieu
|
||||
|
||||
Currently, we are researching the milieu on the topics of privacy and web analytics software in more detail. The aim is to create a selection of opinion leaders, bloggers and journalists who will be invited to test and evaluate.
|
||||
|
||||
#### Story
|
||||
|
||||
Our product story is based on three key questions. What makes __offen__ stand out from other offerings in the field? What is the motivation for site operators to implement an open source analytics software that limits the amount of data collected? How can we raise or amplify users' awareness for a respectful handling of their data?
|
||||
|
||||
#### Publicity
|
||||
|
||||
This product story is the starting point for publicty efforts that will start as soon as a beta version is available. They include own blog posts, forum marketing as well as SEO measures.
|
17
homepage/docker-compose.yml
Normal file
@ -0,0 +1,17 @@
|
||||
version: '3'
|
||||
|
||||
services:
|
||||
homepage:
|
||||
build:
|
||||
context: '.'
|
||||
dockerfile: ./../Dockerfile.python
|
||||
working_dir: /offen/homepage
|
||||
volumes:
|
||||
- ..:/offen
|
||||
- homepagedeps:/root/.local
|
||||
command: make devserver
|
||||
ports:
|
||||
- 8000:8000
|
||||
|
||||
volumes:
|
||||
homepagedeps:
|
44
homepage/pelicanconf.py
Normal file
@ -0,0 +1,44 @@
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*- #
|
||||
from __future__ import unicode_literals
|
||||
import logging
|
||||
|
||||
# If your site is available via HTTPS, make sure SITEURL begins with https://
|
||||
#SITEURL = 'https://www.offen.dev'
|
||||
RELATIVE_URLS = False
|
||||
|
||||
AUTHOR = 'offen'
|
||||
SITENAME = 'offen'
|
||||
SITEURL = 'https://www.offen.dev'
|
||||
PATH = 'content'
|
||||
TIMEZONE = 'Europe/Berlin'
|
||||
DEFAULT_LANG = 'en'
|
||||
|
||||
# Feed generation is usually not desired when developing
|
||||
FEED_ALL_ATOM = None
|
||||
CATEGORY_FEED_ATOM = None
|
||||
TRANSLATION_FEED_ATOM = None
|
||||
AUTHOR_FEED_ATOM = None
|
||||
AUTHOR_FEED_RSS = None
|
||||
|
||||
# pagination
|
||||
DEFAULT_PAGINATION = False
|
||||
|
||||
|
||||
THEME = './theme'
|
||||
|
||||
# Delete the output directory before generating new files.
|
||||
DELETE_OUTPUT_DIRECTORY = True
|
||||
|
||||
# dont create following standard pages
|
||||
AUTHORS_SAVE_AS = None
|
||||
ARCHIVES_SAVE_AS = None
|
||||
CATEGORIES_SAVE_AS = None
|
||||
TAGS_SAVE_AS = None
|
||||
|
||||
# keep this for access to page variable
|
||||
DIRECT_TEMPLATES = []
|
||||
|
||||
GITHUB_ORG = 'https://github.com/offen'
|
||||
CONTACT_EMAIL = 'mail@offen.dev'
|
||||
PATREON_URL = 'https://www.patreon.com/bePatron?u=21484999'
|
27
homepage/publishconf.py
Normal file
@ -0,0 +1,27 @@
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*- #
|
||||
from __future__ import unicode_literals
|
||||
|
||||
# This file is only used if you use `make publish` or
|
||||
# explicitly specify it as your config file.
|
||||
|
||||
import os
|
||||
import sys
|
||||
sys.path.append(os.curdir)
|
||||
from pelicanconf import *
|
||||
|
||||
# If your site is available via HTTPS, make sure SITEURL begins with https://
|
||||
SITEURL = 'https://www.offen.dev'
|
||||
RELATIVE_URLS = False
|
||||
|
||||
FEED_ALL_ATOM = 'feeds/all.atom.xml'
|
||||
CATEGORY_FEED_ATOM = 'feeds/{slug}.atom.xml'
|
||||
|
||||
DELETE_OUTPUT_DIRECTORY = True
|
||||
|
||||
# Following items are often useful when publishing
|
||||
|
||||
#DISQUS_SITENAME = ""
|
||||
#GOOGLE_ANALYTICS = ""
|
||||
|
||||
OFFEN_ACCOUNT_ID = "5ec8345a-2a45-4eb9-92e5-8d9e5684db58"
|
2
homepage/requirements.txt
Normal file
@ -0,0 +1,2 @@
|
||||
pelican==4.0.1
|
||||
markdown==3.1.1
|
77
homepage/tasks.py
Normal file
@ -0,0 +1,77 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
import os
|
||||
import shutil
|
||||
import sys
|
||||
import datetime
|
||||
|
||||
from invoke import task
|
||||
from invoke.util import cd
|
||||
from pelican.server import ComplexHTTPRequestHandler, RootedHTTPServer
|
||||
|
||||
CONFIG = {
|
||||
# Local path configuration (can be absolute or relative to tasks.py)
|
||||
'deploy_path': 'output',
|
||||
# Port for `serve`
|
||||
'port': 8000,
|
||||
}
|
||||
|
||||
@task
|
||||
def clean(c):
|
||||
"""Remove generated files"""
|
||||
if os.path.isdir(CONFIG['deploy_path']):
|
||||
shutil.rmtree(CONFIG['deploy_path'])
|
||||
os.makedirs(CONFIG['deploy_path'])
|
||||
|
||||
@task
|
||||
def build(c):
|
||||
"""Build local version of site"""
|
||||
c.run('pelican -s pelicanconf.py')
|
||||
|
||||
@task
|
||||
def rebuild(c):
|
||||
"""`build` with the delete switch"""
|
||||
c.run('pelican -d -s pelicanconf.py')
|
||||
|
||||
@task
|
||||
def regenerate(c):
|
||||
"""Automatically regenerate site upon file modification"""
|
||||
c.run('pelican -r -s pelicanconf.py')
|
||||
|
||||
@task
|
||||
def serve(c):
|
||||
"""Serve site at http://localhost:8000/"""
|
||||
|
||||
class AddressReuseTCPServer(RootedHTTPServer):
|
||||
allow_reuse_address = True
|
||||
|
||||
server = AddressReuseTCPServer(
|
||||
CONFIG['deploy_path'],
|
||||
('', CONFIG['port']),
|
||||
ComplexHTTPRequestHandler)
|
||||
|
||||
sys.stderr.write('Serving on port {port} ...\n'.format(**CONFIG))
|
||||
server.serve_forever()
|
||||
|
||||
@task
|
||||
def reserve(c):
|
||||
"""`build`, then `serve`"""
|
||||
build(c)
|
||||
serve(c)
|
||||
|
||||
@task
|
||||
def preview(c):
|
||||
"""Build production version of site"""
|
||||
c.run('pelican -s publishconf.py')
|
||||
|
||||
|
||||
@task
|
||||
def publish(c):
|
||||
"""Publish to production via rsync"""
|
||||
c.run('pelican -s publishconf.py')
|
||||
c.run(
|
||||
'rsync --delete --exclude ".DS_Store" -pthrvz -c '
|
||||
'{} {production}:{dest_path}'.format(
|
||||
CONFIG['deploy_path'].rstrip('/') + '/',
|
||||
**CONFIG))
|
||||
|
31
homepage/theme/static/css/fonts.css
Normal file
@ -0,0 +1,31 @@
|
||||
@font-face {
|
||||
font-family: 'Noto Sans';
|
||||
font-weight: 400;
|
||||
font-style: normal;
|
||||
src: url("/theme/styles/fonts/Noto-Sans-400/Noto-Sans-400.eot");
|
||||
src: url("/theme/styles/fonts/Noto-Sans-400/Noto-Sans-400.eot?#iefix") format("embedded-opentype"), local("Noto Sans"), local("Noto-Sans-400"), url("/theme/styles/fonts/Noto-Sans-400/Noto-Sans-400.woff2") format("woff2"), url("/theme/styles/fonts/Noto-Sans-400/Noto-Sans-400.woff") format("woff"), url("/theme/styles/fonts/Noto-Sans-400/Noto-Sans-400.ttf") format("truetype"), url("/theme/styles/fonts/Noto-Sans-400/Noto-Sans-400.svg#NotoSans") format("svg")
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Noto Sans';
|
||||
font-weight: 700;
|
||||
font-style: normal;
|
||||
src: url("/theme/styles/fonts/Noto-Sans-700/Noto-Sans-700.eot");
|
||||
src: url("/theme/styles/fonts/Noto-Sans-700/Noto-Sans-700.eot?#iefix") format("embedded-opentype"), local("Noto Sans Bold"), local("Noto-Sans-700"), url("/theme/styles/fonts/Noto-Sans-700/Noto-Sans-700.woff2") format("woff2"), url("/theme/styles/fonts/Noto-Sans-700/Noto-Sans-700.woff") format("woff"), url("/theme/styles/fonts/Noto-Sans-700/Noto-Sans-700.ttf") format("truetype"), url("/theme/styles/fonts/Noto-Sans-700/Noto-Sans-700.svg#NotoSans") format("svg")
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Noto Sans';
|
||||
font-weight: 400;
|
||||
font-style: italic;
|
||||
src: url("/theme/styles/fonts/Noto-Sans-italic/Noto-Sans-italic.eot");
|
||||
src: url("/theme/styles/fonts/Noto-Sans-italic/Noto-Sans-italic.eot?#iefix") format("embedded-opentype"), local("Noto Sans Italic"), local("Noto-Sans-italic"), url("/theme/styles/fonts/Noto-Sans-italic/Noto-Sans-italic.woff2") format("woff2"), url("/theme/styles/fonts/Noto-Sans-italic/Noto-Sans-italic.woff") format("woff"), url("/theme/styles/fonts/Noto-Sans-italic/Noto-Sans-italic.ttf") format("truetype"), url("/theme/styles/fonts/Noto-Sans-italic/Noto-Sans-italic.svg#NotoSans") format("svg")
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Noto Sans';
|
||||
font-weight: 700;
|
||||
font-style: italic;
|
||||
src: url("/theme/styles/fonts/Noto-Sans-700italic/Noto-Sans-700italic.eot");
|
||||
src: url("/theme/styles/fonts/Noto-Sans-700italic/Noto-Sans-700italic.eot?#iefix") format("embedded-opentype"), local("Noto Sans Bold Italic"), local("Noto-Sans-700italic"), url("/theme/styles/fonts/Noto-Sans-700italic/Noto-Sans-700italic.woff2") format("woff2"), url("/theme/styles/fonts/Noto-Sans-700italic/Noto-Sans-700italic.woff") format("woff"), url("/theme/styles/fonts/Noto-Sans-700italic/Noto-Sans-700italic.ttf") format("truetype"), url("/theme/styles/fonts/Noto-Sans-700italic/Noto-Sans-700italic.svg#NotoSans") format("svg")
|
||||
}
|
9
homepage/theme/static/css/style.css
Normal file
@ -0,0 +1,9 @@
|
||||
section {
|
||||
display: flex;
|
||||
flex-flow: column;
|
||||
}
|
||||
|
||||
section .footnote {
|
||||
padding-top: 30px;
|
||||
order: 100;
|
||||
}
|
BIN
homepage/theme/static/images/favicon.ico
Normal file
After Width: | Height: | Size: 1.1 KiB |
111
homepage/theme/static/images/logo.svg
Normal file
@ -0,0 +1,111 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="165"
|
||||
height="102"
|
||||
viewBox="0 0 43.656248 26.9875"
|
||||
version="1.1"
|
||||
id="svg876"
|
||||
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
|
||||
sodipodi:docname="logo.svg">
|
||||
<defs
|
||||
id="defs870" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="2.8284271"
|
||||
inkscape:cx="17.025315"
|
||||
inkscape:cy="35.503545"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
showguides="false"
|
||||
units="px"
|
||||
inkscape:window-width="1957"
|
||||
inkscape:window-height="829"
|
||||
inkscape:window-x="42"
|
||||
inkscape:window-y="72"
|
||||
inkscape:window-maximized="0" />
|
||||
<metadata
|
||||
id="metadata873">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(0,-270.01246)">
|
||||
<g
|
||||
transform="matrix(0.93794678,0,0,0.93794678,0.15285618,18.564905)"
|
||||
id="g1419"
|
||||
inkscape:label="Layer 1"
|
||||
style="fill:#f7bf08;fill-opacity:1">
|
||||
<g
|
||||
id="g1417"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:24.30451775px;line-height:1.25;font-family:'Caveat Brush';-inkscape-font-specification:'Caveat Brush, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#f7bf08;fill-opacity:1;stroke:none;stroke-width:0.60761291"
|
||||
aria-label="offen">
|
||||
<path
|
||||
id="path1409"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:24.30451775px;font-family:'Caveat Brush';-inkscape-font-specification:'Caveat Brush, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#f7bf08;fill-opacity:1;stroke-width:0.60761291"
|
||||
d="m 5.0254636,287.97574 q -0.1701317,-0.97218 -0.9478762,-0.89927 -0.4374813,0.0243 -0.7534401,0.58331 -0.4374813,0.85066 -0.3888723,2.21171 0.072914,1.33675 0.1944362,1.94436 0.1458271,0.58331 0.4860903,1.02079 0.1944362,0.34026 0.5833085,0.31596 0.6805265,0 0.9964852,-1.14231 l 0.1944361,-0.58331 q 0.1215226,-0.12152 0.048609,-0.24305 0.2430452,-0.60761 0.2673497,-1.43396 -0.2430452,-0.17014 -0.2916542,-0.31596 -0.1458272,-0.41318 -0.1458272,-0.55901 -0.1701316,-0.12152 -0.1944361,-0.46178 -0.024305,-0.34027 -0.048609,-0.43748 z m -4.44772678,2.28462 0.0972181,-1.23953 q 0.17013163,-1.67701 1.02078968,-2.86793 0.8263536,-0.99649 2.3332337,-1.02079 h 0.1458271 q 1.4096621,0 2.0415795,0.60761 0.6805265,0.5347 0.9964853,1.16662 0.3402632,0.63191 0.4374813,0.92357 0.097218,0.29165 0.1215226,0.85066 0.048609,1.04509 -0.4131768,1.19092 0.3402632,2.30893 -0.4131768,3.66998 -0.2430452,0.559 -0.704831,1.21523 -0.3402633,0.43748 -1.2152259,0.48609 -0.8749627,0 -1.5311846,-0.0972 -0.6319175,-0.0972 -1.4096621,-0.60761 -0.7777445,-0.5347 -1.09370324,-1.72562 -0.34026325,-1.14232 -0.41317681,-2.55198 z"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
id="path1411"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:24.30451775px;font-family:'Caveat Brush';-inkscape-font-specification:'Caveat Brush, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#f7bf08;fill-opacity:1;stroke-width:0.60761291"
|
||||
d="m 15.447545,285.52098 0.48609,-0.0243 q 0.704831,0 2.284625,-0.31596 0.04861,-0.19444 0.04861,-0.43748 l 0.121522,-0.60762 q 0,-0.24304 0.145827,-0.87496 0,-0.31596 0.09722,-0.60761 0,-0.24305 0.07291,-0.63192 0.07291,-0.41318 0.121523,-0.89927 0.07291,-0.0972 0.07291,-0.29165 0.0243,-0.21874 0.09722,-0.46179 -0.656222,-0.14583 -1.482575,-0.19443 -1.118008,0.14582 -1.239531,0.26735 -0.534699,0.46178 -0.729135,0.80204 -0.218741,0.36457 -0.510395,1.19093 -0.121523,0.0486 -0.194436,0.38887 -0.04861,0.38887 -0.26735,0.97218 -0.170132,0.46178 -0.291654,1.0694 -0.121523,0.58331 -0.04861,0.70483 0.243045,0 0.388872,-0.0243 0.170132,-0.17013 0.826354,-0.0243 z m 4.909512,4.76369 q -0.07291,0.60761 -0.04861,0.72913 l -0.07291,0.5104 v 0.43748 q 0.04861,1.43396 0.09722,2.01727 0.121522,0.48609 0.121522,0.72914 0,0.43748 -0.680526,0.70483 -0.413177,0.17013 -0.923572,0.17013 -0.510395,0 -0.75344,-0.38887 l -0.170131,-0.58331 -0.09722,-0.559 -0.07291,-0.19444 q 0,-0.12152 -0.07291,-0.34026 l -0.04861,-0.68053 q 0,-0.58331 0.0243,-1.02079 v -0.17013 q 0,-0.0972 0.04861,-0.29166 0.07291,-0.19443 0.0243,-0.46178 0.145827,-1.23953 0.121523,-1.55549 0,-0.31596 0.04861,-0.65622 0.04861,-0.36457 0,-0.72914 0.121523,-0.43748 0.170132,-0.85066 -0.461786,-0.0243 -1.579794,0.0486 -1.215226,0.0729 -2.600583,0.34027 -0.09722,0.29165 -0.121523,0.68052 -0.02431,0.38887 -0.07291,0.99649 -0.04861,0.58331 -0.04861,0.87496 v 0.82635 q -0.07291,0.55901 -0.04861,0.72914 l -0.07291,0.51039 v 0.43749 q 0.04861,1.43396 0.09722,1.99297 0.121522,0.48609 0.121522,0.75344 0,0.41317 -0.680526,0.70483 -0.534699,0.14582 -0.996485,0.14582 -0.437482,0 -0.680527,-0.36456 l -0.170131,-0.58331 -0.09722,-0.58331 -0.07291,-0.19444 q 0,-0.0972 -0.07291,-0.31596 l -0.04861,-0.68052 q 0,-0.60761 0.02431,-1.02079 v -0.17013 q 0,-0.0972 0.04861,-0.29166 0.07291,-0.19443 0.0243,-0.48609 0.145828,-1.21522 0.121523,-1.55549 0,-0.34026 0.04861,-0.65622 0.04861,-0.34026 0,-0.70483 0.07291,-0.34026 0.09722,-0.38887 0.02431,-0.0729 0.07291,-0.46179 h -0.826354 q -0.5833083,0 -0.7291354,-0.0243 -0.704831,0 -0.8992672,-0.38887 -0.1458271,-0.41318 0.1944362,-0.92358 0.048609,-0.12152 0.4131768,-0.14582 0.5590036,0 1.9929706,-0.29166 0.04861,-0.19443 0.04861,-0.34026 l 0.121522,-0.85066 q 0,-0.21874 0.145828,-0.87496 0,-0.31596 0.09722,-0.60761 0,-0.21875 0.07291,-0.72914 0.194436,-0.99649 0.218741,-1.48258 0.170131,-0.31595 0.194436,-0.41317 -0.09722,-0.12153 0.07291,-0.34027 l 0.07291,-0.14582 q 0.04861,-0.29166 0.680527,-0.89927 l 0.631917,-0.36457 q 0.145827,-0.19443 1.166617,-0.51039 0.218741,-0.12153 0.923572,0.0972 0.07291,0.0243 0.413176,0 0.364568,-0.0243 0.559004,0.0486 0.194436,0.0729 0.26735,0.0729 l 0.559004,0.0729 q 1.118008,0.36457 1.604098,0.68053 0.145827,-0.24305 0.388872,-0.46179 0.243046,-0.24304 0.388873,-0.29165 l 0.437481,-0.29166 q 0.26735,-0.29165 1.093703,-0.46178 0.850658,-0.17013 1.458271,0.0243 0.315959,0 0.510395,0.0729 0.194436,0.0729 0.291654,0.0729 l 0.583309,0.0972 q 0.826353,0.34026 0.947876,0.5347 0.121523,0.17013 0.07291,0.34026 -0.291655,0.87496 -1.312444,0.72914 l -1.045095,0.0486 q -0.802049,0.29166 -1.142312,0.99649 -0.413177,0.60761 -0.559004,1.48258 -0.145827,0.85065 -0.218741,1.04509 -0.04861,0.19444 -0.121522,0.43748 -0.07291,0.17013 -0.170132,0.68053 -0.09722,0.48609 -0.0243,0.60761 0.243045,0 0.388872,-0.0243 0.170132,-0.17014 0.826354,-0.0243 l 0.48609,-0.0243 q 1.336748,0 1.628403,0.48609 0.170131,0.24304 -0.02431,0.60761 -0.170131,0.34026 -0.510395,0.46179 l -2.357538,0.29165 -0.75344,0.14583 q -0.121523,0.34026 -0.145827,0.80205 -0.02431,0.46178 -0.07291,0.97218 -0.04861,0.51039 -0.04861,0.77774 z"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
id="path1413"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:24.30451775px;font-family:'Caveat Brush';-inkscape-font-specification:'Caveat Brush, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#f7bf08;fill-opacity:1;stroke-width:0.60761291"
|
||||
d="m 29.329981,286.22581 q -0.04861,-0.12152 -0.340263,-0.0972 -0.26735,0.0243 -0.413177,0.29166 -0.996485,1.57979 -1.069399,3.37832 0.826354,0.19444 1.409663,-0.72913 0.75344,-2.38184 0.413176,-2.84363 z m -1.895752,9.64889 -0.243045,-0.0486 -0.340263,-0.34027 q -0.145828,0 -0.218741,-0.12152 -0.26735,-0.31596 -0.972181,-1.26384 l -0.364568,-1.33674 q 0,-0.38888 -0.145827,-0.68053 -0.243045,-1.0937 -0.291654,-1.23953 -0.04861,-0.17013 -0.07291,-0.89927 0,-0.72913 0.07291,-1.0694 0.07291,-0.46178 0.899267,-2.28462 0.218741,-0.21874 0.26735,-0.58331 l 0.388872,-0.559 q 0.5347,-0.63192 1.142313,-0.92358 0,-0.0486 0.826353,-0.24304 0.170132,-0.0243 0.777745,0.12152 1.458271,0.34027 1.822839,0.85066 l 0.07291,0.12152 q 0.461786,0.65622 0.534699,2.01728 -0.07291,0.60761 -0.121522,1.02079 -0.04861,0.41317 -0.5347,1.50688 -0.364567,0.68052 -0.704831,1.0937 -0.534699,0.38887 -0.729135,0.38887 -0.09722,0.0486 -0.413177,0.0486 h -0.559004 q -0.07291,-0.0243 -0.315958,-0.0243 -0.243046,0 -0.704832,-0.12152 0,0.53469 0.291655,1.53118 0.315958,0.97218 0.510395,1.19092 0.510394,0.38887 0.802049,0.5104 0.291654,0.12152 0.777744,0.0486 0.486091,-0.0972 0.704831,-0.34026 l 0.631918,-0.77774 q 0.607613,-0.82636 1.23953,-0.14583 0.291654,0.31596 0.218741,0.63192 -0.04861,0.29165 -0.486091,1.19092 -0.364567,0.58331 -0.777744,0.97218 -0.75344,0.38887 -0.899267,0.38887 -0.218741,0.0243 -0.680527,-0.0729 -0.243045,0.12152 -0.826353,-0.0243 0,-0.0486 -0.145828,-0.0729 -0.121522,0 -0.340263,-0.0729 l 0.04861,-0.0243 q -0.04861,0 -0.291654,0 l -0.680526,-0.36457 z"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
id="path1415"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:24.30451775px;font-family:'Caveat Brush';-inkscape-font-specification:'Caveat Brush, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#f7bf08;fill-opacity:1;stroke-width:0.60761291"
|
||||
d="m 39.755481,294.2463 -0.145827,-0.41318 -0.26735,-1.6284 q -0.121522,-0.46178 -0.121522,-0.82635 l 0.09722,-1.0694 q 0,-0.26735 0.0243,-0.29165 -0.291654,0 -0.874962,0.70483 -0.04861,0.0729 -0.145827,0.24304 -1.02079,1.6284 -1.215226,3.91303 -0.194436,0.41318 -0.510395,0.41318 -0.656222,-0.14583 -0.729136,-0.14583 l -0.170131,0.0243 h -0.315959 q -0.559004,-0.0486 -0.729136,-0.43748 -0.09722,-0.12152 -0.09722,-0.63192 v -0.34026 l -0.07291,-1.33675 v -1.99297 q 0,-0.34026 -0.04861,-0.85066 -0.04861,-0.559 -0.0243,-1.74992 0.0243,-1.21523 -0.0243,-1.28814 -0.04861,-0.0972 -0.04861,-0.24305 0,-0.14582 0.07291,-0.29165 0.07291,-0.14583 0.656222,-0.31596 0.315959,-0.19443 0.5347,-0.19443 0.340263,0.0729 0.874962,0.29165 0.364568,0.0729 0.364568,0.70483 0.04861,1.04509 0,1.50688 -0.0243,0.46179 0.0243,1.87145 1.798534,-3.45124 3.208196,-4.15607 0.121523,-0.12153 0.364568,-0.12153 0.243045,0 0.559004,0.24305 0.315958,0.24304 0.437481,0.31596 0.121523,0.0729 0.26735,0.24304 0.170131,0.17013 0.267349,0.21874 0.291655,0.48609 0.121523,2.28463 -0.0243,0.26735 -0.04861,0.48609 -0.0243,0.19443 -0.0243,0.87496 0,0.68053 0.0243,0.94788 0.07291,0.85066 0.07291,0.99648 l 0.121523,0.92357 q 0.243045,0.55901 0.243045,0.87497 0.0243,0.29165 0.437482,0.94787 0.170131,0.36457 -0.145828,0.58331 -0.48609,0.24305 -0.534699,0.19444 -0.0243,-0.0243 -0.26735,0.0486 -0.243045,0.0972 -0.874962,0.0486 -0.315959,-0.0729 -0.631918,-0.38888 l -0.364568,-0.36456 q -0.194436,-0.29166 -0.267349,-0.63192 -0.121523,-0.12152 -0.07291,-0.19444 z"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="layer1-3"
|
||||
inkscape:label="Layer 1"
|
||||
transform="matrix(0.11331872,0,0,0.11331872,26.188505,260.73811)"
|
||||
style="fill:#f7bf08;fill-opacity:1">
|
||||
<g
|
||||
transform="translate(218.54583,-14.816667)"
|
||||
id="g2026"
|
||||
style="fill:#f7bf08;fill-opacity:1">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#f7bf08;stroke:none;stroke-width:0.26458332;fill-opacity:1"
|
||||
d="m -120.04445,102.97209 c -5.0673,0.66543 -10.2399,1.16046 -15.08125,2.98503 -2.31801,0.87365 -4.26772,2.46274 -6.34999,3.76872 -3.51923,2.20716 -7.21387,4.57359 -10.00549,7.69012 -2.6108,2.91412 -4.48281,6.69078 -5.88912,10.31478 -1.62676,4.19206 -3.09925,8.78682 -3.73967,13.22917 -0.28356,1.96691 -0.67048,3.79862 -0.42527,5.82083 0.81608,6.72942 5.2337,10.97518 11.06371,13.81972 3.54171,1.72826 6.56828,2.67626 10.58334,2.27462 1.42081,-0.14181 2.81384,-0.53525 4.23333,-0.70749 1.87536,-0.22728 4.01743,-0.25506 5.82083,-0.80936 1.24434,-0.38259 2.26563,-1.1483 3.43958,-1.6727 2.95858,-1.32186 5.8428,-2.55773 8.73125,-4.04416 3.32873,-1.71291 7.00353,-3.0681 10.05417,-5.28611 3.99865,-2.90724 7.14693,-7.86632 9.228667,-12.30577 0.713317,-1.52056 1.024732,-3.1533 1.46685,-4.7625 1.626129,-5.91978 2.2733,-12.1965 -0.201348,-17.99167 -1.131093,-2.64901 -2.927879,-4.60534 -4.937919,-6.61458 -1.36578,-1.36525 -2.77177,-2.72283 -4.49792,-3.63458 -1.97564,-1.04352 -4.44605,-1.36525 -6.61458,-1.74202 -2.29129,-0.39793 -4.5421,-0.6387 -6.87917,-0.33205 z"
|
||||
id="path821" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#f7bf08;stroke:none;stroke-width:0.26458332;fill-opacity:1"
|
||||
d="m -87.236113,107.73459 c 0.474398,1.6465 1.360752,3.16997 1.997869,4.7625 1.198033,2.99482 2.078567,6.08542 2.652448,9.26042 1.419489,7.8568 0.639498,16.54096 -2.008452,24.07708 -1.405467,4.00077 -3.471598,7.76896 -5.171811,11.64167 -2.696633,6.14283 -4.963847,12.4423 -10.699221,16.46105 -1.14141,0.79957 -2.46009,1.14618 -3.70417,1.73831 -3.53986,1.68461 -7.73456,3.34407 -11.64166,3.95579 -1.40256,0.2196 -2.8067,-0.31803 -4.23334,-0.11536 -5.20858,0.74057 -10.01156,1.84997 -15.34583,1.48431 -5.99202,-0.41063 -12.2256,-2.15688 -17.4625,-5.11545 -1.72863,-0.97658 -3.41312,-2.01745 -5.02708,-3.17606 -1.22248,-0.87762 -2.31032,-1.94257 -3.70417,-2.53259 1.00682,2.25901 3.10904,3.51393 4.71657,5.29272 3.65559,4.04522 7.32859,8.05763 11.42698,11.67501 4.2635,3.76343 8.24389,8.47804 13.75437,10.45686 3.38984,1.21735 6.7728,1.4605 10.31875,1.70339 2.95778,0.2024 6.02588,0.49265 8.99583,0.19553 5.61763,-0.56145 11.09213,-2.96202 16.139584,-5.34432 3.975629,-1.87669 7.875058,-3.67639 11.067521,-6.82731 5.699389,-5.62478 9.200091,-12.18565 12.162631,-19.53313 1.687777,-4.18544 3.258608,-8.4291 3.712104,-12.96458 0.295275,-2.9509 -0.153458,-6.31085 -0.438944,-9.26042 -0.582083,-6.01319 -1.859227,-11.61944 -4.24471,-17.19792 -1.382448,-3.23321 -3.267869,-6.14389 -4.823354,-9.26042 -1.415786,-2.83686 -3.098007,-5.42687 -5.031317,-7.9375 -0.985044,-1.27926 -1.917435,-2.72812 -3.408098,-3.43958 z"
|
||||
id="path853" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 15 KiB |
BIN
homepage/theme/static/images/offen-logo-social-media.jpg
Normal file
After Width: | Height: | Size: 45 KiB |
1
homepage/theme/static/styles
Symbolic link
@ -0,0 +1 @@
|
||||
./../../../styles
|
40
homepage/theme/templates/base.html
Normal file
@ -0,0 +1,40 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<title>{% block title %}{% endblock %}</title>
|
||||
<meta charset="UTF-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
|
||||
<meta name="description" content="{{ page.description }}">
|
||||
<meta property="og:site_name" content="{{ SITENAME }}">
|
||||
<meta property="og:locale" content="{{ DEFAULT_LANG }}">
|
||||
<meta property="og:title" content="{{ page.title }}">
|
||||
<meta property="og:description" content="{{ page.description }}">
|
||||
<meta property="og:type" content="website">
|
||||
<meta property="og:url" content="{{ SITEURL }}/{{ page.save_as }}">
|
||||
<meta property="og:image" content="{{ SITEURL }}/theme/images/offen-logo-social-media.jpg">
|
||||
<meta name="twitter:image:alt" content="offen logo">
|
||||
<meta name="twitter:card" content="summary_large_image">
|
||||
<link rel="canonical" href="{{ SITEURL }}/{{ page.save_as }}">
|
||||
<link rel="shortcut icon" type="image/x-icon" href="/theme/images/favicon.ico">
|
||||
<link rel="stylesheet" type="text/css" href="/theme/css/fonts.css">
|
||||
<link rel="stylesheet" type="text/css" href="/theme/styles/index.css">
|
||||
<link rel="stylesheet" type="text/css" href="/theme/css/style.css">
|
||||
{% if OFFEN_ACCOUNT_ID %}
|
||||
<script async src="https://script-alpha.offen.dev/script.js" data-account-id="{{ OFFEN_ACCOUNT_ID }}"></script>
|
||||
{% endif %}
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div class="wrapper">
|
||||
<header>
|
||||
<a href="/" title="offen home page" alt="offen home page">
|
||||
<img src="/theme/images/logo.svg" alt="offen logo" width="165" height="102" class="logo">
|
||||
</a>
|
||||
</header>
|
||||
|
||||
{% block content %}{% endblock %}
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
50
homepage/theme/templates/page.html
Normal file
@ -0,0 +1,50 @@
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% block title %}
|
||||
{{ page.title }}
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<section>
|
||||
{% block before_content %}
|
||||
<h1>
|
||||
<strong>offen</strong> is a free and open source analytics software for websites and web applications that allows respectful handling of data.
|
||||
</h1>
|
||||
{% endblock %}
|
||||
{% block page_content %}
|
||||
{{ page.content }}
|
||||
{% endblock %}
|
||||
{% block after_content %}
|
||||
<nav class="navigation-wrapper">
|
||||
<div class="button-wrapper btn-fill-space">
|
||||
{% if page.href != "/deep-dive/" %}
|
||||
<a class="btn btn-color-grey" href="/deep-dive/">
|
||||
Deep dive
|
||||
</a>
|
||||
{% endif %}
|
||||
{% if page.href != "/" %}
|
||||
<a class="btn btn-color-grey" href="/">
|
||||
Summary
|
||||
</a>
|
||||
{% endif %}
|
||||
{% if page.href != "/status/" %}
|
||||
<a class="btn btn-color-grey" href="/status/">
|
||||
Status
|
||||
</a>
|
||||
{% endif %}
|
||||
<a class="btn btn-color-orange" href="mailto:{{CONTACT_EMAIL}}">
|
||||
Contact
|
||||
</a>
|
||||
</div>
|
||||
<div class="button-wrapper btn-fill-space">
|
||||
<a class="btn btn-color-orange" href="{{GITHUB_ORG}}" target="_blank">
|
||||
Get involved
|
||||
</a>
|
||||
<a class="btn btn-color-orange" href="{{PATREON_URL}}" target="_blank">
|
||||
Support us
|
||||
</a>
|
||||
</div>
|
||||
</nav>
|
||||
{% endblock %}
|
||||
</section>
|
||||
{% endblock %}
|
94
styles/fonts/LICENSE
Normal file
@ -0,0 +1,94 @@
|
||||
Copyright 2018 The Noto Project Authors (github.com/googlei18n/noto-fonts)
|
||||
|
||||
This Font Software is licensed under the SIL Open Font License,
|
||||
Version 1.1.
|
||||
|
||||
This license is copied below, and is also available with a FAQ at:
|
||||
http://scripts.sil.org/OFL
|
||||
|
||||
-----------------------------------------------------------
|
||||
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
||||
-----------------------------------------------------------
|
||||
|
||||
PREAMBLE
|
||||
The goals of the Open Font License (OFL) are to stimulate worldwide
|
||||
development of collaborative font projects, to support the font
|
||||
creation efforts of academic and linguistic communities, and to
|
||||
provide a free and open framework in which fonts may be shared and
|
||||
improved in partnership with others.
|
||||
|
||||
The OFL allows the licensed fonts to be used, studied, modified and
|
||||
redistributed freely as long as they are not sold by themselves. The
|
||||
fonts, including any derivative works, can be bundled, embedded,
|
||||
redistributed and/or sold with any software provided that any reserved
|
||||
names are not used by derivative works. The fonts and derivatives,
|
||||
however, cannot be released under any other type of license. The
|
||||
requirement for fonts to remain under this license does not apply to
|
||||
any document created using the fonts or their derivatives.
|
||||
|
||||
DEFINITIONS
|
||||
"Font Software" refers to the set of files released by the Copyright
|
||||
Holder(s) under this license and clearly marked as such. This may
|
||||
include source files, build scripts and documentation.
|
||||
|
||||
"Reserved Font Name" refers to any names specified as such after the
|
||||
copyright statement(s).
|
||||
|
||||
"Original Version" refers to the collection of Font Software
|
||||
components as distributed by the Copyright Holder(s).
|
||||
|
||||
"Modified Version" refers to any derivative made by adding to,
|
||||
deleting, or substituting -- in part or in whole -- any of the
|
||||
components of the Original Version, by changing formats or by porting
|
||||
the Font Software to a new environment.
|
||||
|
||||
"Author" refers to any designer, engineer, programmer, technical
|
||||
writer or other person who contributed to the Font Software.
|
||||
|
||||
PERMISSION & CONDITIONS
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of the Font Software, to use, study, copy, merge, embed,
|
||||
modify, redistribute, and sell modified and unmodified copies of the
|
||||
Font Software, subject to the following conditions:
|
||||
|
||||
1) Neither the Font Software nor any of its individual components, in
|
||||
Original or Modified Versions, may be sold by itself.
|
||||
|
||||
2) Original or Modified Versions of the Font Software may be bundled,
|
||||
redistributed and/or sold with any software, provided that each copy
|
||||
contains the above copyright notice and this license. These can be
|
||||
included either as stand-alone text files, human-readable headers or
|
||||
in the appropriate machine-readable metadata fields within text or
|
||||
binary files as long as those fields can be easily viewed by the user.
|
||||
|
||||
3) No Modified Version of the Font Software may use the Reserved Font
|
||||
Name(s) unless explicit written permission is granted by the
|
||||
corresponding Copyright Holder. This restriction only applies to the
|
||||
primary font name as presented to the users.
|
||||
|
||||
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
||||
Software shall not be used to promote, endorse or advertise any
|
||||
Modified Version, except to acknowledge the contribution(s) of the
|
||||
Copyright Holder(s) and the Author(s) or with their explicit written
|
||||
permission.
|
||||
|
||||
5) The Font Software, modified or unmodified, in part or in whole,
|
||||
must be distributed entirely under this license, and must not be
|
||||
distributed under any other license. The requirement for fonts to
|
||||
remain under this license does not apply to any document created using
|
||||
the Font Software.
|
||||
|
||||
TERMINATION
|
||||
This license becomes null and void if any of the above conditions are
|
||||
not met.
|
||||
|
||||
DISCLAIMER
|
||||
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
||||
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
||||
OTHER DEALINGS IN THE FONT SOFTWARE.
|
BIN
styles/fonts/Noto-Sans-400/Noto-Sans-400.eot
Normal file
24247
styles/fonts/Noto-Sans-400/Noto-Sans-400.svg
Normal file
After Width: | Height: | Size: 1.8 MiB |
BIN
styles/fonts/Noto-Sans-400/Noto-Sans-400.ttf
Normal file
BIN
styles/fonts/Noto-Sans-400/Noto-Sans-400.woff
Normal file
BIN
styles/fonts/Noto-Sans-400/Noto-Sans-400.woff2
Normal file
BIN
styles/fonts/Noto-Sans-700/Noto-Sans-700.eot
Normal file
24108
styles/fonts/Noto-Sans-700/Noto-Sans-700.svg
Normal file
After Width: | Height: | Size: 1.7 MiB |
BIN
styles/fonts/Noto-Sans-700/Noto-Sans-700.ttf
Normal file
BIN
styles/fonts/Noto-Sans-700/Noto-Sans-700.woff
Normal file
BIN
styles/fonts/Noto-Sans-700/Noto-Sans-700.woff2
Normal file
BIN
styles/fonts/Noto-Sans-700italic/Noto-Sans-700iItalic.eot
Normal file
24727
styles/fonts/Noto-Sans-700italic/Noto-Sans-700iItalic.svg
Normal file
After Width: | Height: | Size: 1.6 MiB |
BIN
styles/fonts/Noto-Sans-700italic/Noto-Sans-700iItalic.ttf
Normal file
BIN
styles/fonts/Noto-Sans-700italic/Noto-Sans-700iItalic.woff
Normal file
BIN
styles/fonts/Noto-Sans-700italic/Noto-Sans-700iItalic.woff2
Normal file
BIN
styles/fonts/Noto-Sans-italic/Noto-Sans-italic.eot
Normal file
19073
styles/fonts/Noto-Sans-italic/Noto-Sans-italic.svg
Normal file
After Width: | Height: | Size: 1.3 MiB |
BIN
styles/fonts/Noto-Sans-italic/Noto-Sans-italic.ttf
Normal file
BIN
styles/fonts/Noto-Sans-italic/Noto-Sans-italic.woff
Normal file
BIN
styles/fonts/Noto-Sans-italic/Noto-Sans-italic.woff2
Normal file
422
styles/index.css
Normal file
@ -0,0 +1,422 @@
|
||||
/* Typo
|
||||
------------------------------------------------------------- */
|
||||
body {
|
||||
padding: 50px;
|
||||
background-color: #fff;
|
||||
color: #898989;
|
||||
font: 18px/1.5 "Noto Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
|
||||
font-size: 18px;
|
||||
line-height: 1.5;
|
||||
font-weight: 400;
|
||||
}
|
||||
|
||||
h1,
|
||||
h2,
|
||||
h3,
|
||||
h4 {
|
||||
color: #404040;
|
||||
font-size: 28px;
|
||||
line-height: 1.4;
|
||||
font-weight: 400;
|
||||
margin: 0 0 40px 0;
|
||||
}
|
||||
|
||||
h3,
|
||||
h4 {
|
||||
font-size: 18px;
|
||||
margin: 30px 0 20px 0;
|
||||
}
|
||||
|
||||
.section-auditorium h3 {
|
||||
margin: 0 0 10px 0;
|
||||
}
|
||||
|
||||
h4 {
|
||||
color: #898989;
|
||||
margin: 30px 0 6px 0;
|
||||
}
|
||||
|
||||
.section-auditorium h4 {
|
||||
margin: 30px 0 20px 0;
|
||||
}
|
||||
|
||||
|
||||
/* Links
|
||||
------------------------------------------------------------- */
|
||||
a,
|
||||
a:hover,
|
||||
a:focus {
|
||||
color: #898989;
|
||||
text-decoration: none;
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
button {
|
||||
cursor: pointer;
|
||||
font: inherit;
|
||||
font-size: inherit;
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
h1 a,
|
||||
h1 a:hover,
|
||||
h1 a:focus {
|
||||
color: #f7bf08;
|
||||
text-decoration: none;
|
||||
font-weight: 400;
|
||||
}
|
||||
|
||||
small a,
|
||||
small a:hover,
|
||||
small a:focus {
|
||||
color: #898989;
|
||||
text-decoration: none;
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
sup {
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
sup a,
|
||||
sup a:hover,
|
||||
sup a:focus {
|
||||
color: #cfcfcf;
|
||||
}
|
||||
|
||||
ol {
|
||||
padding-inline-start: 20px;
|
||||
}
|
||||
|
||||
ol li p a,
|
||||
ol li p a:hover,
|
||||
ol li p a:focus {
|
||||
color: #cfcfcf;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/* Typo Elements
|
||||
------------------------------------------------------------- */
|
||||
.logo {
|
||||
margin: -20px 0 0 0;
|
||||
}
|
||||
|
||||
blockquote {
|
||||
border-left: 1px solid #e5e5e5;
|
||||
margin: 0;
|
||||
padding: 0 0 0 20px;
|
||||
font-style: italic
|
||||
}
|
||||
|
||||
hr {
|
||||
border-top: 1px solid #d5d5d5;
|
||||
height: 0;
|
||||
margin: 80px 0 0 0;
|
||||
}
|
||||
|
||||
.footnote hr {
|
||||
border: 0;
|
||||
height: 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
blockquote {
|
||||
border-left: 1px solid #d5d5d5;
|
||||
margin: 40px 0 40px 0;
|
||||
}
|
||||
|
||||
strong {
|
||||
font-weight: 700
|
||||
}
|
||||
|
||||
strong,
|
||||
h1 strong,
|
||||
h2 strong,
|
||||
h3 strong {
|
||||
color: #404040;
|
||||
text-decoration: none;
|
||||
font-weight: 400;
|
||||
}
|
||||
|
||||
h1 strong,
|
||||
h2 strong,
|
||||
h3 strong {
|
||||
color: #898989;
|
||||
}
|
||||
|
||||
tbody,
|
||||
h4 strong {
|
||||
color: #404040;
|
||||
text-decoration: none;
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
h4 strong {
|
||||
font-size: 36px;
|
||||
}
|
||||
|
||||
|
||||
/* Buttons
|
||||
------------------------------------------------------------- */
|
||||
.btn {
|
||||
-webkit-border-radius: 0;
|
||||
-moz-border-radius: 0;
|
||||
border-radius: 0px;
|
||||
padding: 6px;
|
||||
text-align: center;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.btn-color-grey,
|
||||
.btn-color-grey:visited,
|
||||
.btn-color-grey:link {
|
||||
background: #fff;
|
||||
color: #898989;
|
||||
border: solid #898989 5px;
|
||||
}
|
||||
|
||||
.btn-color-orange,
|
||||
.btn-color-orange:visited,
|
||||
.btn-color-orange:link {
|
||||
background: #fff;
|
||||
color: #F7BF08;
|
||||
border: solid #F7BF08 5px;
|
||||
}
|
||||
|
||||
.btn-color-grey:hover,
|
||||
.btn-color-grey:active {
|
||||
background: #898989;
|
||||
color: #fff;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.btn-color-orange:hover,
|
||||
.btn-color-orange:active {
|
||||
background: #F7BF08;
|
||||
color: #fff;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.btn {
|
||||
margin: 0 0 15px 0;
|
||||
}
|
||||
|
||||
.button-wrapper {
|
||||
display: flex;
|
||||
flex-flow: column wrap;
|
||||
justify-content: space-around;
|
||||
}
|
||||
|
||||
.navigation-wrapper {
|
||||
margin: 60px 0 0 0;
|
||||
}
|
||||
|
||||
@media (min-width: 480px) {
|
||||
.button-wrapper {
|
||||
align-items: center;
|
||||
flex-flow: row wrap;
|
||||
-ms-flex-flow: row wrap;
|
||||
-webkit-flex-flow: row wrap;
|
||||
}
|
||||
.btn {
|
||||
flex-grow: 1;
|
||||
}
|
||||
.btn {
|
||||
margin: 0 15px 15px 0;
|
||||
}
|
||||
.btn:last-of-type {
|
||||
margin: 0 0 15px 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/* Custom Underline
|
||||
------------------------------------------------------------- */
|
||||
em {
|
||||
color: #898989;
|
||||
background: linear-gradient(transparent 66%, #fde28c 66%);
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/* Layout
|
||||
------------------------------------------------------------- */
|
||||
.wrapper {
|
||||
width: 860px;
|
||||
margin: 0 auto
|
||||
}
|
||||
|
||||
header {
|
||||
width: 270px;
|
||||
float: left;
|
||||
position: fixed;
|
||||
-webkit-font-smoothing: subpixel-antialiased
|
||||
}
|
||||
|
||||
section,
|
||||
section-auditorium {
|
||||
float: right;
|
||||
width: 600px;
|
||||
padding: 0 0 40px 0;
|
||||
}
|
||||
|
||||
section > p,
|
||||
section-auditorium > p {
|
||||
margin: 0 0 20px 0;
|
||||
}
|
||||
|
||||
section > p:last-child,
|
||||
section-auditorium > p:last-child {
|
||||
margin: 0 0 60px 0;
|
||||
}
|
||||
|
||||
.row {
|
||||
display: flex;
|
||||
justify-content: flex-start;
|
||||
}
|
||||
|
||||
.row h4:first-child {
|
||||
margin-right: 30px;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/* Tables
|
||||
------------------------------------------------------------- */
|
||||
.table-full-width {
|
||||
box-sizing: border-box
|
||||
}
|
||||
|
||||
td {
|
||||
padding-right: 30px;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/* Footer
|
||||
------------------------------------------------------------- */
|
||||
footer {
|
||||
width: 270px;
|
||||
float: left;
|
||||
position: fixed;
|
||||
bottom: 100px;
|
||||
-webkit-font-smoothing: subpixel-antialiased
|
||||
}
|
||||
|
||||
.footnote {
|
||||
color: #d5d5d5;
|
||||
font-size: 14px;
|
||||
margin: 20px 0 0 0;
|
||||
}
|
||||
|
||||
.footnote ol {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.footer-list {
|
||||
list-style-type: none;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.footer-list li {
|
||||
display: inline-block;
|
||||
font-size: 14px;
|
||||
margin-right: 0.14em;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/* Media Queries
|
||||
------------------------------------------------------------- */
|
||||
@media screen and (max-width: 960px) {
|
||||
div.wrapper {
|
||||
width: auto;
|
||||
margin: 0
|
||||
}
|
||||
header,
|
||||
section,
|
||||
section-auditorium,
|
||||
footer {
|
||||
float: none;
|
||||
position: static;
|
||||
width: auto
|
||||
}
|
||||
header {
|
||||
padding-right: 320px
|
||||
}
|
||||
section,
|
||||
section-auditorium {
|
||||
border: none;
|
||||
width: auto;
|
||||
padding: 0 0 0 0;
|
||||
margin: 40px 0 40px 0;
|
||||
}
|
||||
section > p:first-child,
|
||||
section > p:last-child,
|
||||
section-auditorium > p:first-child,
|
||||
section-auditorium > p:last-child {
|
||||
margin: 0 0 40px 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@media screen and (max-width: 480px) {
|
||||
body {
|
||||
font-size: 14px;
|
||||
line-height: 1.3;
|
||||
padding: 15px;
|
||||
word-wrap: break-word;
|
||||
}
|
||||
h1,
|
||||
h2 {
|
||||
font-size: 20px;
|
||||
line-height: 1.3;
|
||||
margin: 0 0 20px 0;
|
||||
}
|
||||
h3,
|
||||
h4 {
|
||||
font-size: 14px;
|
||||
line-height: 1.3;
|
||||
margin: 30px 0 15px 0;
|
||||
}
|
||||
h4 strong {
|
||||
font-size: 28px;
|
||||
}
|
||||
header {
|
||||
padding: 0
|
||||
}
|
||||
.logo {
|
||||
margin: 0;
|
||||
}
|
||||
hr {
|
||||
margin: 60px 0 0 0;
|
||||
}
|
||||
blockquote {
|
||||
margin: 15px 0 15px 0;
|
||||
}
|
||||
.row {
|
||||
justify-content: space-between;
|
||||
}
|
||||
.row h4:first-child {
|
||||
margin-right: 0;
|
||||
}
|
||||
.table-full-width {
|
||||
width: 100%;
|
||||
}
|
||||
td {
|
||||
padding-right: 0;
|
||||
}
|
||||
}
|
||||
|