Szablon witryny, docker i workflow gitea

This commit is contained in:
dm
2025-11-20 21:22:37 +01:00
commit 1e5f2bc38a
30 changed files with 601 additions and 0 deletions

View File

@@ -0,0 +1,63 @@
---
const {
title = [],
subtitle = [],
description,
imageUrl,
ctas = []
} = Astro.props;
---
<section class="fuz-section">
<div class="fuz-container grid md:grid-cols-2 gap-10 items-center">
<div class="space-y-6">
{Array.isArray(title) ? (
<h1 class="fuz-hero-title">
{title.map((line) => (
<span class="block">{line}</span>
))}
</h1>
) : (
<h1 class="fuz-hero-title">{title}</h1>
)}
{Array.isArray(subtitle) && subtitle.length > 0 && (
<div class="fuz-hero-subtitle space-y-1">
{subtitle.map((line) => (
<p>{line}</p>
))}
</div>
)}
{description && (
<p class="mt-4 text-base md:text-lg text-gray-600 dark:text-gray-300 max-w-xl">
{description}
</p>
)}
{ctas.length > 0 && (
<div class="mt-6 flex flex-wrap gap-3">
{ctas.map((cta) => (
<a
href={cta.href}
class="inline-flex items-center rounded-full px-5 py-2.5 text-sm font-medium bg-sky-600 text-white hover:bg-sky-700 dark:bg-sky-500 dark:hover:bg-sky-400"
>
{cta.label}
</a>
))}
</div>
)}
</div>
{imageUrl && (
<div class="relative aspect-video md:aspect-[4/3] overflow-hidden rounded-3xl border border-slate-200/70 dark:border-slate-700/70">
<img
src={imageUrl}
alt=""
loading="lazy"
class="h-full w-full object-cover"
/>
</div>
)}
</div>
</section>

View File

@@ -0,0 +1,10 @@
<footer class="fuz-footer">
<div class="fuz-container flex flex-col md:flex-row items-center justify-between gap-3">
<p class="fuz-footer-text">
© {new Date().getFullYear()} FUZ lokalny operator internetu i telewizji.
</p>
<p class="text-xs text-gray-400">
RODO • Polityka prywatności • Cookies
</p>
</div>
</footer>

View File

@@ -0,0 +1,29 @@
---
const nav = [
{ href: "/", label: "Strona główna" },
{ href: "/internet", label: "Internet" },
{ href: "/telewizja", label: "Telewizja" },
{ href: "/internet-telewizja", label: "Internet + TV" },
{ href: "/mapa-zasiegu", label: "Mapa zasięgu" },
{ href: "/kontakt", label: "Kontakt" }
];
---
<header class="fuz-header">
<div class="fuz-container flex items-center justify-between py-3">
<a href="/" class="flex items-center gap-2 font-semibold">
<span class="inline-flex h-8 w-8 items-center justify-center rounded-full bg-sky-500 text-white text-sm font-bold">
F
</span>
<span>FUZ</span>
</a>
<nav class="hidden md:flex items-center gap-6 text-sm">
{nav.map((item) => (
<a href={item.href} class="hover:text-sky-600 dark:hover:text-sky-400">
{item.label}
</a>
))}
</nav>
</div>
</header>

View File

@@ -0,0 +1,21 @@
---
const { href, variant = "primary" } = Astro.props;
const base =
"inline-flex items-center justify-center rounded-full px-4 py-2 text-sm font-medium transition";
const variants = {
primary: "bg-sky-600 text-white hover:bg-sky-700 dark:bg-sky-500 dark:hover:bg-sky-400",
secondary: "bg-slate-100 text-slate-900 hover:bg-slate-200 dark:bg-slate-800 dark:text-slate-100"
};
const classes = `${base} ${variants[variant] ?? variants.primary}`;
---
{href ? (
<a href={href} class={classes}>
<slot />
</a>
) : (
<button type="button" class={classes}>
<slot />
</button>
)}

View File

@@ -0,0 +1,15 @@
---
const { message, type = "success" } = Astro.props;
const base = "fixed right-4 top-20 z-50 rounded-xl px-4 py-3 text-sm shadow-lg border backdrop-blur";
const variants = {
success: "bg-emerald-50/90 border-emerald-200 text-emerald-900 dark:bg-emerald-900/70 dark:border-emerald-700 dark:text-emerald-50",
error: "bg-rose-50/90 border-rose-200 text-rose-900 dark:bg-rose-900/70 dark:border-rose-700 dark:text-rose-50",
info: "bg-sky-50/90 border-sky-200 text-sky-900 dark:bg-sky-900/70 dark:border-sky-700 dark:text-sky-50"
};
const classes = `${base} ${variants[type] ?? variants.success}`;
---
<div class={classes}>
{message}
</div>