72 Commits

Author SHA1 Message Date
1f94bbca15 Remove redundant event timing and reservation details from index.astro
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2025-10-25 16:58:43 +02:00
5ef15f0b5c Update event time and pricing details in index.astro
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2025-10-25 16:57:29 +02:00
020bfca731 Remove commented file reference from index.astro
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2025-10-25 16:47:59 +02:00
ac864ba054 Update event details and assets in index.astro and public/images
- Swapped event titles, dates, and images for better accuracy.
- Replaced `kevin_mcflannigan.png` with `Event4.png`.
- Updated `Menu.pdf`.
2025-10-25 16:29:39 +02:00
e93ba5d29b Remove outdated event details from index.astro
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2025-09-23 11:06:37 +02:00
k
feb137471d Update event details and images for improved content clarity and presentation.
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2025-09-21 15:31:37 +02:00
k
0622d190d1 Remove comment.
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2025-09-17 12:14:05 +02:00
k
2867678223 Remove tappable hint text from HoverCard styles. 2025-09-17 12:06:25 +02:00
k
096ac9f789 Update Getränkekarte PDF link to point to Getraenke_Gallus_2025.pdf.
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2025-08-06 14:29:18 +02:00
k
3006ccd5a0 Merge remote-tracking branch 'origin/main'
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2025-08-05 15:12:38 +02:00
k
8a8bcc304a Enhance HoverCard behavior and styles for better mobile interactivity and accessibility:
- **Hover support refinement**: Limited hover effects to devices with pointer precision and hover capability.
- **Active state improvements**: Added visual feedback for tap and ensured consistent card toggling on mobile, including outside-click handling.
- **Styling additions**: Introduced a tappable hint for better user guidance and refined cursor styles.
- **Script update**: Prevented multiple active cards and ensured seamless closing on external clicks.
2025-08-05 15:12:26 +02:00
k
54c6f205e0 Rename Menu.pdf to Getraenke_Gallus_2025.pdf in the public/pdf directory.
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2025-08-05 14:18:10 +02:00
k
48fddf7b15 Rename Menu.pdf to Getraenke_Gallus_2025.pdf in the public/pdf directory.
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2025-08-05 14:04:09 +02:00
k
2733c2e7f4 Remove redundant whiskey circle styles and update menu PDF.
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2025-08-05 14:01:31 +02:00
k
9502123b89 Remove Kevin McFlannigan details from events and update circle dimensions to use vh for better responsiveness.
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2025-08-05 13:47:09 +02:00
ca2d724bd8 Update Drinks.css and index.astro for style adjustments and event details update
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
- Replaced `em` with `rem` in `.circle` dimensions for consistent scaling.
- Revised event descriptions and titles in `index.astro` for clarity.
- Updated `Menu.pdf` file.
2025-08-04 14:17:28 +02:00
k
38229ac5e9 Refine Drinks section text and styling:
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
- **Content updates**: Adjusted description text for a more engaging and detailed presentation.
- **Styling changes**: Reduced title margin, enlarged circle dimensions for better visual balance, and added spacing to card links.
- **Layout improvements**: Removed redundant whiskey circle styles for cleaner CSS.
2025-08-02 15:54:09 +02:00
k
a11c838d2a Update gallery images and refine Drinks section:
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
- **Gallery updates**: Added `Gallery9.png` and reordered images for better organization.
- **Drinks section tweak**: Removed redundant label text in "Mate Vodka" circle.
2025-08-02 15:43:46 +02:00
k
f9fe914c32 Update images, enhance Drinks section, and adjust styles:
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
- **Image updates**: Replaced placeholder images with new gallery images (`Gallery1.png` to `Gallery8.png`) and added whiskey images (`Whiskey1.png` to `Whiskey3.png`).
- **Drinks section**: Added description, updated drink types, and included new images for Whiskey options and Monthly Special.
- **Circular design refinements**: Enlarged circle dimensions, ensured image fit with `object-fit: cover`, and added responsive adjustments.
- **Style improvements**: Introduced overflow handling, z-index management, and tailored sizes for Whiskey circles.
2025-08-02 15:36:14 +02:00
k
21e09f7155 Update images, enhance Drinks section, and adjust styles:
- **Image updates**: Replaced placeholder images with new gallery images (`Gallery1.png` to `Gallery8.png`) and added whiskey images (`Whiskey1.png` to `Whiskey3.png`).
- **Drinks section**: Added description, updated drink types, and included new images for Whiskey options and Monthly Special.
- **Circular design refinements**: Enlarged circle dimensions, ensured image fit with `object-fit: cover`, and added responsive adjustments.
- **Style improvements**: Introduced overflow handling, z-index management, and tailored sizes for Whiskey circles.
2025-08-02 15:32:51 +02:00
k
0b37f73634 Enhance Header interactivity and clean up HoverCard structure:
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
- **Mobile menu improvements**: Added functionality to close the menu when navigation links are clicked.
- **HoverCard cleanup**: Removed unused title and date markup for a leaner structure.
2025-08-02 14:49:04 +02:00
k
c764f892a1 Add active state for mobile HoverCard
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
- **New functionality**: Introduced an active state for `HoverCard` on mobile devices, triggered via click.
- **Style updates**: Added styles to handle `active` class for text and image opacity.
- **Responsive aspect ratio**: Ensured square aspect ratio with the addition of `aspect-ratio: 1 / 1` in CSS.
- **Script enhancement**: Implemented JavaScript for toggling the active state on mobile.
2025-08-02 14:41:16 +02:00
k
78f367530a Refactor Header and HoverCard styles for consistency and responsiveness:
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
- **Standardized dimensions**: Converted `px` values to `rem` in `HoverCard.css`.
- **Improved header layout**: Enhanced mobile-first responsiveness with distinct layouts for desktop and mobile.
- **New navigation styles**: Adjusted alignment, spacing, and transitions for the burger menu and mobile dropdown.
- **Optimized media queries**: Simplified and organized breakpoints for better maintainability.
2025-08-02 14:35:34 +02:00
k
b539329420 Add responsive mobile menu with burger icon and animations:
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
- **Mobile menu implementation**: Introduced a burger menu for smaller screens, enabling navigation toggle.
- **Responsive styles**: Added CSS adjustments for headers and navigation under `768px` and `480px` breakpoints.
- **Interactive behavior**: Implemented toggle functionality using JavaScript for mobile menu activation.
- **Styling updates**: Enhanced mobile and desktop navigation distinction with scoped CSS changes.
2025-08-02 14:30:49 +02:00
k
3e93e8ce3b Update events, images, and improve layout:
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
- **Events update**: Replaced existing events with new details and images.
- **Image updates**: Replaced outdated images with optimized ones (e.g., `Event1.png`, `Event2.png`, `Event3.png`).
- **Footer improvements**: Added `id` to enable smooth scrolling for "Contact".
- **Welcome section**: Adjusted heading structure for better readability.
- **Navigation fix**: Replaced "Openings" link with "Contact".
- **CSS cleanup**: Removed redundant comment in `Hero.css` and fixed typos in alt text.
2025-08-02 14:27:11 +02:00
k
2fab4bf70b Refactor styles and imports for consistency and maintainability:
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
- **CSS restructuring**: Moved `styles` folder into `src` for better organization.
- **Updated imports**: Adjusted component CSS imports to reflect new paths.
- **Component tweaks**:
  - Increased HoverCard width from `350px` to `400px` for better visual balance.
  - Adjusted Footer layout: reorganized copyright and added email link.
  - Modified Drinks circle dimensions (from `6em` to `9em`) for improved design.
- **Footer styles**: Changed copyright section's layout with top spacing and border adjustments.
2025-08-02 13:50:56 +02:00
k
1a6be67af1 Merge remote-tracking branch 'origin/main'
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
# Conflicts:
#	styles/components/ContactForm.css
2025-08-02 13:35:59 +02:00
k
fea45fc4f8 rm command 2025-08-02 13:35:38 +02:00
761bd6be80 Update CSS imports and Dockerfile for consistent styles handling
- Enforced `!important` for `--color-background` in `variables.css`.
- Centralized CSS imports in `Layout.astro` for cleaner markup.
- Adjusted Dockerfile to ensure CSS variables are copied to `public/styles`.
- Refined fallback handling in `index.css` for `background-color`.
2025-08-02 12:57:17 +02:00
8e6bd12da5 Remove unused cache and name fields from .woodpecker.yml for cleaner pipeline configuration 2025-08-02 12:57:16 +02:00
548a2d6f53 Refactor .woodpecker.yml for streamlined deployment and simplify Dockerfile health check 2025-08-02 12:57:16 +02:00
01edb8d575 Update deployment configuration files for optimized CI/CD pipeline
- Simplified `fly.toml` by removing inline comments.
- Refactored `.woodpecker.yml` pipeline syntax for better clarity and flexibility.
- Adjusted `Dockerfile` to fix `dist` directory path and streamline `CMD` execution.
2025-08-02 12:57:16 +02:00
c498b19afb Update fly.toml, .woodpecker.yml, and Dockerfile for deployment improvements
- Increased health check grace period in `fly.toml` to 30s.
- Added `dist` directory to cache mounts in `.woodpecker.yml`.
- Fixed file copy path in `Dockerfile` for accurate builds.
2025-08-02 12:57:16 +02:00
74a8e7b393 make main a version off dev 2025-08-02 12:57:16 +02:00
9c4b6ec425 Text rearangment 2025-08-02 12:57:14 +02:00
dc3f0b53d7 Improve logo responsiveness and container padding in styles.css
- Updated `.logo-container` for full-width responsiveness.
- Adjusted `.logo-container img` to maintain aspect ratio and center align.
- Added padding to `.container` for better layout spacing.
2025-08-02 12:57:14 +02:00
b215592292 Update footer styles for improved readability
- Changed `background-color` to a darker shade for better contrast.
- Added white text color for enhanced visibility.
2025-08-02 12:57:14 +02:00
9c7ecc97df Fix typo in "Coming Soon" text in index.html 2025-08-02 12:57:14 +02:00
0fd4fbe61f Remove .dockerignore file to avoid redundant configuration 2025-08-02 12:57:14 +02:00
6e489ceac3 Remove .dockerignore file to avoid redundant configuration 2025-08-02 12:57:14 +02:00
21d51732e5 Add .dockerignore and update Fly.io configuration
- Created `.dockerignore` to exclude irrelevant files during Docker image build.
- Enhanced `fly.toml` with additional configuration such as VM specs and adjusted syntax.
- Fixed logo path in `index.html` and relocated the logo file for proper referencing.
2025-08-02 12:57:12 +02:00
f1c94ed438 Update Gallus Pub site design and content
- Changed background and text colors in `styles.css` for a refreshed look.
- Updated logo implementation in `index.html` to use an actual image.
- Adjusted social links and opening hours information.
- Added Font Awesome library to the project configuration.
- Included new logo image in the `public` directory.
2025-08-02 12:57:02 +02:00
493c2a94f0 Remove Gallus_Pub and Gallus_Pub_v1 directories along with associated configuration and files
This commit deletes the entire setup for both Gallus_Pub and Gallus_Pub_v1 projects, including `.gitignore`, configuration files, source code, styles, package files, and other related assets.
2025-08-02 12:56:52 +02:00
3a3a36e2ea Update CSS imports and Dockerfile for consistent styles handling
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
- Enforced `!important` for `--color-background` in `variables.css`.
- Centralized CSS imports in `Layout.astro` for cleaner markup.
- Adjusted Dockerfile to ensure CSS variables are copied to `public/styles`.
- Refined fallback handling in `index.css` for `background-color`.
2025-07-23 21:57:33 +02:00
535c82bd81 Remove unused cache and name fields from .woodpecker.yml for cleaner pipeline configuration
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2025-07-23 21:38:28 +02:00
64aa08c699 Refactor .woodpecker.yml for streamlined deployment and simplify Dockerfile health check
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2025-07-23 21:36:36 +02:00
6f3edc8977 Update deployment configuration files for optimized CI/CD pipeline
- Simplified `fly.toml` by removing inline comments.
- Refactored `.woodpecker.yml` pipeline syntax for better clarity and flexibility.
- Adjusted `Dockerfile` to fix `dist` directory path and streamline `CMD` execution.
2025-07-23 21:32:24 +02:00
9ac87b82e9 Update fly.toml, .woodpecker.yml, and Dockerfile for deployment improvements
- Increased health check grace period in `fly.toml` to 30s.
- Added `dist` directory to cache mounts in `.woodpecker.yml`.
- Fixed file copy path in `Dockerfile` for accurate builds.
2025-07-23 21:29:27 +02:00
74e4799ea9 make main a version off dev 2025-07-23 21:25:24 +02:00
0a939975c3 Remove About and Contact sections from navigation and index page
This commit comments out the About and Contact links in the navigation menu and removes the corresponding sections from the index page. Additionally, adjusted header styles for a full-width layout.
2025-07-23 21:08:38 +02:00
7e0f052ce7 Anpassungen damit das Navi ein OnePager wird, die verlinkung von About und Contact stimmt noch nicht. 2025-07-23 16:48:04 +02:00
77c5d5df82 event hinzugefügt und erste anpassungen am nav für onePager 2025-07-23 16:39:01 +02:00
f0afa677a0 Event Cards Update und alle links sind Orange, einheitlich auf der ganzen Seite 2025-07-23 14:56:34 +02:00
f356b37c9e Rredundantz in Header.css und Hero.css normalisieren 2025-07-23 12:49:23 +02:00
k
096883b0ee Add contact form and WhatsApp integration
- Created a new, styled contact form with input validation.
- Added WhatsApp Chat link for direct communication.
- Introduced `ContactForm.css` with responsive styles to improve usability.
2025-07-20 14:28:13 +02:00
k
749b3e5079 Event Header fix 2025-07-20 13:59:45 +02:00
k
3c1a6fae2c Update styles and layout for improved responsiveness and consistency:
- **Global fonts**: Adjusted `font-family` fallback to include `serif`.
- **Header improvements**: Refined structure with flexbox, adjusted heights, and fixed responsive issues (e.g., removed hardcoded margins).
- **New Layout styles**: Added scoped `Layout.css` for better layout control and modularity.
- **Links fix**: Corrected casing in `About` and `Contact` links for proper navigation.
2025-07-20 13:57:33 +02:00
k
f3952e7e81 Add section IDs and smooth scrolling for improved navigation:
- Updated components (`Hero`, `Welcome`, `EventsGrid`, `ImageCarousel`, `Drinks`) to accept optional `id` props and applied them to `<section>` elements.
- Enabled smooth scrolling by adding `scroll-behavior: smooth` to global styles.
- Enhanced dropdown menu: added internal links for section navigation and adjusted styling for improved responsiveness.
- Updated color handling in `ImageCarousel` to use CSS variables for better theme consistency.
2025-07-20 13:32:43 +02:00
k
00213204c4 Add ImageCarousel component with responsive design and functionality.
- Introduced a new `ImageCarousel` component to display image galleries with navigation and indicators.
- Included scoped CSS for custom styles and responsiveness.
- Integrated `ImageCarousel` into the homepage with sample image data.
2025-07-20 12:57:40 +02:00
5247bd9816 Remove comments from fly.toml for cleaner configuration
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2025-07-16 23:11:28 +02:00
50c06b3a8a Text rearangment
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2025-07-15 21:42:50 +02:00
5ab62f2b3b Improve logo responsiveness and container padding in styles.css
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
- Updated `.logo-container` for full-width responsiveness.
- Adjusted `.logo-container img` to maintain aspect ratio and center align.
- Added padding to `.container` for better layout spacing.
2025-07-15 21:36:53 +02:00
6120f04c95 Update footer styles for improved readability
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
- Changed `background-color` to a darker shade for better contrast.
- Added white text color for enhanced visibility.
2025-07-15 21:32:57 +02:00
179de67386 Fix typo in "Coming Soon" text in index.html
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2025-07-15 21:25:12 +02:00
3da1b63a50 Remove .dockerignore file to avoid redundant configuration
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2025-07-15 21:23:52 +02:00
6b79e08684 Remove .dockerignore file to avoid redundant configuration
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
2025-07-15 21:22:26 +02:00
7d5e77df76 Add .dockerignore and update Fly.io configuration
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
- Created `.dockerignore` to exclude irrelevant files during Docker image build.
- Enhanced `fly.toml` with additional configuration such as VM specs and adjusted syntax.
- Fixed logo path in `index.html` and relocated the logo file for proper referencing.
2025-07-15 21:20:55 +02:00
23b47a7e85 Add Fly.io secret to .woodpecker.yml pipeline
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
- Configured `FLY_API_TOKEN` environment variable from secrets for deployment pipeline.
2025-07-15 21:12:50 +02:00
f4c75ea941 Refactor .woodpecker.yml pipeline configuration
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
- Renamed pipeline to "deploy" for clarity.
- Adjusted `when` conditions structure for branch and event targeting.
2025-07-15 21:10:11 +02:00
58522f2ae0 Add deployment pipeline with Fly.io setup
- Introduced `.woodpecker.yml` for CI/CD pipeline configuration targeting `main` branch.
- Added `fly.toml` for Fly.io deployment settings, including region and deployment checks.
- Created a `Dockerfile` for serving static files via NGINX with SPA routing setup.
2025-07-15 21:08:24 +02:00
2a0aa7a6c8 Update Gallus Pub site design and content
- Changed background and text colors in `styles.css` for a refreshed look.
- Updated logo implementation in `index.html` to use an actual image.
- Adjusted social links and opening hours information.
- Added Font Awesome library to the project configuration.
- Included new logo image in the `public` directory.
2025-07-15 20:30:11 +02:00
bcd86c9c68 Remove Gallus_Pub and Gallus_Pub_v1 directories along with associated configuration and files
This commit deletes the entire setup for both Gallus_Pub and Gallus_Pub_v1 projects, including `.gitignore`, configuration files, source code, styles, package files, and other related assets.
2025-07-15 20:16:25 +02:00
65 changed files with 1240 additions and 517 deletions

View File

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

View File

@ -1,25 +1,22 @@
FROM node:20-alpine AS build
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY ../backup/backup .
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
WORKDIR /app
RUN npm install -g serve
COPY --from=build /app/dist /app
COPY --from=build /app/dist ./dist
EXPOSE 3000
CMD ["serve", "-s", ".", "-l", "3000"]
CMD ["serve", "-s", "dist", "-l", "3000"]
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD wget -qO- http://localhost:3000/ || exit 1

View File

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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 506 KiB

After

Width:  |  Height:  |  Size: 706 KiB

BIN
public/images/Event1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

BIN
public/images/Event2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

BIN
public/images/Event3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

BIN
public/images/Event4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 160 KiB

BIN
public/images/Gallery1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 800 KiB

BIN
public/images/Gallery2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 747 KiB

BIN
public/images/Gallery3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 398 KiB

BIN
public/images/Gallery4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 604 KiB

BIN
public/images/Gallery5.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 580 KiB

BIN
public/images/Gallery6.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 117 KiB

BIN
public/images/Gallery7.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 128 KiB

BIN
public/images/Gallery8.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 KiB

BIN
public/images/Gallery9.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 567 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 110 KiB

After

Width:  |  Height:  |  Size: 122 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 250 KiB

BIN
public/images/Whiskey1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 184 KiB

BIN
public/images/Whiskey2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 179 KiB

BIN
public/images/Whiskey3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 196 KiB

BIN
public/images/karaoke.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

BIN
public/images/pub_quiz.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,42 @@
---
import Layout from "../components/Layout.astro";
import "../styles/components/ContactForm.css";
---
<Layout>
<div class="contact-container">
<h1 class="contact-title">Kontakt</h1>
<form class="contact-form">
<div class="form-group">
<label for="name">Name</label>
<input type="text" id="name" name="name" required>
</div>
<div class="form-group">
<label for="email">E-Mail</label>
<input type="email" id="email" name="email" required>
</div>
<div class="form-group">
<label for="subject">Betreff</label>
<input type="text" id="subject" name="subject" required>
</div>
<div class="form-group">
<label for="message">Nachricht</label>
<textarea id="message" name="message" rows="5" required></textarea>
</div>
<button type="submit" class="submit-button">Senden</button>
</form>
<div class="whatsapp-container">
<p>Oder kontaktiere uns direkt über WhatsApp:</p>
<a href="https://wa.me/41772322770" class="whatsapp-link" target="_blank" rel="noopener noreferrer">
<span class="whatsapp-icon">📱</span>
<span>WhatsApp Chat starten</span>
</a>
</div>
</div>
</Layout>

View File

@ -1,33 +1,44 @@
---
import "../../styles/components/Drinks.css"
import "../styles/components/Drinks.css"
const { id } = Astro.props;
---
<section class="Drinks">
<section id={id} class="Drinks">
<h2 class="title">Drinks</h2>
<a href="/pdf/Menu.pdf" class="card-link" target="_blank" rel="noopener noreferrer">Getränkekarte</a>
<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>
<h3 class="monats-hit">Monats Hit</h3>
<div class="mate-vodka">
<div class="circle" title="Mate Vodka">
<span class="circle-label">Mate Vodka</span>
<img src="/images/MonthlyHit.png" alt="Monats Hit" class="circle-image" />
<span class="circle-label"></span>
</div>
<div>Mate Vodka</div>
</div>
<div class="circle-row">
<div class="circle" title="Bier">
<span class="circle-label">Bier</span>
</div>
<div class="circle" title="Wein">
<span class="circle-label">Wein</span>
</div>
<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.
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>
<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>
<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>
</div>
</section>

View File

@ -2,26 +2,30 @@
// src/components/EventsGrid.astro
import HoverCard from "./HoverCard.astro";
interface Event {
image: string;
title: string;
date: Date;
date: string;
description: string;
}
const { events = [] }: { events?: Event[] } = Astro.props as { events?: Event[] };
import '../../styles/components/EventsGrid.css';
const { events = [], id }: { events?: Event[]; id?: string } = Astro.props as {
events?: Event[];
id?: string;
};
import "../styles/components/EventsGrid.css";
---
<section class="events-gird container">
{events.map((event: Event) => (
<h2 class="section-title">Events</h2>
<section id={id} class="events-gird container">
{
events.map((event: Event) => (
<HoverCard
title={event.title}
date={event.date}
description={event.description}
image={event.image}
/>
))}
))
}
</section>

View File

@ -1,14 +1,12 @@
---
// src/components/Footer.astro
import "/styles/components/Footer.css"
import "../styles/components/Footer.css"
const currentYear = new Date().getFullYear();
---
<footer class="footer">
<footer class="footer" id="footer">
<div class="footer-content">
<div class="copyright">
&copy; {currentYear} Gallus Pub. Alle Rechte vorbehalten.
</div>
<div class="footer-sections">
<div class="footer-section">
@ -24,8 +22,8 @@ const currentYear = new Date().getFullYear();
<p>Gallus Pub</p>
<p>Metzgergasse 13</p>
<p>9000 St. Gallen</p>
<p>Reservierungen via Whatsapp</p>
<p><a href="tel:0772322770">077 232 27 70</a></p>
<p><a href="mailto:info@gallus-pub.ch">info@gallus-pub.ch</a></p>
</div>
<div class="footer-section">
@ -33,12 +31,12 @@ const currentYear = new Date().getFullYear();
<p>Du planst einen Event?</p>
<p>Der "St.Gallerruum" im 2.OG</p>
<p>kann gemietet werden.</p>
<br/>
<p>Gerne öffnen wir auf Anfrage</p>
<p>auch ausserhalb unserer</p>
<p>Betriebszeiten.</p>
<p>Reservierungen via Whatsapp</p>
</div>
</div>
<div class="copyright">
&copy; {currentYear} Gallus Pub. Alle Rechte vorbehalten.
</div>
</div>
</footer>

View File

@ -1,39 +1,81 @@
---
// 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">
<img src="/images/Logo.png" alt="Logo" class="logo" />
</a>
</div>
<!-- Hauptnavigation: immer Home, About, Contact -->
<nav class="nav-main">
<div class="dropdown">
<a href="/" class="dropdbtn">Home</a>
<div class="dropdown-content">
<a href="/events">Events</a>
<a href="/gallery">Gallery</a>
<a href="/openings">Openings</a>
<a href="/drinks">Drinks</a>
<div class="desktop-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>
<!--<a href="/#about">About</a>
<a href="/#contact">Contact</a>-->
</div>
</div>
<a href="/about">About</a>
<a href="/contact">Contact</a>
</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,9 +1,11 @@
---
// src/components/Hero.astro
import "../../styles/components/Hero.css"
import "../styles/components/Hero.css"
const { id } = Astro.props;
---
<section class="hero container">
<section id={id} class="hero container">
<div class="hero-overlay">

View File

@ -1,7 +1,6 @@
---
// src/components/HoverCard.astro
import "../../styles/components/HoverCard.css"
const { title, description, image = "", date} = Astro.props;
import "../styles/components/HoverCard.css";
const {title, description, image = "", date} = Astro.props;
---
<article class="hover-card">
@ -9,13 +8,41 @@ const { title, description, image = "", date} = Astro.props;
<img class="card-image" src={image} alt={title} />
</div>
<h3 class="card-title">{title}</h3>
<h4 class="card_date">{date}</h4>
<div class="hover-text">
<div>
<p>{description}</p>
<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

@ -0,0 +1,114 @@
---
// src/components/ImageCarousel.astro
import "../styles/components/ImageCarousel.css";
interface Image {
src: string;
alt: string;
}
const { images = [], id } = Astro.props as { images: Image[], id?: string };
---
<section id={id} class="image-carousel-container">
<h2 class="section-title">Galerie</h2>
<div class="image-carousel">
<button class="nav-button prev-button" aria-label="Previous image">
<span class="arrow">&#10094;</span>
</button>
<div class="carousel-images">
<div class="carousel-track">
{images.map((image, index) => (
<div class="carousel-slide" data-index={index}>
<img src={image.src} alt={image.alt} class="carousel-image" />
</div>
))}
</div>
</div>
<button class="nav-button next-button" aria-label="Next image">
<span class="arrow">&#10095;</span>
</button>
</div>
<div class="carousel-indicators">
{images.map((_, index) => (
<button
class="indicator-dot"
data-index={index}
aria-label={`Go to slide ${index + 1}`}
></button>
))}
</div>
</section>
<script>
// Initialize carousel functionality
function initCarousel() {
const carousel = document.querySelector('.image-carousel');
const track = document.querySelector('.carousel-track');
const slides = document.querySelectorAll('.carousel-slide');
const prevButton = document.querySelector('.prev-button');
const nextButton = document.querySelector('.next-button');
const indicators = document.querySelectorAll('.indicator-dot');
if (!carousel || !track || !slides.length || !prevButton || !nextButton) return;
let currentIndex = 0;
const slideCount = slides.length;
// Set initial active state
updateCarousel();
// Add event listeners
prevButton.addEventListener('click', () => {
currentIndex = (currentIndex - 1 + slideCount) % slideCount;
updateCarousel();
});
nextButton.addEventListener('click', () => {
currentIndex = (currentIndex + 1) % slideCount;
updateCarousel();
});
// Add click events to indicators
indicators.forEach((dot, index) => {
dot.addEventListener('click', () => {
currentIndex = index;
updateCarousel();
});
});
// Function to update carousel display
function updateCarousel() {
// Update active class on slides
slides.forEach((slide, index) => {
const position = index - currentIndex;
// Remove all position classes
slide.classList.remove('prev', 'current', 'next');
// Add appropriate position class
if (position === -1 || (position === slideCount - 1 && currentIndex === 0)) {
slide.classList.add('prev');
} else if (position === 0) {
slide.classList.add('current');
} else if (position === 1 || (position === -(slideCount - 1) && currentIndex === slideCount - 1)) {
slide.classList.add('next');
}
});
// Update indicators
indicators.forEach((dot, index) => {
dot.classList.toggle('active', index === currentIndex);
});
}
}
// Run initialization when DOM is loaded
document.addEventListener('DOMContentLoaded', initCarousel);
// Re-initialize on astro:page-load for Astro View Transitions
document.addEventListener('astro:page-load', initCarousel);
</script>

View File

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

View File

@ -1,11 +0,0 @@
---
import Layout from "../components/Layout.astro";
---
<Layout>
<h1>Contact</h1>
<p>Hier findest du alle aktuellen und kommenden Contact im Gallus Pub.</p>
</Layout>

View File

@ -1,23 +1,88 @@
---
// src/pages/index.astro
import Layout from "../components/Layout.astro";
import Hero from "../components/Hero.astro";
import Welcome from "../components/Welcome.astro";
import EventsGrid from '../components/EventsGrid.astro';
import EventsGrid from "../components/EventsGrid.astro";
import Drinks from "../components/Drinks.astro";
import ImageCarousel from "../components/ImageCarousel.astro";
import Contact from "../components/Contact.astro";
import About from "../components/About.astro";
const events = [
{image: '/images/Logo.png', title: 'Karaoke Night', date: 'Mi, 23. Juli 2025', description: 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua' },
{image: '/images/Logo.png', title: 'Pub Quiz', date: 'Fr, 25. Juli 2025', description: 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptuaLorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua' },
{image: '/images/Logo.png', title: 'Live-Musik', date: 'Sa, 26. Juli 2025', description: 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod' },
{image: '/images/Logo.png', title: 'Cocktail-Abend', date: 'So, 27. Juli 2025', description: 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua' }
{
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" },
];
---
<Layout>
<Hero />
<Welcome />
<EventsGrid events={events} />
<Drinks />
<Hero id="hero" />
<Welcome id="welcome" />
<EventsGrid id="events" events={events} />
<ImageCarousel id="gallery" images={images} />
<Drinks id="drinks" />
</Layout>

BIN
src/public/Logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

9
src/public/favicon.svg Normal file
View File

@ -0,0 +1,9 @@
<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>

After

Width:  |  Height:  |  Size: 749 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 506 KiB

BIN
src/public/images/Logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 124 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 384 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
src/public/pdf/Menu.pdf Normal file

Binary file not shown.

View File

@ -0,0 +1,125 @@
.contact-container {
max-width: 800px;
margin: 2rem auto;
padding: 0 1rem;
}
.contact-title {
margin-top: 70px;
padding-top: 2rem;
text-align: center;
margin-bottom: 2rem;
font-size: 2.5rem;
color: var(--color-text);
}
.contact-form {
background-color: rgba(33, 59, 40, 0.05);
padding: 2rem;
border-radius: 8px;
margin-bottom: 2rem;
}
.form-group {
margin-bottom: 1.5rem;
}
.form-group label {
display: block;
margin-bottom: 0.5rem;
font-weight: bold;
color: var(--color-text);
}
.form-group input,
.form-group textarea {
width: 100%;
padding: 0.75rem;
border: 1px solid #ccc;
border-radius: 4px;
font-family: inherit;
font-size: 1rem;
background-color: #fff;
}
.form-group textarea {
resize: vertical;
}
.form-group input:focus,
.form-group textarea:focus {
outline: none;
border-color: #213b28;
box-shadow: 0 0 0 2px rgba(33, 59, 40, 0.2);
}
.submit-button {
background-color: #213b28;
color: white;
border: none;
padding: 0.75rem 1.5rem;
font-size: 1rem;
font-weight: bold;
border-radius: 4px;
cursor: pointer;
transition: background-color 0.3s ease;
}
.submit-button:hover {
background-color: #2a4c35;
}
.whatsapp-container {
text-align: center;
margin: 2rem 0;
}
.whatsapp-link {
display: inline-flex;
align-items: center;
background-color: #25D366;
color: white;
text-decoration: none;
padding: 0.75rem 1.5rem;
border-radius: 4px;
font-weight: bold;
transition: background-color 0.3s ease;
margin-top: 0.5rem;
}
.whatsapp-link:hover {
background-color: #128C7E;
}
.whatsapp-icon {
font-size: 1.2rem;
margin-right: 0.5rem;
display: inline-block;
}
/* Responsive adjustments */
@media (max-width: 768px) {
.contact-form {
padding: 1.5rem;
}
.contact-title {
font-size: 2rem;
}
}
@media (max-width: 480px) {
.contact-form {
padding: 1rem;
}
.contact-title {
font-size: 1.75rem;
}
.submit-button,
.whatsapp-link {
width: 100%;
justify-content: center;
}
}

View File

@ -15,7 +15,7 @@
.title {
font-size: var(--font-size-large);
margin-bottom: 1.5rem;
margin-bottom: 0.5rem;
font-weight: bold;
color: var(--color-text);
text-transform: uppercase;
@ -25,6 +25,7 @@
.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);
@ -68,7 +69,6 @@
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: 6em;
width: 6em;
height: 35vh;
width: 35vh;
border: 2px solid var(--color-accent-beige);
border-radius: 50%;
margin: 0.5rem;
@ -94,6 +94,7 @@
justify-content: center;
align-items: center;
cursor: pointer;
overflow: hidden;
}
.circle:hover {
@ -109,12 +110,25 @@
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;
@ -149,10 +163,6 @@
width: 90%;
}
.circle {
height: 5em;
width: 5em;
}
.circle-label {
font-size: 0.7rem;

View File

@ -1,3 +1,11 @@
.section-title {
text-align: center;
margin-bottom: 1.5rem;
font-size: 2rem;
font-weight: bold;
color: var(--color-text);
}
.events-gird {
display: flex;
flex-wrap: wrap;

View File

@ -13,9 +13,9 @@
.copyright {
text-align: center;
margin-bottom: 2rem;
padding-bottom: 1rem;
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
margin-top: 2rem;
padding-top: 1rem;
border-top: 1px solid rgba(255, 255, 255, 0.1);
}
.footer-sections {

View File

@ -0,0 +1,190 @@
.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

@ -0,0 +1,65 @@
.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;
background-position: center;
background-repeat: no-repeat;
margin-top: 2em;
}
h1 {
padding-top: 2em;
}
.hero {
position: relative;
height: 70vh;
display: flex;
align-items: center;
justify-content: center;
color: white;
margin-bottom: 2rem;
}
.hero-overlay {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
/* Background is set in the component */
}
.hero-content {
position: relative;
text-align: center;
z-index: 1;
}
.hero-content h1 {
font-size: 4rem;
font-weight: bold;
}
.hero-content p {
margin: 0.5rem 0 1rem 0;
font-size: 1.2rem;
}
.button {
margin-top: 2rem;
padding: 0.8rem 2rem;
background: linear-gradient(45deg, #ffa500, #ff7f00);
color: white;
border: none;
border-radius: 30px;
font-size: 1rem;
font-weight: bold;
text-decoration: none;
box-shadow: 0 4px 15px rgba(0, 0, 0, 0.3);
transition: transform 0.2s, box-shadow 0.2s;
}
.button:hover {
transform: translateY(-3px);
box-shadow: 0 6px 20px rgba(0, 0, 0, 0.4);
}

View File

@ -0,0 +1,155 @@
.hover-card {
position: relative;
width: 25rem;
height: 25rem;
border-radius: var(--border-radius);
background-color: var(--color-accent-green);
box-shadow: var(--box-shadow);
transition: transform var(--transition-standard);
overflow: hidden;
margin: var(--margin-standard);
display: flex;
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;
color: var(--color-accent-beige);
font-size: var(--font-size-small);
text-align: center;
font-style: italic;
order: -1;
}
.image-container {
flex-grow: 1;
position: relative;
overflow: hidden;
}
.card-image {
width: 100%;
height: 100%;
object-fit: cover;
transition: opacity 0.3s ease;
}
.hover-text {
font-size: var(--font-size-small-medium);
text-align: center;
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: var(--color-accent-green-transparent);
display: flex;
justify-content: center;
align-items: center;
padding: 20px;
opacity: 0;
transition: opacity var(--transition-standard);
}
.hover-text div {
color: var(--color-accent-beige);
text-align: center;
max-height: 100%;
width: 100%;
overflow-y: auto;
padding-right: 5px;
}
.hover-text div::-webkit-scrollbar {
width: 5px;
}
.hover-text div::-webkit-scrollbar-track {
background: rgba(0, 0, 0, 0.1);
border-radius: 10px;
}
.hover-text div::-webkit-scrollbar-thumb {
background: var(--color-accent-beige);
border-radius: 10px;
}
.hover-text div {
scrollbar-width: thin;
scrollbar-color: var(--color-accent-beige) rgba(0, 0, 0, 0.1);
}
/* Active state for mobile tap functionality */
.hover-card.active .hover-text {
opacity: 1;
}
.hover-card.active .card-image {
opacity: 0.1;
}
.hover-text p {
margin: 0;
padding: 0;
}
@media (max-width: 768px) {
.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

@ -0,0 +1,176 @@
/* styles/components/ImageCarousel.css */
.image-carousel-container {
width: 100%;
max-width: 1200px;
margin: 2rem auto;
padding: 0 1rem;
}
.section-title {
text-align: center;
margin-bottom: 1.5rem;
font-size: 2rem;
font-weight: bold;
color: var(--color-text);
}
.image-carousel {
position: relative;
display: flex;
align-items: center;
justify-content: center;
overflow: hidden;
height: 400px;
}
.carousel-images {
position: relative;
width: 100%;
height: 100%;
overflow: hidden;
}
.carousel-track {
display: flex;
height: 100%;
position: relative;
}
.carousel-slide {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
opacity: 0;
transition: all 0.5s ease;
display: flex;
align-items: center;
justify-content: center;
transform: scale(0.8);
z-index: 1;
}
/* Current slide - center and fully visible */
.carousel-slide.current {
opacity: 1;
transform: scale(1);
z-index: 3;
}
/* Previous slide - left side, partially visible */
.carousel-slide.prev {
opacity: 0.7;
transform: translateX(-30%) scale(0.85);
z-index: 2;
}
/* Next slide - right side, partially visible */
.carousel-slide.next {
opacity: 0.7;
transform: translateX(30%) scale(0.85);
z-index: 2;
}
.carousel-image {
max-width: 100%;
max-height: 100%;
object-fit: contain;
border-radius: 8px;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
}
/* Navigation buttons */
.nav-button {
position: absolute;
top: 50%;
transform: translateY(-50%);
background-color: rgba(255, 255, 255, 0.7);
border: none;
border-radius: 50%;
width: 40px;
height: 40px;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
z-index: 10;
transition: background-color 0.3s ease;
}
.nav-button:hover {
background-color: rgba(255, 255, 255, 0.9);
}
.prev-button {
left: 10px;
}
.next-button {
right: 10px;
}
.arrow {
font-size: 18px;
font-weight: bold;
}
/* Indicators */
.carousel-indicators {
display: flex;
justify-content: center;
margin-top: 1rem;
gap: 8px;
}
.indicator-dot {
width: 12px;
height: 12px;
border-radius: 50%;
background-color: #ccc;
border: none;
cursor: pointer;
transition: background-color 0.3s ease;
}
.indicator-dot.active {
background-color: #333;
}
/* Responsive adjustments */
@media (max-width: 768px) {
.image-carousel {
height: 300px;
}
.carousel-slide.prev,
.carousel-slide.next {
opacity: 0.5;
transform: scale(0.7);
}
.carousel-slide.prev {
transform: translateX(-20%) scale(0.7);
}
.carousel-slide.next {
transform: translateX(20%) scale(0.7);
}
}
@media (max-width: 480px) {
.image-carousel {
height: 250px;
}
.carousel-slide.prev,
.carousel-slide.next {
display: none;
}
.nav-button {
width: 30px;
height: 30px;
}
}

View File

@ -0,0 +1,15 @@
html, body {
height: 100%;
margin: 0;
}
body {
display: flex;
flex-direction: column;
min-height: 100vh;
}
main {
flex: 1;
padding: 0 1rem;
}

View File

@ -5,9 +5,15 @@
box-sizing: border-box;
}
/* Add smooth scrolling behavior */
html {
scroll-behavior: smooth;
}
body {
font-family: var(--font-family-primary);
background-color: var(--color-background);
font-family: var(--font-family-primary), serif;
background-color: var(--color-background, #000000);
background: #000000;
color: var(--color-text);
line-height: var(--line-height);
}
@ -18,3 +24,12 @@ body {
width: var(--container-width);
margin: 0 auto;
}
a {
color: #ffa500;
}
a:hover {
text-decoration: none;
}

34
src/styles/variables.css Normal file
View File

@ -0,0 +1,34 @@
:root {
/* Colors */
--color-background: #000000 !important;
--color-text: #f5f5f5;
--color-accent-green: #213b28;
--color-accent-beige: #ceb39b;
--color-accent-green-transparent: rgba(33, 59, 40, 0.95);
--color-shadow: rgba(0, 0, 0, 0.2);
--color-orange1: #ffa500;
/* Font Sizes */
--font-family-primary: 'Georgia', serif;
--font-size-small: 1rem;
--font-size-small-medium: 1.2rem;
--font-size-medium: 1.5rem;
--font-size-large: 2rem;
--line-height: 1.6;
--container-width: 100%;
--container-max-width: 1600px;
--padding-vertical: 2rem;
--padding-horizontal: 0;
--margin-standard: 1rem;
--gap-standard: 30px;
--border-radius: 8px;
--box-shadow: 0 4px 8px var(--color-shadow);
--transition-standard: 0.3s ease;
--breakpoint-mobile: 768px;
--breakpoint-desktop: 1600px;
}

View File

@ -1,94 +0,0 @@
.header {
position: fixed;
top: 0;
left: 0;
right: 0;
background-color: rgba(26, 26, 26, 0.95);
z-index: 1000;
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
backdrop-filter: blur(5px);
}
.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;
margin-right: 377px;
}
.nav-main a,
.dropdbtn {
margin: 0 1rem;
color: white;
text-decoration: none;
font-size: 1rem;
cursor: pointer;
}
.nav-main a:hover,
.dropdbtn:hover {
color: #ffa500;
}
/* Dropdown für Home */
.dropdown {
position: relative;
display: inline-block;
}
.dropdown-content {
display: none;
position: absolute;
background-color: #0e0c0c;
min-width: 160px;
z-index: 1;
border: 1px solid #444;
border-radius: 4px;
}
.dropdown-content a {
color: #f5f5f5;
padding: 0.5rem 1rem;
text-decoration: none;
display: block;
}
.dropdown-content a:hover {
background-color: #1f1a1a;
color: #ffa500;
}
.dropdown:hover .dropdown-content {
display: block;
}
@media (max-width: 768px) {
.nav-container {
padding: 1rem;
}
.nav-links {
gap: 1rem;
}
}

View File

@ -1,128 +0,0 @@
/* === Header & Nav === */
.header {
background-color: #0e0c0c;
display: flex;
align-items: center;
justify-content: space-between;
padding: 1rem 2rem;
border-bottom: 1px solid #444;
}
.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;
background-position: center;
background-repeat: no-repeat;
margin-top: 2em;
}
h1 {
padding-top: 2em;
}
.nav-main {
display: flex;
align-items: center;
margin-right: 377px;
}
.nav-main a,
.dropdbtn {
margin: 0 1rem;
color: white;
text-decoration: none;
font-size: 1rem;
cursor: pointer;
}
.nav-main a:hover,
.dropdbtn:hover {
color: #ffa500;
}
/* Dropdown für Home */
.dropdown {
position: relative;
display: inline-block;
}
.dropdown-content {
display: none;
position: absolute;
background-color: #0e0c0c;
min-width: 160px;
z-index: 1;
border: 1px solid #444;
border-radius: 4px;
}
.dropdown-content a {
color: #f5f5f5;
padding: 0.5rem 1rem;
text-decoration: none;
display: block;
}
.dropdown-content a:hover {
background-color: #1f1a1a;
color: #ffa500;
}
.dropdown:hover .dropdown-content {
display: block;
}
.hero {
position: relative;
height: 70vh;
display: flex;
align-items: center;
justify-content: center;
color: white;
margin-bottom: 2rem;
}
.hero-overlay {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
/* Background is set in the component */
}
.hero-content {
position: relative;
text-align: center;
z-index: 1;
}
.hero-content h1 {
font-size: 4rem;
font-weight: bold;
}
.hero-content p {
margin: 0.5rem 0 1rem 0;
font-size: 1.2rem;
}
.button {
margin-top: 2rem;
padding: 0.8rem 2rem;
background: linear-gradient(45deg, #ffa500, #ff7f00);
color: white;
border: none;
border-radius: 30px;
font-size: 1rem;
font-weight: bold;
text-decoration: none;
box-shadow: 0 4px 15px rgba(0, 0, 0, 0.3);
transition: transform 0.2s, box-shadow 0.2s;
}
.button:hover {
transform: translateY(-3px);
box-shadow: 0 6px 20px rgba(0, 0, 0, 0.4);
}

View File

@ -1,112 +0,0 @@
.hover-card {
position: relative;
width: 350px;
height: 400px;
border-radius: var(--border-radius);
background-color: var(--color-accent-green);
box-shadow: var(--box-shadow);
transition: transform var(--transition-standard);
overflow: hidden;
margin: var(--margin-standard);
display: flex;
flex-direction: column;
}
.hover-card:hover {
transform: translateY(-5px);
}
.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;
color: var(--color-accent-beige);
font-size: var(--font-size-small);
text-align: center;
font-style: italic;
order: -1;
}
.image-container {
flex-grow: 1;
position: relative;
overflow: hidden;
}
.card-image {
width: 100%;
height: 100%;
object-fit: cover;
transition: opacity 0.3s ease;
}
.hover-text {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: var(--color-accent-green-transparent);
display: flex;
justify-content: center;
align-items: center;
padding: 20px;
opacity: 0;
transition: opacity var(--transition-standard);
}
.hover-text div {
color: var(--color-accent-beige);
text-align: center;
max-height: 100%;
width: 100%;
overflow-y: auto;
padding-right: 5px;
}
.hover-text div::-webkit-scrollbar {
width: 5px;
}
.hover-text div::-webkit-scrollbar-track {
background: rgba(0, 0, 0, 0.1);
border-radius: 10px;
}
.hover-text div::-webkit-scrollbar-thumb {
background: var(--color-accent-beige);
border-radius: 10px;
}
.hover-text div {
scrollbar-width: thin;
scrollbar-color: var(--color-accent-beige) rgba(0, 0, 0, 0.1);
}
.hover-card:hover .hover-text {
opacity: 1;
}
.hover-card:hover .card-image {
opacity: 0.1;
}
.hover-text p {
margin: 0;
padding: 0;
}
@media (max-width: 768px) {
.hover-card {
width: 100%;
max-width: 350px;
}
}

View File

@ -1,30 +0,0 @@
:root {
/* Colors */
--color-background: #000;
--color-text: #f5f5f5;
--color-accent-green: #213b28;
--color-accent-beige: #ceb39b;
--color-accent-green-transparent: rgba(33, 59, 40, 0.95);
--color-shadow: rgba(0, 0, 0, 0.2);
--font-family-primary: 'Georgia', serif;
--font-size-small: 1rem;
--font-size-medium: 1.5rem;
--font-size-large: 2rem;
--line-height: 1.6;
--container-width: 100%;
--container-max-width: 1600px;
--padding-vertical: 2rem;
--padding-horizontal: 0;
--margin-standard: 1rem;
--gap-standard: 30px;
--border-radius: 8px;
--box-shadow: 0 4px 8px var(--color-shadow);
--transition-standard: 0.3s ease;
--breakpoint-mobile: 768px;
--breakpoint-desktop: 1600px;
}