save
@@ -0,0 +1,48 @@
|
|||||||
|
name: Deploy Static Site
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
deploy:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Setup Node.js
|
||||||
|
uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: 20
|
||||||
|
cache: npm
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
run: npm ci
|
||||||
|
|
||||||
|
- name: Build static site
|
||||||
|
run: npm run build
|
||||||
|
|
||||||
|
- name: Setup SSH key
|
||||||
|
run: |
|
||||||
|
mkdir -p ~/.ssh
|
||||||
|
echo "${{ secrets.DEPLOY_SSH_KEY }}" > ~/.ssh/id_ed25519
|
||||||
|
chmod 600 ~/.ssh/id_ed25519
|
||||||
|
|
||||||
|
- name: Deploy static files to server
|
||||||
|
env:
|
||||||
|
DEPLOY_HOST: ${{ secrets.DEPLOY_HOST }}
|
||||||
|
REMOTE_DIR: /home/deploy/projects/ge-bos/static
|
||||||
|
run: |
|
||||||
|
SSH="ssh -i ~/.ssh/id_ed25519 -o StrictHostKeyChecking=accept-new"
|
||||||
|
# Recreate the target dir so removed files don't linger (rsync --delete equivalent)
|
||||||
|
$SSH deploy@"$DEPLOY_HOST" "rm -rf '$REMOTE_DIR' && mkdir -p '$REMOTE_DIR'"
|
||||||
|
# Stream the build output over ssh and extract it on the server
|
||||||
|
tar -czf - -C out . | $SSH deploy@"$DEPLOY_HOST" "tar -xzf - -C '$REMOTE_DIR'"
|
||||||
|
|
||||||
|
- name: Run deployment script
|
||||||
|
run: |
|
||||||
|
ssh -i ~/.ssh/id_ed25519 -o StrictHostKeyChecking=accept-new \
|
||||||
|
deploy@${{ secrets.DEPLOY_HOST }} \
|
||||||
|
"cd /home/deploy/projects/ge-bos && ./deploy.sh"
|
||||||
|
After Width: | Height: | Size: 119 KiB |
|
After Width: | Height: | Size: 194 KiB |
|
After Width: | Height: | Size: 111 KiB |
|
After Width: | Height: | Size: 146 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 32 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 32 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 35 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 35 KiB |
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 38 KiB |
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 36 KiB |
@@ -1,5 +1,9 @@
|
|||||||
import { cn } from "@/lib/utils"
|
import { cn } from "@/lib/utils"
|
||||||
|
|
||||||
|
import barChartManyFewAvif from "@/assets/gebos/bar-chart-many-few.avif"
|
||||||
|
import barChartManyFewWebp from "@/assets/gebos/bar-chart-many-few.webp"
|
||||||
|
import barChartManyFullAvif from "@/assets/gebos/bar-chart-many-full.avif"
|
||||||
|
import barChartManyFullWebp from "@/assets/gebos/bar-chart-many-full.webp"
|
||||||
import barChartAvif from "@/assets/gebos/bar-chart.avif"
|
import barChartAvif from "@/assets/gebos/bar-chart.avif"
|
||||||
import barChartWebp from "@/assets/gebos/bar-chart.webp"
|
import barChartWebp from "@/assets/gebos/bar-chart.webp"
|
||||||
import brandCubeAvif from "@/assets/gebos/brand-cube-render.avif"
|
import brandCubeAvif from "@/assets/gebos/brand-cube-render.avif"
|
||||||
@@ -307,6 +311,18 @@ const renders = {
|
|||||||
alt: "",
|
alt: "",
|
||||||
matte: "alpha",
|
matte: "alpha",
|
||||||
},
|
},
|
||||||
|
barChartManyFew: {
|
||||||
|
avif: barChartManyFewAvif,
|
||||||
|
webp: barChartManyFewWebp,
|
||||||
|
alt: "",
|
||||||
|
matte: "alpha",
|
||||||
|
},
|
||||||
|
barChartManyFull: {
|
||||||
|
avif: barChartManyFullAvif,
|
||||||
|
webp: barChartManyFullWebp,
|
||||||
|
alt: "",
|
||||||
|
matte: "alpha",
|
||||||
|
},
|
||||||
drillTool: {
|
drillTool: {
|
||||||
avif: drillToolAvif,
|
avif: drillToolAvif,
|
||||||
webp: drillToolWebp,
|
webp: drillToolWebp,
|
||||||
|
|||||||
@@ -271,7 +271,7 @@ const audiences = [
|
|||||||
|
|
||||||
const scaleFlows = [
|
const scaleFlows = [
|
||||||
{
|
{
|
||||||
vector: vectors.tealBars,
|
render: renders.barChartManyFew,
|
||||||
label: "1 Gebäude",
|
label: "1 Gebäude",
|
||||||
sub: "Ein Eigentümer kann ein Mehrfamilienhaus konfigurieren.",
|
sub: "Ein Eigentümer kann ein Mehrfamilienhaus konfigurieren.",
|
||||||
steps: [
|
steps: [
|
||||||
@@ -281,7 +281,7 @@ const scaleFlows = [
|
|||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
vector: vectors.consumptionRing,
|
render: renders.barChartManyFull,
|
||||||
label: "50 Gebäude",
|
label: "50 Gebäude",
|
||||||
sub: "Eine Hausverwaltung kann denselben Prozess auf viele Gebäude übertragen.",
|
sub: "Eine Hausverwaltung kann denselben Prozess auf viele Gebäude übertragen.",
|
||||||
steps: [
|
steps: [
|
||||||
@@ -440,11 +440,11 @@ export default function HomePage() {
|
|||||||
{scaleFlows.map((flow) => (
|
{scaleFlows.map((flow) => (
|
||||||
<div key={flow.label} className="flex flex-col gap-5 p-6 sm:p-8">
|
<div key={flow.label} className="flex flex-col gap-5 p-6 sm:p-8">
|
||||||
<div className="flex items-center gap-4">
|
<div className="flex items-center gap-4">
|
||||||
<img
|
<AssetRender
|
||||||
src={flow.vector}
|
render={flow.render}
|
||||||
alt=""
|
alt=""
|
||||||
className="size-14"
|
className="flex size-14 shrink-0 items-center justify-center"
|
||||||
loading="lazy"
|
imgClassName="w-14"
|
||||||
/>
|
/>
|
||||||
<div>
|
<div>
|
||||||
<h3 className="text-xl font-extrabold tracking-tight text-navy">
|
<h3 className="text-xl font-extrabold tracking-tight text-navy">
|
||||||
|
|||||||