9 Commits

Author SHA1 Message Date
Dome 8114d7870e Update login.scss 2026-05-10 18:41:12 +02:00
Dome 9b0350adb0 Update login.scss 2026-05-10 18:16:10 +02:00
Dome 7bb1f0dcbc Update login.scss 2026-05-10 18:13:33 +02:00
Dome 402f53056c initial css and config changes for login page 2026-05-10 16:55:59 +02:00
Dome 3ad97b8b5e Update Dockerfile 2026-05-10 15:05:00 +02:00
Dome 872d05154c Update Dockerfile 2026-05-10 15:04:35 +02:00
Dome 457231a14d Update Dockerfile 2026-05-10 14:51:57 +02:00
Dome 2ad0fc902b fix workflow 2026-05-10 14:46:17 +02:00
Dome 8464a206dc Create build-image-yml 2026-05-10 14:41:38 +02:00
5 changed files with 123 additions and 62 deletions
+34
View File
@@ -0,0 +1,34 @@
name: Build and Push Masto Image
on:
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Generate timestamp
id: vars
run: echo "TAG=$(date +%Y%m%d-%H%M)" >> $GITHUB_ENV
- name: Login to Docker Hub
run: |
echo "${{ secrets.DOCKER_PASSWORD }}" | docker login \
-u "${{ secrets.DOCKER_USERNAME }}" \
--password-stdin
- name: Build image
run: |
docker build \
-t domoel/masto:latest \
-t domoel/masto:${TAG} \
.
- name: Push image
run: |
docker push domoel/masto:latest
docker push domoel/masto:${TAG}
+12 -8
View File
@@ -1,12 +1,16 @@
### BUILDER IMAGE ### ### BUILDER IMAGE ###
FROM docker.io/superseriousbusiness/masto-fe-standalone-woodpecker-build:0.1.0 AS builder FROM docker.io/superseriousbusiness/masto-fe-standalone-woodpecker-build:0.1.0 AS builder
# Prepare the build directory, copy
# relevant source + config files over.
WORKDIR /build WORKDIR /build
USER root
RUN mkdir -p /build/.yarn && chown -R node:node /build
USER node
COPY --chown=node:node app /build/app COPY --chown=node:node app /build/app
COPY --chown=node:node config /build/config COPY --chown=node:node config /build/config
COPY --chown=node:node public /build/public COPY --chown=node:node public /build/public
COPY --chown=node:node \ COPY --chown=node:node \
.browserslistrc \ .browserslistrc \
babel.config.js \ babel.config.js \
@@ -16,19 +20,19 @@ COPY --chown=node:node \
yarn.lock \ yarn.lock \
/build/ /build/
# Create a production build of the frontend.
RUN yarn && yarn build:production RUN yarn && yarn build:production
### RUNTIME IMAGE ###
FROM nginx:alpine AS runtime
# Copy bigger nested stuff. ### RUNTIME IMAGE ###
FROM docker.io/nginx:alpine AS runtime
COPY --from=builder /build/public/packs/js/flavours/glitch /usr/share/nginx/html/packs/js/flavours/glitch COPY --from=builder /build/public/packs/js/flavours/glitch /usr/share/nginx/html/packs/js/flavours/glitch
COPY --from=builder /build/public/packs/js/flavours/vanilla /usr/share/nginx/html/packs/js/flavours/vanilla COPY --from=builder /build/public/packs/js/flavours/vanilla /usr/share/nginx/html/packs/js/flavours/vanilla
# Copy remaining files.
COPY --from=builder /build/public /usr/share/nginx/html/ COPY --from=builder /build/public /usr/share/nginx/html/
# Set up nginx.
COPY nginx.conf /etc/nginx/nginx.conf COPY nginx.conf /etc/nginx/nginx.conf
EXPOSE 80 EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
@@ -2,16 +2,18 @@
@import 'reset'; @import 'reset';
:root { :root {
--color-bg: #191b22; --light-color: #f7f7fa;
--color-fg: #fff; --dark-color: #1e1f29;
--footer-color: #2f313d;
--hover-color: #bd93f9;
} }
body { body {
color: var(--color-fg); color: var(--light-color);
font-family: ui-rounded, mastodon-font-sans-serif, sans-serif; font-family: ui-rounded, mastodon-font-sans-serif, sans-serif;
font-size: 1rem; font-size: 1rem;
line-height: 1.5; line-height: 1.5;
background: var(--color-bg); background-color: var(--dark-color);
} }
.login-container { .login-container {
@@ -19,7 +21,7 @@ body {
display: grid; display: grid;
row-gap: var(--login-row-gap); row-gap: var(--login-row-gap);
margin: 50px auto; margin: 34px auto;
padding: 1rem; padding: 1rem;
max-width: 30rem; max-width: 30rem;
box-sizing: border-box; box-sizing: border-box;
@@ -27,10 +29,15 @@ body {
header { header {
display: flex; display: flex;
justify-content: center; justify-content: flex-start;
img { img {
height: 150px; display: block;
width: auto;
height: auto;
max-width: 90px;
max-height: 90px;
object-fit: contain;
} }
} }
@@ -41,19 +48,18 @@ main {
} }
h1 { h1 {
margin-bottom: 15px;
font-size: 28px; font-size: 28px;
line-height: 33px; line-height: 33px;
font-weight: 700; font-weight: 700;
margin-bottom: 15px;
} }
label { label {
font-family: inherit;
color: var(--color-fg);
display: block; display: block;
word-wrap: break-word;
font-weight: 500;
grid-column: 1 / -1; grid-column: 1 / -1;
color: var(--light-color);
font-family: inherit;
font-weight: 500;
} }
form { form {
@@ -62,64 +68,82 @@ form {
grid-template-columns: 1fr min-content; grid-template-columns: 1fr min-content;
} }
:focus-visible, input[type='text'] {
button:focus-visible { display: block;
outline: 2px solid #66befe; margin: 0;
outline-offset: 3px; padding: 0.75rem 1rem;
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 0;
box-sizing: border-box;
color: var(--light-color);
font-family: inherit;
font-size: inherit;
line-height: 1.5;
background-color: rgba(255, 255, 255, 0.04);
box-shadow: none;
transition: color 0.2s ease, background-size 0.2s ease, border-color 0.2s ease;
&:focus {
outline: none;
border-color: var(--hover-color);
}
} }
button { button {
padding: 7px 10px; padding: 0.75rem 1.5rem;
border: 1px solid lighten(#66befe, 7%); border: 1px solid rgba(255, 255, 255, 0.15);
border-radius: 4px; border-radius: 0;
box-sizing: border-box; box-sizing: border-box;
color: #2a2b2f; color: var(--dark-color);
font-family: inherit; font-family: inherit;
font-size: inherit; font-size: inherit;
font-weight: 500; font-weight: bold;
text-align: center;
white-space: nowrap; white-space: nowrap;
background-color: #66befe; background-color: var(--light-color);
cursor: pointer;
&:hover { &:hover {
background-color: #89caff; color: var(--dark-color);
background-color: var(--hover-color);
} }
&:disabled { &:disabled {
background-color: #9baec8; color: var(--dark-color);
background-color: rgba(255, 255, 255, 0.35);
cursor: default; cursor: default;
} }
} }
input[type='text'] {
display: block;
margin: 0;
padding: 15px;
border: 1px solid lighten(#282c37, 7%);
border-radius: 4px;
box-sizing: border-box;
box-shadow: none;
color: #9baec8;
font-family: inherit;
font-size: inherit;
line-height: 18px;
background: #282c37;
}
.content { .content {
padding: 15px; padding: 15px;
border-radius: 4px; border-radius: 0;
border: 1px solid lighten(#39404f, 7%); border: 1px solid rgba(248, 248, 242, 0.08);
color: #fff; border-left: 4px solid var(--hover-color);
background-color: #39404f; color: var(--light-color);
background-color: var(--footer-color);
} }
.link-footer { .link-footer {
padding-inline: 10px; padding-inline: 10px;
color: #97a8b4; color: rgba(247, 247, 250, 0.75);
font-size: 0.875rem; font-size: 0.875rem;
a { a {
color: inherit; color: var(--hover-color);
text-decoration: none;
&:hover {
text-decoration: underline;
}
}
}
@media (max-width: 500px) {
form {
grid-template-columns: 1fr;
}
button {
width: 100%;
} }
} }
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

+6 -7
View File
@@ -3,7 +3,7 @@
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<title>Login | Masto-FE (🦥 flavour)</title> <title>Zeitfresser Mastodon Frontend</title>
<meta content="width=device-width, initial-scale=1" name="viewport"> <meta content="width=device-width, initial-scale=1" name="viewport">
<link rel="stylesheet" media="all" href="/packs/css/flavours/glitch/login.css" /> <link rel="stylesheet" media="all" href="/packs/css/flavours/glitch/login.css" />
<script src="/auth.js"></script> <script src="/auth.js"></script>
@@ -12,10 +12,10 @@
<body class="app-body"> <body class="app-body">
<div class="login-container"> <div class="login-container">
<header> <header>
<img alt="a friendly smiling sloth" src="images/mascot.svg" /> <img alt="a friendly smiling sloth" src="images/logo.avif" />
</header> </header>
<main> <main>
<h1>Log into your instance</h1> <h1>Zeitfresser Mastodon Frontend</h1>
<form method="post" id="login"> <form method="post" id="login">
<label for="instance">Instance URL</label> <label for="instance">Instance URL</label>
<input type="text" id="instance" value="" class="input instance"> <input type="text" id="instance" value="" class="input instance">
@@ -25,17 +25,16 @@
</form> </form>
<aside class="content"> <aside class="content">
<p> <p>
<strong>Note:</strong> Zeitfresser Mastodon is a client-sided web frontend to run Mastodon or GoToSocial server backends on your machine
this application is completely client-side, meaning everything happens in the browser on your machine.
It does not store information anywhere else than your browser's local storage. It does not store information anywhere else than your browser's local storage.
</p> </p>
</aside> </aside>
</main> </main>
<footer class="link-footer"> <footer class="link-footer">
<p> <p>
<strong>Masto-FE (🦥 flavour)</strong> <strong>Zeitfresser Mastodon Frontend</strong>
<span aria-hidden="true"> · </span> <span aria-hidden="true"> · </span>
<a href="https://codeberg.org/superseriousbusiness/masto-fe-standalone" rel="noopener noreferrer" target="_blank"> <a href="https://git.ztfr.eu/Dome/Masto" rel="noopener noreferrer" target="_blank">
Source code Source code
</a> </a>
</p> </p>