2 Commits

Author SHA1 Message Date
a5bdf7b4f5 Update dependencies and enhance package-lock.json
This commit updates multiple dependencies within `package-lock.json`, including upgrades for Astro, @astrojs packages, and various Sharp components. Additionally, it introduces new optional dependencies and enforces compatibility with Node 18 and higher in certain components.
2025-11-08 15:59:10 +01:00
k
03671a4d3e Update styles and dependencies, improve Footer and Drinks components layout
- **HoverCard improvements**: Adjusted dimensions and removed unused title styles for cleaner design.
- **Footer layout**: Reorganized structure by repositioning the copyright section and updating its styles for better hierarchy.
- **Drinks component**: Expanded circle dimensions and refined font-family fallback to include `serif`.
- **Dependencies update**: Upgraded `astro` and related packages to their latest versions for security and performance enhancements.
2025-08-02 13:31:48 +02:00
63 changed files with 798 additions and 924 deletions

1
.gitignore vendored
View File

@ -16,6 +16,7 @@ pnpm-debug.log*
# environment variables
.env
.env.production
.env.local
# macOS-specific files
.DS_Store

View File

@ -1,16 +1,26 @@
steps:
deploy:
image: node:20
environment:
FLY_API_TOKEN:
from_secret: FLY_API_TOKEN
pipeline:
build:
image: node:20-alpine
commands:
- curl -L https://fly.io/install.sh | sh
- export PATH="$HOME/.fly/bin:$PATH"
- flyctl deploy --config fly.toml --app gallus-pub
- npm ci
- npm run build
when:
branch:
- main
event:
- push
branch: main
event: [push, pull_request]
deploy:
depends_on: [build]
image: flyio/flyctl:latest
secrets: [fly_api_token]
commands:
- flyctl deploy --remote-only
when:
branch: main
event: push
branches:
include: [main, dev]
cache:
mount:
- node_modules
- .npm

View File

@ -1,22 +1,29 @@
FROM node:20-alpine AS build
WORKDIR /app
COPY package*.json ./
RUN npm ci
RUN npm install
COPY . .
# Ensure CSS variables are present
RUN mkdir -p public/styles
RUN cp -r styles/* public/styles/ || true
RUN npm run build
FROM node:20-alpine AS production
ENV NODE_ENV=production
WORKDIR /app
RUN npm install -g serve
COPY --from=build /app/dist ./dist
# Copy built app and minimal runtime files
COPY --from=build /app/dist /app/dist
COPY --from=build /app/package*.json /app/
RUN npm pkg delete devDependencies || true
EXPOSE 3000
CMD ["serve", "-s", "dist", "-l", "3000"]
# Run Astro server entry (node adapter standalone)
CMD ["node", "dist/server/entry.mjs"]
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD wget -qO- http://localhost:3000/ || exit 1

View File

@ -1,47 +1,55 @@
# Astro Starter Kit: Minimal
# Gallus Pub Website
```sh
npm create astro@latest -- --template minimal
This is the Gallus Pub website built with Astro. It includes an admin area at `/admin` for editing content (events, gallery, texts). Changes are committed back to the Git repository via the Gitea API which triggers your Woodpecker + Fly.io deployment pipeline.
## Local development
To run the site locally with OAuth login (Gitea):
1. Copy the example env file and fill values:
```bash
cp .env.example .env.local
```
- Create a Gitea OAuth application with Redirect URI: `http://localhost:4321/api/auth/callback`.
- Set `OAUTH_CLIENT_ID` and `OAUTH_CLIENT_SECRET` from Gitea.
- Set `GITEA_OWNER`, `GITEA_REPO`, and a `GITEA_TOKEN` (PAT) with write access to the repo.
- Generate random secrets for sessions/CSRF (e.g. `openssl rand -hex 32`).
2. Install dependencies:
```bash
npm install
```
[![Open in StackBlitz](https://developer.stackblitz.com/img/open_in_stackblitz.svg)](https://stackblitz.com/github/withastro/astro/tree/latest/examples/minimal)
[![Open with CodeSandbox](https://assets.codesandbox.io/github/button-edit-lime.svg)](https://codesandbox.io/p/sandbox/github/withastro/astro/tree/latest/examples/minimal)
[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/withastro/astro?devcontainer_path=.devcontainer/minimal/devcontainer.json)
3. Start dev server using your local env file:
```bash
npm run dev:local
```
The site runs at http://localhost:4321. Visit http://localhost:4321/admin to log in via Gitea OAuth.
> 🧑‍🚀 **Seasoned astronaut?** Delete this file. Have fun!
Notes:
- If OAuth variables are missing or malformed, the auth endpoints return a clear 500 with guidance instead of crashing.
- Production secrets are configured on Fly.io; `.env.local` is ignored by Git.
## 🚀 Project Structure
## Project structure
Inside of your Astro project, you'll see the following folders and files:
```text
```
/
├── public/
├── public/ # static assets
├── src/
── pages/
│ └── index.astro
── content/ # editable JSON content (events, gallery)
│ ├── pages/ # Astro pages, includes /admin and API routes
│ ├── components/ # UI components
│ └── utils/ # session helpers
├── .env.example # template for local env
├── fly.toml # Fly.io config
├── Dockerfile
└── package.json
```
Astro looks for `.astro` or `.md` files in the `src/pages/` directory. Each page is exposed as a route based on its file name.
## Commands
There's nothing special about `src/components/`, but that's where we like to put any Astro/React/Vue/Svelte/Preact components.
Any static assets, like images, can be placed in the `public/` directory.
## 🧞 Commands
All commands are run from the root of the project, from a terminal:
| Command | Action |
| :------------------------ | :----------------------------------------------- |
| `npm install` | Installs dependencies |
| `npm run dev` | Starts local dev server at `localhost:4321` |
| `npm run build` | Build your production site to `./dist/` |
| `npm run preview` | Preview your build locally, before deploying |
| `npm run astro ...` | Run CLI commands like `astro add`, `astro check` |
| `npm run astro -- --help` | Get help using the Astro CLI |
## 👀 Want to learn more?
Feel free to check [our documentation](https://docs.astro.build) or jump into our [Discord server](https://astro.build/chat).
- `npm install` install deps
- `npm run dev` dev server without loading .env.local (expects env to be present in the shell)
- `npm run dev:local` dev server loading `.env.local` via dotenv-cli
- `npm run build` production build (SSR via @astrojs/node)
- `npm run preview` preview the production build

View File

@ -1,5 +1,9 @@
// @ts-check
import { defineConfig } from 'astro/config';
import node from '@astrojs/node';
// https://astro.build/config
export default defineConfig({});
export default defineConfig({
output: 'server',
adapter: node({ mode: 'standalone' })
});

View File

@ -1,5 +1,5 @@
app = "gallus-pub"
primary_region = "fra"
primary_region = "fra" # Frankfurt region, change if needed
kill_signal = "SIGINT"
kill_timeout = 5
@ -26,7 +26,7 @@ kill_timeout = 5
[[http_service.checks]]
interval = "30s"
timeout = "5s"
grace_period = "30s"
grace_period = "10s"
method = "GET"
path = "/"
protocol = "http"

907
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,14 +1,19 @@
{
"name": "",
"name": "gallus-pub",
"type": "module",
"version": "0.0.1",
"scripts": {
"dev": "astro dev",
"dev:local": "dotenv -e .env.local -- astro dev",
"build": "astro build",
"preview": "astro preview",
"astro": "astro"
},
"dependencies": {
"astro": "^5.12.0"
"astro": "^5.12.8",
"@astrojs/node": "^9.0.0"
},
"devDependencies": {
"dotenv-cli": "^7.4.1"
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 706 KiB

After

Width:  |  Height:  |  Size: 506 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 160 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 800 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 747 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 398 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 604 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 580 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 117 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 128 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 567 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 122 KiB

After

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 250 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 184 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 179 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 196 KiB

View File

Before

Width:  |  Height:  |  Size: 124 KiB

After

Width:  |  Height:  |  Size: 124 KiB

View File

Before

Width:  |  Height:  |  Size: 384 KiB

After

Width:  |  Height:  |  Size: 384 KiB

Binary file not shown.

BIN
public/pdf/Menu.pdf Normal file

Binary file not shown.

View File

@ -1,6 +1,6 @@
---
import Layout from "../components/Layout.astro";
import "../styles/components/ContactForm.css";
import "../../styles/components/ContactForm.css";
---
<Layout>

View File

@ -1,44 +1,35 @@
---
import "../styles/components/Drinks.css"
import "../../styles/components/Drinks.css"
const { id } = Astro.props;
---
<section id={id} class="Drinks">
<h2 class="title">Drinks</h2>
<p class="note">
Ob ein frisch gezapftes Pint, ein edler Tropfen Whiskey oder ein gemütliches Glas Wein hier kannst du in entspannter
Atmosphäre das Leben genießen. Natürlich dürfen auch Cocktails nicht fehlen. Vieles kreieren wir auch selber - Sláinte!
</p>
<a href="/pdf/Getraenke_Gallus_2025.pdf" class="card-link" target="_blank" rel="noopener noreferrer">Getränkekarte</a>
<a href="/pdf/Menu.pdf" class="card-link" target="_blank" rel="noopener noreferrer">Getränkekarte</a>
<h3 class="monats-hit">Monats Hit</h3>
<div class="mate-vodka">
<div class="circle" title="Mate Vodka">
<img src="/images/MonthlyHit.png" alt="Monats Hit" class="circle-image" />
<span class="circle-label"></span>
<span class="circle-label">Mate Vodka</span>
</div>
<div>Mate Vodka</div>
</div>
<p class="note">
Für Whisky-Liebhaber haben wir erlesene Sorten aus Schottland und Irland im Angebot.
</p>
<div class="circle-row">
<div class="circle whiskey-circle" title="Whiskey 1">
<img src="/images/Whiskey1.png" alt="Whiskey 1" class="circle-image" />
<span class="circle-label"></span>
<div class="circle" title="Bier">
<span class="circle-label">Bier</span>
</div>
<div class="circle whiskey-circle" title="Whiskey 2">
<img src="/images/Whiskey2.png" alt="Whiskey 2" class="circle-image" />
<span class="circle-label"></span>
<div class="circle" title="Wein">
<span class="circle-label">Wein</span>
</div>
<div class="circle whiskey-circle" title="Whiskey 3">
<img src="/images/Whiskey3.png" alt="Whiskey 3" class="circle-image" />
<span class="circle-label"></span>
<div class="circle" title="Cocktails">
<span class="circle-label">Cocktails</span>
</div>
</div>
<p class="note">
Wir bieten eine Auswahl an erlesenen Getränken für jeden Geschmack. Besuche uns und entdecke unsere saisonalen Spezialitäten und Klassiker.
</p>
</section>

View File

@ -13,7 +13,7 @@ const { events = [], id }: { events?: Event[]; id?: string } = Astro.props as {
events?: Event[];
id?: string;
};
import "../styles/components/EventsGrid.css";
import "../../styles/components/EventsGrid.css";
---
<h2 class="section-title">Events</h2>

View File

@ -1,13 +1,11 @@
---
// src/components/Footer.astro
import "../styles/components/Footer.css"
import "/styles/components/Footer.css"
const currentYear = new Date().getFullYear();
---
<footer class="footer" id="footer">
<footer class="footer">
<div class="footer-content">
<div class="footer-sections">
<div class="footer-section">
<h3>Öffnungszeiten</h3>
@ -22,7 +20,7 @@ const currentYear = new Date().getFullYear();
<p>Gallus Pub</p>
<p>Metzgergasse 13</p>
<p>9000 St. Gallen</p>
<p><a href="tel:0772322770">077 232 27 70</a></p>
<p>Email:</p>
<p><a href="mailto:info@gallus-pub.ch">info@gallus-pub.ch</a></p>
</div>
@ -30,9 +28,11 @@ const currentYear = new Date().getFullYear();
<h3>Raumreservationen</h3>
<p>Du planst einen Event?</p>
<p>Der "St.Gallerruum" im 2.OG</p>
<p>kann gemietet werden.</p>
<p>Kann gemietet werden.</p>
<p>Reservierungen via Whatsapp</p>
<p><a href="tel:0772322770">077 232 27 70</a></p>
</div>
</div>
<div class="copyright">
&copy; {currentYear} Gallus Pub. Alle Rechte vorbehalten.

View File

@ -1,81 +1,28 @@
---
// src/components/Header.astro
const { url } = Astro;
import "../styles/components/Header.css";
import "../../styles/components/Header.css";
---
<header class="header">
<!-- Desktop Layout -->
<div class="desktop-layout">
<div class="logo-container">
<a href="/">
<img src="/images/Logo.png" alt="Logo" class="logo" />
</a>
</div>
<!-- Hauptnavigation: immer Home, About, Contact -->
<nav class="nav-main">
<div class="desktop-menu">
<div>
<a href="/#hero">Home</a>
<a href="/#events">Events</a>
<a href="/#gallery">Galerie</a>
<a href="/#drinks">Drinks</a>
<a href="/#footer">Contact</a>
<a href="/#openings">Openings</a>
<!--<a href="/#about">About</a>
<a href="/#contact">Contact</a>-->
</div>
</nav>
</div>
<!-- Mobile Layout -->
<div class="mobile-layout">
<!-- Centered Logo -->
<div class="mobile-logo-container">
<a href="/">
<img src="/images/Logo.png" alt="Logo" class="logo" />
</a>
</div>
<!-- Burger Menu Below Logo -->
<div class="burger-menu">
<div class="burger-icon">
<span></span>
<span></span>
<span></span>
</div>
</div>
<!-- Mobile Navigation Menu (Dropdown) -->
<div class="mobile-menu">
<a href="/#hero">Home</a>
<a href="/#events">Events</a>
<a href="/#gallery">Galerie</a>
<a href="/#drinks">Drinks</a>
<a href="/#footer">Contact</a>
</div>
</div>
</header>
<div class="header-spacer"></div>
<script>
// Toggle mobile menu when burger icon is clicked
document.addEventListener('DOMContentLoaded', () => {
const burgerIcon = document.querySelector('.burger-icon');
const mobileMenu = document.querySelector('.mobile-menu');
const mobileMenuLinks = document.querySelectorAll('.mobile-menu a');
// Toggle menu when burger icon is clicked
burgerIcon.addEventListener('click', () => {
burgerIcon.classList.toggle('active');
mobileMenu.classList.toggle('active');
});
// Close menu when a navigation link is clicked
mobileMenuLinks.forEach(link => {
link.addEventListener('click', () => {
burgerIcon.classList.remove('active');
mobileMenu.classList.remove('active');
});
});
});
</script>

View File

@ -1,6 +1,6 @@
---
// src/components/Hero.astro
import "../styles/components/Hero.css"
import "../../styles/components/Hero.css"
const { id } = Astro.props;
---

View File

@ -1,5 +1,6 @@
---
import "../styles/components/HoverCard.css";
// src/components/HoverCard.astro
import "../../styles/components/HoverCard.css";
const { title, description, image = "", date } = Astro.props;
---
@ -9,40 +10,6 @@ const {title, description, image = "", date} = Astro.props;
</div>
<div class="hover-text">
<div>
<p set:html={description} />
</div>
</div>
</article>
<script>
document.addEventListener('DOMContentLoaded', () => {
const hoverCards = document.querySelectorAll('.hover-card');
hoverCards.forEach(card => {
card.addEventListener('click', (e) => {
// Only toggle on mobile devices
if (window.innerWidth <= 768) {
e.preventDefault();
// Close all other active cards first
hoverCards.forEach(otherCard => {
if (otherCard !== card) {
otherCard.classList.remove('active');
}
});
// Toggle current card
card.classList.toggle('active');
}
});
// Close card when clicking outside (mobile only)
document.addEventListener('click', (e) => {
if (window.innerWidth <= 768 && !card.contains(e.target)) {
card.classList.remove('active');
}
});
});
});
</script>

View File

@ -1,6 +1,6 @@
---
// src/components/ImageCarousel.astro
import "../styles/components/ImageCarousel.css";
import "../../styles/components/ImageCarousel.css";
interface Image {
src: string;

View File

@ -2,9 +2,7 @@
// src/components/Layout.astro
import Header from "./Header.astro";
import Footer from "./Footer.astro";
import "../styles/components/Layout.css"
import "../styles/variables.css"
import "../styles/index.css"
import "../../styles/components/Layout.css"
---
<!doctype html>
@ -16,6 +14,8 @@ import "../styles/index.css"
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Gallus Pub</title>
<link rel="stylesheet" href="/styles/variables.css" />
<link rel="stylesheet" href="/styles/index.css" />
</head>
<body>

View File

@ -1,6 +1,6 @@
---
// src/components/Welcome.astro
import "../styles/components/Welcome.css"
import "../../styles/components/Welcome.css"
const { id } = Astro.props;
---
@ -9,8 +9,7 @@ const { id } = Astro.props;
<div class="welcome-text">
<h2>Herzlich willkommen im</h2>
<h2>Gallus Pub!</h2>
<h2>Herzlich willkommen im Gallus Pub!</h2>
<p>
Wie die meisten bereits wissen, ist hier jeder willkommen - ob jung
@ -52,7 +51,7 @@ const { id } = Astro.props;
<div class="welcome-image">
<img src="/images/Welcome.png" alt="Welcome background image" />
<img src="/images/Welcome.png" alt="Welcome backgrount image" />
</div>
</section>

View File

@ -1,4 +1,5 @@
---
// src/pages/index.astro
import Layout from "../components/Layout.astro";
import Hero from "../components/Hero.astro";
import Welcome from "../components/Welcome.astro";
@ -8,75 +9,9 @@ import ImageCarousel from "../components/ImageCarousel.astro";
import Contact from "../components/Contact.astro";
import About from "../components/About.astro";
const events = [
{
image: "/images/karaoke.jpg",
title: "Karaoke",
date: "Mittwoch - Samstag",
description: `
Bei uns gibt es Karaoke Mi-Sa!! <br>
Seid ihr eine Gruppe und lieber unter euch? ..unseren 2.Stock kannst du auch mieten ;) <br>
Reserviere am besten gleich per Whatsapp <a href="tel:+41772322770">077 232 27 70</a>
`,
},
{
image: "/images/pub_quiz.jpg",
title: "Pub Quiz",
date: "Jeden Freitag",
description: `
Jeden Freitag findet unser <b>Pub Quiz</b> statt. Gespielt wird tischweise in 3-4 Runden. <br>
Jede Woche gibt es ein anderes Thema. Es geht um Ruhm und Ehre und zusätzlich werden die Sieger der Herzen durch das Publikum gekürt! <3 <br>
Auch Einzelpersonen sind herzlich willkommen! <br>
*zum mitmachen minimum 1 Getränk konsumieren oder 5CHF
`,
},
{
image: "/images/Event3.png",
title: "Karaoke tes",
date: "Mittwoch - Samstag",
description: `
`,
},
{
image: "/images/Event2.png",
title: "Karaoke test",
date: "Mittwoch - Samstag",
description: `
`,
},
{
image: "/images/Event1.png",
title: "Crepes Sucette <br /> Live Music im Gallus Pub!",
date: "Do, 04. September 2025",
description: `
<b>ab 19 Uhr gehts los, bis max. 21.30 Uhr</b> <br>
Kosten? CHF 10 pro Spielgast
Reservieren unter <a href="tel:+41772322770">077 232 27 70</a>
`,
},
{
image: "/images/Event4.png",
title: "Kevin McFlannigan <br> Live Music im Gallus Pub!",
date: "Sa, 27. September 2025",
description: `
<b>ab 20:00 Uhr</b> <br>
Eintritt ist Frei / Hutkollekte <br>
Reservieren unter <a href="tel:+41772322770">077 232 27 70</a>
`,
},
];
const images = [
{ src: "/images/Gallery7.png", alt: "Siebtes Bild" },
{ src: "/images/Gallery8.png", alt: "Achtes Bild" },
{ src: "/images/Gallery9.png", alt: "Neuntes Bild" },
{ src: "/images/Gallery6.png", alt: "Sechstes Bild" },
{ src: "/images/Gallery1.png", alt: "Erstes Bild" },
{ src: "/images/Gallery2.png", alt: "Zweites Bild" },
{ src: "/images/Gallery3.png", alt: "Drittes Bild" },
{ src: "/images/Gallery4.png", alt: "Viertes Bild" },
{ src: "/images/Gallery5.png", alt: "Fünftes Bild" },
];
// Inhalte aus Dateien laden (editierbar über Admin)
import events from "../content/events.json";
import images from "../content/gallery.json";
---
<Layout>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 110 KiB

View File

@ -1,9 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 128 128">
<path d="M50.4 78.5a75.1 75.1 0 0 0-28.5 6.9l24.2-65.7c.7-2 1.9-3.2 3.4-3.2h29c1.5 0 2.7 1.2 3.4 3.2l24.2 65.7s-11.6-7-28.5-7L67 45.5c-.4-1.7-1.6-2.8-2.9-2.8-1.3 0-2.5 1.1-2.9 2.7L50.4 78.5Zm-1.1 28.2Zm-4.2-20.2c-2 6.6-.6 15.8 4.2 20.2a17.5 17.5 0 0 1 .2-.7 5.5 5.5 0 0 1 5.7-4.5c2.8.1 4.3 1.5 4.7 4.7.2 1.1.2 2.3.2 3.5v.4c0 2.7.7 5.2 2.2 7.4a13 13 0 0 0 5.7 4.9v-.3l-.2-.3c-1.8-5.6-.5-9.5 4.4-12.8l1.5-1a73 73 0 0 0 3.2-2.2 16 16 0 0 0 6.8-11.4c.3-2 .1-4-.6-6l-.8.6-1.6 1a37 37 0 0 1-22.4 2.7c-5-.7-9.7-2-13.2-6.2Z" />
<style>
path { fill: #000; }
@media (prefers-color-scheme: dark) {
path { fill: #FFF; }
}
</style>
</svg>

Before

Width:  |  Height:  |  Size: 749 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 506 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

View File

@ -1,190 +0,0 @@
.header {
position: fixed;
top: 0;
left: 0;
right: 0;
background-color: #0e0c0c;
z-index: 1000;
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
backdrop-filter: blur(5px);
width: 100%;
border-bottom: 1px solid #444;
}
.header-spacer {
height: 70px;
/* Should match the header height */
}
/* Desktop Layout */
.desktop-layout {
display: flex;
justify-content: space-between;
align-items: center;
padding: 1rem 2rem;
height: 70px;
}
.logo-container {
display: flex;
align-items: center;
}
.logo {
margin-left: 2em;
height: 4em;
width: auto;
transition: transform 0.3s ease;
}
.logo:hover {
transform: scale(1.05);
}
.nav-main {
display: flex;
align-items: center;
}
.nav-main a {
margin: 0 1rem;
color: white;
text-decoration: none;
font-size: 1rem;
cursor: pointer;
}
.nav-main a:hover {
color: #ffa500;
}
/* Mobile Layout */
.mobile-layout {
display: none;
flex-direction: column;
align-items: center;
padding: 1rem;
}
.mobile-logo-container {
display: flex;
justify-content: center;
margin-bottom: 0.5rem;
}
.mobile-logo-container .logo {
margin: 0;
height: 3.5em;
}
/* Burger Menu Styles */
.burger-menu {
display: flex;
justify-content: center;
cursor: pointer;
margin: 0.5rem 0;
}
.burger-icon {
width: 30px;
height: 24px;
position: relative;
display: flex;
flex-direction: column;
justify-content: space-between;
}
.burger-icon span {
display: block;
height: 3px;
width: 100%;
background-color: white;
border-radius: 3px;
transition: all 0.3s ease;
}
.burger-icon.active span:nth-child(1) {
transform: translateY(10.5px) rotate(45deg);
}
.burger-icon.active span:nth-child(2) {
opacity: 0;
}
.burger-icon.active span:nth-child(3) {
transform: translateY(-10.5px) rotate(-45deg);
}
/* Mobile Menu Styles */
.mobile-menu {
display: none;
width: 100%;
background-color: #0e0c0c;
flex-direction: column;
align-items: center;
padding: 0;
box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
max-height: 0;
overflow: hidden;
transition: max-height 0.3s ease;
z-index: 999;
}
.mobile-menu.active {
max-height: 300px; /* Adjust based on content */
padding: 0.5rem 0;
}
.mobile-menu a {
margin: 0.5rem 0;
color: white;
text-decoration: none;
font-size: 1.2rem;
text-align: center;
width: 100%;
padding: 0.5rem 0;
border-bottom: 1px solid #333;
}
.mobile-menu a:last-child {
border-bottom: none;
}
.mobile-menu a:hover {
color: #ffa500;
}
@media (max-width: 768px) {
.header-spacer {
height: 120px; /* Adjusted for the taller mobile header */
}
/* Hide desktop layout, show mobile layout */
.desktop-layout {
display: none;
}
.mobile-layout {
display: flex;
}
/* Show mobile menu when active */
.mobile-menu.active {
display: flex;
}
}
@media (max-width: 480px) {
.header-spacer {
height: 110px; /* Slightly smaller for very small screens */
}
.mobile-logo-container .logo {
height: 3em;
}
.burger-icon {
width: 25px;
height: 20px;
}
}

View File

@ -1,3 +1,5 @@
/* styles/components/ContactForm.css */
.contact-container {
max-width: 800px;
margin: 2rem auto;

View File

@ -1,5 +1,5 @@
.Drinks {
font-family: var(--font-family-primary);
font-family: var(--font-family-primary), serif;
display: flex;
flex-direction: column;
align-items: center;
@ -15,7 +15,7 @@
.title {
font-size: var(--font-size-large);
margin-bottom: 0.5rem;
margin-bottom: 1.5rem;
font-weight: bold;
color: var(--color-text);
text-transform: uppercase;
@ -25,7 +25,6 @@
.card-link {
border: 2px solid var(--color-accent-beige);
padding: 0.75rem 1.5rem;
margin-top: 2.5rem;
margin-bottom: 2.5rem;
color: var(--color-text);
background-color: var(--color-background);
@ -69,6 +68,7 @@
align-items: center;
margin-bottom: 1.5rem;
padding: 1rem;
background-color: rgba(0, 0, 0, 0.2);
border-radius: var(--border-radius);
width: 80%;
max-width: 300px;
@ -81,8 +81,8 @@
}
.circle {
height: 35vh;
width: 35vh;
height: 9em;
width: 9em;
border: 2px solid var(--color-accent-beige);
border-radius: 50%;
margin: 0.5rem;
@ -94,7 +94,6 @@
justify-content: center;
align-items: center;
cursor: pointer;
overflow: hidden;
}
.circle:hover {
@ -110,25 +109,12 @@
text-align: center;
transition: opacity var(--transition-standard);
position: absolute;
z-index: 2;
}
.circle:hover .circle-label {
opacity: 1;
}
.circle-image {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
object-fit: cover;
object-position: center;
border-radius: 50%;
z-index: 1;
}
.circle-row {
display: flex;
justify-content: center;
@ -163,6 +149,10 @@
width: 90%;
}
.circle {
height: 5em;
width: 5em;
}
.circle-label {
font-size: 0.7rem;

View File

@ -0,0 +1,92 @@
.header {
position: fixed;
top: 0;
left: 0;
right: 0;
background-color: #0e0c0c;
z-index: 1000;
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
backdrop-filter: blur(5px);
display: flex;
justify-content: space-between;
align-items: center;
padding: 1rem 2rem;
height: 70px;
width: 100%;
border-bottom: 1px solid #444;
}
.header-spacer {
height: 70px;
/* Should match the header height */
}
.logo-container {
display: flex;
align-items: center;
}
.logo {
margin-left: 2em;
height: 4em;
width: auto;
transition: transform 0.3s ease;
}
.logo:hover {
transform: scale(1.05);
}
.nav-main {
display: flex;
align-items: center;
}
.nav-main a {
margin: 0 1rem;
color: white;
text-decoration: none;
font-size: 1rem;
cursor: pointer;
}
.nav-main a:hover {
color: #ffa500;
}
@media (max-width: 768px) {
.header {
height: 65px;
}
.logo {
margin-left: 1em;
height: 3em;
}
.header-spacer {
height: 65px;
}
}
@media (max-width: 480px) {
.header {
padding: 0.5rem;
height: 60px;
}
.logo {
margin-left: 0.5em;
height: 2.5em;
}
.nav-main a {
margin: 0 0.5rem;
font-size: 0.9rem;
}
.header-spacer {
height: 60px;
}
}

View File

@ -1,3 +1,4 @@
/* === Hero === */
.hero-overlay {
background-image: linear-gradient(to bottom, rgba(0, 0, 0, 0.3), rgba(0, 0, 0, 1)), url('/images/Background.png');
background-size: cover;

View File

@ -1,7 +1,7 @@
.hover-card {
position: relative;
width: 25rem;
height: 25rem;
width: 400px;
height: 400px;
border-radius: var(--border-radius);
background-color: var(--color-accent-green);
box-shadow: var(--box-shadow);
@ -12,30 +12,10 @@
flex-direction: column;
}
/* Hover effects only for devices that support hover */
@media (hover: hover) and (pointer: fine) {
.hover-card:hover {
transform: translateY(-5px);
}
.hover-card:hover .hover-text {
opacity: 1;
}
.hover-card:hover .card-image {
opacity: 0.1;
}
}
.card-title {
padding: 15px 15px 5px 15px;
margin: 0;
color: var(--color-accent-beige);
font-size: var(--font-size-medium);
text-align: center;
order: -2;
}
.card_date {
padding: 0 15px 15px 15px;
margin: 0;
@ -104,12 +84,11 @@
scrollbar-color: var(--color-accent-beige) rgba(0, 0, 0, 0.1);
}
/* Active state for mobile tap functionality */
.hover-card.active .hover-text {
.hover-card:hover .hover-text {
opacity: 1;
}
.hover-card.active .card-image {
.hover-card:hover .card-image {
opacity: 0.1;
}
@ -122,34 +101,5 @@
.hover-card {
width: 100%;
max-width: 350px;
/* Maintain square aspect ratio */
aspect-ratio: 1 / 1;
height: auto;
/* Add cursor pointer to indicate it's clickable */
cursor: pointer;
}
/* Add visual feedback for tap */
.hover-card:active {
transform: scale(0.98);
}
.hover-card::after {
position: absolute;
bottom: 10px;
right: 10px;
background-color: rgba(0, 0, 0, 0.7);
color: var(--color-accent-beige);
font-size: 0.7rem;
padding: 4px 8px;
border-radius: 12px;
opacity: 0.8;
pointer-events: none;
z-index: 10;
}
/* Hide the hint when card is active */
.hover-card.active::after {
display: none;
}
}

View File

@ -12,8 +12,7 @@ html {
body {
font-family: var(--font-family-primary), serif;
background-color: var(--color-background, #000000);
background: #000000;
background-color: var(--color-background);
color: var(--color-text);
line-height: var(--line-height);
}

View File

@ -1,6 +1,6 @@
:root {
/* Colors */
--color-background: #000000 !important;
--color-background: #000;
--color-text: #f5f5f5;
--color-accent-green: #213b28;
--color-accent-beige: #ceb39b;