Szablon witryny, docker i workflow gitea
This commit is contained in:
63
src/components/hero/Hero.astro
Normal file
63
src/components/hero/Hero.astro
Normal 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>
|
||||
10
src/components/layout/Footer.astro
Normal file
10
src/components/layout/Footer.astro
Normal 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>
|
||||
29
src/components/layout/Header.astro
Normal file
29
src/components/layout/Header.astro
Normal 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>
|
||||
21
src/components/ui/Button.astro
Normal file
21
src/components/ui/Button.astro
Normal 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>
|
||||
)}
|
||||
15
src/components/ui/Toast.astro
Normal file
15
src/components/ui/Toast.astro
Normal 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>
|
||||
Reference in New Issue
Block a user