commit 09db9d9a2cc306f523767b7a4c855d37031fbc2a Author: Julian Lobbes Date: Mon Mar 13 19:54:16 2023 +0100 feat: initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9ded375 --- /dev/null +++ b/.gitignore @@ -0,0 +1,14 @@ +# Backend config file +/config.py + +# Local environments +/.venv/ +/node_modules/ + +# Cache files and directories +*.pyc +__pycache__/ +/.parcel-cache/ + +# Bundled files +/dist/ diff --git a/.postcssrc b/.postcssrc new file mode 100644 index 0000000..f56b326 --- /dev/null +++ b/.postcssrc @@ -0,0 +1,7 @@ +{ +  "plugins": { +    "postcss-import": {}, +    "tailwindcss/nesting": {}, +    "tailwindcss": {}, +  } +} diff --git a/Caddyfile b/Caddyfile new file mode 100644 index 0000000..6af7b05 --- /dev/null +++ b/Caddyfile @@ -0,0 +1,29 @@ +:3000 { + + encode zstd gzip + + @staticfiles { + method GET + path /static/* + } + handle @staticfiles { + file_server { + root /app/public/ + } + } + + handle_path /api/* { + reverse_proxy * portfolio-backend:3001 + } + + handle * { + root * /app/dist/ + file_server + try_files {path} / + } + + log { + output stderr + format console + } +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..e0f302b --- /dev/null +++ b/README.md @@ -0,0 +1,41 @@ +# TODO + +In `index.html`: make parcel replace the hard-coded base URL (in the meta tags). + +# About + +This is a template project for a webapp using the following tech stack: + +- **Frontend**: + - Vue.js + - TailwindCSS + - Axios +- **Backend**: + - FastAPI (python) +- **Other**: + - Caddy (webserver/reverse proxy) + - Parcel (bundler) + +# Customization + +A number of default template files and assets for the frontend are already present in the repository. +These include essential assets like a set of fonts, and a default favicon. + +## Favicon + +The standards for the correct favicons are annoying, many browser vendors use a different standard. + +A quick and easy way to create a set of favicons with broad compatibility is to create your favicon as an `.svg`-file, +and then use [realfavicongenerator.net](https://realfavicongenerator.net/) to create a set of relevant files and HTML +for your favicon. + +Place the generated icons into `/frontend/assets/images/common/` and be sure to adjust the generated HTML to point to +this path. + +## OG Image + +The OG image is served directly by Caddy, and thus needs to be placed into `/public/static/images/common/`, +ideally as a `.webp`-file. + +The image's dimensions should be 1200 x 630 pixels, as according to the +[OGP standard](https://developers.facebook.com/docs/sharing/webmasters/images/). diff --git a/backend.Dockerfile b/backend.Dockerfile new file mode 100644 index 0000000..99da56e --- /dev/null +++ b/backend.Dockerfile @@ -0,0 +1,25 @@ +# syntax=docker/dockerfile:1 + +FROM python:3 + +# Create non-root user +ARG CUSTOM_UID +ARG CUSTOM_GID +ENV CUSTOM_USERNAME=backend +ENV CUSTOM_GROUPNAME=backend +RUN groupadd --gid ${CUSTOM_GID:-1000} ${CUSTOM_GROUPNAME} && \ + useradd --uid ${CUSTOM_UID:-1000} --gid ${CUSTOM_GID:-1000} --create-home --shell /bin/bash ${CUSTOM_USERNAME} && \ + mkdir /app && chown ${CUSTOM_UID:-1000}:${CUSTOM_GID:-1000} /app + +# Copy source files +WORKDIR /app +COPY --chown=${CUSTOM_USERNAME}:${CUSTOM_GROUPNAME} requirements.txt /app/ +COPY --chown=${CUSTOM_USERNAME}:${CUSTOM_GROUPNAME} backend /app/backend/ + +# Install dependencies +RUN pip install -r requirements.txt + +# Run ASGI server +EXPOSE 3001/tcp +USER ${CUSTOM_UID:-1000}:${CUSTOM_GID:-1000} +ENTRYPOINT ["uvicorn", "backend.main:app", "--root-path", "/api", "--host", "0.0.0.0", "--port", "3001"] diff --git a/backend/__init__.py b/backend/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/main.py b/backend/main.py new file mode 100644 index 0000000..ceeb113 --- /dev/null +++ b/backend/main.py @@ -0,0 +1,8 @@ +from fastapi import FastAPI, HTTPException + + +app = FastAPI() + +@app.get("/hello/") +async def hello() -> str: + return "Hello World!" diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..7d00260 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,31 @@ +--- + +version: "3" + +services: + portfolio-frontend: + container_name: portfolio-frontend + restart: unless-stopped + build: + context: . + dockerfile: ./frontend.Dockerfile + args: + CUSTOM_UID: 1000 + CUSTOM_GID: 1000 + environment: + TZ: Europe/Berlin + ports: + - "8000:3000" + portfolio-backend: + container_name: portfolio-backend + restart: unless-stopped + build: + context: . + dockerfile: ./backend.Dockerfile + args: + CUSTOM_UID: 1000 + CUSTOM_GID: 1000 + expose: + - "3001" + +... diff --git a/frontend.Dockerfile b/frontend.Dockerfile new file mode 100644 index 0000000..b803ccf --- /dev/null +++ b/frontend.Dockerfile @@ -0,0 +1,36 @@ +# syntax=docker/dockerfile:1 + +FROM debian:latest + +# Install packages +ENV DEBIAN_FRONTEND=noninteractive +#RUN apt update && apt install -y python3-pip python3-venv && rm -rf /var/lib/apt/lists/* +RUN apt update && apt install -y curl && \ + curl -fsSL https://deb.nodesource.com/setup_19.x | bash - && apt-get install -y nodejs && \ + apt install -y debian-keyring debian-archive-keyring apt-transport-https && \ + curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg && \ + curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' > /etc/apt/sources.list.d/caddy-stable.list && \ + apt update && apt install -y caddy && \ + rm -rf /var/lib/apt/lists/* + +# Create non-root user +ARG CUSTOM_UID +ARG CUSTOM_GID +ENV CUSTOM_USERNAME=webserver +ENV CUSTOM_GROUPNAME=webserver +RUN groupadd --gid ${CUSTOM_GID:-1000} ${CUSTOM_GROUPNAME} && \ + useradd --uid ${CUSTOM_UID:-1000} --gid ${CUSTOM_GID:-1000} --create-home --shell /bin/bash ${CUSTOM_USERNAME} && \ + mkdir /app && chown ${CUSTOM_UID:-1000}:${CUSTOM_GID:-1000} /app + +# Copy source files +WORKDIR /app +COPY --chown=${CUSTOM_USERNAME}:${CUSTOM_GROUPNAME} package.json package-lock.json .postcssrc postcss.config.js tailwind.config.js Caddyfile /app/ +COPY --chown=${CUSTOM_USERNAME}:${CUSTOM_GROUPNAME} frontend /app/frontend/ +COPY --chown=${CUSTOM_USERNAME}:${CUSTOM_GROUPNAME} public /app/public/ + +# Install dependencies +USER ${CUSTOM_UID:-1000}:${CUSTOM_GID:-1000} +RUN npm install +RUN npx parcel build frontend/src/html/index.html + +ENTRYPOINT ["caddy", "run", "--config", "/app/Caddyfile"] diff --git a/frontend/assets/fonts/kanit/kanit-black-italic.ttf b/frontend/assets/fonts/kanit/kanit-black-italic.ttf new file mode 100644 index 0000000..dc81853 Binary files /dev/null and b/frontend/assets/fonts/kanit/kanit-black-italic.ttf differ diff --git a/frontend/assets/fonts/kanit/kanit-black.ttf b/frontend/assets/fonts/kanit/kanit-black.ttf new file mode 100644 index 0000000..2e37a00 Binary files /dev/null and b/frontend/assets/fonts/kanit/kanit-black.ttf differ diff --git a/frontend/assets/fonts/kanit/kanit-bold-italic.ttf b/frontend/assets/fonts/kanit/kanit-bold-italic.ttf new file mode 100644 index 0000000..17eda2a Binary files /dev/null and b/frontend/assets/fonts/kanit/kanit-bold-italic.ttf differ diff --git a/frontend/assets/fonts/kanit/kanit-bold.ttf b/frontend/assets/fonts/kanit/kanit-bold.ttf new file mode 100644 index 0000000..4686906 Binary files /dev/null and b/frontend/assets/fonts/kanit/kanit-bold.ttf differ diff --git a/frontend/assets/fonts/kanit/kanit-extrabold-italic.ttf b/frontend/assets/fonts/kanit/kanit-extrabold-italic.ttf new file mode 100644 index 0000000..037187a Binary files /dev/null and b/frontend/assets/fonts/kanit/kanit-extrabold-italic.ttf differ diff --git a/frontend/assets/fonts/kanit/kanit-extrabold.ttf b/frontend/assets/fonts/kanit/kanit-extrabold.ttf new file mode 100644 index 0000000..5240d38 Binary files /dev/null and b/frontend/assets/fonts/kanit/kanit-extrabold.ttf differ diff --git a/frontend/assets/fonts/kanit/kanit-extralight-italic.ttf b/frontend/assets/fonts/kanit/kanit-extralight-italic.ttf new file mode 100644 index 0000000..5d575cc Binary files /dev/null and b/frontend/assets/fonts/kanit/kanit-extralight-italic.ttf differ diff --git a/frontend/assets/fonts/kanit/kanit-extralight.ttf b/frontend/assets/fonts/kanit/kanit-extralight.ttf new file mode 100644 index 0000000..404c1e0 Binary files /dev/null and b/frontend/assets/fonts/kanit/kanit-extralight.ttf differ diff --git a/frontend/assets/fonts/kanit/kanit-light-italic.ttf b/frontend/assets/fonts/kanit/kanit-light-italic.ttf new file mode 100644 index 0000000..59a3f2e Binary files /dev/null and b/frontend/assets/fonts/kanit/kanit-light-italic.ttf differ diff --git a/frontend/assets/fonts/kanit/kanit-light.ttf b/frontend/assets/fonts/kanit/kanit-light.ttf new file mode 100644 index 0000000..3c9d4b5 Binary files /dev/null and b/frontend/assets/fonts/kanit/kanit-light.ttf differ diff --git a/frontend/assets/fonts/kanit/kanit-medium-italic.ttf b/frontend/assets/fonts/kanit/kanit-medium-italic.ttf new file mode 100644 index 0000000..2c6aa14 Binary files /dev/null and b/frontend/assets/fonts/kanit/kanit-medium-italic.ttf differ diff --git a/frontend/assets/fonts/kanit/kanit-medium.ttf b/frontend/assets/fonts/kanit/kanit-medium.ttf new file mode 100644 index 0000000..50413d0 Binary files /dev/null and b/frontend/assets/fonts/kanit/kanit-medium.ttf differ diff --git a/frontend/assets/fonts/kanit/kanit-regular-italic.ttf b/frontend/assets/fonts/kanit/kanit-regular-italic.ttf new file mode 100644 index 0000000..e6d868b Binary files /dev/null and b/frontend/assets/fonts/kanit/kanit-regular-italic.ttf differ diff --git a/frontend/assets/fonts/kanit/kanit-regular.ttf b/frontend/assets/fonts/kanit/kanit-regular.ttf new file mode 100644 index 0000000..ef204c1 Binary files /dev/null and b/frontend/assets/fonts/kanit/kanit-regular.ttf differ diff --git a/frontend/assets/fonts/kanit/kanit-semibold-italic.ttf b/frontend/assets/fonts/kanit/kanit-semibold-italic.ttf new file mode 100644 index 0000000..21a2f3d Binary files /dev/null and b/frontend/assets/fonts/kanit/kanit-semibold-italic.ttf differ diff --git a/frontend/assets/fonts/kanit/kanit-semibold.ttf b/frontend/assets/fonts/kanit/kanit-semibold.ttf new file mode 100644 index 0000000..7501a2e Binary files /dev/null and b/frontend/assets/fonts/kanit/kanit-semibold.ttf differ diff --git a/frontend/assets/fonts/kanit/kanit-thin-italic.ttf b/frontend/assets/fonts/kanit/kanit-thin-italic.ttf new file mode 100644 index 0000000..25fd1f9 Binary files /dev/null and b/frontend/assets/fonts/kanit/kanit-thin-italic.ttf differ diff --git a/frontend/assets/fonts/kanit/kanit-thin.ttf b/frontend/assets/fonts/kanit/kanit-thin.ttf new file mode 100644 index 0000000..5c835ad Binary files /dev/null and b/frontend/assets/fonts/kanit/kanit-thin.ttf differ diff --git a/frontend/assets/fonts/lora/lora-bold-italic.ttf b/frontend/assets/fonts/lora/lora-bold-italic.ttf new file mode 100644 index 0000000..9d61f1b Binary files /dev/null and b/frontend/assets/fonts/lora/lora-bold-italic.ttf differ diff --git a/frontend/assets/fonts/lora/lora-bold.ttf b/frontend/assets/fonts/lora/lora-bold.ttf new file mode 100644 index 0000000..cd154bf Binary files /dev/null and b/frontend/assets/fonts/lora/lora-bold.ttf differ diff --git a/frontend/assets/fonts/lora/lora-medium-italic.ttf b/frontend/assets/fonts/lora/lora-medium-italic.ttf new file mode 100644 index 0000000..f52f150 Binary files /dev/null and b/frontend/assets/fonts/lora/lora-medium-italic.ttf differ diff --git a/frontend/assets/fonts/lora/lora-medium.ttf b/frontend/assets/fonts/lora/lora-medium.ttf new file mode 100644 index 0000000..6d652b5 Binary files /dev/null and b/frontend/assets/fonts/lora/lora-medium.ttf differ diff --git a/frontend/assets/fonts/lora/lora-regular-italic.ttf b/frontend/assets/fonts/lora/lora-regular-italic.ttf new file mode 100644 index 0000000..c037576 Binary files /dev/null and b/frontend/assets/fonts/lora/lora-regular-italic.ttf differ diff --git a/frontend/assets/fonts/lora/lora-regular.ttf b/frontend/assets/fonts/lora/lora-regular.ttf new file mode 100644 index 0000000..5306a94 Binary files /dev/null and b/frontend/assets/fonts/lora/lora-regular.ttf differ diff --git a/frontend/assets/fonts/lora/lora-semibold-italic.ttf b/frontend/assets/fonts/lora/lora-semibold-italic.ttf new file mode 100644 index 0000000..c3d61ee Binary files /dev/null and b/frontend/assets/fonts/lora/lora-semibold-italic.ttf differ diff --git a/frontend/assets/fonts/lora/lora-semibold.ttf b/frontend/assets/fonts/lora/lora-semibold.ttf new file mode 100644 index 0000000..c69d778 Binary files /dev/null and b/frontend/assets/fonts/lora/lora-semibold.ttf differ diff --git a/frontend/assets/fonts/montserrat/montserrat-black-italic.ttf b/frontend/assets/fonts/montserrat/montserrat-black-italic.ttf new file mode 100644 index 0000000..172e249 Binary files /dev/null and b/frontend/assets/fonts/montserrat/montserrat-black-italic.ttf differ diff --git a/frontend/assets/fonts/montserrat/montserrat-black.ttf b/frontend/assets/fonts/montserrat/montserrat-black.ttf new file mode 100644 index 0000000..7bb6575 Binary files /dev/null and b/frontend/assets/fonts/montserrat/montserrat-black.ttf differ diff --git a/frontend/assets/fonts/montserrat/montserrat-bold-italic.ttf b/frontend/assets/fonts/montserrat/montserrat-bold-italic.ttf new file mode 100644 index 0000000..b7d8031 Binary files /dev/null and b/frontend/assets/fonts/montserrat/montserrat-bold-italic.ttf differ diff --git a/frontend/assets/fonts/montserrat/montserrat-bold.ttf b/frontend/assets/fonts/montserrat/montserrat-bold.ttf new file mode 100644 index 0000000..efddc83 Binary files /dev/null and b/frontend/assets/fonts/montserrat/montserrat-bold.ttf differ diff --git a/frontend/assets/fonts/montserrat/montserrat-extrabold-italic.ttf b/frontend/assets/fonts/montserrat/montserrat-extrabold-italic.ttf new file mode 100644 index 0000000..c21a396 Binary files /dev/null and b/frontend/assets/fonts/montserrat/montserrat-extrabold-italic.ttf differ diff --git a/frontend/assets/fonts/montserrat/montserrat-extrabold.ttf b/frontend/assets/fonts/montserrat/montserrat-extrabold.ttf new file mode 100644 index 0000000..3059507 Binary files /dev/null and b/frontend/assets/fonts/montserrat/montserrat-extrabold.ttf differ diff --git a/frontend/assets/fonts/montserrat/montserrat-extralight-italic.ttf b/frontend/assets/fonts/montserrat/montserrat-extralight-italic.ttf new file mode 100644 index 0000000..382293d Binary files /dev/null and b/frontend/assets/fonts/montserrat/montserrat-extralight-italic.ttf differ diff --git a/frontend/assets/fonts/montserrat/montserrat-extralight.ttf b/frontend/assets/fonts/montserrat/montserrat-extralight.ttf new file mode 100644 index 0000000..f1b405e Binary files /dev/null and b/frontend/assets/fonts/montserrat/montserrat-extralight.ttf differ diff --git a/frontend/assets/fonts/montserrat/montserrat-light-italic.ttf b/frontend/assets/fonts/montserrat/montserrat-light-italic.ttf new file mode 100644 index 0000000..5bdce7f Binary files /dev/null and b/frontend/assets/fonts/montserrat/montserrat-light-italic.ttf differ diff --git a/frontend/assets/fonts/montserrat/montserrat-light.ttf b/frontend/assets/fonts/montserrat/montserrat-light.ttf new file mode 100644 index 0000000..c5dfdb7 Binary files /dev/null and b/frontend/assets/fonts/montserrat/montserrat-light.ttf differ diff --git a/frontend/assets/fonts/montserrat/montserrat-medium-italic.ttf b/frontend/assets/fonts/montserrat/montserrat-medium-italic.ttf new file mode 100644 index 0000000..ce56883 Binary files /dev/null and b/frontend/assets/fonts/montserrat/montserrat-medium-italic.ttf differ diff --git a/frontend/assets/fonts/montserrat/montserrat-medium.ttf b/frontend/assets/fonts/montserrat/montserrat-medium.ttf new file mode 100644 index 0000000..dfc7e2f Binary files /dev/null and b/frontend/assets/fonts/montserrat/montserrat-medium.ttf differ diff --git a/frontend/assets/fonts/montserrat/montserrat-regular-italic.ttf b/frontend/assets/fonts/montserrat/montserrat-regular-italic.ttf new file mode 100644 index 0000000..eee45ba Binary files /dev/null and b/frontend/assets/fonts/montserrat/montserrat-regular-italic.ttf differ diff --git a/frontend/assets/fonts/montserrat/montserrat-regular.ttf b/frontend/assets/fonts/montserrat/montserrat-regular.ttf new file mode 100644 index 0000000..aa9033a Binary files /dev/null and b/frontend/assets/fonts/montserrat/montserrat-regular.ttf differ diff --git a/frontend/assets/fonts/montserrat/montserrat-semibold-italic.ttf b/frontend/assets/fonts/montserrat/montserrat-semibold-italic.ttf new file mode 100644 index 0000000..7f9153d Binary files /dev/null and b/frontend/assets/fonts/montserrat/montserrat-semibold-italic.ttf differ diff --git a/frontend/assets/fonts/montserrat/montserrat-semibold.ttf b/frontend/assets/fonts/montserrat/montserrat-semibold.ttf new file mode 100644 index 0000000..cbf44db Binary files /dev/null and b/frontend/assets/fonts/montserrat/montserrat-semibold.ttf differ diff --git a/frontend/assets/fonts/montserrat/montserrat-thin-italic.ttf b/frontend/assets/fonts/montserrat/montserrat-thin-italic.ttf new file mode 100644 index 0000000..94bcf55 Binary files /dev/null and b/frontend/assets/fonts/montserrat/montserrat-thin-italic.ttf differ diff --git a/frontend/assets/fonts/montserrat/montserrat-thin.ttf b/frontend/assets/fonts/montserrat/montserrat-thin.ttf new file mode 100644 index 0000000..7c90a54 Binary files /dev/null and b/frontend/assets/fonts/montserrat/montserrat-thin.ttf differ diff --git a/frontend/assets/fonts/notocoloremoji/notocoloremoji-regular.ttf b/frontend/assets/fonts/notocoloremoji/notocoloremoji-regular.ttf new file mode 100644 index 0000000..8ebcc8f Binary files /dev/null and b/frontend/assets/fonts/notocoloremoji/notocoloremoji-regular.ttf differ diff --git a/frontend/assets/fonts/sourcecodepro/sourcecodepro-black-italic.ttf b/frontend/assets/fonts/sourcecodepro/sourcecodepro-black-italic.ttf new file mode 100644 index 0000000..b9e96b2 Binary files /dev/null and b/frontend/assets/fonts/sourcecodepro/sourcecodepro-black-italic.ttf differ diff --git a/frontend/assets/fonts/sourcecodepro/sourcecodepro-black.ttf b/frontend/assets/fonts/sourcecodepro/sourcecodepro-black.ttf new file mode 100644 index 0000000..cfc5f9f Binary files /dev/null and b/frontend/assets/fonts/sourcecodepro/sourcecodepro-black.ttf differ diff --git a/frontend/assets/fonts/sourcecodepro/sourcecodepro-bold-italic.ttf b/frontend/assets/fonts/sourcecodepro/sourcecodepro-bold-italic.ttf new file mode 100644 index 0000000..7b354cc Binary files /dev/null and b/frontend/assets/fonts/sourcecodepro/sourcecodepro-bold-italic.ttf differ diff --git a/frontend/assets/fonts/sourcecodepro/sourcecodepro-bold.ttf b/frontend/assets/fonts/sourcecodepro/sourcecodepro-bold.ttf new file mode 100644 index 0000000..e034f70 Binary files /dev/null and b/frontend/assets/fonts/sourcecodepro/sourcecodepro-bold.ttf differ diff --git a/frontend/assets/fonts/sourcecodepro/sourcecodepro-extrabold-italic.ttf b/frontend/assets/fonts/sourcecodepro/sourcecodepro-extrabold-italic.ttf new file mode 100644 index 0000000..5041be4 Binary files /dev/null and b/frontend/assets/fonts/sourcecodepro/sourcecodepro-extrabold-italic.ttf differ diff --git a/frontend/assets/fonts/sourcecodepro/sourcecodepro-extrabold.ttf b/frontend/assets/fonts/sourcecodepro/sourcecodepro-extrabold.ttf new file mode 100644 index 0000000..a66b0f4 Binary files /dev/null and b/frontend/assets/fonts/sourcecodepro/sourcecodepro-extrabold.ttf differ diff --git a/frontend/assets/fonts/sourcecodepro/sourcecodepro-extralight-italic.ttf b/frontend/assets/fonts/sourcecodepro/sourcecodepro-extralight-italic.ttf new file mode 100644 index 0000000..0345c21 Binary files /dev/null and b/frontend/assets/fonts/sourcecodepro/sourcecodepro-extralight-italic.ttf differ diff --git a/frontend/assets/fonts/sourcecodepro/sourcecodepro-extralight.ttf b/frontend/assets/fonts/sourcecodepro/sourcecodepro-extralight.ttf new file mode 100644 index 0000000..2b652af Binary files /dev/null and b/frontend/assets/fonts/sourcecodepro/sourcecodepro-extralight.ttf differ diff --git a/frontend/assets/fonts/sourcecodepro/sourcecodepro-light-italic.ttf b/frontend/assets/fonts/sourcecodepro/sourcecodepro-light-italic.ttf new file mode 100644 index 0000000..c1f3d4b Binary files /dev/null and b/frontend/assets/fonts/sourcecodepro/sourcecodepro-light-italic.ttf differ diff --git a/frontend/assets/fonts/sourcecodepro/sourcecodepro-light.ttf b/frontend/assets/fonts/sourcecodepro/sourcecodepro-light.ttf new file mode 100644 index 0000000..aae9d48 Binary files /dev/null and b/frontend/assets/fonts/sourcecodepro/sourcecodepro-light.ttf differ diff --git a/frontend/assets/fonts/sourcecodepro/sourcecodepro-medium-italic.ttf b/frontend/assets/fonts/sourcecodepro/sourcecodepro-medium-italic.ttf new file mode 100644 index 0000000..580c00d Binary files /dev/null and b/frontend/assets/fonts/sourcecodepro/sourcecodepro-medium-italic.ttf differ diff --git a/frontend/assets/fonts/sourcecodepro/sourcecodepro-medium.ttf b/frontend/assets/fonts/sourcecodepro/sourcecodepro-medium.ttf new file mode 100644 index 0000000..1e42b5e Binary files /dev/null and b/frontend/assets/fonts/sourcecodepro/sourcecodepro-medium.ttf differ diff --git a/frontend/assets/fonts/sourcecodepro/sourcecodepro-regular-italic.ttf b/frontend/assets/fonts/sourcecodepro/sourcecodepro-regular-italic.ttf new file mode 100644 index 0000000..ffbae58 Binary files /dev/null and b/frontend/assets/fonts/sourcecodepro/sourcecodepro-regular-italic.ttf differ diff --git a/frontend/assets/fonts/sourcecodepro/sourcecodepro-regular.ttf b/frontend/assets/fonts/sourcecodepro/sourcecodepro-regular.ttf new file mode 100644 index 0000000..daad874 Binary files /dev/null and b/frontend/assets/fonts/sourcecodepro/sourcecodepro-regular.ttf differ diff --git a/frontend/assets/fonts/sourcecodepro/sourcecodepro-semibold-italic.ttf b/frontend/assets/fonts/sourcecodepro/sourcecodepro-semibold-italic.ttf new file mode 100644 index 0000000..37595b0 Binary files /dev/null and b/frontend/assets/fonts/sourcecodepro/sourcecodepro-semibold-italic.ttf differ diff --git a/frontend/assets/fonts/sourcecodepro/sourcecodepro-semibold.ttf b/frontend/assets/fonts/sourcecodepro/sourcecodepro-semibold.ttf new file mode 100644 index 0000000..7dc26d9 Binary files /dev/null and b/frontend/assets/fonts/sourcecodepro/sourcecodepro-semibold.ttf differ diff --git a/frontend/assets/images/common/favicon/android-chrome-192x192.png b/frontend/assets/images/common/favicon/android-chrome-192x192.png new file mode 100644 index 0000000..6b40da6 Binary files /dev/null and b/frontend/assets/images/common/favicon/android-chrome-192x192.png differ diff --git a/frontend/assets/images/common/favicon/android-chrome-512x512.png b/frontend/assets/images/common/favicon/android-chrome-512x512.png new file mode 100644 index 0000000..6a8698f Binary files /dev/null and b/frontend/assets/images/common/favicon/android-chrome-512x512.png differ diff --git a/frontend/assets/images/common/favicon/apple-touch-icon.png b/frontend/assets/images/common/favicon/apple-touch-icon.png new file mode 100644 index 0000000..8396146 Binary files /dev/null and b/frontend/assets/images/common/favicon/apple-touch-icon.png differ diff --git a/frontend/assets/images/common/favicon/browserconfig.xml b/frontend/assets/images/common/favicon/browserconfig.xml new file mode 100644 index 0000000..b3930d0 --- /dev/null +++ b/frontend/assets/images/common/favicon/browserconfig.xml @@ -0,0 +1,9 @@ + + + + + + #da532c + + + diff --git a/frontend/assets/images/common/favicon/favicon-16x16.png b/frontend/assets/images/common/favicon/favicon-16x16.png new file mode 100644 index 0000000..3534b08 Binary files /dev/null and b/frontend/assets/images/common/favicon/favicon-16x16.png differ diff --git a/frontend/assets/images/common/favicon/favicon-32x32.png b/frontend/assets/images/common/favicon/favicon-32x32.png new file mode 100644 index 0000000..ded72b6 Binary files /dev/null and b/frontend/assets/images/common/favicon/favicon-32x32.png differ diff --git a/frontend/assets/images/common/favicon/favicon.ico b/frontend/assets/images/common/favicon/favicon.ico new file mode 100644 index 0000000..6400300 Binary files /dev/null and b/frontend/assets/images/common/favicon/favicon.ico differ diff --git a/frontend/assets/images/common/favicon/favicon.svg b/frontend/assets/images/common/favicon/favicon.svg new file mode 100644 index 0000000..913aafd --- /dev/null +++ b/frontend/assets/images/common/favicon/favicon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/frontend/assets/images/common/favicon/mstile-144x144.png b/frontend/assets/images/common/favicon/mstile-144x144.png new file mode 100644 index 0000000..b56cc9f Binary files /dev/null and b/frontend/assets/images/common/favicon/mstile-144x144.png differ diff --git a/frontend/assets/images/common/favicon/mstile-150x150.png b/frontend/assets/images/common/favicon/mstile-150x150.png new file mode 100644 index 0000000..179fb13 Binary files /dev/null and b/frontend/assets/images/common/favicon/mstile-150x150.png differ diff --git a/frontend/assets/images/common/favicon/mstile-310x150.png b/frontend/assets/images/common/favicon/mstile-310x150.png new file mode 100644 index 0000000..77c5ca9 Binary files /dev/null and b/frontend/assets/images/common/favicon/mstile-310x150.png differ diff --git a/frontend/assets/images/common/favicon/mstile-310x310.png b/frontend/assets/images/common/favicon/mstile-310x310.png new file mode 100644 index 0000000..d099842 Binary files /dev/null and b/frontend/assets/images/common/favicon/mstile-310x310.png differ diff --git a/frontend/assets/images/common/favicon/mstile-70x70.png b/frontend/assets/images/common/favicon/mstile-70x70.png new file mode 100644 index 0000000..e9710d6 Binary files /dev/null and b/frontend/assets/images/common/favicon/mstile-70x70.png differ diff --git a/frontend/assets/images/common/favicon/safari-pinned-tab.svg b/frontend/assets/images/common/favicon/safari-pinned-tab.svg new file mode 100644 index 0000000..62ce369 --- /dev/null +++ b/frontend/assets/images/common/favicon/safari-pinned-tab.svg @@ -0,0 +1,71 @@ + + + + +Created by potrace 1.14, written by Peter Selinger 2001-2017 + + + + + diff --git a/frontend/assets/images/common/favicon/site.webmanifest b/frontend/assets/images/common/favicon/site.webmanifest new file mode 100644 index 0000000..b20abb7 --- /dev/null +++ b/frontend/assets/images/common/favicon/site.webmanifest @@ -0,0 +1,19 @@ +{ + "name": "", + "short_name": "", + "icons": [ + { + "src": "/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/android-chrome-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ], + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone" +} diff --git a/frontend/src/css/fonts.css b/frontend/src/css/fonts.css new file mode 100644 index 0000000..12cd87e --- /dev/null +++ b/frontend/src/css/fonts.css @@ -0,0 +1,379 @@ +/* Kanit */ +@font-face { + font-family: 'Kanit'; + src: url('/frontend/assets/fonts/kanit/kanit-thin.ttf') format('truetype'); + font-weight: 100; + font-style: normal; +} +@font-face { + font-family: 'Kanit'; + src: url('/frontend/assets/fonts/kanit/kanit-thin-italic.ttf') format('truetype'); + font-weight: 100; + font-style: italic; +} +@font-face { + font-family: 'Kanit'; + src: url('/frontend/assets/fonts/kanit/kanit-extralight.ttf') format('truetype'); + font-weight: 200; + font-style: normal; +} +@font-face { + font-family: 'Kanit'; + src: url('/frontend/assets/fonts/kanit/kanit-extralight-italic.ttf') format('truetype'); + font-weight: 200; + font-style: italic; +} +@font-face { + font-family: 'Kanit'; + src: url('/frontend/assets/fonts/kanit/kanit-light.ttf') format('truetype'); + font-weight: 300; + font-style: normal; +} +@font-face { + font-family: 'Kanit'; + src: url('/frontend/assets/fonts/kanit/kanit-light-italic.ttf') format('truetype'); + font-weight: 300; + font-style: italic; +} +@font-face { + font-family: 'Kanit'; + src: url('/frontend/assets/fonts/kanit/kanit-regular.ttf') format('truetype'); + font-weight: 400; + font-style: normal; +} +@font-face { + font-family: 'Kanit'; + src: url('/frontend/assets/fonts/kanit/kanit-regular-italic.ttf') format('truetype'); + font-weight: 400; + font-style: italic; +} +@font-face { + font-family: 'Kanit'; + src: url('/frontend/assets/fonts/kanit/kanit-medium.ttf') format('truetype'); + font-weight: 500; + font-style: normal; +} +@font-face { + font-family: 'Kanit'; + src: url('/frontend/assets/fonts/kanit/kanit-medium-italic.ttf') format('truetype'); + font-weight: 500; + font-style: italic; +} +@font-face { + font-family: 'Kanit'; + src: url('/frontend/assets/fonts/kanit/kanit-semibold.ttf') format('truetype'); + font-weight: 600; + font-style: normal; +} +@font-face { + font-family: 'Kanit'; + src: url('/frontend/assets/fonts/kanit/kanit-semibold-italic.ttf') format('truetype'); + font-weight: 600; + font-style: italic; +} +@font-face { + font-family: 'Kanit'; + src: url('/frontend/assets/fonts/kanit/kanit-bold.ttf') format('truetype'); + font-weight: 700; + font-style: normal; +} +@font-face { + font-family: 'Kanit'; + src: url('/frontend/assets/fonts/kanit/kanit-bold-italic.ttf') format('truetype'); + font-weight: 700; + font-style: italic; +} +@font-face { + font-family: 'Kanit'; + src: url('/frontend/assets/fonts/kanit/kanit-extrabold.ttf') format('truetype'); + font-weight: 800; + font-style: normal; +} +@font-face { + font-family: 'Kanit'; + src: url('/frontend/assets/fonts/kanit/kanit-extrabold-italic.ttf') format('truetype'); + font-weight: 800; + font-style: italic; +} +@font-face { + font-family: 'Kanit'; + src: url('/frontend/assets/fonts/kanit/kanit-black.ttf') format('truetype'); + font-weight: 900; + font-style: normal; +} +@font-face { + font-family: 'Kanit'; + src: url('/frontend/assets/fonts/kanit/kanit-black-italic.ttf') format('truetype'); + font-weight: 900; + font-style: italic; +} + + +/* Montserrat */ +@font-face { + font-family: 'Montserrat'; + src: url('/frontend/assets/fonts/montserrat/montserrat-thin.ttf') format('truetype'); + font-weight: 100; + font-style: normal; +} +@font-face { + font-family: 'Montserrat'; + src: url('/frontend/assets/fonts/montserrat/montserrat-thin-italic.ttf') format('truetype'); + font-weight: 100; + font-style: italic; +} +@font-face { + font-family: 'Montserrat'; + src: url('/frontend/assets/fonts/montserrat/montserrat-extralight.ttf') format('truetype'); + font-weight: 200; + font-style: normal; +} +@font-face { + font-family: 'Montserrat'; + src: url('/frontend/assets/fonts/montserrat/montserrat-extralight-italic.ttf') format('truetype'); + font-weight: 200; + font-style: italic; +} +@font-face { + font-family: 'Montserrat'; + src: url('/frontend/assets/fonts/montserrat/montserrat-light.ttf') format('truetype'); + font-weight: 300; + font-style: normal; +} +@font-face { + font-family: 'Montserrat'; + src: url('/frontend/assets/fonts/montserrat/montserrat-light-italic.ttf') format('truetype'); + font-weight: 300; + font-style: italic; +} +@font-face { + font-family: 'Montserrat'; + src: url('/frontend/assets/fonts/montserrat/montserrat-regular.ttf') format('truetype'); + font-weight: 400; + font-style: normal; +} +@font-face { + font-family: 'Montserrat'; + src: url('/frontend/assets/fonts/montserrat/montserrat-regular-italic.ttf') format('truetype'); + font-weight: 400; + font-style: italic; +} +@font-face { + font-family: 'Montserrat'; + src: url('/frontend/assets/fonts/montserrat/montserrat-medium.ttf') format('truetype'); + font-weight: 500; + font-style: normal; +} +@font-face { + font-family: 'Montserrat'; + src: url('/frontend/assets/fonts/montserrat/montserrat-medium-italic.ttf') format('truetype'); + font-weight: 500; + font-style: italic; +} +@font-face { + font-family: 'Montserrat'; + src: url('/frontend/assets/fonts/montserrat/montserrat-semibold.ttf') format('truetype'); + font-weight: 600; + font-style: normal; +} +@font-face { + font-family: 'Montserrat'; + src: url('/frontend/assets/fonts/montserrat/montserrat-semibold-italic.ttf') format('truetype'); + font-weight: 600; + font-style: italic; +} +@font-face { + font-family: 'Montserrat'; + src: url('/frontend/assets/fonts/montserrat/montserrat-bold.ttf') format('truetype'); + font-weight: 700; + font-style: normal; +} +@font-face { + font-family: 'Montserrat'; + src: url('/frontend/assets/fonts/montserrat/montserrat-bold-italic.ttf') format('truetype'); + font-weight: 700; + font-style: italic; +} +@font-face { + font-family: 'Montserrat'; + src: url('/frontend/assets/fonts/montserrat/montserrat-extrabold.ttf') format('truetype'); + font-weight: 800; + font-style: normal; +} +@font-face { + font-family: 'Montserrat'; + src: url('/frontend/assets/fonts/montserrat/montserrat-extrabold-italic.ttf') format('truetype'); + font-weight: 800; + font-style: italic; +} +@font-face { + font-family: 'Montserrat'; + src: url('/frontend/assets/fonts/montserrat/montserrat-black.ttf') format('truetype'); + font-weight: 900; + font-style: normal; +} +@font-face { + font-family: 'Montserrat'; + src: url('/frontend/assets/fonts/montserrat/montserrat-black-italic.ttf') format('truetype'); + font-weight: 900; + font-style: italic; +} + + +/* SourceCodePro */ +@font-face { + font-family: 'SourceCodePro'; + src: url('/frontend/assets/fonts/sourcecodepro/sourcecodepro-extralight.ttf') format('truetype'); + font-weight: 200; + font-style: normal; +} +@font-face { + font-family: 'SourceCodePro'; + src: url('/frontend/assets/fonts/sourcecodepro/sourcecodepro-extralight-italic.ttf') format('truetype'); + font-weight: 200; + font-style: italic; +} +@font-face { + font-family: 'SourceCodePro'; + src: url('/frontend/assets/fonts/sourcecodepro/sourcecodepro-light.ttf') format('truetype'); + font-weight: 300; + font-style: normal; +} +@font-face { + font-family: 'SourceCodePro'; + src: url('/frontend/assets/fonts/sourcecodepro/sourcecodepro-light-italic.ttf') format('truetype'); + font-weight: 300; + font-style: italic; +} +@font-face { + font-family: 'SourceCodePro'; + src: url('/frontend/assets/fonts/sourcecodepro/sourcecodepro-regular.ttf') format('truetype'); + font-weight: 400; + font-style: normal; +} +@font-face { + font-family: 'SourceCodePro'; + src: url('/frontend/assets/fonts/sourcecodepro/sourcecodepro-regular-italic.ttf') format('truetype'); + font-weight: 400; + font-style: italic; +} +@font-face { + font-family: 'SourceCodePro'; + src: url('/frontend/assets/fonts/sourcecodepro/sourcecodepro-medium.ttf') format('truetype'); + font-weight: 500; + font-style: normal; +} +@font-face { + font-family: 'SourceCodePro'; + src: url('/frontend/assets/fonts/sourcecodepro/sourcecodepro-medium-italic.ttf') format('truetype'); + font-weight: 500; + font-style: italic; +} +@font-face { + font-family: 'SourceCodePro'; + src: url('/frontend/assets/fonts/sourcecodepro/sourcecodepro-semibold.ttf') format('truetype'); + font-weight: 600; + font-style: normal; +} +@font-face { + font-family: 'SourceCodePro'; + src: url('/frontend/assets/fonts/sourcecodepro/sourcecodepro-semibold-italic.ttf') format('truetype'); + font-weight: 600; + font-style: italic; +} +@font-face { + font-family: 'SourceCodePro'; + src: url('/frontend/assets/fonts/sourcecodepro/sourcecodepro-bold.ttf') format('truetype'); + font-weight: 700; + font-style: normal; +} +@font-face { + font-family: 'SourceCodePro'; + src: url('/frontend/assets/fonts/sourcecodepro/sourcecodepro-bold-italic.ttf') format('truetype'); + font-weight: 700; + font-style: italic; +} +@font-face { + font-family: 'SourceCodePro'; + src: url('/frontend/assets/fonts/sourcecodepro/sourcecodepro-extrabold.ttf') format('truetype'); + font-weight: 800; + font-style: normal; +} +@font-face { + font-family: 'SourceCodePro'; + src: url('/frontend/assets/fonts/sourcecodepro/sourcecodepro-extrabold-italic.ttf') format('truetype'); + font-weight: 800; + font-style: italic; +} +@font-face { + font-family: 'SourceCodePro'; + src: url('/frontend/assets/fonts/sourcecodepro/sourcecodepro-black.ttf') format('truetype'); + font-weight: 900; + font-style: normal; +} +@font-face { + font-family: 'SourceCodePro'; + src: url('/frontend/assets/fonts/sourcecodepro/sourcecodepro-black-italic.ttf') format('truetype'); + font-weight: 900; + font-style: italic; +} + + +/* Lora */ +@font-face { + font-family: 'Lora'; + src: url('/frontend/assets/fonts/lora/lora-regular.ttf') format('truetype'); + font-weight: 400; + font-style: normal; +} +@font-face { + font-family: 'Lora'; + src: url('/frontend/assets/fonts/lora/lora-regular-italic.ttf') format('truetype'); + font-weight: 400; + font-style: italic; +} +@font-face { + font-family: 'Lora'; + src: url('/frontend/assets/fonts/lora/lora-medium.ttf') format('truetype'); + font-weight: 500; + font-style: normal; +} +@font-face { + font-family: 'Lora'; + src: url('/frontend/assets/fonts/lora/lora-medium-italic.ttf') format('truetype'); + font-weight: 500; + font-style: italic; +} +@font-face { + font-family: 'Lora'; + src: url('/frontend/assets/fonts/lora/lora-semibold.ttf') format('truetype'); + font-weight: 600; + font-style: normal; +} +@font-face { + font-family: 'Lora'; + src: url('/frontend/assets/fonts/lora/lora-semibold-italic.ttf') format('truetype'); + font-weight: 600; + font-style: italic; +} +@font-face { + font-family: 'Lora'; + src: url('/frontend/assets/fonts/lora/lora-bold.ttf') format('truetype'); + font-weight: 700; + font-style: normal; +} +@font-face { + font-family: 'Lora'; + src: url('/frontend/assets/fonts/lora/lora-bold-italic.ttf') format('truetype'); + font-weight: 700; + font-style: italic; +} + + +/* NotoColorEmoji */ +@font-face { + font-family: 'NotoColorEmoji'; + src: url('/frontend/assets/fonts/notocoloremoji/notocoloremoji-regular.ttf') format('truetype'); + font-weight: 400; + font-style: normal; +} diff --git a/frontend/src/css/styles.css b/frontend/src/css/styles.css new file mode 100644 index 0000000..98ea78f --- /dev/null +++ b/frontend/src/css/styles.css @@ -0,0 +1,4 @@ +@import "./fonts.css"; +@import "tailwindcss/base"; +@import "tailwindcss/components"; +@import "tailwindcss/utilities"; diff --git a/frontend/src/html/index.html b/frontend/src/html/index.html new file mode 100644 index 0000000..fdb0e4a --- /dev/null +++ b/frontend/src/html/index.html @@ -0,0 +1,48 @@ + + + + + + + Example Site + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + diff --git a/frontend/src/js/App.vue b/frontend/src/js/App.vue new file mode 100644 index 0000000..a14d0c3 --- /dev/null +++ b/frontend/src/js/App.vue @@ -0,0 +1,5 @@ + diff --git a/frontend/src/js/components/ExampleComponent.vue b/frontend/src/js/components/ExampleComponent.vue new file mode 100644 index 0000000..6259fba --- /dev/null +++ b/frontend/src/js/components/ExampleComponent.vue @@ -0,0 +1,5 @@ + diff --git a/frontend/src/js/main.js b/frontend/src/js/main.js new file mode 100644 index 0000000..26af893 --- /dev/null +++ b/frontend/src/js/main.js @@ -0,0 +1,12 @@ +import { createApp } from 'vue'; +import App from './App.vue'; +import router from './router'; + +// Enable global Vue feature flags: +// https://stackoverflow.com/questions/70083869/parcel-2-vue-3-how-to-set-global-feature-flags-vue-devtools-disabled +globalThis.__VUE_OPTIONS_API__ = true; +globalThis.__VUE_PROD_DEVTOOLS__ = false; + +const app = createApp(App); +app.use(router); +app.mount("#app"); diff --git a/frontend/src/js/router/index.js b/frontend/src/js/router/index.js new file mode 100644 index 0000000..555bbdc --- /dev/null +++ b/frontend/src/js/router/index.js @@ -0,0 +1,22 @@ +import { createRouter, createWebHistory } from 'vue-router'; +import Home from '../views/Home.vue'; + +const routes = [ + { + path: '/', + name: 'Home', + component: Home, + }, + { + path: '/:pathMatch(.*)*', + name: 'NotFound', + component: () => import('../views/NotFound.vue'), + }, +]; + +const router = createRouter({ + history: createWebHistory(process.env.BASE_URL), + routes, +}); + +export default router; diff --git a/frontend/src/js/views/Home.vue b/frontend/src/js/views/Home.vue new file mode 100644 index 0000000..0c0970f --- /dev/null +++ b/frontend/src/js/views/Home.vue @@ -0,0 +1,17 @@ + + + diff --git a/frontend/src/js/views/NotFound.vue b/frontend/src/js/views/NotFound.vue new file mode 100644 index 0000000..9d2c444 --- /dev/null +++ b/frontend/src/js/views/NotFound.vue @@ -0,0 +1,14 @@ + + + diff --git a/package.json b/package.json new file mode 100644 index 0000000..a70064c --- /dev/null +++ b/package.json @@ -0,0 +1,23 @@ +{ + "name": "Vue/Tailwind/FastAPI Template", + "version": "0.0.1", + "description": "A template for a new web application.", + "scripts": {}, + "private": true, + "author": "John Doe", + "license": "UNLICENSED", + "devDependencies": { + "@parcel/transformer-vue": "^2.8.2", + "buffer": "^5.7.1", + "parcel": "^2.8.2", + "postcss": "^8.4.20", + "postcss-import": "^15.1.0", + "process": "^0.11.10", + "tailwindcss": "^3.2.4" + }, + "dependencies": { + "axios": "^1.2.2", + "vue": "^3.2.45", + "vue-router": "^4.1.6" + } +} diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000..8ff0fbf --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,8 @@ +module.exports = { + plugins: [ + require('postcss-import'), + require('tailwindcss/nesting'), + require('tailwindcss'), + require('autoprefixer'), + ] +}; diff --git a/public/static/images/common/og-image.webp b/public/static/images/common/og-image.webp new file mode 100644 index 0000000..55357f4 Binary files /dev/null and b/public/static/images/common/og-image.webp differ diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..5075bec --- /dev/null +++ b/requirements.txt @@ -0,0 +1,16 @@ +anyio==3.6.2 +click==8.1.3 +fastapi==0.88.0 +h11==0.14.0 +httptools==0.5.0 +idna==3.4 +pydantic==1.10.4 +python-dotenv==0.21.0 +PyYAML==6.0 +sniffio==1.3.0 +starlette==0.22.0 +typing_extensions==4.4.0 +uvicorn==0.20.0 +uvloop==0.17.0 +watchfiles==0.18.1 +websockets==10.4 diff --git a/tailwind.config.js b/tailwind.config.js new file mode 100644 index 0000000..e9f68b5 --- /dev/null +++ b/tailwind.config.js @@ -0,0 +1,28 @@ +module.exports = { + content: [ + "./frontend/src/**/*.html", + "./frontend/src/**/*.js", + "./frontend/src/**/*.vue", + ], + theme: { + extend: { + fontFamily: { + sans: ["Montserrat", "NotoColorEmoji"], + serif: ["Lora", "NotoColorEmoji"], + mono: ["SourceCodePro", "NotoColorEmoji"], + accent: ["Kanit", "NotoColorEmoji"], + emoji: ["NotoColorEmoji"], + }, + colors: { + transparent: 'transparent', + current: 'currentColor', + lightshade: '#eeebed', + lightaccent: '#8C919C', + main: '#1C4F97', + darkaccent: '#B3425C', + darkshade: '#221F2F', + }, + }, + }, + plugins: [], +};