Add Forgejo deploy workflow with selective sync
All checks were successful
Deploy / Deploy to pre-production (push) Successful in 7s

Configure automated deployment via FTP that mirrors all files except hidden ones, with special handling for assets/css to sync only compiled CSS files (style.css and style.css.map).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
isUnknown 2025-12-18 17:55:51 +01:00
parent 162cee6dc9
commit 44257321ca
4 changed files with 656 additions and 3 deletions

View file

@ -0,0 +1,36 @@
name: Deploy
on:
push:
branches:
- main
jobs:
deploy:
name: Deploy to pre-production
runs-on: docker
steps:
- name: Checkout code
run: |
git clone --depth 1 --branch main https://forge.studio-variable.com/${{ github.repository }}.git .
ls -la
- name: Deploy via FTP
env:
USERNAME: ${{ secrets.USERNAME }}
PASSWORD: ${{ secrets.PASSWORD }}
PRODUCTION_HOST: ${{ secrets.PRODUCTION_HOST }}
run: |
apt-get update -qq && apt-get install -y -qq lftp
cat > /tmp/lftp-script.txt <<SCRIPT
set ftp:ssl-allow no
open -u $USERNAME,$PASSWORD $PRODUCTION_HOST
# Mirror everything except hidden files/folders and assets/css content
mirror --reverse --verbose --ignore-time --parallel=10 -x '.*' -x '*/.*' -x 'assets/css/*' . .
# Sync only style.css and style.css.map from assets/css
cd assets/css
lcd assets/css
mput style.css style.css.map
quit
SCRIPT
lftp -f /tmp/lftp-script.txt

2
.gitignore vendored
View file

@ -1,4 +1,2 @@
.DS_Store .DS_Store
assets/fonts/* assets/fonts/*
assets/css/style.css
assets/css/style.css.map

618
assets/css/style.css Normal file
View file

@ -0,0 +1,618 @@
@charset "UTF-8";
:root {
--font: "Executive", Arial, sans-serif;
--title: "System", Arial, sans-serif;
--fs-x-small: 10px;
--fs-small: 12px;
--fs-normal: 16px;
--fs-medium: 20px;
--fs-big: 30px;
--fs-x-big: 38px;
--fs-button-bold: 22px;
--leading-tight: 1;
--leading-normal: 1.2;
--fw-normal: 400;
--fw-medium: 500;
--fw-bold: 600;
--grey-100: #d8d8d8;
--grey-200: #c8c8c8;
--grey-300: #b9b9b9;
--grey-400: #969696;
--grey-600: #6d6d6d;
--grey-800: #383838;
--color-bg: #161616;
--color-txt: #ffffff;
--color-txt-light: var(--grey-600);
--color-accent: #00ff00;
--color-accent-50: #e9ffe9;
--color-accent-100: #d8fdd8;
--border: 1px solid var(--color-txt);
--border-light: 1px solid var(--grey-800);
--header-h: 80px;
--header-h-shrinked: 50px;
--padding-body: 26px;
--radius-small: 4px;
--spacing: 30px;
--h-block: 30px;
--curve: cubic-bezier(0.175, 0.885, 0.32, 1.275);
}
@media screen and (max-width: 720px) {
:root {
--fs-medium: 20px;
--fs-big: 26px;
}
}
@media screen and (max-width: 720px) {
:root {
--fs-x-small: 10px;
--fs-small: 11px;
--fs-normal: 14px;
--fs-medium: 20px;
--fs-big: 30px;
--fs-x-big: 38px;
}
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
-webkit-font-smoothing: antialiased;
-moz-font-smoothing: antialiased;
-o-font-smoothing: antialiased;
scroll-behavior: smooth;
}
a {
color: currentColor;
}
button {
background: none;
outline: none;
border: none;
color: var(--color-txt);
}
iframe {
border: none;
}
body {
font-family: var(--font);
line-height: var(--leading-normal);
font-size: var(--fs-normal);
color: var(--color-txt);
background-color: var(--color-bg);
width: 100vw;
overflow-x: hidden;
}
@keyframes add-border {
from {
border-bottom-color: transparent;
}
to {
border-bottom: var(--grey-800);
}
}
#site-header {
position: fixed;
left: var(--padding-body);
top: 0px;
z-index: 900;
--gap: 3ch;
width: calc(100vw - var(--padding-body) * 2);
height: var(--header-h);
background-color: var(--color-bg);
border-bottom: var(--border-light);
display: flex;
align-items: center;
justify-content: space-between;
gap: var(--gap);
}
#site-header a {
text-decoration: none;
}
#site-header a:hover {
color: var(--grey-200);
}
#site-header #site-title {
flex-grow: 2;
}
#site-header #site-title svg {
width: 100px;
}
#site-header ul {
list-style-type: none;
display: flex;
align-items: center;
gap: var(--gap);
}
#site-header #btn--soutenir {
color: var(--color-accent);
}
#site-header #btn--soutenir a:hover {
color: var(--color-accent);
text-decoration: underline;
}
#site-header ul, #site-header #btn--soutenir {
text-transform: uppercase;
}
#site-header #lang-toggle {
display: flex;
gap: 1ch;
}
#site-header #lang-toggle button:disabled {
color: var(--color-txt-light);
}
#site-header #menu-toggle {
cursor: pointer;
}
#site-header #menu-toggle svg {
width: 30px;
}
#site-header #menu-toggle .close {
display: none;
}
#site-header button:hover svg {
fill: var(--grey-200) !important;
}
button {
cursor: pointer;
font-family: var(--font);
font-size: var(--fons-normal);
color: var(--color-txt);
}
button:hover {
color: var(--grey-100);
}
button a {
text-decoration: none;
width: 100%;
height: 100%;
}
button:disabled {
cursor: auto;
}
.btn__default {
--size: calc(var(--h-block) - 8px);
font-size: var(--fs-normal);
font-weight: var(--fw-normal);
height: var(--size);
padding-right: 1.5ch;
position: relative;
display: flex;
align-items: center;
gap: 0ch;
color: var(--color-accent);
font-weight: var(--fw-medium);
text-decoration: none;
cursor: pointer;
}
.btn__default .icon, .btn__default .txt {
z-index: 10;
}
.btn__default .icon {
width: var(--size);
height: var(--size);
display: flex;
align-items: center;
justify-content: center;
color: var(--color-bg);
text-align: center;
}
.btn__default .icon svg {
fill: var(--color-bg);
width: 80%;
}
.btn__default .txt {
font-family: var(--font-title);
color: var(--color-accent);
font-size: var(--fs-normal);
font-weight: var(--fw-bold);
padding-left: 1ch;
}
.btn__default::after {
content: "";
display: block;
background-color: var(--color-accent);
border-radius: calc(var(--size) / 2);
width: var(--size);
height: var(--size);
position: absolute;
left: 0;
z-index: 0;
transition: width 0.2s;
}
.btn__default:hover .txt {
color: var(--color-bg);
display: block;
}
.btn__default:hover::after {
width: 100%;
}
.form__newsletter {
--size: 24px;
position: relative;
display: flex;
align-items: center;
position: relative;
}
.form__newsletter input[type=email] {
height: calc(var(--h-block) * 1.25);
width: 100%;
border-radius: calc(var(--h-block) * 0.625);
outline: none;
border: none;
padding: 0 2ch;
font-family: var(--font);
font-size: var(--fs-normal);
z-index: 40;
padding-top: 4px;
}
.form__newsletter input[type=email]::-moz-placeholder {
font-family: var(--font);
font-size: var(--fs-normal);
}
.form__newsletter input[type=email]::placeholder {
font-family: var(--font);
font-size: var(--fs-normal);
}
.form__newsletter input[type=email]:focus {
outline: 3px solid var(--grey-400);
}
.form__newsletter button[type=submit].btn--bold {
position: absolute;
right: 2px;
z-index: 100;
}
.form__newsletter button[type=submit].btn--bold {
--size: calc(var(--h-block)*1.25 - 4px);
font-family: var(--font);
font-size: var(--fs-button-bold);
height: var(--size);
display: flex;
align-items: center;
gap: 0.75ch;
color: var(--color-accent);
font-weight: var(--fw-medium);
text-decoration: none;
cursor: pointer;
}
.form__newsletter button[type=submit].btn--bold .icon, .form__newsletter button[type=submit].btn--bold .txt {
z-index: 10;
}
.form__newsletter button[type=submit].btn--bold .icon {
width: var(--size);
height: var(--size);
display: flex;
align-items: center;
justify-content: center;
color: var(--color-bg);
text-align: center;
}
.form__newsletter button[type=submit].btn--bold .icon svg {
fill: var(--color-bg);
width: 80%;
}
.form__newsletter button[type=submit].btn--bold .txt {
position: relative;
top: 2px;
font-size: var(--fs-normal);
display: none;
padding-left: 1ch;
}
.form__newsletter button[type=submit].btn--bold::after {
content: "";
display: block;
background-color: var(--color-accent);
border-radius: calc(var(--size) / 2);
width: var(--size);
height: var(--size);
position: absolute;
right: 0;
z-index: 0;
transition: width 0.2s;
}
.form__newsletter button[type=submit].btn--bold:hover .txt {
color: var(--color-bg);
display: block;
}
.form__newsletter button[type=submit].btn--bold:hover::after {
width: 100%;
}
.list-socials {
list-style: none;
display: flex;
justify-content: space-between;
align-items: center;
max-width: 400px;
}
.list-socials a {
display: flex;
align-items: center;
text-decoration: none;
}
.list-socials .icon {
width: 24px;
height: 24px;
position: relative;
top: -2px;
}
.list-socials svg {
display: flex;
align-items: center;
width: 24px;
height: 24px;
}
.list-socials .text {
display: none;
}
@media screen and (min-width: 720px) {
.footer__socials .list-socials {
display: block;
}
.footer__socials .list-socials li {
margin-bottom: calc(var(--spacing) * 0.5);
-moz-column-break-inside: avoid;
break-inside: avoid;
}
.footer__socials .list-socials a {
gap: 1ch;
height: calc(var(--spacing) * 1);
}
.footer__socials .list-socials a::after {
content: "↗";
color: var(--grey-300);
}
.footer__socials .list-socials .text {
display: block;
line-height: 1;
}
}
[data-template=subscription-newsletter] .p__baseline-big,
[data-template=thanks] .p__baseline-big,
[data-template=support] .p__baseline-big,
[data-template=store] .p__baseline-big {
font-family: var(--title);
font-size: var(--fs-big);
font-weight: var(--fw-bold);
line-height: 1.1;
text-align: center;
margin: calc(var(--spacing) * 1) 0;
}
[data-template=subscription-newsletter] .p__baseline-big strong,
[data-template=thanks] .p__baseline-big strong,
[data-template=support] .p__baseline-big strong,
[data-template=store] .p__baseline-big strong {
font-weight: var(--fw-bolf);
color: var(--color-accent);
}
[data-template=subscription-newsletter] .p__baseline-big .link-don,
[data-template=thanks] .p__baseline-big .link-don,
[data-template=support] .p__baseline-big .link-don,
[data-template=store] .p__baseline-big .link-don {
display: block;
color: var(--color-accent);
text-decoration: none;
}
[data-template=subscription-newsletter] .p__baseline-big .link-don:hover,
[data-template=thanks] .p__baseline-big .link-don:hover,
[data-template=support] .p__baseline-big .link-don:hover,
[data-template=store] .p__baseline-big .link-don:hover {
-webkit-text-decoration: underline 2px;
text-decoration: underline 2px;
text-underline-offset: 4px;
}
[data-template=subscription-newsletter] .p__baseline,
[data-template=thanks] .p__baseline,
[data-template=support] .p__baseline,
[data-template=store] .p__baseline {
font-size: var(--fs-medium);
font-weight: var(--fw-medium);
line-height: 1.1;
text-align: center;
margin: calc(var(--spacing) * 1) 0;
}
@media screen and (max-width: 720px) {
[data-template=subscription-newsletter] .p__baseline,
[data-template=thanks] .p__baseline,
[data-template=support] .p__baseline,
[data-template=store] .p__baseline {
text-align: center;
margin: var(--spacing) 0;
}
}
[data-template=subscription-newsletter] .p__details,
[data-template=thanks] .p__details,
[data-template=support] .p__details,
[data-template=store] .p__details {
font-size: var(--fs-small);
margin-bottom: 0.5em;
color: var(--grey-400);
}
[data-template=subscription-newsletter] .section__heading,
[data-template=thanks] .section__heading,
[data-template=support] .section__heading,
[data-template=store] .section__heading {
font-size: var(--fs-normal);
font-weight: var(--fw-medium);
line-height: 1;
text-align: center;
margin-top: calc(var(--spacing) * 0.5);
margin-bottom: calc(var(--spacing) * 1);
}
[data-template=subscription-newsletter] ul, [data-template=subscription-newsletter] ol,
[data-template=thanks] ul,
[data-template=thanks] ol,
[data-template=support] ul,
[data-template=support] ol,
[data-template=store] ul,
[data-template=store] ol {
margin-left: 3ch;
margin-bottom: 0.5em;
}
@keyframes add-border {
from {
border-bottom-color: transparent;
}
to {
border-bottom: var(--grey-800);
}
}
#site-header {
position: fixed;
left: var(--padding-body);
top: 0px;
z-index: 900;
--gap: 3ch;
width: calc(100vw - var(--padding-body) * 2);
height: var(--header-h);
background-color: var(--color-bg);
border-bottom: var(--border-light);
display: flex;
align-items: center;
justify-content: space-between;
gap: var(--gap);
}
#site-header a {
text-decoration: none;
}
#site-header a:hover {
color: var(--grey-200);
}
#site-header #site-title {
flex-grow: 2;
}
#site-header #site-title svg {
width: 100px;
}
#site-header ul {
list-style-type: none;
display: flex;
align-items: center;
gap: var(--gap);
}
#site-header #btn--soutenir {
color: var(--color-accent);
}
#site-header #btn--soutenir a:hover {
color: var(--color-accent);
text-decoration: underline;
}
#site-header ul, #site-header #btn--soutenir {
text-transform: uppercase;
}
#site-header #lang-toggle {
display: flex;
gap: 1ch;
}
#site-header #lang-toggle button:disabled {
color: var(--color-txt-light);
}
#site-header #menu-toggle {
cursor: pointer;
}
#site-header #menu-toggle svg {
width: 30px;
}
#site-header #menu-toggle .close {
display: none;
}
#site-header button:hover svg {
fill: var(--grey-200) !important;
}
#site-footer {
background-color: black;
padding: calc(var(--padding-body) * 2) var(--padding-body);
}
#site-footer .logo {
margin-top: calc(var(--spacing) * 0.25);
margin-bottom: calc(var(--spacing) * 1);
}
#site-footer .logo svg {
width: 100px;
}
#site-footer p {
margin: calc(var(--spacing) * 0.5) 0;
}
#site-footer p a {
text-decoration: none;
}
#site-footer p a:hover {
text-decoration: underline;
color: currentColor;
}
#site-footer .p__small {
font-size: var(--fs-x-small);
color: var(--grey-600);
}
#site-footer .footer__mentions p {
font-size: var(--fs-small);
color: var(--color-txt);
}
@media screen and (max-width: 720px) {
#site-footer {
margin-top: calc(var(--spacing) * 2);
}
#site-footer .footer__socials {
margin-top: calc(var(--spacing) * 0.75);
padding-top: calc(var(--spacing) * 0.25);
border-top: var(--border-light);
}
#site-footer .footer__socials .list-socials {
margin-top: calc(var(--spacing) * 0.5);
margin-bottom: calc(var(--spacing) * 0.75);
}
#site-footer .footer__mentions {
border-top: var(--border-light);
padding-top: calc(var(--spacing) * 0.25);
}
#site-footer .footer__mentions p {
font-size: var(--fs-small);
text-align: center;
}
}
@media screen and (min-width: 720px) {
#site-footer .site-footer__container {
display: grid;
grid-template-columns: 1fr 1fr;
-moz-column-gap: calc(var(--spacing) * 2);
column-gap: calc(var(--spacing) * 2);
max-width: 1200px;
margin: 0 auto;
}
#site-footer .footer__socials .container {
max-width: 400px;
-moz-columns: 2;
columns: 2;
margin-top: calc(var(--spacing) * 1);
}
#site-footer .footer__mentions {
grid-column: span 2;
}
#site-footer .footer__mentions p {
margin-top: calc(var(--spacing) * 1);
}
}
body {
min-height: 100dvh;
min-height: 100vh;
display: flex;
flex-direction: column;
}
body main {
flex-grow: 1;
margin-top: var(--header-h);
padding: 0 var(--padding-body);
}/*# sourceMappingURL=style.css.map */

1
assets/css/style.css.map Normal file

File diff suppressed because one or more lines are too long