Browse Source

initial commit of hugo site

pull/96/head
jonathanspw 2 years ago
parent
commit
cf83bc8ee3
No known key found for this signature in database GPG Key ID: 773CFABA46017A2E
  1. 37
      .editorconfig
  2. 20
      .env.dist
  3. 7
      .gitignore
  4. 5
      .mypy.ini
  5. 3
      .venv/.gitignore
  6. 60
      CONTRIBUTING.md
  7. 32
      Dockerfile
  8. 25
      Dockerfile-frontend
  9. 35
      Dockerfile-production
  10. 19
      LICENSE
  11. 145
      Makefile
  12. 21
      Pipfile
  13. 347
      Pipfile.lock
  14. 13
      README.DEPLOY.md
  15. 48
      README.md
  16. 38
      almalinux/admin.py
  17. 5
      almalinux/apps.py
  18. 16
      almalinux/asgi.py
  19. 188
      almalinux/settings.py
  20. 42
      almalinux/urls.py
  21. 16
      almalinux/wsgi.py
  22. 15
      ansible/.editorconfig
  23. 1
      ansible/.gitignore
  24. 8
      ansible/ansible.cfg
  25. 1
      ansible/files/ssh/id_rsa.eugene.pub
  26. 1
      ansible/files/ssh/id_rsa.iselets.ainode.pub
  27. 1
      ansible/files/ssh/id_rsa.iseletsk.pub
  28. 1
      ansible/files/ssh/id_rsa.jack.pub
  29. 1
      ansible/files/ssh/id_rsa.leonid.pub
  30. 1
      ansible/files/ssh/id_rsa.matiss.pub
  31. 22
      ansible/group_vars/all.yml
  32. 1
      ansible/group_vars/production_web_servers.yml
  33. 1
      ansible/group_vars/staging_web_servers.yml
  34. 9
      ansible/hosts
  35. 8
      ansible/roles/commons/handlers/main.yml
  36. 33
      ansible/roles/commons/tasks/journal.yml
  37. 20
      ansible/roles/commons/tasks/main.yml
  38. 12
      ansible/roles/commons/tasks/packages.yml
  39. 8
      ansible/roles/commons/tasks/services.yml
  40. 42
      ansible/roles/commons/tasks/users.yml
  41. 8
      ansible/roles/website/files/dhparam.pem
  42. 62
      ansible/roles/website/files/docker.repo
  43. 3
      ansible/roles/website/files/le-nginx-reload.sh
  44. 59
      ansible/roles/website/files/nginx.conf
  45. 152
      ansible/roles/website/files/nginx.conf.d/almalinux.org.conf
  46. 8
      ansible/roles/website/files/nginx.repo
  47. 2
      ansible/roles/website/files/security.txt
  48. 6
      ansible/roles/website/files/tempcrt.sh
  49. 12
      ansible/roles/website/handlers/main.yml
  50. 37
      ansible/roles/website/tasks/docker.yml
  51. 5
      ansible/roles/website/tasks/main.yml
  52. 82
      ansible/roles/website/tasks/nginx.yml
  53. 32
      ansible/roles/website/tasks/users.yml
  54. 84
      ansible/roles/website/tasks/website.yml
  55. 3
      ansible/roles/website/templates/web_authorized_keys.jinja2
  56. 11
      ansible/site.yml
  57. 6
      archetypes/default.md
  58. 838
      assets/css/bundle.css
  59. 1
      assets/css/bundle.css.map
  60. BIN
      assets/images/AlmaLinux_9.1.png
  61. BIN
      assets/images/profile.png
  62. 0
      assets/js/blog.js
  63. 8
      assets/js/main.js
  64. 32
      assets/js/member.js
  65. 1
      assets/js/page_index/main.js
  66. 154
      assets/scss/blog.css
  67. 1
      assets/scss/blog.css.map
  68. 47
      assets/scss/blog.scss
  69. 1
      assets/scss/bootstrap.css
  70. 1
      assets/scss/bootstrap.css.map
  71. 0
      assets/scss/bootstrap.scss
  72. 23
      assets/scss/contribute.css
  73. 1
      assets/scss/contribute.css.map
  74. 6
      assets/scss/contribute.scss
  75. 35
      assets/scss/elevate.css
  76. 1
      assets/scss/elevate.css.map
  77. 20
      assets/scss/elevate.scss
  78. 1
      assets/scss/functions.css
  79. 1
      assets/scss/functions.css.map
  80. 0
      assets/scss/functions.scss
  81. 189
      assets/scss/home.css
  82. 1
      assets/scss/home.css.map
  83. 79
      assets/scss/home.scss
  84. 841
      assets/scss/main.css
  85. 1
      assets/scss/main.css.map
  86. 435
      assets/scss/main.scss
  87. 43
      assets/scss/members.css
  88. 1
      assets/scss/members.css.map
  89. 12
      assets/scss/members.scss
  90. 1
      assets/scss/partials/common/footer.css
  91. 1
      assets/scss/partials/common/footer.css.map
  92. 0
      assets/scss/partials/common/footer.scss
  93. 1
      assets/scss/partials/common/header.css
  94. 1
      assets/scss/partials/common/header.css.map
  95. 0
      assets/scss/partials/common/header.scss
  96. 1
      assets/scss/variables.css
  97. 1
      assets/scss/variables.css.map
  98. 0
      assets/scss/variables.scss
  99. 3
      commons/__init__.py
  100. 5
      commons/apps.py

37
.editorconfig

@ -1,37 +0,0 @@
root = true
[*]
end_of_line = lf
insert_final_newline = true
charset = utf-8
[*.py]
indent_style = space
indent_size = 4
ij_continuation_indent_size = 4
[*.js]
indent_style = space
indent_size = 4
ij_continuation_indent_size = 4
[*.scss]
indent_style = space
indent_size = 2
[*.html]
indent_style = space
indent_size = 4
ij_continuation_indent_size = 4
[{*.yml, *.yaml}]
indent_style = space
indent_size = 2
[*.svg]
indent_style = space
indent_size = 2
[{package.json, tsconfig.json}]
indent_style = space
indent_size = 4

20
.env.dist

@ -1,20 +0,0 @@
# Configuration defaults for AlmaLinux website software.
# `make dev` will automatically copy this file to `.env` if target is not present with development
# environment appropriate and specific defaults.
# Django secret key
SECRET_KEY=CHANGE_ME
# Is debugging enabled? False for production
DEBUG=true
# Database settings
DB_ENGINE=django.db.backends.mysql
DB_NAME=devel
DB_USER=devel
DB_PASSWORD=devel
DB_HOST=mariadb
DB_PORT=3306
# Path to media, empty for default
MEDIA_ROOT=
# HubSpot subscription API key
HUBSPOT_APIKEY=changeme
HUBSPOT_SUB_ID=changeme

7
.gitignore

@ -1,7 +0,0 @@
node_modules
db.sqlite3
static/build
public/
*.mo
tmp
.env

5
.mypy.ini

@ -1,5 +0,0 @@
[mypy]
disallow_untyped_calls = True
disallow_untyped_defs = True
disallow_untyped_decorators = True
disallow_incomplete_defs = True

3
.venv/.gitignore

@ -1,3 +0,0 @@
# Keep .venv around in the project source to avoid pipenv creating new user-local venvs
*
!.gitignore

60
CONTRIBUTING.md

@ -1,60 +0,0 @@
# Contributing
If you are interested in making a contribution there are a few ways you could help out the project.
## Filing issues
You are free to use [GitHub issues](https://github.com/AlmaLinux/almalinux.org/issues) to submit bugs and for
discussions related to the codebase.
### Reporting a Bug
Good bug reports can be very helpful. A bug is a demonstrable problem with the code or functionality.
Please use the [GitHub issues](https://github.com/AlmaLinux/almalinux.org/issues) and check if the issue has
already been reported.
A good bug report should be as detailed as possible, so that others won't have to follow up for the essential details.
- Submit a bug in [GitHub issues](https://github.com/AlmaLinux/almalinux.org/issues)
### Requesting a Feature
1. [Search the issues](https://github.com/AlmaLinux/almalinux.org/issues) for any previous requests for the same
feature, and give a thumbs up or +1 on existing requests.
1. If no previous requests exist, create a new issue. Please be as clear as possible about why the feature is needed and
the intended use case.
- Request a feature in [GitHub issues](https://github.com/AlmaLinux/almalinux.org/issues)
## Contributing code
If you plan to propose code changes it is required you create
an [issue](https://github.com/AlmaLinux/almalinux.org/issues) with a brief proposal and discuss it with
us first.
This is necessary to avoid more than one contributor working on the same feature/change and to avoid someone from
spending time on feature/change that would not be merged for any reason.
For smaller contributions use this workflow:
* Create an [issue](https://github.com/AlmaLinux/almalinux.org/issues) describing the changes.
* Await confirmation from contributors.
* Fork the project.
* Create a branch for your feature or bug fix.
* Add code changes, relevant documentation, etc.
* Send a pull request.
After one of the contributors has checked and approved the changes, they will be merged into master branch and will be
included in the next deployment.
## Approval of changes
Before any changes can be merged:
- All minor or cosmetic changes (typos, minor styling, etc) can be approved and merged by any contributor with master
merge rights,
- All non-cosmetic changes to the website requires the approval of the Web Team lead and at least one other Web Team
member.
- All major changes that are not purely technical, and fundamental changes in technology requires the approval of the
AlmaLinux OS Community Manager.

32
Dockerfile

@ -1,32 +0,0 @@
# Docker image for local development environment.
# You should NOT publish this image, it is intended for local use only.
FROM almalinux/almalinux:8
ARG LOCAL_UID
ARG LOCAL_GID
ARG LOCAL_USER=web
RUN groupadd -g $LOCAL_GID -o $LOCAL_USER
RUN useradd -m -u $LOCAL_UID -g $LOCAL_GID -o -s /bin/bash $LOCAL_USER
RUN dnf -y install \
gcc \
make \
gettext \
python38 \
python38-devel \
mariadb-devel
RUN pip3 install pipenv
# Work around IDEA remote interpreter not able to work with remote virtualenvs
RUN touch /root/.bashrc \
&& echo 'if [[ -f "/app/.venv/bin/activate" ]]; then source /app/.venv/bin/activate; fi' >> /root/.bashrc
RUN touch /home/web/.bashrc \
&& echo 'if [[ -f "/app/.venv/bin/activate" ]]; then source /app/.venv/bin/activate; fi' >> /home/web/.bashrc
WORKDIR /app
CMD make runserver

25
Dockerfile-frontend

@ -1,25 +0,0 @@
# Docker image for local development environment.
# You should NOT publish this image, it is intended for local use only.
FROM almalinux/almalinux:8
ARG LOCAL_UID
ARG LOCAL_GID
ARG LOCAL_USER=web
RUN groupadd -g $LOCAL_GID -o $LOCAL_USER
RUN useradd -m -u $LOCAL_UID -g $LOCAL_GID -o -s /bin/bash $LOCAL_USER
RUN dnf -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm && \
dnf -y install yum-utils && \
curl -fsSL https://rpm.nodesource.com/setup_15.x | bash - && \
curl -sL https://dl.yarnpkg.com/rpm/yarn.repo | tee /etc/yum.repos.d/yarn.repo
RUN dnf -y install \
make \
gcc-c++ \
nodejs \
yarn
WORKDIR /app
CMD make frontend-runserver

35
Dockerfile-production

@ -1,35 +0,0 @@
# Docker image for production environment.
# You should NOT publish this image.
FROM almalinux/almalinux:8
RUN groupadd -g 900 web && \
useradd -d /app -M -r -s /bin/bash web -g 900 -u 900
RUN dnf -y install \
gcc \
make \
gettext \
python38 \
python38-devel \
mariadb-devel
COPY tmp/deploy /app
WORKDIR /app
# Use our local env
ENV PYTHONPATH=/app/.local/lib/python3.8/site-packages:$PYTHONPATH
ENV PATH=/app/.local/bin:$PATH
# Remove static images from build
RUN rm -rf /app/public/* \
# Fix perms
&& chown web:web -Rf /app \
# Install dependencies
&& su - web -c 'pip3 install -r requirements.txt --user' \
# Cleanup dependencies
&& dnf -y remove gcc \
&& dnf -y clean all \
&& rm -rf /var/cache/yum
CMD su web -c 'make uwsgi'

19
LICENSE

@ -1,19 +0,0 @@
Copyright (c) 2021 AlmaLinux OS Foundation
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

145
Makefile

@ -1,145 +0,0 @@
ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
CURRENT_UID ?= $(shell id -u)
CURRENT_GID ?= $(shell id -g)
TARGET_REPO ?= "git@github.com:AlmaLinux/almalinux.org.git"
TARGET_BRANCH ?= "master"
.PHONY: default
default: dev ;
dev: #: Start development environment
cp -n .env.dist .env
LOCAL_UID=${CURRENT_UID} LOCAL_GID=${CURRENT_GID} docker-compose up --abort-on-container-exit
build-dev: #: Build development Docker images
LOCAL_UID=${CURRENT_UID} LOCAL_GID=${CURRENT_GID} docker-compose build web
LOCAL_UID=${CURRENT_UID} LOCAL_GID=${CURRENT_GID} docker-compose build frontend
clean-dev: #: Clean development environment, remove docker images and data
LOCAL_UID=${CURRENT_UID} LOCAL_GID=${CURRENT_GID} docker-compose down --rmi local -v
mypy: #: Run mypy static type checker for Python modules
LOCAL_UID=${CURRENT_UID} LOCAL_GID=${CURRENT_GID} docker-compose run -u ${CURRENT_UID} web pipenv run mypy almalinux www commons
web-shell: #: Enter backend shell within docker, as a regular user, new service instance
LOCAL_UID=${CURRENT_UID} LOCAL_GID=${CURRENT_GID} docker-compose run -u ${CURRENT_UID} web /bin/bash
web-root-shell: #: Enter backend shell within docker, as root, new service instance
LOCAL_UID=${CURRENT_UID} LOCAL_GID=${CURRENT_GID} docker-compose run web /bin/bash
web-attach: #: Attach to backend shell within docker, as a regular user, running instance
docker exec -ti -u ${CURRENT_UID} web /bin/bash
web-root-attach: #: Attach to backend shell within docker, as root, running instance
docker exec -ti web /bin/bash
messages: #: Update message files for all translations in known domains
LOCAL_UID=${CURRENT_UID} LOCAL_GID=${CURRENT_GID} docker-compose run -u ${CURRENT_UID} web pipenv run python3 ./manage.py makemessages -a --domain django
LOCAL_UID=${CURRENT_UID} LOCAL_GID=${CURRENT_GID} docker-compose run -u ${CURRENT_UID} web pipenv run python3 ./manage.py makemessages -a --domain djangojs --ignore "frontend/node_modules/**"
LOCAL_UID=${CURRENT_UID} LOCAL_GID=${CURRENT_GID} docker-compose run -u ${CURRENT_UID} web pipenv run python3 ./manage.py compilemessages
compile-messages: #: Compile messages without source extraction
LOCAL_UID=${CURRENT_UID} LOCAL_GID=${CURRENT_GID} docker-compose run -u ${CURRENT_UID} web pipenv run python3 ./manage.py compilemessages
migrations: #: Update message files for all translations in known domains
LOCAL_UID=${CURRENT_UID} LOCAL_GID=${CURRENT_GID} docker-compose run -u ${CURRENT_UID} web pipenv run python3 ./manage.py makemigrations
frontend-shell: #: Enter frontend shell within docker, as a regular user, new service instance
LOCAL_UID=${CURRENT_UID} LOCAL_GID=${CURRENT_GID} docker-compose run -u ${CURRENT_UID} frontend /bin/bash
frontend-root-shell: #: Enter frontend shell within docker, as root, new service instance
LOCAL_UID=${CURRENT_UID} LOCAL_GID=${CURRENT_GID} docker-compose run frontend /bin/bash
frontend-attach: #: Attach to frontend shell within docker, as a regular user, running instance
docker exec -ti -u ${CURRENT_UID} frontend /bin/bash
frontend-root-attach: #: Attach to frontend shell within docker, as root, running instance
docker exec -ti frontend /bin/bash
assemble: # INTERNAL: assemble deployment asset for deployment
rm -rf tmp/deploy
rm -rf tmp/deploy_out
mkdir -p tmp
mkdir -p tmp/deploy_out
git clone ${TARGET_REPO} tmp/deploy --branch ${TARGET_BRANCH}
# Use local install .venv and node_modules to reuse local install as sort of a cache
cp -R .venv tmp/deploy
cp -R frontend/node_modules tmp/deploy/frontend
# Build dependencies
LOCAL_UID=${CURRENT_UID} LOCAL_GID=${CURRENT_GID} docker-compose run -u ${CURRENT_UID} frontend /bin/bash -c 'cd /app/tmp/deploy/ && make assemble-frontend'
LOCAL_UID=${CURRENT_UID} LOCAL_GID=${CURRENT_GID} docker-compose run -u ${CURRENT_UID} web /bin/bash -c 'cd /app/tmp/deploy/ && make assemble-web'
# Cleanup
rm tmp/deploy/Pipfile
rm tmp/deploy/Pipfile.lock
rm tmp/deploy/.env
rm tmp/deploy/.env.dist
rm -rf tmp/deploy/.git
rm -rf tmp/deploy/.venv
rm -rf tmp/deploy/static
rm -rf tmp/deploy/media
rm -rf tmp/deploy/Dockerfile*
rm -rf tmp/deploy/docker-compose.yml
rm -rf tmp/deploy/.mypy.ini
rm -rf tmp/deploy/.editorconfig
rm -rf tmp/deploy/.gitignore
rm -rf tmp/deploy/README.md
rm -rf tmp/deploy/CONTRIBUTING.md
rm -rf tmp/deploy/screenshot.png
# Build production docker image
docker build --rm -f ./Dockerfile-production -t almalinux.org:latest .
# Exporting image for deployment...
docker save almalinux.org:latest > tmp/deploy_out/almalinux.org.image.tar
# Assembling deployment asset
mv tmp/deploy/public tmp/deploy_out
cp tmp/deploy/docker-compose.production.yml tmp/deploy_out/docker-compose.yml
cd tmp/deploy_out && tar -zcvf ../deployment.tar.gz .
# Cleanup deployment workspace
rm -rf tmp/deploy_out/
rm -rf tmp/deploy/
assemble-frontend: # INTERNAL - package and build frontend
yarn --cwd=/app/tmp/deploy/frontend/ install
yarn --cwd=/app/tmp/deploy/frontend/ build
rm -rf /app/tmp/deploy/frontend
assemble-web: # INTERNAL - package and build web
cp /app/tmp/deploy/.env.dist /app/tmp/deploy/.env
cd /app/tmp/deploy/ && pipenv sync
cd /app/tmp/deploy/ && pipenv clean
cd /app/tmp/deploy/ && pipenv run python3 ./manage.py collectstatic
cd /app/tmp/deploy/ && pipenv run python3 ./manage.py compilemessages
cd /app/tmp/deploy/ && pipenv lock -r > requirements.txt
uwsgi: # INTERNAL - start UWSGI server, within production image
uwsgi \
--chdir=/app/ \
--module=almalinux.wsgi:application \
--master \
--pidfile=/tmp/almalinux.org.pid \
--socket=0.0.0.0:9000 \
--processes=4 \
--enable-threads \
--threads=2 \
--harakiri=20 \
--max-requests=5000 \
--vacuum
runserver: # INTERNAL - start internal development server. This is supposed to be run inside Docker.
@echo 'Delaying start of local development server to allow for dependencies to boot'
@sleep 5
su - web -c 'cd /app && pipenv install --dev'
su - web -c 'cd /app && pipenv run python3 manage.py migrate'
su - web -c 'cd /app && pipenv run python3 manage.py runserver 0.0.0.0:8080'
frontend-runserver: # INTERNAL - start internal frontend development server. This is supposed to be run inside Docker.
su - web -c 'yarn --cwd=/app/frontend/ install'
su - web -c 'yarn --cwd=/app/frontend/ dev-server --host 0.0.0.0 --public http://localhost:8090 --port 8090'
help: #: Show this help
@fgrep -h "#:" $(MAKEFILE_LIST) | fgrep -v fgrep | sed -e 's/\\$$//' | sed -e 's/#://'
all: dev
%:
@echo 'Invalid command'
@make help

21
Pipfile

@ -1,21 +0,0 @@
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"
[packages]
Django = "~=3.2"
mysqlclient = "~=2.0.3"
Pillow = "~=9.0.0"
python-dotenv = "~=0.17.1"
PyYAML = "~=5.4.1"
uWSGI = "~=2.0"
requests = "~=2.25"
Markdown = "~=3.3"
[dev-packages]
mypy = "*"
django-stubs = "*"
[requires]
python_version = "3.8"

347
Pipfile.lock

@ -1,347 +0,0 @@
{
"_meta": {
"hash": {
"sha256": "709bc6f36c62f3c5fff12247d94da36aa6f3b894e4b4386275acaf787b6f7ff3"
},
"pipfile-spec": 6,
"requires": {
"python_version": "3.8"
},
"sources": [
{
"name": "pypi",
"url": "https://pypi.org/simple",
"verify_ssl": true
}
]
},
"default": {
"asgiref": {
"hashes": [
"sha256:1d2880b792ae8757289136f1db2b7b99100ce959b2aa57fd69dab783d05afac4",
"sha256:4a29362a6acebe09bf1d6640db38c1dc3d9217c68e6f9f6204d72667fc19a424"
],
"markers": "python_version >= '3.7'",
"version": "==3.5.2"
},
"certifi": {
"hashes": [
"sha256:84c85a9078b11105f04f3036a9482ae10e4621616db313fe045dd24743a0820d",
"sha256:fe86415d55e84719d75f8b69414f6438ac3547d2078ab91b67e779ef69378412"
],
"markers": "python_version >= '3.6'",
"version": "==2022.6.15"
},
"charset-normalizer": {
"hashes": [
"sha256:2857e29ff0d34db842cd7ca3230549d1a697f96ee6d3fb071cfa6c7393832597",
"sha256:6881edbebdb17b39b4eaaa821b438bf6eddffb4468cf344f09f89def34a8b1df"
],
"markers": "python_version >= '3'",
"version": "==2.0.12"
},
"django": {
"hashes": [
"sha256:115baf5049d5cf4163e43492cdc7139c306ed6d451e7d3571fe9612903903713",
"sha256:f71934b1a822f14a86c9ac9634053689279cd04ae69cb6ade4a59471b886582b"
],
"index": "pypi",
"version": "==3.2.15"
},
"idna": {
"hashes": [
"sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff",
"sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"
],
"markers": "python_version >= '3'",
"version": "==3.3"
},
"importlib-metadata": {
"hashes": [
"sha256:637245b8bab2b6502fcbc752cc4b7a6f6243bb02b31c5c26156ad103d3d45670",
"sha256:7401a975809ea1fdc658c3aa4f78cc2195a0e019c5cbc4c06122884e9ae80c23"
],
"markers": "python_version < '3.10'",
"version": "==4.12.0"
},
"markdown": {
"hashes": [
"sha256:76df8ae32294ec39dcf89340382882dfa12975f87f45c3ed1ecdb1e8cefc7006",
"sha256:9923332318f843411e9932237530df53162e29dc7a4e2b91e35764583c46c9a3"
],
"index": "pypi",
"version": "==3.3.6"
},
"mysqlclient": {
"hashes": [
"sha256:0ac0dd759c4ca02c35a9fedc24bc982cf75171651e8187c2495ec957a87dfff7",
"sha256:3381ca1a4f37ff1155fcfde20836b46416d66531add8843f6aa6d968982731c3",
"sha256:71c4b330cf2313bbda0307fc858cc9055e64493ba9bf28454d25cf8b3ee8d7f5",
"sha256:f6ebea7c008f155baeefe16c56cd3ee6239f7a5a9ae42396c2f1860f08a7c432",
"sha256:fc575093cf81b6605bed84653e48b277318b880dc9becf42dd47fa11ffd3e2b6"
],
"index": "pypi",
"version": "==2.0.3"
},
"pillow": {
"hashes": [
"sha256:011233e0c42a4a7836498e98c1acf5e744c96a67dd5032a6f666cc1fb97eab97",
"sha256:0f29d831e2151e0b7b39981756d201f7108d3d215896212ffe2e992d06bfe049",
"sha256:12875d118f21cf35604176872447cdb57b07126750a33748bac15e77f90f1f9c",
"sha256:14d4b1341ac07ae07eb2cc682f459bec932a380c3b122f5540432d8977e64eae",
"sha256:1c3c33ac69cf059bbb9d1a71eeaba76781b450bc307e2291f8a4764d779a6b28",
"sha256:1d19397351f73a88904ad1aee421e800fe4bbcd1aeee6435fb62d0a05ccd1030",
"sha256:253e8a302a96df6927310a9d44e6103055e8fb96a6822f8b7f514bb7ef77de56",
"sha256:2632d0f846b7c7600edf53c48f8f9f1e13e62f66a6dbc15191029d950bfed976",
"sha256:335ace1a22325395c4ea88e00ba3dc89ca029bd66bd5a3c382d53e44f0ccd77e",
"sha256:413ce0bbf9fc6278b2d63309dfeefe452835e1c78398efb431bab0672fe9274e",
"sha256:5100b45a4638e3c00e4d2320d3193bdabb2d75e79793af7c3eb139e4f569f16f",
"sha256:514ceac913076feefbeaf89771fd6febde78b0c4c1b23aaeab082c41c694e81b",
"sha256:528a2a692c65dd5cafc130de286030af251d2ee0483a5bf50c9348aefe834e8a",
"sha256:6295f6763749b89c994fcb6d8a7f7ce03c3992e695f89f00b741b4580b199b7e",
"sha256:6c8bc8238a7dfdaf7a75f5ec5a663f4173f8c367e5a39f87e720495e1eed75fa",
"sha256:718856856ba31f14f13ba885ff13874be7fefc53984d2832458f12c38205f7f7",
"sha256:7f7609a718b177bf171ac93cea9fd2ddc0e03e84d8fa4e887bdfc39671d46b00",
"sha256:80ca33961ced9c63358056bd08403ff866512038883e74f3a4bf88ad3eb66838",
"sha256:80fe64a6deb6fcfdf7b8386f2cf216d329be6f2781f7d90304351811fb591360",
"sha256:81c4b81611e3a3cb30e59b0cf05b888c675f97e3adb2c8672c3154047980726b",
"sha256:855c583f268edde09474b081e3ddcd5cf3b20c12f26e0d434e1386cc5d318e7a",
"sha256:9bfdb82cdfeccec50aad441afc332faf8606dfa5e8efd18a6692b5d6e79f00fd",
"sha256:a5d24e1d674dd9d72c66ad3ea9131322819ff86250b30dc5821cbafcfa0b96b4",
"sha256:a9f44cd7e162ac6191491d7249cceb02b8116b0f7e847ee33f739d7cb1ea1f70",
"sha256:b5b3f092fe345c03bca1e0b687dfbb39364b21ebb8ba90e3fa707374b7915204",
"sha256:b9618823bd237c0d2575283f2939655f54d51b4527ec3972907a927acbcc5bfc",
"sha256:cef9c85ccbe9bee00909758936ea841ef12035296c748aaceee535969e27d31b",
"sha256:d21237d0cd37acded35154e29aec853e945950321dd2ffd1a7d86fe686814669",
"sha256:d3c5c79ab7dfce6d88f1ba639b77e77a17ea33a01b07b99840d6ed08031cb2a7",
"sha256:d9d7942b624b04b895cb95af03a23407f17646815495ce4547f0e60e0b06f58e",
"sha256:db6d9fac65bd08cea7f3540b899977c6dee9edad959fa4eaf305940d9cbd861c",
"sha256:ede5af4a2702444a832a800b8eb7f0a7a1c0eed55b644642e049c98d589e5092",
"sha256:effb7749713d5317478bb3acb3f81d9d7c7f86726d41c1facca068a04cf5bb4c",
"sha256:f154d173286a5d1863637a7dcd8c3437bb557520b01bddb0be0258dcb72696b5",
"sha256:f25ed6e28ddf50de7e7ea99d7a976d6a9c415f03adcaac9c41ff6ff41b6d86ac"
],
"index": "pypi",
"version": "==9.0.1"
},
"python-dotenv": {
"hashes": [
"sha256:00aa34e92d992e9f8383730816359647f358f4a3be1ba45e5a5cefd27ee91544",
"sha256:b1ae5e9643d5ed987fc57cc2583021e38db531946518130777734f9589b3141f"
],
"index": "pypi",
"version": "==0.17.1"
},
"pytz": {
"hashes": [
"sha256:1e760e2fe6a8163bc0b3d9a19c4f84342afa0a2affebfaa84b01b978a02ecaa7",
"sha256:e68985985296d9a66a881eb3193b0906246245294a881e7c8afe623866ac6a5c"
],
"version": "==2022.1"
},
"pyyaml": {
"hashes": [
"sha256:08682f6b72c722394747bddaf0aa62277e02557c0fd1c42cb853016a38f8dedf",
"sha256:0f5f5786c0e09baddcd8b4b45f20a7b5d61a7e7e99846e3c799b05c7c53fa696",
"sha256:129def1b7c1bf22faffd67b8f3724645203b79d8f4cc81f674654d9902cb4393",
"sha256:294db365efa064d00b8d1ef65d8ea2c3426ac366c0c4368d930bf1c5fb497f77",
"sha256:3b2b1824fe7112845700f815ff6a489360226a5609b96ec2190a45e62a9fc922",
"sha256:3bd0e463264cf257d1ffd2e40223b197271046d09dadf73a0fe82b9c1fc385a5",
"sha256:4465124ef1b18d9ace298060f4eccc64b0850899ac4ac53294547536533800c8",
"sha256:49d4cdd9065b9b6e206d0595fee27a96b5dd22618e7520c33204a4a3239d5b10",
"sha256:4e0583d24c881e14342eaf4ec5fbc97f934b999a6828693a99157fde912540cc",
"sha256:5accb17103e43963b80e6f837831f38d314a0495500067cb25afab2e8d7a4018",
"sha256:607774cbba28732bfa802b54baa7484215f530991055bb562efbed5b2f20a45e",
"sha256:6c78645d400265a062508ae399b60b8c167bf003db364ecb26dcab2bda048253",
"sha256:72a01f726a9c7851ca9bfad6fd09ca4e090a023c00945ea05ba1638c09dc3347",
"sha256:74c1485f7707cf707a7aef42ef6322b8f97921bd89be2ab6317fd782c2d53183",
"sha256:895f61ef02e8fed38159bb70f7e100e00f471eae2bc838cd0f4ebb21e28f8541",
"sha256:8c1be557ee92a20f184922c7b6424e8ab6691788e6d86137c5d93c1a6ec1b8fb",
"sha256:bb4191dfc9306777bc594117aee052446b3fa88737cd13b7188d0e7aa8162185",
"sha256:bfb51918d4ff3d77c1c856a9699f8492c612cde32fd3bcd344af9be34999bfdc",
"sha256:c20cfa2d49991c8b4147af39859b167664f2ad4561704ee74c1de03318e898db",
"sha256:cb333c16912324fd5f769fff6bc5de372e9e7a202247b48870bc251ed40239aa",
"sha256:d2d9808ea7b4af864f35ea216be506ecec180628aced0704e34aca0b040ffe46",
"sha256:d483ad4e639292c90170eb6f7783ad19490e7a8defb3e46f97dfe4bacae89122",
"sha256:dd5de0646207f053eb0d6c74ae45ba98c3395a571a2891858e87df7c9b9bd51b",
"sha256:e1d4970ea66be07ae37a3c2e48b5ec63f7ba6804bdddfdbd3cfd954d25a82e63",
"sha256:e4fac90784481d221a8e4b1162afa7c47ed953be40d31ab4629ae917510051df",
"sha256:fa5ae20527d8e831e8230cbffd9f8fe952815b2b7dae6ffec25318803a7528fc",
"sha256:fd7f6999a8070df521b6384004ef42833b9bd62cfee11a09bda1079b4b704247",
"sha256:fdc842473cd33f45ff6bce46aea678a54e3d21f1b61a7750ce3c498eedfe25d6",
"sha256:fe69978f3f768926cfa37b867e3843918e012cf83f680806599ddce33c2c68b0"
],
"index": "pypi",
"version": "==5.4.1"
},
"requests": {
"hashes": [
"sha256:68d7c56fd5a8999887728ef304a6d12edc7be74f1cfa47714fc8b414525c9a61",
"sha256:f22fa1e554c9ddfd16e6e41ac79759e17be9e492b3587efa038054674760e72d"
],
"index": "pypi",
"version": "==2.27.1"
},
"sqlparse": {
"hashes": [
"sha256:0c00730c74263a94e5a9919ade150dfc3b19c574389985446148402998287dae",
"sha256:48719e356bb8b42991bdbb1e8b83223757b93789c00910a616a071910ca4a64d"
],
"markers": "python_version >= '3.5'",
"version": "==0.4.2"
},
"urllib3": {
"hashes": [
"sha256:c33ccba33c819596124764c23a97d25f32b28433ba0dedeb77d873a38722c9bc",
"sha256:ea6e8fb210b19d950fab93b60c9009226c63a28808bc8386e05301e25883ac0a"
],
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5' and python_version < '4'",
"version": "==1.26.11"
},
"uwsgi": {
"hashes": [
"sha256:88ab9867d8973d8ae84719cf233b7dafc54326fcaec89683c3f9f77c002cdff9"
],
"index": "pypi",
"version": "==2.0.20"
},
"zipp": {
"hashes": [
"sha256:05b45f1ee8f807d0cc928485ca40a07cb491cf092ff587c0df9cb1fd154848d2",
"sha256:47c40d7fe183a6f21403a199b3e4192cca5774656965b0a4988ad2f8feb5f009"
],
"markers": "python_version >= '3.7'",
"version": "==3.8.1"
}
},
"develop": {
"asgiref": {
"hashes": [
"sha256:1d2880b792ae8757289136f1db2b7b99100ce959b2aa57fd69dab783d05afac4",
"sha256:4a29362a6acebe09bf1d6640db38c1dc3d9217c68e6f9f6204d72667fc19a424"
],
"markers": "python_version >= '3.7'",
"version": "==3.5.2"
},
"backports.zoneinfo": {
"hashes": [
"sha256:17746bd546106fa389c51dbea67c8b7c8f0d14b5526a579ca6ccf5ed72c526cf",
"sha256:1b13e654a55cd45672cb54ed12148cd33628f672548f373963b0bff67b217328",
"sha256:1c5742112073a563c81f786e77514969acb58649bcdf6cdf0b4ed31a348d4546",
"sha256:4a0f800587060bf8880f954dbef70de6c11bbe59c673c3d818921f042f9954a6",
"sha256:5c144945a7752ca544b4b78c8c41544cdfaf9786f25fe5ffb10e838e19a27570",
"sha256:7b0a64cda4145548fed9efc10322770f929b944ce5cee6c0dfe0c87bf4c0c8c9",
"sha256:8439c030a11780786a2002261569bdf362264f605dfa4d65090b64b05c9f79a7",
"sha256:8961c0f32cd0336fb8e8ead11a1f8cd99ec07145ec2931122faaac1c8f7fd987",
"sha256:89a48c0d158a3cc3f654da4c2de1ceba85263fafb861b98b59040a5086259722",
"sha256:a76b38c52400b762e48131494ba26be363491ac4f9a04c1b7e92483d169f6582",
"sha256:da6013fd84a690242c310d77ddb8441a559e9cb3d3d59ebac9aca1a57b2e18bc",
"sha256:e55b384612d93be96506932a786bbcde5a2db7a9e6a4bb4bffe8b733f5b9036b",
"sha256:e81b76cace8eda1fca50e345242ba977f9be6ae3945af8d46326d776b4cf78d1",
"sha256:e8236383a20872c0cdf5a62b554b27538db7fa1bbec52429d8d106effbaeca08",
"sha256:f04e857b59d9d1ccc39ce2da1021d196e47234873820cbeaad210724b1ee28ac",
"sha256:fadbfe37f74051d024037f223b8e001611eac868b5c5b06144ef4d8b799862f2"
],
"markers": "python_version < '3.9'",
"version": "==0.2.1"
},
"django": {
"hashes": [
"sha256:115baf5049d5cf4163e43492cdc7139c306ed6d451e7d3571fe9612903903713",
"sha256:f71934b1a822f14a86c9ac9634053689279cd04ae69cb6ade4a59471b886582b"
],
"index": "pypi",
"version": "==3.2.15"
},
"django-stubs": {
"hashes": [
"sha256:2ec21fc14dba392156e0ec8438e1863c86ddb295f1c8d88eecd7e0e04977c843",
"sha256:dfffa933e3c7f5cae92c860fbd6cf4ae58c4f78eed93843612f863207c9e0e1a"
],
"index": "pypi",
"version": "==1.10.1"
},
"django-stubs-ext": {
"hashes": [
"sha256:9bd7418376ab00b7f88d6d56be9fece85bfa0c7c348ac621155fa4d7a91146f2",
"sha256:c5d8db53d29c756e7e3d0820a5a079a43bc38d8fab0e1b8bd5df2f3366c54b5a"
],
"markers": "python_version >= '3.6'",
"version": "==0.5.0"
},
"mypy": {
"hashes": [
"sha256:0e2dd88410937423fba18e57147dd07cd8381291b93d5b1984626f173a26543e",
"sha256:10daab80bc40f84e3f087d896cdb53dc811a9f04eae4b3f95779c26edee89d16",
"sha256:17e44649fec92e9f82102b48a3bf7b4a5510ad0cd22fa21a104826b5db4903e2",
"sha256:1a0459c333f00e6a11cbf6b468b870c2b99a906cb72d6eadf3d1d95d38c9352c",
"sha256:246e1aa127d5b78488a4a0594bd95f6d6fb9d63cf08a66dafbff8595d8891f67",
"sha256:2b184db8c618c43c3a31b32ff00cd28195d39e9c24e7c3b401f3db7f6e5767f5",
"sha256:2bc249409a7168d37c658e062e1ab5173300984a2dada2589638568ddc1db02b",
"sha256:3841b5433ff936bff2f4dc8d54cf2cdbfea5d8e88cedfac45c161368e5770ba6",
"sha256:4c3e497588afccfa4334a9986b56f703e75793133c4be3a02d06a3df16b67a58",
"sha256:5bf44840fb43ac4074636fd47ee476d73f0039f4f54e86d7265077dc199be24d",
"sha256:64235137edc16bee6f095aba73be5334677d6f6bdb7fa03cfab90164fa294a17",
"sha256:6776e5fa22381cc761df53e7496a805801c1a751b27b99a9ff2f0ca848c7eca0",
"sha256:6ce34a118d1a898f47def970a2042b8af6bdcc01546454726c7dd2171aa6dfca",
"sha256:6f6ad963172152e112b87cc7ec103ba0f2db2f1cd8997237827c052a3903eaa6",
"sha256:6f7106cbf9cc2f403693bf50ed7c9fa5bb3dfa9007b240db3c910929abe2a322",
"sha256:7742d2c4e46bb5017b51c810283a6a389296cda03df805a4f7869a6f41246534",
"sha256:9521c1265ccaaa1791d2c13582f06facf815f426cd8b07c3a485f486a8ffc1f3",
"sha256:a1b383fe99678d7402754fe90448d4037f9512ce70c21f8aee3b8bf48ffc51db",
"sha256:b840cfe89c4ab6386c40300689cd8645fc8d2d5f20101c7f8bd23d15fca14904",
"sha256:d8d3ba77e56b84cd47a8ee45b62c84b6d80d32383928fe2548c9a124ea0a725c",
"sha256:dcd955f36e0180258a96f880348fbca54ce092b40fbb4b37372ae3b25a0b0a46",
"sha256:e865fec858d75b78b4d63266c9aff770ecb6a39dfb6d6b56c47f7f8aba6baba8",
"sha256:edf7237137a1a9330046dbb14796963d734dd740a98d5e144a3eb1d267f5f9ee"
],
"index": "pypi",
"version": "==0.942"
},
"mypy-extensions": {
"hashes": [
"sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d",
"sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"
],
"version": "==0.4.3"
},
"sqlparse": {
"hashes": [
"sha256:0c00730c74263a94e5a9919ade150dfc3b19c574389985446148402998287dae",
"sha256:48719e356bb8b42991bdbb1e8b83223757b93789c00910a616a071910ca4a64d"
],
"markers": "python_version >= '3.5'",
"version": "==0.4.2"
},
"tomli": {
"hashes": [
"sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc",
"sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"
],
"markers": "python_version >= '3.7'",
"version": "==2.0.1"
},
"types-pytz": {
"hashes": [
"sha256:1a8b25c225c5e6bd8468aa9eb45ddd3b337f6716d4072ad0aa4ef1e41478eebc",
"sha256:8aa9fd2af9dee5f5bd7221c6804c9addeafa7ebc0008f544d4ace02b066818a4"
],
"version": "==2022.1.2"
},
"types-pyyaml": {
"hashes": [
"sha256:7f7da2fd11e9bc1e5e9eb3ea1be84f4849747017a59fc2eee0ea34ed1147c2e0",
"sha256:8f890028123607379c63550179ddaec4517dc751f4c527a52bb61934bf495989"
],
"version": "==6.0.11"
},
"typing-extensions": {
"hashes": [
"sha256:25642c956049920a5aa49edcdd6ab1e06d7e5d467fc00e0506c44ac86fbfca02",
"sha256:e6d2677a32f47fc7eb2795db1dd15c1f34eff616bcaf2cfb5e997f854fa1c4a6"
],
"markers": "python_version >= '3.7'",
"version": "==4.3.0"
}
}
}

13
README.DEPLOY.md

@ -1,13 +0,0 @@
# Deployment
The website is currently designed to run on a single host.
## Preparing a host
- Go to `ansible/` and apply all relevant roles to the new host.
- Create `.env` file in `/opt/almalinux.org/` directory on the target host.
- Deploy!
## Deploying
Execute `kafe do <staging|production> deploy`. This will build from master and deploy to the target environment.

48
README.md

@ -1,48 +0,0 @@
# almalinux.org website
[![almalinux.org](./screenshot.png)](https://almalinux.org)
This repository contains website source code for https://almalinux.org.
This website is built with Python using Django web framework. It uses MariaDB as database backend,
Docker and docker-compose for development environment deployment, and Pipenv is used to track project
requirements, and manage Python dependencies.
JavaScript and SCSS is used for frontend, and is managed/built using Webpack Encore. See
[frontend/README](./frontend/README.md) for more details.
## For developers
To deploy local development environment, you will need following dependencies installed
on your development host:
- Docker
- docker-compose
- make
Common development commands and automation related commands are listed in Makefile. Execute `make help`
for a complete list of available commands.
Executing `make dev` will deploy a complete, ready to go development environment.
### Directories and modules
- `/almalinux/` - Django project root.
- `/commons/` - A Django app-module with reusable utilities for app support.
- `/locale/` - Django locale files.
- `/media/` - Django file uploads.
- `/static/` - Static files and build output for frontend code.
- `/www/` - Django app that contains all logic for the website.
- `/frontend/` - JavaScript and SCSS frontend code.
### Localization and translation
AlmaLinux OS localization and translation is managed using [Weblate](https://hosted.weblate.org/engage/almalinux/).
To contribute translations see [AlmaLinux OS](https://hosted.weblate.org/projects/almalinux/) localization project in Weblate.
You can request new languages to be added by creating a ticket in [GitHub issues](https://github.com/AlmaLinux/almalinux.org/issues).
[![Translation status](https://hosted.weblate.org/widgets/almalinux/-/287x66-white.png)](https://hosted.weblate.org/engage/almalinux/)
Copyright (c) 2021 AlmaLinux OS Foundation

38
almalinux/admin.py

@ -1,38 +0,0 @@
from functools import update_wrapper
from typing import List
from django.contrib.admin import AdminSite
from django.template.response import TemplateResponse
from django.urls import path
from django.utils.safestring import SafeString
class AlmaLinuxAdminSite(AdminSite):
site_title = 'AlmaLinux OS Admin'
site_header = SafeString('<img src="/static/images/logo.svg" alt="Logo">')
def get_urls(self) -> List:
urls: List = []
urls += super().get_urls()
urls_insert_pos = len(urls) - 1
from www.admin import www_admin_urls
for www_admin_url in www_admin_urls:
def inner(request): # type: ignore
context = {
**self.each_context(request),
'subtitle': None,
'is_nav_sidebar_enabled': False,
**(www_admin_url[3] or {})
}
request.current_app = self.name
return TemplateResponse(request, www_admin_url[1], context)
urls.insert(
urls_insert_pos,
path(www_admin_url[0], self.admin_view(inner), name=www_admin_url[2])
)
return urls

5
almalinux/apps.py

@ -1,5 +0,0 @@
from django.contrib.admin.apps import AdminConfig
class AlmaLinuxAdminConfig(AdminConfig):
default_site = 'almalinux.admin.AlmaLinuxAdminSite'

16
almalinux/asgi.py

@ -1,16 +0,0 @@
"""
ASGI config for almalinux project.
It exposes the ASGI callable as a module-level variable named ``application``.
For more information on this file, see
https://docs.djangoproject.com/en/3.1/howto/deployment/asgi/
"""
import os
from django.core.asgi import get_asgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'almalinux.settings')
application = get_asgi_application()

188
almalinux/settings.py

@ -1,188 +0,0 @@
"""
Django settings for almalinux project.
Generated by 'django-admin startproject' using Django 3.1.4.
For more information on this file, see
https://docs.djangoproject.com/en/3.1/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/3.1/ref/settings/
"""
# TODO: .env support for all major settings that could change between envs
from pathlib import Path
# Build paths inside the project like this: BASE_DIR / 'subdir'.
from typing import List, Tuple, Union, Any
from dotenv import dotenv_values
BASE_DIR = Path(__file__).resolve().parent.parent
DOTENV = dotenv_values(BASE_DIR / '.env')
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/3.1/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = DOTENV['SECRET_KEY']
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = DOTENV['DEBUG'] == 'true'
ALLOWED_HOSTS = [
'127.0.0.1',
'localhost',
'almalinux.org',
'www.almalinux.org',
'staging.almalinux.org',
]
# Application definition
INSTALLED_APPS = [
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.humanize',
'commons',
'almalinux.apps.AlmaLinuxAdminConfig',
'www',
]
MIDDLEWARE = [
'django.middleware.locale.LocaleMiddleware',
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
ROOT_URLCONF = 'almalinux.urls'
template_loaders: List[Any] = [
'django.template.loaders.filesystem.Loader',
'django.template.loaders.app_directories.Loader'
]
effective_loaders: List[Union[str, Tuple]]
if DEBUG:
effective_loaders = template_loaders
else:
effective_loaders = [
('django.template.loaders.cached.Loader', template_loaders),
]
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': [],
'OPTIONS': {
'loaders': effective_loaders,
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
'commons.context.dnt.is_dnt_enabled'
],
},
},
]
WSGI_APPLICATION = 'almalinux.wsgi.application'
# Database
# https://docs.djangoproject.com/en/3.1/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': DOTENV['DB_ENGINE'],
'NAME': DOTENV['DB_NAME'],
'USER': DOTENV['DB_USER'],
'PASSWORD': DOTENV['DB_PASSWORD'],
'HOST': DOTENV['DB_HOST'],
'PORT': int(DOTENV['DB_PORT']), # type: ignore
}
}
# Password validation
# https://docs.djangoproject.com/en/3.1/ref/settings/#auth-password-validators
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
# Internationalization
# https://docs.djangoproject.com/en/3.1/topics/i18n/
LANGUAGE_CODE = 'en'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
LANGUAGES = (
('de', 'Deutsch'),
('en', 'English'), # English (US), default
('es', 'Español'), # Spanish (ES)
('fr', 'Français'),
('he', 'עִבְרִית'), # Hebrew
('it', 'Italiano'),
('ja', '日本語'), # Japanese
('lv', 'Latviešu'),
('pl', 'Polski'),
('pt', 'Português'), # Portuguese (PT)
('pt-br', 'Português Brasileiro'), # Portuguese (BR)
('ru', 'Русский'),
('sk', 'Slovenčina'),
('sv', 'Svenska'),
('tr', 'Türkçe'),
('uk', 'Украї́нська'),
('zh-hans', 'Chinese (Simplified)'),
)
LOCALE_PATHS = [
BASE_DIR / 'locale'
]
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.1/howto/static-files/
STATIC_URL = '/static/'
STATIC_ROOT = BASE_DIR / 'public/static/'
STATICFILES_DIRS = [
BASE_DIR / 'static',
]
ENCORE_BUILD_DIR = BASE_DIR / 'static/build/'
MEDIA_ROOT = BASE_DIR / 'media' if 0 == len(DOTENV['MEDIA_ROOT']) else DOTENV['MEDIA_ROOT'] # type: ignore
MEDIA_URL = 'media/'
# Custom settings
HUBSPOT_APIKEY = DOTENV['HUBSPOT_APIKEY']
HUBSPOT_SUB_ID = DOTENV['HUBSPOT_SUB_ID']

42
almalinux/urls.py

@ -1,42 +0,0 @@
"""almalinux URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/3.1/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from typing import List
from django.conf import settings
from django.conf.urls.i18n import i18n_patterns
from django.conf.urls.static import static
from django.contrib import admin
from django.urls import path, include
from django.views.generic.base import RedirectView
from django.views.i18n import JavaScriptCatalog
handler404 = 'www.views.not_found'
urlpatterns: List = []
urlpatterns += i18n_patterns(path('', include('www.urls')), prefix_default_language=False)
urlpatterns += [
path('admin/', admin.site.urls),
path('favicon.ico', RedirectView.as_view(url='/static/fav/favicon.ico'))
]
urlpatterns += i18n_patterns(path(
'jsi18n/',
JavaScriptCatalog.as_view(),
name='javascript-catalog'
), prefix_default_language=False)
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

16
almalinux/wsgi.py

@ -1,16 +0,0 @@
"""
WSGI config for almalinux project.
It exposes the WSGI callable as a module-level variable named ``application``.
For more information on this file, see
https://docs.djangoproject.com/en/3.1/howto/deployment/wsgi/
"""
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'almalinux.settings')
application = get_wsgi_application()

15
ansible/.editorconfig

@ -1,15 +0,0 @@
root = true
[*]
end_of_line = lf
insert_final_newline = true
[*.yml]
indent_style = space
charset = utf-8
indent_size = 2
[group_vars/all]
indent_style = space
charset = utf-8
indent_size = 2

1
ansible/.gitignore

@ -1 +0,0 @@
site.retry

8
ansible/ansible.cfg

@ -1,8 +0,0 @@
[defaults]
callback_whitelist = profile_tasks
ssh_args = -o ControlMaster=auto -o ControlPersist=3600s -o PreferredAuthentications=publickey
[ssh_connection]
pipelining = True
control_path = /tmp/ansible-ssh-%%h-%%p-%%r

1
ansible/files/ssh/id_rsa.eugene.pub

@ -1 +0,0 @@
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDGqJLNLhgjH3xUgkR8OqIEBLsBk/BdjG7GIXpFIhLFzug4f1FRATA7cVsJ8XQ2sN+WUPe9hRJicYXTdFirJUafdpsrtwWhdvVhFq9RlkpS1BtbMlNJa8tkurxRqtdzR0sinu71uq8T/HmfKIgXHiRvo7qZyWfvM+0NHflPNS6kJfFoa0QazLmavPnI7dHROmkNnBpSMIDlovHjzFyiH2WFNBTkW0KLolio7xcySTtTsZPzYomp+mlMhnAUjwfcOUNFTgkoo86IYuOfu/3LdCOZQEq9N7AM4KpCaEm0qwSFrowWfNqGQGJPczUYlFMCd0InnZolb1D9JGhoUp2GppU3 eugene

1
ansible/files/ssh/id_rsa.iselets.ainode.pub

@ -1 +0,0 @@
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDCNQ4ei4vig0thQbLvY8n1pUxPRfTlCDIE+GLQLz8On09xhFgBDqf60WtbmLTT8d10uAkXBz9Lw8TzNpOAWqrLXNiUsXKZlJiCc/8CYR26YdS1a2CcpDhbEU30vfxXfcGF7kLxUYoo60Qqbg8lgku4+FPNgVP8gfquPn8e+1r+V0H24QFuO6FOTDohNRjDRvtXghh2rhWdIa1fBNbd8rcuHCxgri7j/DNH1/x+fRtM6CvT+t5mYD9gOUK5LbQVdpWyd9IhkwKJHQ3DAAiljcLWP6p81yNHHjaatsJ1nuUtVKKeeBUEtJ+ehOjPuGHMOnddFdY1SZq+T+B/tkI8lw9mwua9Vl/adxfpxLOVGLQ1pFRHGxng3A6NXiV38LTFHT+PFZZJZp733Wh/rn5yJWaj6lhdsrsfEB/PG3ctGliOlVjvetzeg339LahrQtP8AfxAAiI6yJ22Bekl2+UR2cLAO37aPZjr6d4FsaxdOn3d3yjw0yylzh26Xovo8ihGFUU= iseletsk@ainode1

1
ansible/files/ssh/id_rsa.iseletsk.pub

@ -1 +0,0 @@
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCyNw588p7A9RaexQuHa1ZGYsqX+B9PlcBWPY7PgJCTNAMsLN9neH+SEHjc3VO9f1a5p+2YJSu6nrM39MJHiqXynX4VwILfCXrEfUCKRdr8KOfDipoH0fkX/9NcDZU1mU1Hx7yVgRe/sbnjrGsuYu1k6fBUfAV73jB8/UWS7I4zpp+iVAW41bPDLPJmMlxO//V6jvze8rtAqc4W0YuwkTN5tJQR7sZSUFSzZHYfjRlSesRaKRrfcryu813ak39/bIbkuntWFqJhi7Z1R7rWIF2BCj7xwnMn5JwN33XeqW+b+KbZZ4n5ikjQ53VPpdkrLgzVkBN1ZooUbz1QaqjxozSZ iseletsk@almalinux.org

1
ansible/files/ssh/id_rsa.jack.pub

@ -1 +0,0 @@
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDeNW6Ja6L2EcSjtfrQk/pLrUQoB3ORcp5VPZhEqx6GXdv+J5CXZUlUbx2MZx9/Ir9tsdqjcxqVpRzNnefgUkqnSuJLH7J2kp+hUXXqdLjBUJI1QT6aPVyWxrgpTkpvuPKSQp5SXfmbj3FrWYCJi9wHwezARO+BtSpHMNLcyDRm5iPHYXOAljCxdxnbUQuU6SpmseLjwzOtgd6q+MkxZU+d7FT5zBVl0Z8H2DyKachDN/ah51MJ6rt2DYrCcUzIVa+JtJ7SSXSa0MIJQukhcXZMKeIqXJpoFw/FbptjL5tsAhZ6COdvuFzyaayKsTIG9mKpVbfXK6LVddPgRVvYOfZL jack

1
ansible/files/ssh/id_rsa.leonid.pub

@ -1 +0,0 @@
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq08dp40WevtPv9FG/dA61MVY364TYhhMvwgMQNxqmCGzcxs0MVFlIGT/xJrd6rq6W0ORiC0WEG3msRqwKI+0KtbKKn2jKPk7P2vkZQv2Gpn/b0KgP2WodPHUXUdl1gPrX/L/SqgC3W2DKmCWojnL/mV51VjC9fCMj6Swszz/c9BUaASZUXoce1VcthA93alPASo9KBcHUgQnbw/MS5c22wnPlOVUvA1dFtTbeqI/EkERNxDS8T/ZEHXzYXsTczFe2Gpdyh6gy5T+LTv5tUONG4fKrWjdkXmZ6w0RvUrzdxHXmjF7SDvUgpHtv49HjpXYgFLzAaBoeXftRoV3fTJwuQ== leonid

1
ansible/files/ssh/id_rsa.matiss.pub

@ -1 +0,0 @@
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCoLG3WPkrxwAmbVZKf5bffLiREPi0/YHezYu342OVhjokklmdXm1TcqW3WXDChDB83qaZ4KEbP2aqqwpJNwIv8hz6njFTYgqRyjNFKtTmlTEBSzel225pbm8Rt0B4I4ghJdw84JY6wxMLSkhtF0QsjzW6RcJH4YD+K+8GRH+qA3XL4JeTspB5W94gTsBoTq+wIwi4Ph3U0yfsQ6iozvoi+9OiuXWm1YnoVJ74mFMBQXlR3W1gu+fGu5EYyCUrqgxbwjpcO+7c8GPZ8dF/SbmzIfcvqCL6I5jIWunIrNALNlLC6TJHFp9hs1/TkJa/N+sB4JgLr58aqb1+kyiF9fdr4fDgVFLM6Ij/QD1aSXfxJXoihiDVFBXUTf/vgzALbhwxQXFrA65gu5YfIDZTOxBRSq8FtCLlLXfNA4Cp3lk6oec3WN6z9te9VFORXCQzBYa/oi7OMIQQDkSMR3JpsdXUBcijxK9Y2r6NDwEJINlyyYyPfs5lepu64yube2a9TeXAQP7DPULrGsHo8bNoSJakqoBtT/vg5zwNyzfBxlhNMcEuyYjBG+80mmMsOg6D6G3Zipu9SyDmIMvK3p1w6VeUBp7XogvHLECISdWxYYjpWGv0O88fblu9gsZeFY9LJ4JQ1sZaUaQyFF6UxMhr/qwmNslF4HM/hsHZ9SCDr5a0g1w== matiss@hub256.com

22
ansible/group_vars/all.yml

@ -1,22 +0,0 @@
users:
- username: matiss
pubkey: '{{ lookup("file", "../files/ssh/id_rsa.matiss.pub") }}'
state: absent
- username: jack
pubkey: '{{ lookup("file", "../files/ssh/id_rsa.jack.pub") }}'
state: present
- username: eugene
pubkey: '{{ lookup("file", "../files/ssh/id_rsa.eugene.pub") }}'
state: present
- username: leonid
pubkey: '{{ lookup("file", "../files/ssh/id_rsa.leonid.pub") }}'
state: present
- username: iseletsk
pubkey: '{{ lookup("file", "../files/ssh/id_rsa.iseletsk.pub") }}'
state: present
deployment_keys:
- '{{ lookup("file", "../files/ssh/id_rsa.jack.pub") }}'
- '{{ lookup("file", "../files/ssh/id_rsa.jack.pub") }}'
- '{{ lookup("file", "../files/ssh/id_rsa.leonid.pub") }}'
- '{{ lookup("file", "../files/ssh/id_rsa.iseletsk.pub") }}'

1
ansible/group_vars/production_web_servers.yml

@ -1 +0,0 @@
performance_profile: 'virtual-guest'

1
ansible/group_vars/staging_web_servers.yml

@ -1 +0,0 @@
performance_profile: 'virtual-guest'

9
ansible/hosts

@ -1,9 +0,0 @@
[all:vars]
ansible_connection=ssh
ansible_python_interpreter=/usr/bin/python3
[production_web_servers]
almalinux.org ansible_ssh_host=3.210.88.35
[staging_web_servers]
staging.almalinux.org ansible_ssh_host=18.213.64.210

8
ansible/roles/commons/handlers/main.yml

@ -1,8 +0,0 @@
---
- name: Restart journald
service: name='systemd-journald' state='restarted'
become: yes
- name: Restart SSH
service: name='sshd' state='restarted'
become: yes

33
ansible/roles/commons/tasks/journal.yml

@ -1,33 +0,0 @@
---
- name: Make Journal persist logs
ini_file:
path: /etc/systemd/journald.conf
section: Journal
option: Storage
value: persistent
mode: '0644'
backup: yes
notify: ['Restart journald']
become: yes
- name: Make Journal compress logs
ini_file:
path: /etc/systemd/journald.conf
section: Journal
option: Compress
value: 'true'
mode: '0644'
backup: yes
notify: ['Restart journald']
become: yes
- name: Make Journal store maximum of 30 days of logs
ini_file:
path: /etc/systemd/journald.conf
section: Journal
option: MaxRetentionSec
value: '1month'
mode: '0644'
backup: yes
notify: ['Restart journald']
become: yes

20
ansible/roles/commons/tasks/main.yml

@ -1,20 +0,0 @@
---
- import_tasks: users.yml
- import_tasks: packages.yml
- import_tasks: services.yml
- import_tasks: journal.yml
- name: Set timezone to UTC
timezone:
name: 'Etc/UTC'
become: yes
- name: Set tuned profile
shell: tuned-adm profile '{{ performance_profile }}'
when: performance_profile is defined
changed_when: False
become: yes
- hostname:
name: '{{ inventory_hostname }}'
become: yes

12
ansible/roles/commons/tasks/packages.yml

@ -1,12 +0,0 @@
---
- name: Ensure common system packages
package: name='{{item}}' state=latest
loop:
- iotop
- tuned
- chrony
- traceroute
- bind-utils
- net-tools
- policycoreutils-python-utils
become: yes

8
ansible/roles/commons/tasks/services.yml

@ -1,8 +0,0 @@
---
- name: Enable common services
service: name='{{item}}' state=started enabled=yes
loop:
- sshd
- auditd
- tuned
become: yes

42
ansible/roles/commons/tasks/users.yml

@ -1,42 +0,0 @@
---
- name: Configure users
user:
name: '{{ item.username }}'
create_home: yes
shell: /bin/bash
groups: wheel
append: yes
update_password: always
state: '{{ item.state }}'
loop: '{{ users }}'
become: yes
tags: [ 'users' ]
- name: Configure user SSH keys
authorized_key:
user: '{{ item.username }}'
state: present
key: '{{ item.pubkey }}'
exclusive: true
loop: '{{ users | selectattr("state", "equalto", "present") | list }}'
become: yes
tags: [ 'users' ]
- name: Allow 'wheel' group to have passwordless sudo
lineinfile:
dest: /etc/sudoers
state: present
regexp: '^%wheel'
line: '%wheel ALL=(ALL) NOPASSWD: ALL'
validate: 'visudo -cf %s'
become: yes
- name: Disable root login over SSH
lineinfile: dest=/etc/ssh/sshd_config regexp="^PermitRootLogin" line="PermitRootLogin no" state=present
notify: ['Restart SSH']
become: yes
- name: Disable password login
lineinfile: dest=/etc/ssh/sshd_config regexp="^PasswordAuthentication" line="PasswordAuthentication no" state=present
notify: [ 'Restart SSH' ]
become: yes

8
ansible/roles/website/files/dhparam.pem

@ -1,8 +0,0 @@
-----BEGIN DH PARAMETERS-----
MIIBCAKCAQEA//////////+t+FRYortKmq/cViAnPTzx2LnFg84tNpWp4TZBFGQz
+8yTnc4kmz75fS/jY2MMddj2gbICrsRhetPfHtXV/WVhJDP1H18GbtCFY2VVPe0a
87VXE15/V8k1mE8McODmi3fipona8+/och3xWKE2rec1MKzKT0g6eXq8CrGCsyT7
YdEIqUuyyOP7uWrat2DX9GgdT0Kj3jlN9K5W7edjcrsZCwenyO4KbXCeAvzhzffi
7MA0BM0oNC9hkXL+nOmFg/+OTxIy7vKBg8P+OxtMb61zO7X8vC7CIAXFjvGDfRaD
ssbzSibBsu/6iGtCOGEoXJf//////////wIBAg==
-----END DH PARAMETERS-----

62
ansible/roles/website/files/docker.repo

@ -1,62 +0,0 @@
[docker-ce-stable]
name=Docker CE Stable - $basearch
baseurl=https://download.docker.com/linux/centos/$releasever/$basearch/stable
enabled=1
gpgcheck=1
gpgkey=https://download.docker.com/linux/centos/gpg
[docker-ce-stable-debuginfo]
name=Docker CE Stable - Debuginfo $basearch
baseurl=https://download.docker.com/linux/centos/$releasever/debug-$basearch/stable
enabled=0
gpgcheck=1
gpgkey=https://download.docker.com/linux/centos/gpg
[docker-ce-stable-source]
name=Docker CE Stable - Sources
baseurl=https://download.docker.com/linux/centos/$releasever/source/stable
enabled=0
gpgcheck=1
gpgkey=https://download.docker.com/linux/centos/gpg
[docker-ce-test]
name=Docker CE Test - $basearch
baseurl=https://download.docker.com/linux/centos/$releasever/$basearch/test
enabled=0
gpgcheck=1
gpgkey=https://download.docker.com/linux/centos/gpg
[docker-ce-test-debuginfo]
name=Docker CE Test - Debuginfo $basearch
baseurl=https://download.docker.com/linux/centos/$releasever/debug-$basearch/test
enabled=0
gpgcheck=1
gpgkey=https://download.docker.com/linux/centos/gpg
[docker-ce-test-source]
name=Docker CE Test - Sources
baseurl=https://download.docker.com/linux/centos/$releasever/source/test
enabled=0
gpgcheck=1
gpgkey=https://download.docker.com/linux/centos/gpg
[docker-ce-nightly]
name=Docker CE Nightly - $basearch
baseurl=https://download.docker.com/linux/centos/$releasever/$basearch/nightly
enabled=0
gpgcheck=1
gpgkey=https://download.docker.com/linux/centos/gpg
[docker-ce-nightly-debuginfo]
name=Docker CE Nightly - Debuginfo $basearch
baseurl=https://download.docker.com/linux/centos/$releasever/debug-$basearch/nightly
enabled=0
gpgcheck=1
gpgkey=https://download.docker.com/linux/centos/gpg
[docker-ce-nightly-source]
name=Docker CE Nightly - Sources
baseurl=https://download.docker.com/linux/centos/$releasever/source/nightly
enabled=0
gpgcheck=1
gpgkey=https://download.docker.com/linux/centos/gpg

3
ansible/roles/website/files/le-nginx-reload.sh

@ -1,3 +0,0 @@
#!/bin/bash
# DO NOT EDIT - managed by Ansible.
/sbin/nginx -t && systemctl reload nginx

59
ansible/roles/website/files/nginx.conf

@ -1,59 +0,0 @@
# DO NOT EDIT - managed by Ansible.
user nginx nginx;
pid /run/nginx.pid;
worker_processes auto;
worker_rlimit_nofile 1000000;
events {
multi_accept on;
worker_connections 65535;
use epoll;
}
http {
charset utf-8;
sendfile on;
sendfile_max_chunk 512k;
tcp_nopush on;
tcp_nodelay on;
server_tokens off;
log_not_found off;
types_hash_max_size 2048;
client_max_body_size 16M;
reset_timedout_connection on;
server_names_hash_bucket_size 128;
# MIME
include mime.types;
default_type application/octet-stream;
# Logging
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log warn;
# Limits
limit_req_log_level warn;
limit_req_zone $binary_remote_addr zone=login:10m rate=10r/m;
# SSL
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:150m;
ssl_session_tickets off;
# Diffie-Hellman parameter for DHE ciphersuites
ssl_dhparam /etc/nginx/dhparam.pem;
# Mozilla Intermediate configuration
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
# OCSP Stapling
ssl_stapling on;
ssl_stapling_verify on;
resolver 1.1.1.1 1.0.0.1 valid=60s;
resolver_timeout 2s;
# Load configs
include /etc/nginx/conf.d/*.conf;
}

152
ansible/roles/website/files/nginx.conf.d/almalinux.org.conf

@ -1,152 +0,0 @@
# DO NOT EDIT - managed by Ansible.
upstream almalinux_org_backends {
server 127.0.0.1:9000;
server 127.0.0.1:9001;
server 127.0.0.1:9002;
}
server {
server_name almalinux.org www.almalinux.org staging.almalinux.org;
root /var/www/almalinux.org/current/public;
listen 443 ssl http2;
listen [::]:443 ssl http2;
# SSL
ssl_certificate /etc/ssl/almalinux.org.cert.pem;
ssl_certificate_key /etc/ssl/almalinux.org.key.pem;
# . files
location ~ /\.(?!well-known) {
deny all;
}
# logging
access_log /var/log/nginx/almalinux.org.access.log;
error_log /var/log/nginx/almalinux.org.error.log warn;
location ~ /static/ {
root /var/www/almalinux.org/current/public;
# assets, media
location ~* \.(?:css(\.map)?|js(\.map)?|jpe?g|svgz?|svpng|gif|png|ico|cur|heic|webp|tiff?|mp3|m4a|aac|ogg|midi?|wav|mp4|mov|webm|mpe?g|avi|ogv|flv|wmv)$ {
# 1 day cache
add_header Cache-Control "private, no-transform, must-revalidate, max-age=86400";
etag on;
access_log off;
}
# fonts
location ~* \.(?:ttf|ttc|otf|eot|woff2?)$ {
# 7 day cache
add_header Cache-Control "private, no-transform, must-revalidate, max-age=604800";
add_header Access-Control-Allow-Origin "*";
etag on;
access_log off;
}
}
location ~ /media/ {
root /var/www/almalinux.org;
# media
location ~* \.(?:jpe?g|svgz?|svpng|gif|png|ico|cur|heic|webp|tiff?|mp3|m4a|aac|ogg|midi?|wav|mp4|mov|webm|mpe?g|avi|ogv|flv|wmv)$ {
# 1 day cache
add_header Cache-Control "private, no-transform, must-revalidate, max-age=86400";
etag on;
access_log off;
}
}
location / {
include /etc/nginx/uwsgi_params;
uwsgi_param Host $host;
uwsgi_param X-Real-IP $remote_addr;
uwsgi_param X-Forwarded-For $proxy_add_x_forwarded_for;
uwsgi_param X-Forwarded-Proto $http_x_forwarded_proto;
uwsgi_pass almalinux_org_backends;
}
# favicon.ico
location = /favicon.ico {
expires 1d;
log_not_found off;
access_log off;
}
# robots.txt
location = /robots.txt {
expires 1d;
log_not_found off;
access_log off;
}
# security.txt
location = /security.txt {
expires 1h;
access_log off;
root /var/www/_default;
}
# HTML
location ~* \.(?:html|htm?)$ {
add_header Cache-Control "no-cache, no-transform, must-revalidate";
etag on;
}
# assets, media
location ~* \.(?:css(\.map)?|js(\.map)?|jpe?g|svgz?|svpng|gif|png|ico|cur|heic|webp|tiff?|mp3|m4a|aac|ogg|midi?|wav|mp4|mov|webm|mpe?g|avi|ogv|flv|wmv)$ {
# 1 hour cache
add_header Cache-Control "private, no-transform, must-revalidate, max-age=3600";
etag on;
access_log off;
}
# fonts
location ~* \.(?:ttf|ttc|otf|eot|woff2?)$ {
# 7 day cache
add_header Cache-Control "private, no-transform, must-revalidate, max-age=604800";
add_header Access-Control-Allow-Origin "*";
etag on;
access_log off;
}
# gzip
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_types text/plain text/css text/xml application/json application/javascript application/rss+xml application/atom+xml image/svg+xml;
}
# HTTP to HTTPS redirect
server {
listen 80;
listen [::]:80;
server_name almalinux.org www.almalinux.org staging.almalinux.org almalinux.net almalinux.com;
# ACME-challenge
location ^~ /.well-known/acme-challenge/ {
allow all;
default_type 'text/plain';
root /var/www/_letsencrypt;
}
location / {
return 301 https://$host$request_uri;
}
}
# Redirect for .net and .com
server {
server_name almalinux.net almalinux.com;
listen 443 ssl http2;
listen [::]:443 ssl http2;
# SSL
ssl_certificate /etc/ssl/almalinux.com.cert.pem;
ssl_certificate_key /etc/ssl/almalinux.com.key.pem;
location / {
return 301 https://almalinux.org$request_uri;
}
}

8
ansible/roles/website/files/nginx.repo

@ -1,8 +0,0 @@
# DO NOT EDIT - managed by Ansible.
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

2
ansible/roles/website/files/security.txt

@ -1,2 +0,0 @@
Contact: https://almalinux.atlassian.net/browse/SEC
Preferred-Languages: en

6
ansible/roles/website/files/tempcrt.sh

@ -1,6 +0,0 @@
#!/bin/bash
openssl req -x509 -nodes -days 398 -newkey rsa:2048 \
-keyout /etc/ssl/selfsigned.key \
-out /etc/ssl/selfsigned.crt \
-subj '/C=ES/ST=Moon/L=Moon/O=Acme Inc./OU=IT Department/CN=localhost'

12
ansible/roles/website/handlers/main.yml

@ -1,12 +0,0 @@
---
- name: Reload NGINX
service: name='nginx' state='reloaded'
become: yes
- name: Restart NGINX
service: name='nginx' state='restarted'
become: yes
- name: Generate temporary SSL
command: /opt/tempcrt.sh
become: yes

37
ansible/roles/website/tasks/docker.yml

@ -1,37 +0,0 @@
---
- name: Remove not-Docker
package: name='{{item}}' state=absent
loop:
- docker
- docker-client
- docker-client-latest
- docker-common
- docker-latest
- docker-latest-logrotate
- docker-logrotate
- docker-engine
become: yes
- name: Configure Docker upstream repository
copy: src='docker.repo' dest='/etc/yum.repos.d/docker.repo' mode='0644' owner=root group=root
become: yes
- name: Install Docker
package: name='{{item}}' state=latest
loop:
- docker-ce
- docker-ce-cli
- containerd.io
become: yes
- name: Ensure latest pip
pip: name='pip' executable='/usr/local/bin/pip3' extra_args='--upgrade'
become: yes
- name: Install docker-compose
pip: name='docker-compose' executable='/usr/local/bin/pip3'
become: yes
- name: Enable and start Docker service
service: name='docker' state=started enabled=yes
become: yes

5
ansible/roles/website/tasks/main.yml

@ -1,5 +0,0 @@
---
- import_tasks: docker.yml
- import_tasks: users.yml
- import_tasks: nginx.yml
- import_tasks: website.yml

82
ansible/roles/website/tasks/nginx.yml

@ -1,82 +0,0 @@
---
- name: Deploy temporary SSL cert build script
copy: src='tempcrt.sh' dest='/opt/tempcrt.sh' mode='0750' owner=root group=root
become: yes
- name: Create temporary SSL cert if none exists
stat:
path: /etc/ssl/selfsigned.key
register: selfsigned_key
changed_when: not selfsigned_key.stat.exists
become: yes
notify: [ 'Generate temporary SSL' ]
- meta: flush_handlers
- name: Install certbot
pip: name='certbot' executable='/usr/local/bin/pip3'
become: yes
- name: Configure NGINX upstream repository
copy: src='nginx.repo' dest='/etc/yum.repos.d/nginx.repo' mode='0644' owner=root group=root
become: yes
- name: Install NGINX
package: name='nginx' state=latest
notify: [ 'Restart NGINX' ]
become: yes
- name: Install OpenSSL
package: name='openssl' state=latest
become: yes
- name: Configure NGINX
copy: src='nginx.conf' dest='/etc/nginx/nginx.conf' mode='0644' owner='root' group='root'
notify: [ 'Reload NGINX' ]
become: yes
- name: Deploy dhparam.pem
copy: src='dhparam.pem' dest='/etc/nginx/dhparam.pem' mode='0644' owner=root group=root
notify: [ 'Reload NGINX' ]
become: yes
- name: Create common site directory
file: path='/var/www/_default' state=directory mode='0755' owner=root group=root
become: yes
- name: Deploy security.txt
copy: src='security.txt' dest='/var/www/_default/security.txt' mode='0644' owner=root group=root
become: yes
- name: Create letsencrypt known root
file: path='/var/www/_letsencrypt' state=directory mode='0755' owner='nginx' group='nginx'
become: yes
- name: Create letsencrypt update hook directory
file: path='/etc/letsencrypt/renewal-hooks/post/' state=directory mode='0755' owner='root' group='root'
become: yes
- name: Deploy LetsEncrypt NGINX post-update hook
copy: src='le-nginx-reload.sh' dest='/etc/letsencrypt/renewal-hooks/post/nginx-reload.sh' mode='0755' owner=root group=root
become: yes
- name: Enable and start NGINX service
service: name='nginx' state=started enabled=yes
become: yes
- name: Create certbot update CRON job
cron:
name: 'certbot auto update'
minute: '0'
hour: '8'
user: 'root'
job: '/usr/local/bin/certbot renew --webroot --email info@almalinux.org -w /var/www/_letsencrypt -n --agree-tos 2>&1 | /usr/bin/logger -t certbot'
cron_file: 'certbot-auto_update'
become: yes
- name: Set httpd_can_network_connect flag on and keep it persistent across reboots
seboolean:
name: httpd_can_network_connect
state: yes
persistent: yes
become: yes

32
ansible/roles/website/tasks/users.yml

@ -1,32 +0,0 @@
---
- name: Ensure group deploy exists
group:
name: deploy
state: present
gid: 900
become: yes
- name: Configure deployment user
user:
name: deploy
create_home: yes
shell: /bin/bash
groups: docker
append: yes
state: present
uid: 900
become: yes
- name: Ensure deploy .ssh directory
file:
path: /home/deploy/.ssh
state: directory
owner: deploy
group: deploy
mode: '0700'
become: yes
- name: Add all authorized keys to deployment user
template: src='web_authorized_keys.jinja2' dest='/home/deploy/.ssh/authorized_keys' mode='0600' owner=deploy group=deploy
become: yes
tags: [ 'users' ]

84
ansible/roles/website/tasks/website.yml

@ -1,84 +0,0 @@
---
- name: Ensure deployment directory
file:
path: /opt/almalinux.org/
state: directory
owner: deploy
group: deploy
mode: '0750'
become: yes
- name: Ensure deployment releases directory
file:
path: /opt/almalinux.org/release/
state: directory
owner: deploy
group: deploy
mode: '0750'
become: yes
- name: Ensure webroot directory
file:
path: /var/www/almalinux.org/
state: directory
owner: deploy
group: nginx
mode: '0750'
become: yes
- name: Ensure webroot release deployment directory
file:
path: /var/www/almalinux.org/release/
state: directory
owner: deploy
group: nginx
mode: '0750'
become: yes
- name: Ensure media uploads directory
file:
path: /var/www/almalinux.org/media/
state: directory
owner: deploy
group: nginx
mode: '0750'
recurse: true
become: yes
- name: Check if site SSL cert exists
stat:
path: /etc/ssl/almalinux.org.cert.pem
register: site_cert
become: yes
- name: Check if site SSL key exists
stat:
path: /etc/ssl/almalinux.org.key.pem
register: site_key
become: yes
- name: Link site cert to temporary cert if site cert does not exist
file:
src: /etc/ssl/selfsigned.crt
dest: /etc/ssl/almalinux.org.cert.pem
owner: root
group: root
state: link
become: yes
when: not site_cert.stat.exists
- name: Link site key to temporary key if site key does not exist
file:
src: /etc/ssl/selfsigned.key
dest: /etc/ssl/almalinux.org.key.pem
owner: root
group: root
state: link
become: yes
when: not site_key.stat.exists
- name: Configure almalinux.org vhost
copy: src='nginx.conf.d/almalinux.org.conf' dest='/etc/nginx/conf.d/almalinux.org.conf' mode='0644' owner=root group=root
notify: [ 'Reload NGINX' ]
become: yes
tags: [ 'www_conf' ]

3
ansible/roles/website/templates/web_authorized_keys.jinja2

@ -1,3 +0,0 @@
{% for key in deployment_keys %}
{{ key }}
{% endfor %}

11
ansible/site.yml

@ -1,11 +0,0 @@
---
- hosts: production_web_servers
roles:
- role: commons
- role: website
- hosts: staging_web_servers
roles:
- role: commons
- role: website

6
archetypes/default.md

@ -0,0 +1,6 @@
---
title: "{{ replace .Name "-" " " | title }}"
date: {{ .Date }}
draft: true
---

838
assets/css/bundle.css

@ -0,0 +1,838 @@
.row{
margin-left: 0 !important;
margin-right: 0 !important;
}
.container{
padding: 0 ;
}
.al-primary-navbar .container {
padding-left: 15px !important;
padding-right: 15px !important;
}
.al-index-faq .container {
padding-left: 15px !important;
padding-right: 15px !important;
}
.al-index-press .container {
padding-right: 15px !important;
padding-left: 15px !important;
}
.elevate-container-wrap{
padding-right: 15px !important;
padding-left: 15px !important;
}
.al-page-index .al-hero-cta-primary {
background: #24c2ff;
color: #222222;
margin:10px 10px 10px 0;
}
.al-page-index .al-hero-cta-primary:hover {
background: #0bbbff;
}
.al-page-index .al-hero-cta-secondary {
background: #86da2f;
color: #222222;
margin: 10px;
}
.al-page-index .al-hero-cta-secondary:hover {
background: #79cb24;
}
.al-page-index .al-hero-cta-tertiary {
background: #ffcb12;
color: #222222;
margin: 10px;
}
.al-page-index .al-hero-cta-tertiary img {
display: inline;
height: 1em;
}
.al-page-index .al-hero-cta-tertiary:hover {
background: #f8c100;
}
.al-page-index .al-index-feature-container {
background: #0e3b5c;
}
.al-page-index .al-index-feature-container .al-index-feature-icon {
color: white;
font-size: 32px;
padding-right: 22px;
}
[dir=rtl] .al-page-index .al-index-feature-container .al-index-feature-icon {
padding-right: 0;
padding-left: 22px;
}
.al-page-index .al-index-community-container {
background: #0e3b5c;
}
.al-page-index .al-index-community-container .al-index-community-icon {
color: #fefefe;
font-size: 32px;
padding-right: 22px;
flex: 0;
}
[dir=rtl] .al-page-index .al-index-community-container .al-index-community-icon {
padding-right: 0;
padding-left: 22px;
}
.al-page-index .al-index-community-container .al-index-community-icon.img {
height: 32px;
box-sizing: border-box;
}
.al-index-community-content-wrap {
display: flex;
flex: 1;
flex-direction: column;
}
.al-index-community-content-wrap p{
flex: 1;
}
.al-page-index .al-index-community-container .al-community-cta {
min-width: 120px;
}
.al-page-index .al-index-backed-by h2.border-bottom {
border-bottom-color: #14598a !important;
}
.al-backed-by-list a{
margin-top: 3rem !important;
}
.al-page-index .al-index-backed-by .al-backed-by-list {
justify-content: space-between;
padding: 0;
}
.al-page-index .al-index-backed-by .al-backed-by-list div.col {
text-align: center;
}
.al-page-index .al-index-backed-by .al-backed-by-list .al-backer-logo-container {
height: 100%;
}
.al-page-index .al-index-backed-by .al-backed-by-list .al-backer-logo {
height: 100%;
width: 120px;
/* padding: 10px; */
}
.al-page-index .al-index-commercial-support h2.border-bottom {
border-bottom-color: #14598a !important;
}
.al-page-index .al-index-commercial-support .al-commercial-supporter-list {
justify-content: center;
}
.al-page-index .al-index-commercial-support .al-commercial-supporter-list div.col {
text-align: center;
}
.al-page-index .al-index-commercial-support .al-commercial-supporter-list .al-commercial-supporter-logo-container {
height: 100%;
}
.al-page-index .al-index-commercial-support .al-commercial-supporter-list .al-commercial-supporter-logo {
max-width: 120px;
width: 100%;
}
.al-page-index .al-index-faq {
background: #0e3b5c;
}
.al-page-index .al-index-faq .accordion-button {
border: none;
box-shadow: none;
font-weight: normal;
background: #104469;
width: 100% !important;
text-align: left !important;
padding: 20px 10px !important;
color: #fefefe !important;
font-size: 15px;
}
.al-page-index .al-index-faq .accordion-button:active, .al-page-index .al-index-faq .accordion-button.active, .al-page-index .al-index-faq .accordion-button:hover, .al-page-index .al-index-faq .accordion-button:focus {
box-shadow: none;
outline: none;
border: none;
}
.al-page-index .al-index-faq .accordion-button:not(.collapsed) {
background: #104469;
color: #fefefe;
}
.al-page-index .al-index-faq .accordion-body {
background: #114a73;
padding: 15px 10px;
margin-top: -8px;
color: #fefefe;
}
.al-page-index .al-index-newsletter a {
text-decoration: underline !important;
}
.al-page-index .al-index-newsletter .al-newsletter-input {
background-color: white;
}
.al-page-index .al-index-newsletter .al-newsletter-button {
background: #86da2f;
color: #000518;
}
.al-page-index .al-index-newsletter .al-newsletter-button:hover {
color: #000518;
background: #79cb24;
}
.al-page-index .al-index-press {
background: #0e3b5c;
}
.al-page-index .al-index-press .al-index-press-item {
margin-bottom: 10px;
}
.al-page-index .al-index-press .al-index-press-item blockquote.blockquote {
padding-bottom: 7px;
font-family: "Montserrat", -apple-system, BlinkMacSystemFont, "segoe ui", roboto, oxygen-sans, ubuntu, cantarell, "helvetica neue", "arial", sans-serif, "apple color emoji", "segoe ui emoji", "segoe ui symbol";
font-size: 1.4rem;
}
.al-page-index .al-index-press .al-index-press-item blockquote.blockquote:before {
content: open-quote;
padding-right: 3px;
}
.al-page-index .al-index-press .al-index-press-item blockquote.blockquote:after {
content: close-quote;
padding-left: 3px;
}
.al-page-index .al-index-press .al-index-press-item blockquote.blockquote:before, .al-page-index .al-index-press .al-index-press-item blockquote.blockquote:after {
font-family: "Montserrat", -apple-system, BlinkMacSystemFont, "segoe ui", roboto, oxygen-sans, ubuntu, cantarell, "helvetica neue", "arial", sans-serif, "apple color emoji", "segoe ui emoji", "segoe ui symbol";
vertical-align: top;
display: inline-block;
color: #faf5f5;
font-weight: bold;
font-size: 1rem;
}
.al-page-index .al-index-press .al-index-press-item figcaption.blockquote-footer {
color: #fefefe;
}
.al-page-index .al-index-press .al-index-press-item figcaption.blockquote-footer cite {
font-style: normal;
}
.al-page-index .al-index-press .al-index-press-item figcaption.blockquote-footer a {
text-decoration: none;
}
.al-page-index .al-index-press .al-index-press-item figcaption.blockquote-footer a:hover {
text-decoration: underline;
color: #f7fbff;
}
.al-page-blog-index .al-page-blog-posts article a.al-article-title-link {
text-decoration: none;
}
.al-page-blog-index .al-page-blog-posts article a.al-article-title-link h2 {
font-weight: 400;
font-size: 1.5rem;
}
.al-page-blog-index .al-page-blog-posts article .al-article-date {
color: #efefef;
font-size: 0.82rem;
}
.al-page-blog-index .al-page-blog-posts article .al-article-date i {
font-size: 0.8rem;
}
[dir=rtl] .al-page-blog-index .al-page-blog-posts article .al-article-date i {
padding-right: 0;
padding-left: 6px;
}
.al-page-blog-index .al-page-blog-posts article .al-article-excerpt {
color: #fefefe;
}
.al-page-blog-index .al-page-blog-posts article .al-article-actions a.al-article-continue {
text-decoration: none;
font-size: 0.9rem;
color: #C4E1FF;
}
.al-page-blog-index .al-page-blog-posts article .al-article-actions a.al-article-continue:hover {
text-decoration: underline;
}
.al-page-blog-index .al-page-blog-posts article .al-article-author img {
width: 40px;
height: 40px;
}
.al-page-blog-index .al-page-blog-posts article .al-article-author .al-article-author-name {
font-style: italic;
font-size: 14px;
margin: 0px;
margin-bottom: 5px;
color: #C4E1FF;
}
.al-page-blog-index .al-page-blog-posts article .al-article-author .al-article-author-bio {
font-style: italic;
font-size: 12px;
margin: 0px;
color: #C4E1FF;
}
.al-page-blog-index .pagination .page-item .page-link {
background: #196da9;
border: none;
}
.al-page-blog-index .pagination .page-item .page-link:hover {
color: #efefef;
}
.al-page-blog-index .pagination .page-item.active .page-link {
background: #1f8ad5;
}
.al-page-blog-index .pagination .page-item.disabled .page-link {
color: #051723;
}
.al-page-blog-post article .al-article-date {
color: #efefef;
font-size: 0.82rem;
}
.al-page-blog-post article .al-article-date i {
font-size: 0.8rem;
margin-right: 5px;
}
[dir=rtl] .al-page-blog-post article .al-article-date i {
padding-right: 0;
padding-left: 6px;
}
.al-page-blog-post article .al-article-content {
color: #fefefe;
}
.al-page-blog-post article .al-article-content img {
max-width: 100%;
}
.al-page-blog-post article .al-page-blog-author img {
width: 40px;
height: 40px;
}
.al-page-blog-post article .al-page-blog-author .al-page-blog-author-name {
font-style: italic;
font-size: 14px;
margin: 0px;
margin-bottom: 5px;
color: #C4E1FF;
}
.al-page-blog-post article .al-page-blog-author .al-page-blog-author-bio {
font-style: italic;
font-size: 12px;
margin: 0px;
color: #C4E1FF;
}
.al-page-blog-post .al-blog-pagination .al-blog-previous-button {
background: #86da2f;
color: #222222;
}
.al-page-blog-post .al-blog-pagination .al-blog-previous-button:hover {
background: #79cb24;
}
.al-page-blog-post .al-blog-pagination .al-blog-next-button {
background: #86da2f;
color: #222222;
float: right;
}
.al-page-blog-post .al-blog-pagination .al-blog-next-button:hover {
background: #79cb24;
}
.al-page-blog-post .al-blog-pagination a {
text-decoration: none;
display: inline-block;
padding: 10px 16px;
font-size: 15px;
}
.custom-blog-page-section{
width: 680px;
margin: auto;
}
.al-page-blog-post .container{
padding: 3rem 15px !important;
}
.al-page-elevate-index .al-cta-discuss {
background: #2891ff;
color: #222;
}
.al-page-elevate-index .al-cta-discuss:hover {
background: #0f84ff;
}
.al-page-elevate-index .al-cta-learn-how {
background: #86da2f;
color: #222222;
}
.al-page-elevate-index .al-cta-learn-how:hover {
background: #79cb24;
}
.al-page-elevate-index .faq-container {
margin-bottom: 120px;
}
.al-page-elevate-index .al-faq-slim {
padding-top: 25px;
padding-bottom: 25px;
font-weight: 300;
}
.al-page-elevate-index .al-faq-slim > div {
padding-bottom: 26px;
}
.al-page-elevate-index .al-faq-slim > div div.question {
font-weight: 500;
font-size: 1.1rem;
text-transform: uppercase;
margin-bottom: 8px;
}
.al-page-foundation-members-index .al-members .al-member-item {
height: 100%;
background: rgb(14, 59, 92);
}
.al-page-foundation-members-index .al-member-apply-category-icon {
color: white;
font-size: 32px;
padding-right: 22px;
}
[dir=rtl] .al-page-foundation-members-index .al-member-apply-category-icon {
padding-right: 0;
padding-left: 22px;
}
.al-page-foundation-members-index .al-member-apply-cta {
min-width: 120px;
}
.al-page-foundation-members-index .fw-light .al-laws-link, .al-page-foundation-members-index .fw-light .al-guideline-link {
text-decoration: none;
}
.al-page-foundation-members-index .fw-light .al-laws-link:hover, .al-page-foundation-members-index .fw-light .al-laws-link:active, .al-page-foundation-members-index .fw-light .al-guideline-link:hover, .al-page-foundation-members-index .fw-light .al-guideline-link:active {
text-decoration: underline;
}
.al-page-foundation-members-index .al-membership-info {
display: none;
}
.al-membership-info table {
color: #fefefe !important;
}
.al-page-foundation-members-index #al-mirror-info ul, .al-page-foundation-members-index #al-sponsor-info ul {
list-style-type: "- ";
}
.al-page-foundation-members-index .member-info:hover {
color: #86da2f;
}
.al-page-foundation-members-index .al-foundation-members-apply-content-wrap {
display: flex;
flex-direction: column;
flex: 1;
}
.al-page-foundation-members-index .al-foundation-members-apply-content-wrap p {
flex: 1;
}
.al-page-contribute-index {
padding-bottom: 120px;
}
.al-page-contribute-index .al-subtle-links a {
text-decoration: none;
}
.al-page-contribute-index .al-subtle-links a:hover, .al-page-contribute-index .al-subtle-links a:active {
text-decoration: underline;
}
.al-page-contribute-index .al-cta-chat {
background: #86da2f;
color: #222222;
}
.al-page-contribute-index .al-cta-chat:hover {
background: #79cb24;
}
.al-page-contribute-index .al-member-button {
background: #86da2f;
color: #222222;
}
.al-page-contribute-index .al-member-button:hover {
background: #79cb24;
}
body, html {
line-height: initial;
font-weight: normal;
font-style: normal;
-webkit-font-smoothing: subpixel-antialiased;
-moz-osx-font-smoothing: grayscale;
text-rendering: auto;
letter-spacing: normal;
word-spacing: normal;
text-transform: none;
text-shadow: none;
position: relative;
box-sizing: border-box;
margin: 0;
padding: 0;
}
body {
background: #0f4266;
}
h1, h2, h3, h4, h5, h6 {
font-family: "Montserrat", -apple-system, BlinkMacSystemFont, "segoe ui", roboto, oxygen-sans, ubuntu, cantarell, "helvetica neue", "arial", sans-serif, "apple color emoji", "segoe ui emoji", "segoe ui symbol";
}
.al-body-container {
min-height: 65vh;
}
button:active {
outline: none;
border: 0px solid transparent;
}
button:focus, .btn:focus {
outline: none !important;
box-shadow: none !important;
}
.row {
margin-left: 0 !important;
margin-right: 0 !important;
}
.al-primary-navbar {
background: #082336;
font-family: "Montserrat", -apple-system, BlinkMacSystemFont, "segoe ui", roboto, oxygen-sans, ubuntu, cantarell, "helvetica neue", "arial", sans-serif, "apple color emoji", "segoe ui emoji", "segoe ui symbol";
font-weight: 500;
box-shadow: 0 3px 4px 0 rgba(0, 0, 0, 0.07), 0 3px 3px -2px rgba(0, 0, 0, 0.06), 0 1px 8px 0 rgba(0, 0, 0, 0.1);
}
.al-primary-navbar .nav-link.al-download-button {
font-weight: 500;
background-color: #86da2f;
color: black !important;
}
.al-primary-navbar .nav-link.al-download-button:hover {
color: black !important;
background: #79cb24;
}
.al-primary-navbar .nav-link {
padding-left: 1rem !important;
padding-right: 1rem !important;
color: #fff !important;
font-size: 15px;
transition: 0.3s ease-in-out;
text-decoration: none !important;
cursor: pointer !important;
}
.al-primary-navbar .nav-link:hover {
color: #1e87f8 !important;
}
.al-primary-navbar.with-motd {
padding-bottom: 0;
border-bottom: 0;
}
.al-primary-navbar .dropdown-menu-dark {
background: #082336;
border: 0;
}
.dropdown-item{
text-decoration: none !important;
}
.al-primary-navbar .dropdown-menu-dark .dropdown-item:hover {
background-color: rgba(255, 255, 255, 0.1490196078) !important;
}
.al-primary-navbar .dropdown-menu-dark .dropdown-divider {
border-color: #264154;
}
.al-primary-navbar .al-language-switch img {
height: 24px;
}
.al-primary-navbar .al-language-link {
text-transform: capitalize;
color: aliceblue;
}
.al-primary-navbar .al-translate-callout {
font-size: 0.92rem;
}
.al-primary-navbar .al-translate-callout a {
display: flex;
align-items: center;
color: #69b1ff;
}
.al-primary-navbar .al-translate-callout a i {
margin-right: 0.4rem;
font-size: 0.8rem;
}
#al-motd {
width: 100%;
background: #051520;
/* margin-top: 8px; */
padding-top: 12px;
padding-bottom: 12px;
font-size: 0.8rem;
}
#al-motd > .container {
display: flex;
}
#al-motd > .container > i {
padding-right: 8px;
}
#al-motd > .container > .text {
display: block;
font-weight: 500;
}
#al-motd > .container > .text a {
text-decoration: none;
}
#al-motd > .container > .text a:hover {
text-decoration: underline;
color: inherit;
}
section h1.al-section-title {
font-size: 2.6rem;
font-weight: 300;
}
.al-primary-footer {
background: #0D3654;
padding-top: 122px;
padding-bottom: 132px;
}
.al-py-lg {
padding-top: 3rem !important;
padding-bottom: 3rem !important;
}
.al-py-md {
padding-top: 2.5rem !important;
padding-bottom: 2.5rem !important;
}
.al-text-shadow-dark {
text-shadow: 1px 3px 3px rgba(0, 0, 0, 0.5);
}
.btn {
transition-property: all;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
transition-duration: 0.12s;
text-decoration: none !important;
}
a{
transition-property: all;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
transition-duration: 0.12s;
text-decoration: underline;
}
a:hover{
color: #9db4cc;
}
.al-wysiwyg {
all: revert;
font-family: -apple-system, BlinkMacSystemFont, "segoe ui", roboto, oxygen-sans, ubuntu, cantarell, "helvetica neue", "arial", sans-serif, "apple color emoji", "segoe ui emoji", "segoe ui symbol";
font-size: 15px;
}
.al-wysiwyg h1, .al-wysiwyg h2, .al-wysiwyg h3, .al-wysiwyg h4, .al-wysiwyg h5, .al-wysiwyg h6 {
all: revert;
font-family: "Montserrat", -apple-system, BlinkMacSystemFont, "segoe ui", roboto, oxygen-sans, ubuntu, cantarell, "helvetica neue", "arial", sans-serif, "apple color emoji", "segoe ui emoji", "segoe ui symbol";
}
.al-wysiwyg ul,
.al-wysiwyg ol,
.al-wysiwyg ul li,
.al-wysiwyg ol li,
.al-wysiwyg p,
.al-wysiwyg pre,
.al-wysiwyg blockquote {
all: revert;
font-family: -apple-system, BlinkMacSystemFont, "segoe ui", roboto, oxygen-sans, ubuntu, cantarell, "helvetica neue", "arial", sans-serif, "apple color emoji", "segoe ui emoji", "segoe ui symbol";
font-size: 15px;
}
.al-wysiwyg pre, .al-wysiwyg code {
font-family: "SF Mono", "source code pro", consolas, "courier new", courier, monospace;
}
.fw-bold{
font-weight: 700 !important;
}
.fw-light{
font-weight: 300;
}
.fs-6 {
font-size: 1rem!important;
}
.display-5{
font-size: 46px !important;
line-height: 47px
}
.lead {
font-size: 1.25rem !important;
font-weight: 400 !important;
}
@media (min-width:1400px){
.container{
max-width: 1320px;
}
}
.al-certified-amd-page .banner {
background-image: url(/images/main-image.png);
background-size: cover;
padding: 180px 0 300px;
background-position:25%;
}
.al-certified-amd-page .container {
margin: 0 auto;
max-width: 1180px;
}
.al-certified-amd-page .banner h1 {
font-size: 40px;
font-weight: 600;
max-width: 600px;
}
.al-certified-amd-page .banner p {
font-size: 22px;
font-style: italic;
font-weight: 500;
}
.al-certified-amd-page section.content {
background-color: #0e3b5c;
}
.al-certified-amd-page .content p {
margin: 0 auto;
max-width: 900px;
padding: 60px 0;
text-align: center;
}
.al-certified-amd-page .info-flex {
align-items: center;
display: flex;
justify-content: space-evenly;
padding: 60px 0;
}
.al-certified-amd-page .img img {
height: 300px;
}
.al-certified-amd-page .text>div {
align-items: center;
display: flex;
font-size: 16px;
margin-bottom: 30px;
}
.al-certified-amd-page .info-block-title {
font-size: 25px!important;
font-weight: 500;
margin-bottom: 40px!important;
}
.al-certified-amd-page .info-flex .text img {
height: 25px;
margin-right: 20px;
}
.al-certified-amd-page .container{
padding: 3rem 15px;
}
.al-certified-amd-page img{
max-width: 100%;
}
.al-certified-amd-page button.request {
background-color: #0069d9;
border: 0;
cursor: pointer;
font-size: 16px;
margin-top: 20px;
padding: 17px 35px;
}
.al-certified-amd-page .test-cta {
padding: 60px 0;
text-align: center;
}
.al-certified-amd-page .test-cta a, .al-certified-amd-page .test-cta button {
background-color: #87d831;
border: 0;
color: #000;
cursor: pointer;
font-size: 16px;
margin-top: 0;
padding: 17px 50px;
-webkit-text-decoration: None;
text-decoration: None;
}
.al-certified-amd-page .test table {
margin: 0 auto;
max-width: 800px;
width: 100%;
}
.al-certified-amd-page .test table td, .al-certified-amd-page .test table th {
background-color: #0e3b5c;
font-weight: 500;
padding: 20px 40px;
text-transform: uppercase;
width: 35%;
}
.al-certified-amd-page td.passed {
padding-left: 80px!important;
position: relative;
}
.al-certified-amd-page .checkmark {
border-bottom: 6px solid #0069d9;
border-right: 6px solid #0069d9;
display: inline-block;
height: 25px;
left: 40px;
position: absolute;
top: 25px;
transform: rotate(45deg);
width: 12px;
}
.al-certified-amd-page {
color: #fff;
font-family: Montserrat,sans-serif;
margin: 0;
width: 100%;
}
.al-certified-amd-page p.test-title {
font-size: 20px;
font-weight: 500;
padding-top: 40px;
text-transform: uppercase;
}
.al-certified-amd-page .test img {
margin-top: 40px;
max-height: 400px;
}
.al-certified-amd-page .form {
margin-top: 40px;
}
.al-page-blog-index {
margin: auto;
max-width: 680px;
}
.al-article-actions i {
margin-right: 5px;
}
.pagination .page-item .page-link {
background: #196da9 !important;
padding: .375rem .75rem !important;
color: #c4e1ff;
border: none;
text-decoration: none;
}
.pagination .active .page-link{
background: #1f8ad5 !important;
}
.pagination .disabled {
color: #000 !important;
}
/*# sourceMappingURL=bundle.css.map */

1
assets/css/bundle.css.map

@ -0,0 +1 @@
{"version":3,"sourceRoot":"","sources":["../scss/home.scss","../scss/variables.scss","../scss/blog.scss","../scss/elevate.scss","../scss/members.scss","../scss/contribute.scss","../scss/main.scss"],"names":[],"mappings":"AAOE;EACE;EACA;EACA;;AACA;EACE;;AAIJ;EACE,YCMY;EDLZ;EACA;;AAEA;EACE;;AAIJ;EACE,YCCe;EDAf;EACA;;AAEA;EACE;EACA;;AAGF;EACE;;AAIJ;EACE;;AAEA;EACE;EACA;EACA;;AAGE;EACE;EACA;;;AAMR;EACE;;AAEA;EACE,OC7DU;ED8DV;EACA;EACA;;AAGE;EACE;EACA;;;AAIJ;EACE;EACA;;AAKJ;EACE;;AAKF;EACE;;AAIF;EACE;;AAEA;EACE;;AAGF;EACE;;AAKF;EACE;EACA;EAEA;;AAUJ;EACE;;AAKF;EACE;;AAEA;EACE;;AAGF;EACE;;AAGF;EACE;EACA;;AAKN;EACE;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAGF;EACE;EACA,OCpKQ;;ADwKZ;EACE;EACA;EACJ;EACA;;AAQE;EACE;;AAGF;EACE;EACA;;AAEA;EACE;EACA;;AAKN;EACE;;AAIA;EACE;;AAEA;EACE;EACA,aCzMgB;ED0MhB;;AAEA;EACE;EACA;;AAGF;EACE;EACA;;AAGF;EAEE,aCxNc;EDyNd;EACA;EACA;EACA;EACA;;AAIJ;EACE,OCtOQ;;ADwOR;EACE;;AAGF;EACE;;AAEA;EACE;EACA;;;AE1ON;EACE;;AAEA;EACE;EACA;;AAIJ;EACE;EACA;;AAEA;EACE;;AAGE;EACE;EACA;;;AAMR;EACE,ODjCQ;;ACqCR;EACE;EACA;EACA;;AAEA;EACE;;AAMJ;EACE;EACA;;AAEF;EACE;EACA;EACA;EACA;EACA;;AAEF;EACE;EACA;EACA;EACA;;AAQJ;EACE;EACA;;AAEA;EACE;;AAKF;EACE;;AAKF;EACE;;;AASN;EACE;EACA;;AAEA;EACE;;AAGE;EACE;EACA;;;AAMR;EACE,ODnHU;;ACqHV;EACE;;AAIA;EACE;EACA;;AAEF;EACE;EACA;EACA;EACA;EACA;;AAEF;EACE;EACA;EACA;EACA;;AAMN;EACE,YD1HU;EC2HV;;AAEA;EACE;;AAGJ;EACE,YDlIU;ECmIV;EACA;;AAEA;EACE;;AAGJ;EACE;EACA;EACA;EACA;;;AAKN;EACE,WD1H2B;EC2H3B;;;ACtKA;EACE,YFcsB;EEbtB;;AAEA;EACE;;AAIJ;EACE,YFOY;EENZ;;AAEA;EACE;;AAIJ;EACE;;AAOF;EACE;EACA;EACA;;AAEA;EACE;;AAEA;EACE;EACA;EACA;EACA;;;ACtCJ;EACE;EACA;;AAIJ;EACE;EACA;EACA;;AAGE;EACE;EACA;;;AAKN;EACE;;AAIA;EACE;;AAEA;EACE;;AAKN;EACE;;AAIA;EACI;;AAIN;EACE;;AAIA;EACE;EACA;EACA;;AAEA;EACE;;;ACxDR;EACE;;AAGE;EACE;;AAEA;EACE;;AAKN;EACE,YJKY;EIJZ;;AAEA;EACE;;AAIJ;EACE,YJJY;EIKZ;;AAEA;EACE;;;ACrBN;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE,YLnBmB;;;AKsBrB;EACE,aL3BsB;;;AK8BxB;EACE;;;AAGF;EACA;EACA;;;AAGA;EACE;EACA;;;AAEF;EACE;EACA;;;AAIF;EACE,YLtBiB;EKuBjB,aLnDsB;EKoDtB;EACA;;AAEA;EAEE;EACA;EACA;EACA;EACA;;AACA;EACE;;AAIJ;EACE;EACA;;AAKF;EACE,YL/Ce;EKgDf;;AAIA;EACE,cLnDqB;;AK2DzB;EACE;EACA,YLzEY;EK0EZ,OL/FkB;;AKiGlB;EACE,OLlGgB;EKmGhB;;AAKF;EACE;;AAIJ;EACE;EACA;;AAGF;EACE;;AAEA;EACE;EACA;EACA;;AAEA;EACE;EACA;;;AAOR;EACE;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAEA;EACE;;AAGF;EACE;;AAEA;EACE;;AAEA;EACE;EACA;;;AAQV;EACE;EACA;;;AAIF;EACE;EACA;EACA;;;AAIF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;;;AAIF;EACE;EACA;EACA;;;AAMF;EAEE;EACA,aLxMe;EKyMf,WAHuB;;AAKvB;EACE;EACA,aL5MoB;;AK+MtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAOE;EACA,aLxNa;EKyNb,WAnBqB;;AAsBvB;EACE,aL3NkB","file":"bundle.css"}

BIN
assets/images/AlmaLinux_9.1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 423 KiB

BIN
assets/images/profile.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

0
almalinux/__init__.py → assets/js/blog.js

8
frontend/src/common/js/main.js → assets/js/main.js

@ -1,7 +1,8 @@
import '@common/scss/main.scss';
import '@assets/scss/main.scss';
// noinspection ES6UnusedImports
import {Dropdown} from 'bootstrap';
// Ensure locales are made for all languages
// noinspection JSUnusedLocalSymbols
const helloWorld = gettext('Hello World');
@ -25,3 +26,8 @@ window.addEventListener('DOMContentLoaded', () => {
maybeHideMotd()
}
});

32
assets/js/member.js

@ -0,0 +1,32 @@
"use strict";
(self.webpackChunk = self.webpackChunk || []).push([
[229],
{
63: function () {
window.addEventListener("DOMContentLoaded", function () {
document.getElementById("contributor").addEventListener("click", function () {
var e = document.getElementById("al-contributor-info"),
n = document.getElementById("al-mirror-info"),
t = document.getElementById("al-sponsor-info");
(n.style.display = "none"), (t.style.display = "none"), ("none" === e.style.display) | ("" == e.style.display) ? (e.style.display = "block") : (e.style.display = "none");
}),
document.getElementById("mirror").addEventListener("click", function () {
var e = document.getElementById("al-mirror-info"),
n = document.getElementById("al-contributor-info"),
t = document.getElementById("al-sponsor-info");
(n.style.display = "none"), (t.style.display = "none"), ("none" === e.style.display) | ("" == e.style.display) ? (e.style.display = "block") : (e.style.display = "none");
}),
document.getElementById("sponsor").addEventListener("click", function () {
var e = document.getElementById("al-sponsor-info"),
n = document.getElementById("al-mirror-info");
(document.getElementById("al-contributor-info").style.display = "none"), (n.style.display = "none"), ("none" === e.style.display) | ("" == e.style.display) ? (e.style.display = "block") : (e.style.display = "none");
});
});
},
},
function (e) {
var n;
(n = 63), e((e.s = n));
},
]);

1
assets/js/page_index/main.js

@ -0,0 +1 @@
import '.assets/scss/main.scss';

154
assets/scss/blog.css

@ -0,0 +1,154 @@
.al-page-blog-index {
margin: auto;
max-width: 680px;
}
.al-page-blog-index .al-page-blog-posts article a.al-article-title-link {
text-decoration: none;
}
.al-page-blog-index .al-page-blog-posts article a.al-article-title-link h2 {
font-weight: 400;
font-size: 1.5rem;
}
.al-page-blog-index .al-page-blog-posts article .al-article-date {
color: #efefef;
font-size: 0.82rem;
}
.al-page-blog-index .al-page-blog-posts article .al-article-date i {
font-size: 0.8rem;
margin-right: 5px;
}
[dir=rtl] .al-page-blog-index .al-page-blog-posts article .al-article-date i {
padding-right: 0;
padding-left: 6px;
}
.al-page-blog-index .al-page-blog-posts article .al-article-excerpt {
color: #fefefe;
}
.al-page-blog-index .al-page-blog-posts article .al-article-actions a.al-article-continue {
text-decoration: none;
font-size: 0.9rem;
color: #C4E1FF;
}
.al-page-blog-index .al-page-blog-posts article .al-article-actions a.al-article-continue i {
margin-right: 5px;
}
.al-page-blog-index .al-page-blog-posts article .al-article-actions a.al-article-continue:hover {
text-decoration: underline;
}
.al-page-blog-index .al-page-blog-posts article .al-article-author img {
width: 40px;
height: 40px;
}
.al-page-blog-index .al-page-blog-posts article .al-article-author .al-article-author-name {
font-style: italic;
font-size: 14px;
margin: 0px;
margin-bottom: 5px;
color: #C4E1FF;
}
.al-page-blog-index .al-page-blog-posts article .al-article-author .al-article-author-bio {
font-style: italic;
font-size: 12px;
margin: 0px;
color: #C4E1FF;
}
.al-page-blog-index .pagination .page-item .page-link {
background: #196da9;
border: none;
}
.al-page-blog-index .pagination .page-item .page-link:hover {
color: #efefef;
}
.al-page-blog-index .pagination .page-item.active .page-link {
background: #1f8ad5;
}
.al-page-blog-index .pagination .page-item.disabled .page-link {
color: #051723;
}
.al-page-blog-post .container {
padding: 3rem 15px !important;
}
.al-page-blog-post .container article .al-article-date {
color: #efefef;
font-size: 0.82rem;
}
.al-page-blog-post .container article .al-article-date i {
font-size: 0.8rem;
}
[dir=rtl] .al-page-blog-post .container article .al-article-date i {
padding-right: 0;
padding-left: 6px;
}
.al-page-blog-post .container article .al-article-content {
color: #fefefe;
}
.al-page-blog-post .container article .al-article-content img {
max-width: 100%;
}
.al-page-blog-post .container article .al-page-blog-author img {
width: 40px;
height: 40px;
}
.al-page-blog-post .container article .al-page-blog-author .al-page-blog-author-name {
font-style: italic;
font-size: 14px;
margin: 0px;
margin-bottom: 5px;
color: #C4E1FF;
}
.al-page-blog-post .container article .al-page-blog-author .al-page-blog-author-bio {
font-style: italic;
font-size: 12px;
margin: 0px;
color: #C4E1FF;
}
.al-page-blog-post .container .al-blog-pagination .al-blog-previous-button {
background: #86da2f;
color: #222222;
}
.al-page-blog-post .container .al-blog-pagination .al-blog-previous-button:hover {
background: #79cb24;
}
.al-page-blog-post .container .al-blog-pagination .al-blog-next-button {
background: #86da2f;
color: #222222;
float: right;
}
.al-page-blog-post .container .al-blog-pagination .al-blog-next-button:hover {
background: #79cb24;
}
.al-page-blog-post .container .al-blog-pagination a {
text-decoration: none;
display: inline-block;
padding: 10px 16px;
font-size: 15px;
}
.custom-blog-page-section {
width: 680px;
margin: auto;
}
.al-page-blog-index .pagination .page-item .page-link {
background: #196da9 !important;
border: none;
}
.pagination .page-item .page-link {
background: #196da9 !important;
padding: 0.375rem 0.75rem !important;
color: #c4e1ff;
border: none;
text-decoration: none;
}
.pagination .active .page-link {
background: #1f8ad5 !important;
}
.pagination .disabled {
color: #000 !important;
}/*# sourceMappingURL=blog.css.map */

1
assets/scss/blog.css.map

@ -0,0 +1 @@
{"version":3,"sources":["blog.scss","blog.css","variables.scss"],"names":[],"mappings":"AAIA;EAEI,YAAA;EACA,gBAAA;ACJJ;ADSM;EACE,qBAAA;ACPR;ADSQ;EACE,gBAAA;EACA,iBAAA;ACPV;ADWM;EACE,cAAA;EACA,kBAAA;ACTR;ADWQ;EACE,iBAAA;EACA,iBAAA;ACTV;ADYY;EACE,gBAAA;EACA,iBAAA;ACVd;;ADgBM;EACE,cEtCQ;ADyBhB;ADkBQ;EACE,qBAAA;EACA,iBAAA;EACA,cAAA;AChBV;ADkBU;EACE,iBAAA;AChBZ;ADmBU;EACE,0BAAA;ACjBZ;ADuBQ;EACE,WAAA;EACA,YAAA;ACrBV;ADuBQ;EACE,kBAAA;EACA,eAAA;EACA,WAAA;EACA,kBAAA;EACA,cAAA;ACrBV;ADuBQ;EACE,kBAAA;EACA,eAAA;EACA,WAAA;EACA,cAAA;ACrBV;AD6BM;EACE,mBAAA;EACA,YAAA;AC3BR;AD6BQ;EACE,cAAA;AC3BV;ADgCQ;EACE,mBAAA;AC9BV;ADmCQ;EACE,cAAA;ACjCV;;AD0CE;EACE,6BAAA;ACvCJ;AD0CI;EACE,cAAA;EACA,kBAAA;ACxCN;AD0CM;EACE,iBAAA;ACxCR;AD2CU;EACE,gBAAA;EACA,iBAAA;ACzCZ;;AD+CI;EACE,cEjIU;ADqFhB;AD8CM;EACE,eAAA;AC5CR;ADgDQ;EACE,WAAA;EACA,YAAA;AC9CV;ADgDQ;EACE,kBAAA;EACA,eAAA;EACA,WAAA;EACA,kBAAA;EACA,cAAA;AC9CV;ADgDQ;EACE,kBAAA;EACA,eAAA;EACA,WAAA;EACA,cAAA;AC9CV;ADoDI;EACE,mBExIU;EFyIV,cAAA;AClDN;ADoDM;EACE,mBAAA;AClDR;ADqDI;EACE,mBEhJU;EFiJV,cAAA;EACA,YAAA;ACnDN;ADqDM;EACE,mBAAA;ACnDR;ADsDI;EACE,qBAAA;EACA,qBAAA;EACA,kBAAA;EACA,eAAA;ACpDN;;ADyDA;EACE,YAAA;EACA,YAAA;ACtDF;;ADwDA;EACE,8BAAA;EACA,YAAA;ACrDF;;ADwDA;EACE,8BAAA;EACA,oCAAA;EACA,cAAA;EACA,YAAA;EACA,qBAAA;ACrDF;;ADuDA;EACE,8BAAA;ACpDF;;ADsDA;EAEE,sBAAA;ACpDF","file":"blog.css"}

47
frontend/src/modules/page_blog/main.scss → assets/scss/blog.scss

@ -1,8 +1,12 @@
@import "~bootstrap/scss/bootstrap-utilities";
@import "../../common/scss/variables";
@import "../../common/scss/functions";
@import "./variables";
@import "./functions";
.al-page-blog-index {
margin: auto;
max-width: 680px;
.al-page-blog-posts {
article {
@ -21,6 +25,7 @@
i {
font-size: 0.8rem;
margin-right: 5px;
@at-root {
[dir=rtl] & {
@ -36,11 +41,16 @@
}
.al-article-actions {
a.al-article-continue {
text-decoration: none;
font-size: 0.9rem;
color: #C4E1FF;
i{
margin-right: 5px;
}
&:hover {
text-decoration: underline;
}
@ -96,6 +106,10 @@
}
.al-page-blog-post {
.container{
padding: 3rem 15px !important;
article {
.al-article-date {
color: #efefef;
@ -167,8 +181,29 @@
}
}
}
.al-page-blog-index, .al-page-blog-post {
max-width: $al-page-readable-max-width;
}
.custom-blog-page-section{
width: 680px;
margin: auto;
}
.al-page-blog-index .pagination .page-item .page-link {
background: #196da9 !important;
border: none;
}
.pagination .page-item .page-link {
background: #196da9 !important;
padding: .375rem .75rem !important;
color: #c4e1ff;
border: none;
text-decoration: none;
}
.pagination .active .page-link{
background: #1f8ad5 !important;
}
.pagination .disabled {
color: #000 !important;
}

1
assets/scss/bootstrap.css

@ -0,0 +1 @@
/*# sourceMappingURL=bootstrap.css.map */

1
assets/scss/bootstrap.css.map

@ -0,0 +1 @@
{"version":3,"sources":[],"names":[],"mappings":"","file":"bootstrap.css"}

0
frontend/src/common/scss/bootstrap.scss → assets/scss/bootstrap.scss

23
assets/scss/contribute.css

@ -0,0 +1,23 @@
.al-page-contribute-index {
padding-bottom: 120px;
}
.al-page-contribute-index .al-subtle-links a {
text-decoration: none;
}
.al-page-contribute-index .al-subtle-links a:hover, .al-page-contribute-index .al-subtle-links a:active {
text-decoration: underline;
}
.al-page-contribute-index .al-cta-chat {
background: #86da2f;
color: #222222;
}
.al-page-contribute-index .al-cta-chat:hover {
background: #79cb24;
}
.al-page-contribute-index .al-member-button {
background: #86da2f;
color: #222222;
}
.al-page-contribute-index .al-member-button:hover {
background: #79cb24;
}/*# sourceMappingURL=contribute.css.map */

1
assets/scss/contribute.css.map

@ -0,0 +1 @@
{"version":3,"sources":["contribute.scss","contribute.css","variables.scss"],"names":[],"mappings":"AAIA;EACE,qBAAA;ACHF;ADMI;EACE,qBAAA;ACJN;ADMM;EACE,0BAAA;ACJR;ADSE;EACE,mBEKY;EFJZ,cAAA;ACPJ;ADSI;EACE,mBAAA;ACPN;ADWE;EACE,mBEJY;EFKZ,cAAA;ACTJ;ADWI;EACE,mBAAA;ACTN","file":"contribute.css"}

6
frontend/src/modules/page_contribute/main.scss → assets/scss/contribute.scss

@ -1,6 +1,6 @@
@import "~bootstrap/scss/bootstrap-utilities";
@import "../../common/scss/variables";
@import "../../common/scss/functions";
@import "./variables";
@import "./functions";
@import "./bootstrap";
.al-page-contribute-index {
padding-bottom: 120px;

35
assets/scss/elevate.css

@ -0,0 +1,35 @@
.al-page-elevate-index .elevate-container-wrap {
padding-right: 15px !important;
padding-left: 15px !important;
}
.al-page-elevate-index .al-cta-discuss {
background: #2891ff;
color: #222;
}
.al-page-elevate-index .al-cta-discuss:hover {
background: #0f84ff;
}
.al-page-elevate-index .al-cta-learn-how {
background: #86da2f;
color: #222222;
}
.al-page-elevate-index .al-cta-learn-how:hover {
background: #79cb24;
}
.al-page-elevate-index .faq-container {
margin-bottom: 120px;
}
.al-page-elevate-index .al-faq-slim {
padding-top: 25px;
padding-bottom: 25px;
font-weight: 300;
}
.al-page-elevate-index .al-faq-slim > div {
padding-bottom: 26px;
}
.al-page-elevate-index .al-faq-slim > div div.question {
font-weight: 500;
font-size: 1.1rem;
text-transform: uppercase;
margin-bottom: 8px;
}/*# sourceMappingURL=elevate.css.map */

1
assets/scss/elevate.css.map

@ -0,0 +1 @@
{"version":3,"sources":["elevate.scss","elevate.css","variables.scss"],"names":[],"mappings":"AAOE;EACE,8BAAA;EACA,6BAAA;ACNJ;ADQE;EACE,mBESsB;EFRtB,WAAA;ACNJ;ADQI;EACE,mBAAA;ACNN;ADUE;EACE,mBEEY;EFDZ,cAAA;ACRJ;ADUI;EACE,mBAAA;ACRN;ADYE;EACE,oBAAA;ACVJ;ADiBE;EACE,iBAAA;EACA,oBAAA;EACA,gBAAA;ACfJ;ADiBI;EACE,oBAAA;ACfN;ADiBM;EACE,gBAAA;EACA,iBAAA;EACA,yBAAA;EACA,kBAAA;ACfR","file":"elevate.css"}

20
frontend/src/modules/page_elevate/main.scss → assets/scss/elevate.scss

@ -1,8 +1,14 @@
@import "~bootstrap/scss/bootstrap-utilities";
@import "../../common/scss/variables";
@import "../../common/scss/functions";
@import "./variables";
@import "./functions";
@import "./bootstrap";
.al-page-elevate-index {
.elevate-container-wrap{
padding-right: 15px !important;
padding-left: 15px !important;
}
.al-cta-discuss {
background: $al-c-science-blue-light;
color: #222;
@ -25,11 +31,9 @@
margin-bottom: 120px;
}
@include media-breakpoint-up(md) {
.al-page-elevate-index {
}
}
.al-faq-slim {
padding-top: 25px;

1
assets/scss/functions.css

@ -0,0 +1 @@
/*# sourceMappingURL=functions.css.map */

1
assets/scss/functions.css.map

@ -0,0 +1 @@
{"version":3,"sources":[],"names":[],"mappings":"","file":"functions.css"}

0
frontend/src/common/scss/functions.scss → assets/scss/functions.scss

189
assets/scss/home.css

@ -0,0 +1,189 @@
.al-page-index .al-hero-cta-primary {
background: #24c2ff;
color: #222222;
margin: 10px 10px 10px 0;
}
.al-page-index .al-hero-cta-primary:hover {
background: #0bbbff;
}
.al-page-index .al-hero-cta-secondary {
background: #86da2f;
color: #222222;
margin: 10px;
}
.al-page-index .al-hero-cta-secondary:hover {
background: #79cb24;
}
.al-page-index .al-hero-cta-tertiary {
background: #ffcb12;
color: #222222;
margin: 10px;
}
.al-page-index .al-hero-cta-tertiary img {
display: inline;
height: 1em;
}
.al-page-index .al-hero-cta-tertiary:hover {
background: #f8c100;
}
.al-page-index .al-index-feature-container {
background: #0e3b5c;
}
.al-page-index .al-index-feature-container .al-index-feature-icon {
color: white;
font-size: 32px;
padding-right: 22px;
}
[dir=rtl] .al-page-index .al-index-feature-container .al-index-feature-icon {
padding-right: 0;
padding-left: 22px;
}
.al-page-index .al-index-community-container {
background: #0e3b5c;
}
.al-page-index .al-index-community-container .al-index-community-icon {
color: #fefefe;
font-size: 32px;
padding-right: 22px;
flex: 0;
}
[dir=rtl] .al-page-index .al-index-community-container .al-index-community-icon {
padding-right: 0;
padding-left: 22px;
}
.al-page-index .al-index-community-container .al-index-community-icon.img {
height: 32px;
box-sizing: border-box;
}
.al-page-index .al-index-community-container .al-community-cta {
min-width: 120px;
}
.al-page-index .al-index-community-container .al-index-community-content-wrap {
display: flex;
flex: 1;
flex-direction: column;
}
.al-page-index .al-index-community-container .al-index-community-content-wrap p {
flex: 1;
}
.al-page-index .al-index-backed-by h2.border-bottom {
border-bottom-color: #14598a !important;
}
.al-page-index .al-index-backed-by .al-backed-by-list {
justify-content: space-between;
padding: 0 !important;
}
.al-page-index .al-index-backed-by .al-backed-by-list a {
margin-top: 3rem !important;
}
.al-page-index .al-index-backed-by .al-backed-by-list a div.col {
text-align: center;
}
.al-page-index .al-index-backed-by .al-backed-by-list a .al-backer-logo-container {
height: 100%;
}
.al-page-index .al-index-backed-by .al-backed-by-list a .al-backer-logo {
height: 100%;
width: 120px;
}
.al-page-index .al-index-commercial-support h2.border-bottom {
border-bottom-color: #14598a !important;
}
.al-page-index .al-index-commercial-support .al-commercial-supporter-list {
justify-content: center;
}
.al-page-index .al-index-commercial-support .al-commercial-supporter-list div.col {
text-align: center;
}
.al-page-index .al-index-commercial-support .al-commercial-supporter-list .al-commercial-supporter-logo-container {
height: 100%;
}
.al-page-index .al-index-commercial-support .al-commercial-supporter-list .al-commercial-supporter-logo {
max-width: 120px;
width: 100%;
}
.al-page-index .al-index-faq {
background: #0e3b5c;
}
.al-page-index .al-index-faq .accordion-button {
border: none;
box-shadow: none;
font-weight: normal;
background: #104469;
width: 100% !important;
text-align: left !important;
padding: 20px 10px !important;
color: #fefefe !important;
font-size: 15px;
}
.al-page-index .al-index-faq .accordion-button:active, .al-page-index .al-index-faq .accordion-button.active, .al-page-index .al-index-faq .accordion-button:hover, .al-page-index .al-index-faq .accordion-button:focus {
box-shadow: none;
outline: none;
border: none;
}
.al-page-index .al-index-faq .accordion-button:not(.collapsed) {
background: #104469;
color: #fefefe;
}
.al-page-index .al-index-faq .accordion-body {
background: #114a73;
padding: 15px 10px;
margin-top: -8px;
color: #fefefe;
}
.al-page-index .al-index-newsletter a {
text-decoration: underline;
}
.al-page-index .al-index-newsletter .al-newsletter-input {
background-color: white;
}
.al-page-index .al-index-newsletter .al-newsletter-button {
background: #86da2f;
color: #000518;
}
.al-page-index .al-index-newsletter .al-newsletter-button:hover {
color: #000518;
background: #79cb24;
}
.al-page-index .al-index-press {
background: #0e3b5c;
}
.al-page-index .al-index-press .al-index-press-item {
margin-bottom: 10px;
}
.al-page-index .al-index-press .al-index-press-item blockquote.blockquote {
padding-bottom: 7px;
font-family: "Montserrat", -apple-system, BlinkMacSystemFont, "segoe ui", roboto, oxygen-sans, ubuntu, cantarell, "helvetica neue", "arial", sans-serif, "apple color emoji", "segoe ui emoji", "segoe ui symbol";
font-size: 1.4rem;
}
.al-page-index .al-index-press .al-index-press-item blockquote.blockquote:before {
content: open-quote;
padding-right: 3px;
}
.al-page-index .al-index-press .al-index-press-item blockquote.blockquote:after {
content: close-quote;
padding-left: 3px;
}
.al-page-index .al-index-press .al-index-press-item blockquote.blockquote:before, .al-page-index .al-index-press .al-index-press-item blockquote.blockquote:after {
font-family: "Montserrat", -apple-system, BlinkMacSystemFont, "segoe ui", roboto, oxygen-sans, ubuntu, cantarell, "helvetica neue", "arial", sans-serif, "apple color emoji", "segoe ui emoji", "segoe ui symbol";
vertical-align: top;
display: inline-block;
color: #faf5f5;
font-weight: bold;
font-size: 1rem;
}
.al-page-index .al-index-press .al-index-press-item figcaption.blockquote-footer {
color: #fefefe;
}
.al-page-index .al-index-press .al-index-press-item figcaption.blockquote-footer cite {
font-style: normal;
}
.al-page-index .al-index-press .al-index-press-item figcaption.blockquote-footer a {
text-decoration: none;
}
.al-page-index .al-index-press .al-index-press-item figcaption.blockquote-footer a:hover {
text-decoration: underline;
color: #f7fbff;
}/*# sourceMappingURL=home.css.map */

1
assets/scss/home.css.map

@ -0,0 +1 @@
{"version":3,"sources":["home.scss","home.css","variables.scss"],"names":[],"mappings":"AAOE;EACE,mBAAA;EACA,cAAA;EACA,wBAAA;ACNJ;ADQI;EACE,mBAAA;ACNN;ADUE;EACE,mBEKY;EFJZ,cAAA;EACA,YAAA;ACRJ;ADUI;EACE,mBAAA;ACRN;ADYE;EACE,mBAAA;EACA,cAAA;EACA,YAAA;ACVJ;ADYI;EACE,eAAA;EACA,WAAA;ACVN;ADaI;EACE,mBAAA;ACXN;ADeE;EACE,mBAAA;ACbJ;ADeI;EACE,YAAA;EACA,eAAA;EACA,mBAAA;ACbN;ADgBQ;EACE,gBAAA;EACA,kBAAA;ACdV;;ADoBE;EACE,mBAAA;ACjBJ;ADmBI;EACE,cE9DU;EF+DV,eAAA;EACA,mBAAA;EACA,OAAA;ACjBN;ADoBQ;EACE,gBAAA;EACA,kBAAA;AClBV;;ADsBM;EACE,YAAA;EACA,sBAAA;ACnBR;ADyBI;EACE,gBAAA;ACvBN;ADyBI;EACE,aAAA;EACA,OAAA;EACA,sBAAA;ACvBN;ADwBM;EACE,OAAA;ACtBR;AD6BI;EACE,uCAAA;AC3BN;AD+BI;EACE,8BAAA;EACA,qBAAA;AC7BN;AD+BM;EACE,2BAAA;AC7BR;ADgCM;EACE,kBAAA;AC9BR;ADkCM;EACE,YAAA;AChCR;ADqCM;EACE,YAAA;EACA,YAAA;ACnCR;AD2CI;EACE,uCAAA;ACzCN;AD8CI;EACE,uBAAA;AC5CN;AD8CM;EACE,kBAAA;AC5CR;AD+CM;EACE,YAAA;AC7CR;ADgDM;EACE,gBAAA;EACA,WAAA;AC9CR;ADmDE;EACE,mBAAA;ACjDJ;ADmDI;EACE,YAAA;EACA,gBAAA;EACA,mBAAA;EACA,mBAAA;EACA,sBAAA;EACA,2BAAA;EACA,6BAAA;EACA,yBAAA;EACA,eAAA;ACjDN;ADmDM;EACE,gBAAA;EACA,aAAA;EACA,YAAA;ACjDR;ADoDM;EACE,mBAAA;EACA,cEjLQ;AD+HhB;ADsDI;EACE,mBAAA;EACA,kBAAA;EACJ,gBAAA;EACA,cAAA;ACpDF;AD0DG;EACC,0BAAA;ACxDJ;AD2DI;EACE,uBAAA;ACzDN;AD4DI;EACE,mBAAA;EACA,cAAA;AC1DN;AD4DM;EACE,cAAA;EACA,mBAAA;AC1DR;AD+DE;EACE,mBAAA;AC7DJ;ADiEI;EACE,mBAAA;AC/DN;ADiEM;EACE,mBAAA;EACA,iNExNgB;EFyNhB,iBAAA;AC/DR;ADiEQ;EACE,mBAAA;EACA,kBAAA;AC/DV;ADkEQ;EACE,oBAAA;EACA,iBAAA;AChEV;ADmEQ;EAEE,iNEvOc;EFwOd,mBAAA;EACA,qBAAA;EACA,cAAA;EACA,iBAAA;EACA,eAAA;AClEV;ADsEM;EACE,cErPQ;ADiLhB;ADsEQ;EACE,kBAAA;ACpEV;ADuEQ;EACE,qBAAA;ACrEV;ADuEU;EACE,0BAAA;EACA,cAAA;ACrEZ","file":"home.css"}

79
frontend/src/modules/page_index/main.scss → assets/scss/home.scss

@ -1,11 +1,14 @@
@import "~bootstrap/scss/bootstrap-utilities";
@import "../../common/scss/variables";
@import "../../common/scss/functions";
@import "./variables";
@import "./functions";
@import "./bootstrap";
.al-page-index {
.al-hero-cta-primary {
background: #24c2ff;
color: #222222;
margin:10px 10px 10px 0;
&:hover {
background: darken(#24c2ff, 5%);
@ -15,6 +18,7 @@
.al-hero-cta-secondary {
background: $al-c-atlantis;
color: #222222;
margin: 10px;
&:hover {
background: darken($al-c-atlantis, 5%);
@ -24,6 +28,7 @@
.al-hero-cta-tertiary {
background: $al-c-candlelight;
color: #222222;
margin: 10px;
img {
display: inline;
@ -74,21 +79,20 @@
}
}
@include media-breakpoint-up(md) {
.al-index-community-content-wrap {
display: flex;
flex-direction: column;
flex: 1;
p {
flex: 1;
}
}
}
.al-community-cta {
min-width: 120px;
}
.al-index-community-content-wrap {
display: flex;
flex: 1;
flex-direction: column;
p{
flex: 1;
}
}
}
.al-index-backed-by {
@ -96,27 +100,33 @@
border-bottom-color: lighten($al-body-background, 8%) !important;
}
@include media-breakpoint-up(md) {
padding-top: 72px !important;
padding-bottom: 102px !important;
}
.al-backed-by-list {
justify-content: center;
justify-content: space-between;
padding: 0 !important;
a{
margin-top: 3rem !important;
div.col {
text-align: center;
}
.al-backer-logo-container {
height: 100%;
}
.al-backer-logo {
max-width: 120px;
width: 100%;
height: 100%;
width:120px;
}
}
}
}
.al-index-commercial-support {
@ -124,10 +134,7 @@
border-bottom-color: lighten($al-body-background, 8%) !important;
}
@include media-breakpoint-up(md) {
padding-top: 72px !important;
padding-bottom: 102px !important;
}
.al-commercial-supporter-list {
justify-content: center;
@ -155,6 +162,11 @@
box-shadow: none;
font-weight: normal;
background: #104469;
width: 100% !important;
text-align: left !important;
padding: 20px 10px !important;
color: #fefefe!important;
font-size: 15px;
&:active, &.active, &:hover, &:focus {
box-shadow: none;
@ -170,15 +182,17 @@
.accordion-body {
background: #114a73;
padding: 15px 10px;
margin-top: -8px;
color: #fefefe;
}
}
.al-index-newsletter {
@include media-breakpoint-up(md) {
padding-top: 80px;
padding-bottom: 80px;
}
a{
text-decoration: underline;
}
.al-newsletter-input{
background-color: white;
@ -198,10 +212,7 @@
.al-index-press {
background: #0e3b5c;
@include media-breakpoint-up(md) {
padding-top: 72px !important;
padding-bottom: 72px !important;
}
.al-index-press-item {
margin-bottom: 10px;

841
assets/scss/main.css

@ -0,0 +1,841 @@
.al-page-index .al-hero-cta-primary {
background: #24c2ff;
color: #222222;
margin: 10px 10px 10px 0;
}
.al-page-index .al-hero-cta-primary:hover {
background: #0bbbff;
}
.al-page-index .al-hero-cta-secondary {
background: #86da2f;
color: #222222;
margin: 10px;
}
.al-page-index .al-hero-cta-secondary:hover {
background: #79cb24;
}
.al-page-index .al-hero-cta-tertiary {
background: #ffcb12;
color: #222222;
margin: 10px;
}
.al-page-index .al-hero-cta-tertiary img {
display: inline;
height: 1em;
}
.al-page-index .al-hero-cta-tertiary:hover {
background: #f8c100;
}
.al-page-index .al-index-feature-container {
background: #0e3b5c;
}
.al-page-index .al-index-feature-container .al-index-feature-icon {
color: white;
font-size: 32px;
padding-right: 22px;
}
[dir=rtl] .al-page-index .al-index-feature-container .al-index-feature-icon {
padding-right: 0;
padding-left: 22px;
}
.al-page-index .al-index-community-container {
background: #0e3b5c;
}
.al-page-index .al-index-community-container .al-index-community-icon {
color: #fefefe;
font-size: 32px;
padding-right: 22px;
flex: 0;
}
[dir=rtl] .al-page-index .al-index-community-container .al-index-community-icon {
padding-right: 0;
padding-left: 22px;
}
.al-page-index .al-index-community-container .al-index-community-icon.img {
height: 32px;
box-sizing: border-box;
}
.al-page-index .al-index-community-container .al-community-cta {
min-width: 120px;
}
.al-page-index .al-index-community-container .al-index-community-content-wrap {
display: flex;
flex: 1;
flex-direction: column;
}
.al-page-index .al-index-community-container .al-index-community-content-wrap p {
flex: 1;
}
.al-page-index .al-index-backed-by h2.border-bottom {
border-bottom-color: #14598a !important;
}
.al-page-index .al-index-backed-by .al-backed-by-list {
justify-content: space-between;
padding: 0 !important;
}
.al-page-index .al-index-backed-by .al-backed-by-list a {
margin-top: 3rem !important;
}
.al-page-index .al-index-backed-by .al-backed-by-list a div.col {
text-align: center;
}
.al-page-index .al-index-backed-by .al-backed-by-list a .al-backer-logo-container {
height: 100%;
}
.al-page-index .al-index-backed-by .al-backed-by-list a .al-backer-logo {
height: 100%;
width: 120px;
}
.al-page-index .al-index-commercial-support h2.border-bottom {
border-bottom-color: #14598a !important;
}
.al-page-index .al-index-commercial-support .al-commercial-supporter-list {
justify-content: center;
}
.al-page-index .al-index-commercial-support .al-commercial-supporter-list div.col {
text-align: center;
}
.al-page-index .al-index-commercial-support .al-commercial-supporter-list .al-commercial-supporter-logo-container {
height: 100%;
}
.al-page-index .al-index-commercial-support .al-commercial-supporter-list .al-commercial-supporter-logo {
max-width: 120px;
width: 100%;
}
.al-page-index .al-index-faq {
background: #0e3b5c;
}
.al-page-index .al-index-faq .accordion-button {
border: none;
box-shadow: none;
font-weight: normal;
background: #104469;
width: 100% !important;
text-align: left !important;
padding: 20px 10px !important;
color: #fefefe !important;
font-size: 15px;
}
.al-page-index .al-index-faq .accordion-button:active, .al-page-index .al-index-faq .accordion-button.active, .al-page-index .al-index-faq .accordion-button:hover, .al-page-index .al-index-faq .accordion-button:focus {
box-shadow: none;
outline: none;
border: none;
}
.al-page-index .al-index-faq .accordion-button:not(.collapsed) {
background: #104469;
color: #fefefe;
}
.al-page-index .al-index-faq .accordion-body {
background: #114a73;
padding: 15px 10px;
margin-top: -8px;
color: #fefefe;
}
.al-page-index .al-index-newsletter a {
text-decoration: underline;
}
.al-page-index .al-index-newsletter .al-newsletter-input {
background-color: white;
}
.al-page-index .al-index-newsletter .al-newsletter-button {
background: #86da2f;
color: #000518;
}
.al-page-index .al-index-newsletter .al-newsletter-button:hover {
color: #000518;
background: #79cb24;
}
.al-page-index .al-index-press {
background: #0e3b5c;
}
.al-page-index .al-index-press .al-index-press-item {
margin-bottom: 10px;
}
.al-page-index .al-index-press .al-index-press-item blockquote.blockquote {
padding-bottom: 7px;
font-family: "Montserrat", -apple-system, BlinkMacSystemFont, "segoe ui", roboto, oxygen-sans, ubuntu, cantarell, "helvetica neue", "arial", sans-serif, "apple color emoji", "segoe ui emoji", "segoe ui symbol";
font-size: 1.4rem;
}
.al-page-index .al-index-press .al-index-press-item blockquote.blockquote:before {
content: open-quote;
padding-right: 3px;
}
.al-page-index .al-index-press .al-index-press-item blockquote.blockquote:after {
content: close-quote;
padding-left: 3px;
}
.al-page-index .al-index-press .al-index-press-item blockquote.blockquote:before, .al-page-index .al-index-press .al-index-press-item blockquote.blockquote:after {
font-family: "Montserrat", -apple-system, BlinkMacSystemFont, "segoe ui", roboto, oxygen-sans, ubuntu, cantarell, "helvetica neue", "arial", sans-serif, "apple color emoji", "segoe ui emoji", "segoe ui symbol";
vertical-align: top;
display: inline-block;
color: #faf5f5;
font-weight: bold;
font-size: 1rem;
}
.al-page-index .al-index-press .al-index-press-item figcaption.blockquote-footer {
color: #fefefe;
}
.al-page-index .al-index-press .al-index-press-item figcaption.blockquote-footer cite {
font-style: normal;
}
.al-page-index .al-index-press .al-index-press-item figcaption.blockquote-footer a {
text-decoration: none;
}
.al-page-index .al-index-press .al-index-press-item figcaption.blockquote-footer a:hover {
text-decoration: underline;
color: #f7fbff;
}
.al-page-blog-index {
margin: auto;
max-width: 680px;
}
.al-page-blog-index .al-page-blog-posts article a.al-article-title-link {
text-decoration: none;
}
.al-page-blog-index .al-page-blog-posts article a.al-article-title-link h2 {
font-weight: 400;
font-size: 1.5rem;
}
.al-page-blog-index .al-page-blog-posts article .al-article-date {
color: #efefef;
font-size: 0.82rem;
}
.al-page-blog-index .al-page-blog-posts article .al-article-date i {
font-size: 0.8rem;
}
[dir=rtl] .al-page-blog-index .al-page-blog-posts article .al-article-date i {
padding-right: 0;
padding-left: 6px;
}
.al-page-blog-index .al-page-blog-posts article .al-article-excerpt {
color: #fefefe;
}
.al-page-blog-index .al-page-blog-posts article .al-article-actions a.al-article-continue {
text-decoration: none;
font-size: 0.9rem;
color: #C4E1FF;
}
.al-page-blog-index .al-page-blog-posts article .al-article-actions a.al-article-continue:hover {
text-decoration: underline;
}
.al-page-blog-index .al-page-blog-posts article .al-article-author img {
width: 40px;
height: 40px;
}
.al-page-blog-index .al-page-blog-posts article .al-article-author .al-article-author-name {
font-style: italic;
font-size: 14px;
margin: 0px;
margin-bottom: 5px;
color: #C4E1FF;
}
.al-page-blog-index .al-page-blog-posts article .al-article-author .al-article-author-bio {
font-style: italic;
font-size: 12px;
margin: 0px;
color: #C4E1FF;
}
.al-page-blog-index .pagination .page-item .page-link {
background: #196da9;
border: none;
}
.al-page-blog-index .pagination .page-item .page-link:hover {
color: #efefef;
}
.al-page-blog-index .pagination .page-item.active .page-link {
background: #1f8ad5;
}
.al-page-blog-index .pagination .page-item.disabled .page-link {
color: #051723;
}
.al-page-blog-post .container {
padding: 3rem 15px !important;
}
.al-page-blog-post .container article .al-article-date {
color: #efefef;
font-size: 0.82rem;
}
.al-page-blog-post .container article .al-article-date i {
font-size: 0.8rem;
}
[dir=rtl] .al-page-blog-post .container article .al-article-date i {
padding-right: 0;
padding-left: 6px;
}
.al-page-blog-post .container article .al-article-content {
color: #fefefe;
}
.al-page-blog-post .container article .al-article-content img {
max-width: 100%;
}
.al-page-blog-post .container article .al-page-blog-author img {
width: 40px;
height: 40px;
}
.al-page-blog-post .container article .al-page-blog-author .al-page-blog-author-name {
font-style: italic;
font-size: 14px;
margin: 0px;
margin-bottom: 5px;
color: #C4E1FF;
}
.al-page-blog-post .container article .al-page-blog-author .al-page-blog-author-bio {
font-style: italic;
font-size: 12px;
margin: 0px;
color: #C4E1FF;
}
.al-page-blog-post .container .al-blog-pagination .al-blog-previous-button {
background: #86da2f;
color: #222222;
}
.al-page-blog-post .container .al-blog-pagination .al-blog-previous-button:hover {
background: #79cb24;
}
.al-page-blog-post .container .al-blog-pagination .al-blog-next-button {
background: #86da2f;
color: #222222;
float: right;
}
.al-page-blog-post .container .al-blog-pagination .al-blog-next-button:hover {
background: #79cb24;
}
.al-page-blog-post .container .al-blog-pagination a {
text-decoration: none;
display: inline-block;
padding: 10px 16px;
font-size: 15px;
}
.custom-blog-page-section {
width: 680px;
margin: auto;
}
.al-page-elevate-index .elevate-container-wrap {
padding-right: 15px !important;
padding-left: 15px !important;
}
.al-page-elevate-index .al-cta-discuss {
background: #2891ff;
color: #222;
}
.al-page-elevate-index .al-cta-discuss:hover {
background: #0f84ff;
}
.al-page-elevate-index .al-cta-learn-how {
background: #86da2f;
color: #222222;
}
.al-page-elevate-index .al-cta-learn-how:hover {
background: #79cb24;
}
.al-page-elevate-index .faq-container {
margin-bottom: 120px;
}
.al-page-elevate-index .al-faq-slim {
padding-top: 25px;
padding-bottom: 25px;
font-weight: 300;
}
.al-page-elevate-index .al-faq-slim > div {
padding-bottom: 26px;
}
.al-page-elevate-index .al-faq-slim > div div.question {
font-weight: 500;
font-size: 1.1rem;
text-transform: uppercase;
margin-bottom: 8px;
}
.al-page-foundation-members-index .al-members .table {
color: #fefefe !important;
}
.al-page-foundation-members-index .al-members .al-member-item {
height: 100%;
background: rgb(14, 59, 92);
}
.al-page-foundation-members-index .al-member-apply-category-icon {
color: white;
font-size: 32px;
padding-right: 22px;
}
[dir=rtl] .al-page-foundation-members-index .al-member-apply-category-icon {
padding-right: 0;
padding-left: 22px;
}
.al-page-foundation-members-index .al-member-apply-cta {
min-width: 120px;
}
.al-page-foundation-members-index .fw-light .al-laws-link, .al-page-foundation-members-index .fw-light .al-guideline-link {
text-decoration: none;
}
.al-page-foundation-members-index .fw-light .al-laws-link:hover, .al-page-foundation-members-index .fw-light .al-laws-link:active, .al-page-foundation-members-index .fw-light .al-guideline-link:hover, .al-page-foundation-members-index .fw-light .al-guideline-link:active {
text-decoration: underline;
}
.al-page-foundation-members-index .al-membership-info {
display: none;
}
.al-page-foundation-members-index #al-mirror-info ul, .al-page-foundation-members-index #al-sponsor-info ul {
list-style-type: "- ";
}
.al-page-foundation-members-index .member-info:hover {
color: #86da2f;
}
.al-page-foundation-members-index .al-foundation-members-apply-content-wrap {
display: flex;
flex-direction: column;
flex: 1;
}
.al-page-foundation-members-index .al-foundation-members-apply-content-wrap p {
flex: 1;
}
.al-page-contribute-index {
padding-bottom: 120px;
}
.al-page-contribute-index .al-subtle-links a {
text-decoration: none;
}
.al-page-contribute-index .al-subtle-links a:hover, .al-page-contribute-index .al-subtle-links a:active {
text-decoration: underline;
}
.al-page-contribute-index .al-cta-chat {
background: #86da2f;
color: #222222;
}
.al-page-contribute-index .al-cta-chat:hover {
background: #79cb24;
}
.al-page-contribute-index .al-member-button {
background: #86da2f;
color: #222222;
}
.al-page-contribute-index .al-member-button:hover {
background: #79cb24;
}
body, html {
line-height: initial;
font-weight: normal;
font-style: normal;
-webkit-font-smoothing: subpixel-antialiased;
-moz-osx-font-smoothing: grayscale;
text-rendering: auto;
letter-spacing: normal;
word-spacing: normal;
text-transform: none;
text-shadow: none;
position: relative;
box-sizing: border-box;
margin: 0;
padding: 0;
}
body {
background: #0f4266;
}
a {
text-decoration: underline;
}
h1, h2, h3, h4, h5, h6 {
font-family: "Montserrat", -apple-system, BlinkMacSystemFont, "segoe ui", roboto, oxygen-sans, ubuntu, cantarell, "helvetica neue", "arial", sans-serif, "apple color emoji", "segoe ui emoji", "segoe ui symbol";
}
.al-body-container {
min-height: 65vh;
}
button:active {
outline: none;
border: 0px solid transparent;
}
button:focus, .btn:focus {
outline: none !important;
box-shadow: none !important;
}
.row {
margin-left: 0 !important;
margin-right: 0 !important;
}
.container {
padding: 0;
}
.al-primary-navbar .container {
padding-left: 15px !important;
padding-right: 15px !important;
}
.al-index-faq .container {
padding-left: 15px !important;
padding-right: 15px !important;
}
.al-index-press .container {
padding-right: 15px !important;
padding-left: 15px !important;
}
.elevate-container-wrap {
padding-right: 15px !important;
padding-left: 15px !important;
}
.custom-blog-page-section {
width: 680px;
margin: auto;
}
.al-page-blog-post .container {
padding: 3rem 15px !important;
}
.fw-bold {
font-weight: 700 !important;
}
.fw-light {
font-weight: 300;
}
.fs-6 {
font-size: 1rem !important;
}
.display-5 {
font-size: 46px !important;
line-height: 47px !important;
}
.lead {
font-size: 1.25rem !important;
font-weight: 400 !important;
}
.al-primary-navbar {
background: #082336;
font-family: "Montserrat", -apple-system, BlinkMacSystemFont, "segoe ui", roboto, oxygen-sans, ubuntu, cantarell, "helvetica neue", "arial", sans-serif, "apple color emoji", "segoe ui emoji", "segoe ui symbol";
font-weight: 500;
box-shadow: 0 3px 4px 0 rgba(0, 0, 0, 0.07), 0 3px 3px -2px rgba(0, 0, 0, 0.06), 0 1px 8px 0 rgba(0, 0, 0, 0.1);
}
.al-primary-navbar .nav-link.al-download-button {
font-weight: 500;
background: #86da2f;
color: #000518 !important;
}
.al-primary-navbar .nav-link.al-download-button:hover {
color: #000518;
background: #79cb24;
}
.al-primary-navbar .nav-link {
padding-left: 1rem !important;
padding-right: 1rem !important;
color: #fff !important;
font-size: 15px;
transition: 0.3s ease-in-out;
text-decoration: none !important;
cursor: pointer !important;
}
.al-primary-navbar .nav-link :hover {
color: #1e87f8 !important;
}
.al-primary-navbar.with-motd {
padding-bottom: 0;
border-bottom: 0;
}
.al-primary-navbar .dropdown-menu-dark {
background: #082336;
border: 0;
}
.al-primary-navbar .dropdown-menu-dark .dropdown-item {
text-decoration: none !important;
}
.al-primary-navbar .dropdown-menu-dark .dropdown-item:hover {
background-color: rgba(255, 255, 255, 0.1490196078) !important;
}
.al-primary-navbar .dropdown-menu-dark .dropdown-divider {
border-color: #264154;
}
.al-primary-navbar .al-language-switch img {
height: 24px;
}
.al-primary-navbar .al-language-link {
text-transform: capitalize;
color: aliceblue;
}
.al-primary-navbar .al-translate-callout {
font-size: 0.92rem;
}
.al-primary-navbar .al-translate-callout a {
display: flex;
align-items: center;
color: #69b1ff;
}
.al-primary-navbar .al-translate-callout a i {
margin-right: 0.4rem;
font-size: 0.8rem;
}
#al-motd {
width: 100%;
background: #051520;
padding-top: 12px;
padding-bottom: 12px;
font-size: 0.8rem;
}
#al-motd > .container {
display: flex;
}
#al-motd > .container > i {
padding-right: 8px;
}
#al-motd > .container > .text {
display: block;
font-weight: 500;
}
#al-motd > .container > .text a {
text-decoration: none;
}
#al-motd > .container > .text a:hover {
text-decoration: underline;
color: inherit;
}
section h1.al-section-title {
font-size: 2.6rem;
font-weight: 300;
}
.al-primary-footer {
background: #0D3654;
padding-top: 122px;
padding-bottom: 132px;
}
.al-py-lg {
padding-top: 3rem !important;
padding-bottom: 3rem !important;
}
.al-py-md {
padding-top: 2.5rem !important;
padding-bottom: 2.5rem !important;
}
.al-text-shadow-dark {
text-shadow: 1px 3px 3px rgba(0, 0, 0, 0.5);
}
.btn {
transition-property: all;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
transition-duration: 0.12s;
text-decoration: none !important;
}
a {
transition-property: all;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
transition-duration: 0.12s;
text-decoration: underline;
}
.al-wysiwyg {
all: revert;
font-family: -apple-system, BlinkMacSystemFont, "segoe ui", roboto, oxygen-sans, ubuntu, cantarell, "helvetica neue", "arial", sans-serif, "apple color emoji", "segoe ui emoji", "segoe ui symbol";
font-size: 15px;
}
.al-wysiwyg h1, .al-wysiwyg h2, .al-wysiwyg h3, .al-wysiwyg h4, .al-wysiwyg h5, .al-wysiwyg h6 {
all: revert;
font-family: "Montserrat", -apple-system, BlinkMacSystemFont, "segoe ui", roboto, oxygen-sans, ubuntu, cantarell, "helvetica neue", "arial", sans-serif, "apple color emoji", "segoe ui emoji", "segoe ui symbol";
}
.al-wysiwyg ul,
.al-wysiwyg ol,
.al-wysiwyg ul li,
.al-wysiwyg ol li,
.al-wysiwyg p,
.al-wysiwyg pre,
.al-wysiwyg blockquote {
all: revert;
font-family: -apple-system, BlinkMacSystemFont, "segoe ui", roboto, oxygen-sans, ubuntu, cantarell, "helvetica neue", "arial", sans-serif, "apple color emoji", "segoe ui emoji", "segoe ui symbol";
font-size: 15px;
}
.al-wysiwyg pre, .al-wysiwyg code {
font-family: "SF Mono", "source code pro", consolas, "courier new", courier, monospace;
}
.al-certified-amd-page .banner {
background-image: url(/images/main-image.png);
background-size: cover;
padding: 180px 0 300px;
background-position: 25%;
}
.al-certified-amd-page .container {
margin: 0 auto;
max-width: 1180px;
}
.al-certified-amd-page .banner h1 {
font-size: 40px;
font-weight: 600;
max-width: 600px;
}
.al-certified-amd-page .banner p {
font-size: 22px;
font-style: italic;
font-weight: 500;
}
.al-certified-amd-page section.content {
background-color: #0e3b5c;
}
.al-certified-amd-page .content p {
margin: 0 auto;
max-width: 900px;
padding: 60px 0;
text-align: center;
}
.al-certified-amd-page .info-flex {
align-items: center;
display: flex;
justify-content: space-evenly;
padding: 60px 0;
}
.al-certified-amd-page .img img {
height: 300px;
}
.al-certified-amd-page .text > div {
align-items: center;
display: flex;
font-size: 16px;
margin-bottom: 30px;
}
.al-certified-amd-page .info-block-title {
font-size: 25px !important;
font-weight: 500;
margin-bottom: 40px !important;
}
.al-certified-amd-page .info-flex .text img {
height: 25px;
margin-right: 20px;
}
.al-certified-amd-page .container {
padding: 3rem 15px;
}
.al-certified-amd-page img {
max-width: 100%;
}
.al-certified-amd-page button.request {
background-color: #0069d9;
border: 0;
cursor: pointer;
font-size: 16px;
margin-top: 20px;
padding: 17px 35px;
}
.al-certified-amd-page .test-cta {
padding: 60px 0;
text-align: center;
}
.al-certified-amd-page .test-cta a, .al-certified-amd-page .test-cta button {
background-color: #87d831;
border: 0;
color: #000;
cursor: pointer;
font-size: 16px;
margin-top: 0;
padding: 17px 50px;
-webkit-text-decoration: None;
text-decoration: None;
}
.al-certified-amd-page .test table {
margin: 0 auto;
max-width: 800px;
width: 100%;
}
.al-certified-amd-page .test table td, .al-certified-amd-page .test table th {
background-color: #0e3b5c;
font-weight: 500;
padding: 20px 40px;
text-transform: uppercase;
width: 35%;
}
.al-certified-amd-page td.passed {
padding-left: 80px !important;
position: relative;
}
.al-certified-amd-page .checkmark {
border-bottom: 6px solid #0069d9;
border-right: 6px solid #0069d9;
display: inline-block;
height: 25px;
left: 40px;
position: absolute;
top: 25px;
transform: rotate(45deg);
width: 12px;
}
.al-certified-amd-page {
color: #fff;
font-family: Montserrat, sans-serif;
margin: 0;
width: 100%;
}
.al-certified-amd-page p.test-title {
font-size: 20px;
font-weight: 500;
padding-top: 40px;
text-transform: uppercase;
}
.al-certified-amd-page .test img {
margin-top: 40px;
max-height: 400px;
}
.al-certified-amd-page .form {
margin-top: 40px;
}
.al-page-blog-index {
margin: auto;
max-width: 680px;
}
@media (min-width: 1400px) {
.container {
max-width: 1320px;
}
}/*# sourceMappingURL=main.css.map */

1
assets/scss/main.css.map

File diff suppressed because one or more lines are too long

435
assets/scss/main.scss

@ -0,0 +1,435 @@
@import "./variables";
@import "./functions";
@import "./bootstrap";
@import "./home";
@import "./blog";
@import "./elevate";
@import "./members";
@import "./contribute";
body, html {
line-height: initial;
font-weight: normal;
font-style: normal;
-webkit-font-smoothing: subpixel-antialiased;
-moz-osx-font-smoothing: grayscale;
text-rendering: auto;
letter-spacing: normal;
word-spacing: normal;
text-transform: none;
text-shadow: none;
position: relative;
box-sizing: border-box;
margin: 0;
padding: 0;
}
body {
background: $al-body-background;
}
a{
text-decoration: underline;
}
h1, h2, h3, h4, h5, h6 {
font-family: $al-font-family-accent;
}
.al-body-container {
min-height: 65vh;
}
button:active {
outline: none;
border: 0px solid transparent;
}
button:focus, .btn:focus{
outline: none !important;
box-shadow: none !important;
}
.row{
margin-left: 0 !important;
margin-right: 0 !important;
}
.container{
padding: 0 ;
}
.al-primary-navbar .container {
padding-left: 15px !important;
padding-right: 15px !important;
}
.al-index-faq .container {
padding-left: 15px !important;
padding-right: 15px !important;
}
.al-index-press .container {
padding-right: 15px !important;
padding-left: 15px !important;
}
.elevate-container-wrap{
padding-right: 15px !important;
padding-left: 15px !important;
}
.custom-blog-page-section{
width: 680px;
margin: auto;
}
.al-page-blog-post .container{
padding: 3rem 15px !important;
}
.fw-bold{
font-weight: 700 !important;
}
.fw-light{
font-weight: 300;
}
.fs-6 {
font-size: 1rem!important;
}
.display-5{
font-size: 46px !important;
line-height: 47px !important;
}
.lead {
font-size: 1.25rem !important;
font-weight: 400 !important;
}
// Main navigation
.al-primary-navbar {
background: $al-c-black-pearl;
font-family: $al-font-family-accent;
font-weight: 500;
box-shadow: al-shadow(3, 0.5);
.nav-link.al-download-button {
font-weight: 500;
background: $al-c-atlantis;
color: $al-font-color-light !important;
&:hover {
color: $al-font-color-light;
background: darken($al-c-atlantis, 5%);
}
}
.nav-link {
padding-left: 1rem !important;
padding-right: 1rem !important;
color: #fff !important;
font-size: 15px;
transition: .3s ease-in-out;
text-decoration: none !important;
cursor: pointer !important;
:hover{
color: #1e87f8 !important;
}
}
&.with-motd {
padding-bottom: 0;
border-bottom: 0;
}
.dropdown-menu-dark {
background: $al-c-black-pearl;
border: 0;
.dropdown-item{
text-decoration: none !important;
}
.dropdown-item:hover{
background-color: #ffffff26 !important;
}
.dropdown-divider {
border-color: $al-c-black-pearl-lighter;
}
}
.al-language-switch {
img {
height: 24px;
}
}
.al-language-link {
text-transform: capitalize;
color: aliceblue;
}
.al-translate-callout {
font-size: 0.92rem;
a {
display: flex;
align-items: center;
color: #69b1ff;
i {
margin-right: 0.4rem;
font-size: 0.8rem;
}
}
}
}
#al-motd {
width: 100%;
background: darken($al-c-black-pearl, 5%);
padding-top: 12px;
padding-bottom: 12px;
font-size: 0.8rem;
& > .container {
display: flex;
& > i {
padding-right: 8px;
}
& > .text {
display: block;
font-weight: 500;
a {
text-decoration: none;
&:hover {
text-decoration: underline;
color: inherit;
}
}
}
}
}
// Section titles
section h1.al-section-title {
font-size: 2.6rem;
font-weight: 300;
}
// Footer
.al-primary-footer {
background: #0D3654;
padding-top: 122px;
padding-bottom: 132px;
}
// Utilities
.al-py-lg {
padding-top: 3rem !important;
padding-bottom: 3rem !important;
}
.al-py-md {
padding-top: 2.5rem !important;
padding-bottom: 2.5rem !important;
}
.al-text-shadow-dark {
text-shadow: 1px 3px 3px rgba(0, 0, 0, 0.5);
}
// Smooth out buttons and links
.btn {
transition-property: all;
transition-timing-function: cubic-bezier(.4, 0, .2, 1);
transition-duration: .12s;
text-decoration: none !important;
}
a{
transition-property: all;
transition-timing-function: cubic-bezier(.4, 0, .2, 1);
transition-duration: .12s;
text-decoration: underline ;
}
// WYSIWYG
.al-wysiwyg {
$al-wysiwyg-font-size: $al-font-base-size - 1px;
all: revert;
font-family: $al-font-family;
font-size: $al-wysiwyg-font-size;
h1, h2, h3, h4, h5, h6 {
all: revert;
font-family: $al-font-family-accent;
}
ul,
ol,
ul li,
ol li,
p,
pre,
blockquote {
all: revert;
font-family: $al-font-family;
font-size: $al-wysiwyg-font-size;
}
pre, code {
font-family: $al-font-family-mono;
}
}
.al-certified-amd-page .banner {
background-image: url(/images/main-image.png);
background-size: cover;
padding: 180px 0 300px;
background-position: 25%;
}
.al-certified-amd-page .container {
margin: 0 auto;
max-width: 1180px;
}
.al-certified-amd-page .banner h1 {
font-size: 40px;
font-weight: 600;
max-width: 600px;
}
.al-certified-amd-page .banner p {
font-size: 22px;
font-style: italic;
font-weight: 500;
}
.al-certified-amd-page section.content {
background-color: #0e3b5c;
}
.al-certified-amd-page .content p {
margin: 0 auto;
max-width: 900px;
padding: 60px 0;
text-align: center;
}
.al-certified-amd-page .info-flex {
align-items: center;
display: flex;
justify-content: space-evenly;
padding: 60px 0;
}
.al-certified-amd-page .img img {
height: 300px;
}
.al-certified-amd-page .text>div {
align-items: center;
display: flex;
font-size: 16px;
margin-bottom: 30px;
}
.al-certified-amd-page .info-block-title {
font-size: 25px!important;
font-weight: 500;
margin-bottom: 40px!important;
}
.al-certified-amd-page .info-flex .text img {
height: 25px;
margin-right: 20px;
}
.al-certified-amd-page .container{
padding: 3rem 15px;
}
.al-certified-amd-page img{
max-width: 100%;
}
.al-certified-amd-page button.request {
background-color: #0069d9;
border: 0;
cursor: pointer;
font-size: 16px;
margin-top: 20px;
padding: 17px 35px;
}
.al-certified-amd-page .test-cta {
padding: 60px 0;
text-align: center;
}
.al-certified-amd-page .test-cta a, .al-certified-amd-page .test-cta button {
background-color: #87d831;
border: 0;
color: #000;
cursor: pointer;
font-size: 16px;
margin-top: 0;
padding: 17px 50px;
-webkit-text-decoration: None;
text-decoration: None;
}
.al-certified-amd-page .test table {
margin: 0 auto;
max-width: 800px;
width: 100%;
}
.al-certified-amd-page .test table td, .al-certified-amd-page .test table th {
background-color: #0e3b5c;
font-weight: 500;
padding: 20px 40px;
text-transform: uppercase;
width: 35%;
}
.al-certified-amd-page td.passed {
padding-left: 80px!important;
position: relative;
}
.al-certified-amd-page .checkmark {
border-bottom: 6px solid #0069d9;
border-right: 6px solid #0069d9;
display: inline-block;
height: 25px;
left: 40px;
position: absolute;
top: 25px;
transform: rotate(45deg);
width: 12px;
}
.al-certified-amd-page {
color: #fff;
font-family: Montserrat,sans-serif;
margin: 0;
width: 100%;
}
.al-certified-amd-page p.test-title {
font-size: 20px;
font-weight: 500;
padding-top: 40px;
text-transform: uppercase;
}
.al-certified-amd-page .test img {
margin-top: 40px;
max-height: 400px;
}
.al-certified-amd-page .form {
margin-top: 40px;
}
.al-page-blog-index{
margin: auto;
max-width: 680px;
}
@media (min-width:1400px){
.container{
max-width: 1320px;
}
}

43
assets/scss/members.css

@ -0,0 +1,43 @@
.al-page-foundation-members-index .al-members .table {
color: #fefefe !important;
}
.al-page-foundation-members-index .al-members .al-member-item {
height: 100%;
background: rgb(14, 59, 92);
}
.al-page-foundation-members-index .al-member-apply-category-icon {
color: white;
font-size: 32px;
padding-right: 22px;
}
[dir=rtl] .al-page-foundation-members-index .al-member-apply-category-icon {
padding-right: 0;
padding-left: 22px;
}
.al-page-foundation-members-index .al-member-apply-cta {
min-width: 120px;
}
.al-page-foundation-members-index .fw-light .al-laws-link, .al-page-foundation-members-index .fw-light .al-guideline-link {
text-decoration: none;
}
.al-page-foundation-members-index .fw-light .al-laws-link:hover, .al-page-foundation-members-index .fw-light .al-laws-link:active, .al-page-foundation-members-index .fw-light .al-guideline-link:hover, .al-page-foundation-members-index .fw-light .al-guideline-link:active {
text-decoration: underline;
}
.al-page-foundation-members-index .al-membership-info {
display: none;
}
.al-page-foundation-members-index #al-mirror-info ul, .al-page-foundation-members-index #al-sponsor-info ul {
list-style-type: "- ";
}
.al-page-foundation-members-index .member-info:hover {
color: #86da2f;
}
.al-page-foundation-members-index .al-foundation-members-apply-content-wrap {
display: flex;
flex-direction: column;
flex: 1;
}
.al-page-foundation-members-index .al-foundation-members-apply-content-wrap p {
flex: 1;
}/*# sourceMappingURL=members.css.map */

1
assets/scss/members.css.map

@ -0,0 +1 @@
{"version":3,"sources":["members.scss","members.css"],"names":[],"mappings":"AAMI;EACE,yBAAA;ACLN;ADOI;EACE,YAAA;EACA,2BAAA;ACLN;ADSE;EACE,YAAA;EACA,eAAA;EACA,mBAAA;ACPJ;ADUM;EACE,gBAAA;EACA,kBAAA;ACRR;;ADaE;EACE,gBAAA;ACVJ;ADcI;EACE,qBAAA;ACZN;ADcM;EACE,0BAAA;ACZR;ADiBE;EACE,aAAA;ACfJ;ADmBI;EACI,uBAAA;ACjBR;ADqBE;EACE,cAAA;ACnBJ;ADuBI;EACE,aAAA;EACA,sBAAA;EACA,OAAA;ACrBN;ADuBM;EACE,OAAA;ACrBR","file":"members.css"}

12
frontend/src/modules/page_foundation/main.scss → assets/scss/members.scss

@ -1,9 +1,12 @@
@import "~bootstrap/scss/bootstrap-utilities";
@import "../../common/scss/variables";
@import "../../common/scss/functions";
@import "./variables";
@import "./functions";
@import "./bootstrap";
.al-page-foundation-members-index {
.al-members {
.table{
color: #fefefe !important;
}
.al-member-item {
height: 100%;
background: rgb(14, 59, 92);
@ -52,7 +55,6 @@
}
@include media-breakpoint-up(md) {
.al-foundation-members-apply-content-wrap {
display: flex;
flex-direction: column;
@ -63,4 +65,4 @@
}
}
}
}

1
assets/scss/partials/common/footer.css

@ -0,0 +1 @@
/*# sourceMappingURL=footer.css.map */

1
assets/scss/partials/common/footer.css.map

@ -0,0 +1 @@
{"version":3,"sources":[],"names":[],"mappings":"","file":"footer.css"}

0
commons/context/__init__.py → assets/scss/partials/common/footer.scss

1
assets/scss/partials/common/header.css

@ -0,0 +1 @@
/*# sourceMappingURL=header.css.map */

1
assets/scss/partials/common/header.css.map

@ -0,0 +1 @@
{"version":3,"sources":[],"names":[],"mappings":"","file":"header.css"}

0
commons/templatetags/__init__.py → assets/scss/partials/common/header.scss

1
assets/scss/variables.css

@ -0,0 +1 @@
/*# sourceMappingURL=variables.css.map */

1
assets/scss/variables.css.map

@ -0,0 +1 @@
{"version":3,"sources":[],"names":[],"mappings":"","file":"variables.css"}

0
frontend/src/common/scss/variables.scss → assets/scss/variables.scss

3
commons/__init__.py

@ -1,3 +0,0 @@
from commons.encore import Encore
encore = Encore()

5
commons/apps.py

@ -1,5 +0,0 @@
from django.apps import AppConfig
class CommonsConfig(AppConfig):
name = 'commons'

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save