Commit Graph

24 Commits

Author SHA1 Message Date
2e6acceb33 feat: add admin panel, market submission form, and legal updates
- Admin layout with auth guard at /admin
- Admin market list with status filter tabs (pending/approved/rejected)
- Admin market detail/review with approve/reject actions
- Admin market create and edit forms with shared MarketForm component
- Anonymous market submission form at /markt/einreichen with Turnstile
- Optional latitude/longitude fields on submission form
- Admin and submission types added to API types
- requireAdmin guard for role-based frontend access
- Header/mobile nav updated with admin and submission links
- Auth layout redirect removed to re-enable login flow
- Login form action renamed to fix named actions conflict
- Impressum updated with user-submitted content section
- Datenschutz updated with submission form and Turnstile sections
2026-02-27 11:04:31 +01:00
63636bfb7f Merge pull request 'fix: add missing recommended fields to Event structured data' (#1) from fix/event-structured-data into main 2026-02-24 12:59:09 +01:00
3447402059 fix: add missing recommended fields to Event structured data
Resolve Google Search Console warnings for Event structured data by
adding image fallback, organizer url, offers url, and offers for free
markets.
2026-02-24 12:56:54 +01:00
c582c7c4d6 feat: parse admission notes into structured price table
Parse semi-structured notes text (e.g. "Samstag: Erw. 15 €, Kinder 8 €")
into grouped table rows instead of showing raw text below the table.

- Split notes on sentence boundaries (". " + uppercase), handling
  abbreviations like "Erw." correctly
- Extract "Label: Category Price €" patterns into table groups
- Expand common abbreviations (Erw. → Erwachsene, Erm. → Ermäßigt)
- Guard against "Cat: Price, Cat: Price" format (colons in pricesStr)
- Guard against bare prices after colon (letter-start requirement)
- Graceful fallback to flat table + raw notes when parsing fails
2026-02-23 06:12:39 +01:00
6b23cc330e feat: add Prettier, ESLint, and pre-commit hooks
- Add Prettier with svelte and tailwindcss plugins
- Add ESLint with typescript-eslint and eslint-plugin-svelte
- Add pre-commit hooks (trailing-whitespace, end-of-file-fixer,
  check-yaml, check-json, no-commit-to-branch, prettier, eslint,
  svelte-check)
- Add format, format:check, lint, lint:fix scripts to package.json
- Rename CI typecheck step to lint, add format:check and lint commands
- Fix ESLint issues: unused imports, Leaflet type import, extract
  JSON-LD from {@html} template literals to script-block variables
2026-02-23 05:33:44 +01:00
b0d7e6c4aa fix: add lightweight /healthz endpoint, skip SSR for k8s probes
Add /healthz handler in hooks.server.ts that returns early without auth
or SSR processing. Update Helm probes from / to /healthz to avoid
unnecessary log noise and wasted SSR renders.
2026-02-22 20:27:00 +01:00
7282f25986 feat: add SEO landing pages for states and cities
Add /maerkte/ browse-by-state overview, /maerkte/[state]/ state detail
pages, and /maerkte/[state]/[city]/ city detail pages. Each page fetches
all markets and filters client-side (SSR). Includes slug utilities with
umlaut handling, JSON-LD structured data, breadcrumb navigation on all
pages including market detail, and sitemap entries for all new routes.
2026-02-22 20:21:48 +01:00
072c9dc934 feat: add version polling and auto-reload on deploy
- Enable kit.version.pollInterval (60s) so SvelteKit detects new
  deploys via version.json
- Add beforeNavigate guard that forces a full page reload when a
  new version is detected, preventing stale client-side state
- Preload fonts, JS, and CSS for faster initial paint
2026-02-22 19:24:18 +01:00
ed52963bf5 fix(ci): set PUBLIC_API_BASE_URL for typecheck step
svelte-kit sync needs the env var to generate correct types for
$env/static/public imports.
2026-02-22 18:38:51 +01:00
6f1709a258 fix: use PUBLIC_API_BASE_URL env var instead of hardcoded localhost
SSR was fetching from http://localhost:8080 in production, causing
the markets endpoint to fail silently and return 0 results.
2026-02-22 18:36:26 +01:00
f83d73c06d fix(deploy): set maxSurge=0 to fit within ResourceQuota during rollout
With 900m/1000m CPU limits used, rolling updates fail because the
new pod cannot be created alongside the old one. Setting maxSurge=0
and maxUnavailable=1 kills the old pod first, avoiding quota exhaustion
at the cost of brief downtime during deploys.
2026-02-22 12:00:23 +01:00
f83c712b2b fix: remove PageServerLoad annotations from disabled routes
The auth and profile layout redirects break SvelteKit's type
generation for child page loads, causing false-positive type
errors where PageData requires `user` from the root layout.
2026-02-22 11:50:14 +01:00
df93f83fcd feat(seo): add sitemap, canonical URLs, structured data, and OG/Twitter tags
- Add dynamic sitemap.xml with static pages and market entries
- Add canonical URLs and base OG/Twitter meta tags in root layout
- Add JSON-LD WebSite schema with SearchAction on home page
- Add JSON-LD Event schema on market detail pages
- Add twitter:card summary_large_image for markets with images
- Add OG tags to impressum and datenschutz pages
- Add font preloading for critical rendering path fonts
- Add Sitemap directive to robots.txt
2026-02-22 11:45:27 +01:00
2c462144a7 chore: temporarily disable login/signup and profile routes
Comment out auth navigation in Header and MobileNav.
Add redirect-to-home layout guards on /auth/* and /profile/* routes.
2026-02-22 11:34:05 +01:00
cd29b49b0e feat: add impressum and datenschutz pages
Add legal pages required by German law (TMG §5, DSGVO).
Impressum includes operator identity, contact, and liability notices.
Datenschutz covers all data processing: registration, OAuth, sessions,
cookies, geolocation, map tiles, and user rights.
2026-02-22 11:32:22 +01:00
bf1ba11de2 fix(deploy): add seccompProfile RuntimeDefault to satisfy PodSecurity restricted policy 2026-02-22 10:03:33 +01:00
93dde9a23a ci: retrigger pipeline 2026-02-22 10:01:14 +01:00
e957419b77 fix(docker): use existing nobody user instead of creating UID 65534 2026-02-22 09:54:35 +01:00
2f9f4c4b49 fix(ci): correct registry to somegit.dev 2026-02-22 09:50:49 +01:00
2718321201 feat(deploy): add container build and Helm chart for k8s deployment
- Switch adapter-auto to adapter-node (SSR) for container deployment
- Add multi-stage Dockerfile: Bun build, Node.js 22 runtime, UID 65534
- Add Helm chart (deploy/helm/) with Deployment, Service, HTTPRoute, HPA, PDB, ServiceAccount
- Use HTTPRoute (Gateway API) targeting nginx-gateway, TLS via cert-manager
- Enforce readOnlyRootFilesystem with emptyDir for /tmp
- Set ORIGIN env var for adapter-node CSRF protection
- Add Woodpecker CI: typecheck, docker push (SHA tag), helm upgrade --atomic
2026-02-22 09:32:13 +01:00
76afe71854 feat: add signet ring logo and favicon with fleur-de-lis
Introduces brand identity with a medieval signet ring motif:
gold fleur-de-lis on dark green signet face. Adds SVG favicon,
raster fallbacks (ICO/PNG), apple-touch-icon, web manifest,
and inline signet ring logo in the header next to the wordmark.
2026-02-18 07:44:41 +01:00
2b02168747 feat: medieval aesthetic restyling with dark/light mode
- Add MedievalSharp + Crimson Pro fonts (woff2)
- Implement OKLCH color theme: forest green primary, gold accent,
  warm stone neutrals, parchment/vellum surfaces, brick red danger
- Add dark/light mode with system preference detection and user toggle
  (ThemeToggle component cycling system/light/dark)
- Prevent FOUC with inline script in app.html
- Replace native <select> with custom accessible dropdown (combobox/
  listbox pattern, keyboard nav, type-ahead, app-themed styling)
- Add IP geolocation fallback via geojs.io when native geolocation
  fails, with visual location badge showing resolved city name
- Shared form control styles via @layer base
- WCAG/a11y: skip-to-content link, aria-invalid, aria-describedby,
  aria-live, focus-visible, role="search", color-scheme:dark
- Update all 23 component/page files with new color system and
  dark: variants
2026-02-18 07:19:30 +01:00
1bcab1f1d4 feat: implement SvelteKit web frontend MVP
SvelteKit 2 (Svelte 5 runes) + Tailwind 4 + TypeScript frontend for
the Marktvogt medieval market platform.

- Market search with keyword FTS, location/radius, date range, sorting
- List/map toggle (Leaflet with OSM tiles, dynamic import)
- Market detail pages with SSR, SEO meta/OG tags, opening hours,
  admission prices, embedded map
- Auth: login (password + magic link + OAuth), register, logout
- Profile: view/edit display name + avatar, account deletion
- 2FA: TOTP setup, verify, disable
- httpOnly cookie auth with JWT access + session token refresh
- Responsive layout with mobile hamburger nav
- German UI text for DACH audience
2026-02-18 06:27:51 +01:00
1e2a3d9686 initial commit 2026-02-18 04:49:25 +01:00