Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
65 changes: 65 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
# AI Coding Guidelines – MunichMakerLab Website

See [README.md](./README.md) for project structure and development commands.

---

## Language & Internationalisation

- English pages live in `src/pages/`. German pages live in `src/pages/de/` and mirror the English ones.
- **Always update both language versions** when adding or changing content.
- UI strings belong in `src/i18n/ui/en.ts` and `src/i18n/ui/de.ts` – never hardcode translatable strings directly in components.

### Punctuation conventions

- Use the en dash **`–`** (not a hyphen `-`) for pauses and ranges in both English and German text.
- Avoid overusing the dash in general – prefer rewriting the sentence instead.
- In **English** text: do **not** use a comma before "and" or "or" (no Oxford comma).
- In **German** text: follow standard German punctuation rules.

---

## Components & Code Reuse

- Prefer components over duplicating markup or styles across pages.
- Shared UI elements (social media links, newsletter signup, etc.) must live in `src/components/`.
- Avoid inline styles and inline `<script>` tags inside page files. Move logic into components.
- When a component is used in both languages, accept a `locale` prop and use `src/i18n/ui/ui-i18n-helper.ts` for translations.

---

## Design & Accessibility

- The site supports **dark mode** (via `data-theme` attribute), **mobile** and **desktop** viewports.
- Every change must work correctly in all three contexts. Use CSS custom properties (`var(--fg)`, `var(--muted)`, etc.) for colours – never hardcode hex values.
- Interactive elements must be keyboard-accessible and have appropriate `aria-label` attributes.
- Images must have meaningful `alt` text.

---

## Privacy & Security (DSGVO / GDPR)

- **Never place a plain-text email address in the HTML output.** At minimum obfuscate it (e.g. via the existing encoded-script pattern used on the contact page).
- Do not embed third-party scripts or tracking pixels without a documented legal basis.
- External links should use `target="_blank" rel="noopener noreferrer"`.
- Follow the [OWASP Top 10](https://owasp.org/www-project-top-ten/) for any dynamic or form-based functionality.
- The site must remain compliant with German DSGVO – when in doubt, do less, not more.

---

## General Principles

- Keep the site **simple and clean**. Avoid unnecessary features, dependencies or complexity.
- Prefer static output. Minimise client-side JavaScript – use `client:only` or `client:load` directives only where truly necessary.
- Run `npm run lint` and `npm run format:fix` before committing.

---

## SEO

- Every page must have a `description` frontmatter field (plain-text, ≤ 160 characters). MDX pages use YAML frontmatter; `*.astro` pages add it to the `frontmatter` object in the script block.
- Page `title` should follow the pattern **"Page Name – Munich Maker Lab"** (en dash, not hyphen). The home page is the exception and uses just "Munich Maker Lab".
- The `Content.astro` layout automatically renders `<meta name="description">`, `<link rel="canonical">`, hreflang alternates and Open Graph tags from frontmatter. Do not add these manually in individual pages.
- When adding a new page, add it in both `src/pages/` (EN) and `src/pages/de/` (DE) so the sitemap and hreflang links stay consistent.
- The sitemap is generated automatically by `@astrojs/sitemap` on build. No manual sitemap editing is needed.
- Do not add `noindex` or `robots` meta tags without a documented reason.
51 changes: 34 additions & 17 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,29 +1,42 @@
MunichMakerLab Website
# MunichMakerLab Website

this website has been built with astro and tries to minimize the gotchas and special purpose additions for maintainabilities sake.
This website is built with [Astro](https://astro.build) and tries to minimize complexity and special-purpose additions for maintainability's sake.

## 🚀 Project Structure
For AI/Human coding guidelines see [AGENTS.md](./AGENTS.md).

Inside of this project, you'll see the following folders and files:
---

## Project Structure

The actual pages are in [`src/pages/`](/src/pages/) and are mostly Markdown/MDX. Adding a new page is as simple as creating a new file, copying the frontmatter from an existing page and customising it.

```text
/
├── public/
│ └── favicon.svg
├── public/ # Static assets (fonts, images, manifest)
├── src/
│ ├── layouts/
│ │ └── Layout.astro
│ └── pages/
│ └── index.astro
│ ├── assets/ # Processed assets (images referenced in pages)
│ ├── components/ # Reusable Astro/Vue components
│ ├── i18n/ui/ # UI translation strings (en.ts, de.ts)
│ ├── layouts/ # Page layouts (Content.astro wraps all pages)
│ └── pages/ # English pages (default)
│ └── de/ # German translations of each page
└── package.json
```

To learn more about the folder structure of an Astro project, refer to [our guide on project structure](https://docs.astro.build/en/basics/project-structure/).
Tl;dr: The actual pages of the website are in [src/pages](/src/pages/) and are mostly markdown. Adding another page should be as easy as just creating another file, copy-pasting the head section and customizing it and the page itself.
---

## Internationalisation (i18n)

## 🧞 Commands
- **English** is the default language. All pages live directly in `src/pages/`.
- **German** translations live in `src/pages/de/` and mirror the English pages.
- When adding or editing a page, always update **both** language versions.
- UI strings (navigation, footer, etc.) are managed in `src/i18n/ui/en.ts` and `src/i18n/ui/de.ts`.

All commands are run from the root of the project, from a terminal:
---

## Development Commands

All commands are run from the root of the project:

| Command | Action |
| :------------------------ | :----------------------------------------------- |
Expand All @@ -34,8 +47,12 @@ All commands are run from the root of the project, from a terminal:
| `npm run astro ...` | Run CLI commands like `astro add`, `astro check` |
| `npm run astro -- --help` | Get help using the Astro CLI |
| `npm run lint` | Lint the project with ESLint |
| `npm run format:check` | Check Code Styling with Prettier |
| `npm run format:check` | Check code styling with Prettier |
| `npm run format:fix` | Fix code styling with Prettier |

---

## 👀 Want to learn more?
## Further Reading

Feel free to check [our documentation](https://docs.astro.build) or jump into our [Discord server](https://astro.build/chat).
- [Astro documentation](https://docs.astro.build)
- [Astro Discord server](https://astro.build/chat)
9 changes: 8 additions & 1 deletion astro.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,22 @@ import vue from '@astrojs/vue';

import node from '@astrojs/node';

import sitemap from '@astrojs/sitemap';

// https://astro.build/config
export default defineConfig({
integrations: [markdoc(), mdx(), icon(), vue()],
site: 'https://munichmakerlab.de',
integrations: [markdoc(), mdx(), icon(), vue(), sitemap()],
output: 'static',
adapter: node({
mode: 'standalone',
}),
i18n: {
defaultLocale: 'en',
locales: ['en', 'de'],
routing: {
prefixDefaultLocale: false,
redirectToDefaultLocale: false,
},
},
});
106 changes: 90 additions & 16 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 3 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@
"preview": "astro preview",
"astro": "astro",
"lint": "eslint .",
"format:check": "prettier --check ."
"format:check": "prettier --check .",
"format:fix": "prettier --write ."
},
"dependencies": {
"@astrojs/markdoc": "^1.0.4",
Expand All @@ -29,6 +30,7 @@
"vue": "^3.5.33"
},
"devDependencies": {
"@astrojs/sitemap": "^3.7.3",
"@eslint/js": "^10.0.1",
"eslint": "^10.2.1",
"eslint-config-prettier": "^10.1.8",
Expand Down
Binary file removed public/img/bg_arduino.png
Binary file not shown.
Binary file added public/img/bg_arduino.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/img/bg_banner.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/img/bg_bench.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file removed public/img/bg_front.jpg
Binary file not shown.
Binary file added public/img/bg_front.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file removed public/img/bg_frontdoor.png
Binary file not shown.
Binary file added public/img/bg_frontdoor.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file removed public/img/bg_letter.png
Binary file not shown.
Binary file added public/img/bg_letter.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file removed public/img/bg_main.png
Binary file not shown.
Binary file added public/img/bg_main.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file removed public/img/bg_make.png
Binary file not shown.
Binary file added public/img/bg_make.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/img/bg_opendoors.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/img/bg_program.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file removed public/img/bg_spacestatus.png
Binary file not shown.
Binary file added public/img/bg_spacestatus.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file removed public/img/bg_werkstatt.png
Binary file not shown.
Binary file added public/img/bg_werkstatt.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 4 additions & 0 deletions public/robots.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
User-agent: *
Allow: /

Sitemap: https://munichmakerlab.de/sitemap-index.xml
Binary file added src/assets/IBAN_Sparkasse_Spende.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/assets/Makerlab_Location_2.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/assets/Makerlab_Location_Arial_large.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/assets/impressions/01 (Large).JPG
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/assets/impressions/02 (Large).JPG
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/assets/impressions/03 (Large).JPG
Binary file added src/assets/impressions/04 (Large).jpg
Binary file added src/assets/impressions/05 (Large).jpg
Binary file added src/assets/impressions/06 (Large).png
Binary file added src/assets/impressions/07 (Large).png
Binary file added src/assets/impressions/08 (Large).jpg
Binary file added src/assets/impressions/09 (Large).jpg
Binary file added src/assets/impressions/10 (Large).png
Binary file added src/assets/impressions/11 (Large).jpg
Binary file added src/assets/impressions/12 (Large).jpg
Binary file added src/assets/impressions/13 (Large).jpg
Binary file added src/assets/impressions/14 (Large).jpg
Binary file added src/assets/impressions/15 (Large).jpg
Binary file added src/assets/impressions/16 (Large).jpg
Binary file added src/assets/impressions/17 (Large).jpg
Binary file added src/assets/impressions/18 (Large).jpg
Binary file added src/assets/impressions/19 (Large).jpg
Binary file added src/assets/impressions/20 (Large).jpg
Binary file added src/assets/impressions/21 (Large).jpg
Binary file added src/assets/impressions/22 (Large).jpg
Binary file added src/assets/impressions/23 (Large).jpg
Binary file added src/assets/impressions/24 (Large).jpg
Binary file added src/assets/impressions/25 (Large).jpg
Binary file added src/assets/paypal_donate_makerlab_muma.png
15 changes: 15 additions & 0 deletions src/components/Calendar.vue
Original file line number Diff line number Diff line change
Expand Up @@ -209,6 +209,21 @@ const calendarOptions = computed(() => ({
--fc-list-event-hover-bg-color: var(--card);
}

/* Smaller event text */
.calendar-container :deep(.fc-event-title),
.calendar-container :deep(.fc-event-time),
.calendar-container :deep(.fc-list-event-title),
.calendar-container :deep(.fc-list-event-time) {
font-size: 0.8rem;
}

/* Reset global link color so FullCalendar's own color system controls text */
.calendar-container :deep(a) {
color: inherit;
text-decoration: none;
text-decoration-color: initial;
}

.event-popover {
position: fixed; /* Fixed allows it to float over everything regardless of calendar scroll */
z-index: 1000;
Expand Down
Loading
Loading