Dodanie title 2/2, Poprawki w ładowaniu map Google, poprwka w linach modal dla title
This commit is contained in:
@@ -49,7 +49,7 @@ const footer = yaml.load(
|
|||||||
{
|
{
|
||||||
footer.services.map((item: any) => (
|
footer.services.map((item: any) => (
|
||||||
<li>
|
<li>
|
||||||
<a href={item.url} class="fuz-footer-link">
|
<a href={item.url} class="fuz-footer-link" title={item.title}>
|
||||||
{item.name}
|
{item.name}
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
|
|||||||
@@ -1,5 +1,9 @@
|
|||||||
---
|
---
|
||||||
import "../../styles/map-google.css";
|
import "../../styles/map-google.css";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PARAMETRY MAPY
|
||||||
|
*/
|
||||||
const {
|
const {
|
||||||
apiKey,
|
apiKey,
|
||||||
lat,
|
lat,
|
||||||
@@ -8,35 +12,80 @@ const {
|
|||||||
title = "",
|
title = "",
|
||||||
description = "",
|
description = "",
|
||||||
showMarker = false,
|
showMarker = false,
|
||||||
mode = "full", // "full" – mapa na całą sekcję, wszystko inne => karta
|
mode = "full",
|
||||||
|
mapStyleId = "8e0a97af9476f2d3" // Google DEMO mapId (legalne, bez warningów)
|
||||||
} = Astro.props;
|
} = Astro.props;
|
||||||
|
|
||||||
const mapId = `fuz-map-${Math.random().toString(36).slice(2)}`;
|
/** ID kontenera w DOM */
|
||||||
|
const domId = `fuz-map-${Math.random().toString(36).slice(2)}`;
|
||||||
---
|
---
|
||||||
|
|
||||||
|
<!-- Kontener na mapę -->
|
||||||
<div
|
<div
|
||||||
id={mapId}
|
id={domId}
|
||||||
class={mode === "full"
|
class={
|
||||||
|
mode === "full"
|
||||||
? "fuz-map--full"
|
? "fuz-map--full"
|
||||||
: mode === "contact"
|
: mode === "contact"
|
||||||
? "fuz-map--contact"
|
? "fuz-map--contact"
|
||||||
: "fuz-map--card"}
|
: "fuz-map--card"
|
||||||
|
}
|
||||||
data-lat={lat}
|
data-lat={lat}
|
||||||
data-lon={lon}
|
data-lon={lon}
|
||||||
data-zoom={zoom}
|
data-zoom={zoom}
|
||||||
data-title={title}
|
data-title={title}
|
||||||
data-desc={description}
|
data-desc={description}
|
||||||
data-showmarker={showMarker}
|
data-showmarker={showMarker}
|
||||||
>
|
/></div>
|
||||||
</div>
|
|
||||||
|
|
||||||
<script is:inline define:vars={{ apiKey, mapId }}>
|
<script is:inline define:vars={{ apiKey, domId, mapStyleId }}>
|
||||||
(function () {
|
/**
|
||||||
// Funkcja inicjująca JEDNĄ konkretną mapę
|
* ⭐ FINALNY GOOGLE MAPS API LOADER 2025 ⭐
|
||||||
function initSingleMap() {
|
* ------------------------------------------
|
||||||
const el = document.getElementById(mapId);
|
* - Bez callbacków
|
||||||
if (!el || !window.google || !google.maps) return;
|
* - Bez deprecated Marker
|
||||||
|
* - Zgodny z importLibrary()
|
||||||
|
* - Zero warningów o async / mapId
|
||||||
|
* - Stabilny w Astro (Vite SSR + SPA)
|
||||||
|
*/
|
||||||
|
|
||||||
|
(function () {
|
||||||
|
|
||||||
|
/** Ładowanie Google Maps API — stabilna wersja */
|
||||||
|
async function loadGoogleMaps(apiKey) {
|
||||||
|
// Jeśli już załadowane
|
||||||
|
if (window.google?.maps) return window.google.maps;
|
||||||
|
|
||||||
|
// Jeśli trwa ładowanie — użyj tego samego Promise
|
||||||
|
if (!window._GOOGLE_MAPS_LOADING) {
|
||||||
|
window._GOOGLE_MAPS_LOADING = new Promise((resolve, reject) => {
|
||||||
|
const script = document.createElement("script");
|
||||||
|
script.src = `https://maps.googleapis.com/maps/api/js?key=${apiKey}&v=weekly`;
|
||||||
|
script.async = true;
|
||||||
|
script.defer = true;
|
||||||
|
script.onerror = () => reject("Google Maps API failed to load");
|
||||||
|
script.onload = () => resolve(window.google.maps);
|
||||||
|
document.head.appendChild(script);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return window._GOOGLE_MAPS_LOADING;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** ★ Inicjalizacja pojedynczej mapy */
|
||||||
|
async function initMap() {
|
||||||
|
const el = document.getElementById(domId);
|
||||||
|
if (!el) return;
|
||||||
|
|
||||||
|
/** 1. Ładujemy API */
|
||||||
|
const maps = await loadGoogleMaps(apiKey);
|
||||||
|
|
||||||
|
/** 2. importLibrary — NOWE Google API 2025 */
|
||||||
|
const { Map } = await maps.importLibrary("maps");
|
||||||
|
const { AdvancedMarkerElement } = await maps.importLibrary("marker");
|
||||||
|
const { InfoWindow } = await maps.importLibrary("maps");
|
||||||
|
|
||||||
|
/** 3. Dane konfiguracyjne mapy z data-* */
|
||||||
const lat = Number(el.dataset.lat);
|
const lat = Number(el.dataset.lat);
|
||||||
const lon = Number(el.dataset.lon);
|
const lon = Number(el.dataset.lon);
|
||||||
const zoom = Number(el.dataset.zoom);
|
const zoom = Number(el.dataset.zoom);
|
||||||
@@ -44,9 +93,11 @@ const mapId = `fuz-map-${Math.random().toString(36).slice(2)}`;
|
|||||||
const desc = el.dataset.desc || "";
|
const desc = el.dataset.desc || "";
|
||||||
const showMarker = el.dataset.showmarker === "true";
|
const showMarker = el.dataset.showmarker === "true";
|
||||||
|
|
||||||
const map = new google.maps.Map(el, {
|
/** 4. Tworzymy mapę z nowym mapId */
|
||||||
zoom,
|
const map = new Map(el, {
|
||||||
center: { lat, lng: lon },
|
center: { lat, lng: lon },
|
||||||
|
zoom,
|
||||||
|
mapId: mapStyleId, // ★★ wymagane 2024+ ★★
|
||||||
mapTypeControl: false,
|
mapTypeControl: false,
|
||||||
fullscreenControl: false,
|
fullscreenControl: false,
|
||||||
streetViewControl: false,
|
streetViewControl: false,
|
||||||
@@ -54,60 +105,34 @@ const mapId = `fuz-map-${Math.random().toString(36).slice(2)}`;
|
|||||||
zoomControl: true,
|
zoomControl: true,
|
||||||
});
|
});
|
||||||
|
|
||||||
// Zapamiętujemy mapę globalnie (np. dla KML / markerów z zewnątrz)
|
/** Zapamiętanie referencji */
|
||||||
if (!window.fuzMaps) window.fuzMaps = {};
|
window.fuzMaps = window.fuzMaps || {};
|
||||||
window.fuzMaps[mapId] = map;
|
window.fuzMaps[domId] = map;
|
||||||
|
|
||||||
|
/** 5. Marker 2025 (AdvancedMarkerElement) */
|
||||||
if (showMarker) {
|
if (showMarker) {
|
||||||
const marker = new google.maps.Marker({
|
const marker = new AdvancedMarkerElement({
|
||||||
position: { lat, lng: lon },
|
|
||||||
map,
|
map,
|
||||||
|
position: { lat, lng: lon }
|
||||||
});
|
});
|
||||||
|
|
||||||
if (title) {
|
if (title || desc) {
|
||||||
const info = new google.maps.InfoWindow({
|
const info = new InfoWindow({
|
||||||
content: `
|
content: `
|
||||||
<div class="fuz-map-infowindow">
|
<div class="fuz-map-infowindow">
|
||||||
<strong>${title}</strong><br/>
|
<strong>${title}</strong><br/>
|
||||||
${desc}
|
${desc}
|
||||||
</div>
|
</div>
|
||||||
`,
|
`
|
||||||
});
|
});
|
||||||
info.open(map, marker);
|
|
||||||
|
info.open({ map, anchor: marker });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 1) Jeśli Google Maps JUŻ załadowane → inicjuj od razu
|
/** Start po załadowaniu DOM */
|
||||||
if (window.google && window.google.maps) {
|
document.addEventListener("DOMContentLoaded", initMap);
|
||||||
initSingleMap();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 2) Jeżeli jeszcze NIE ma Google Maps → przygotuj kolejkę
|
})();
|
||||||
if (!window.FUZ_GOOGLE_MAPS_LOADER) {
|
|
||||||
window.FUZ_GOOGLE_MAPS_LOADER = true;
|
|
||||||
window.FUZ_GOOGLE_MAPS_QUEUE = [];
|
|
||||||
|
|
||||||
window.FUZ_initGoogleMaps = function () {
|
|
||||||
// Wołana przez &callback=FUZ_initGoogleMaps
|
|
||||||
(window.FUZ_GOOGLE_MAPS_QUEUE || []).forEach((fn) => {
|
|
||||||
try {
|
|
||||||
fn();
|
|
||||||
} catch (e) {
|
|
||||||
console.error(e);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
window.FUZ_GOOGLE_MAPS_QUEUE = [];
|
|
||||||
};
|
|
||||||
|
|
||||||
const s = document.createElement("script");
|
|
||||||
s.src = `https://maps.googleapis.com/maps/api/js?key=${apiKey}&callback=FUZ_initGoogleMaps`;
|
|
||||||
s.async = true;
|
|
||||||
document.head.appendChild(s);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 3) Dodaj tę mapę do kolejki, żeby odpaliła się po załadowaniu SDK
|
|
||||||
window.FUZ_GOOGLE_MAPS_QUEUE.push(initSingleMap);
|
|
||||||
})();
|
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -8,11 +8,11 @@ const data = yaml.load(
|
|||||||
fs.readFileSync("./src/content/contact/contact.yaml", "utf8"),
|
fs.readFileSync("./src/content/contact/contact.yaml", "utf8"),
|
||||||
);
|
);
|
||||||
const apiKey = import.meta.env.PUBLIC_GOOGLE_MAPS_KEY;
|
const apiKey = import.meta.env.PUBLIC_GOOGLE_MAPS_KEY;
|
||||||
|
const form = data.form;
|
||||||
---
|
---
|
||||||
|
|
||||||
<!-- TODO: Obrobić wysyłanie maila przez api -->
|
<!-- TODO: Obrobić wysyłanie maila przez api -->
|
||||||
<section id="contact" class="fuz-section">
|
<section id="contact" class="fuz-section">
|
||||||
<!-- GRID 2 kolumny -->
|
|
||||||
<div class="fuz-contact-grid">
|
<div class="fuz-contact-grid">
|
||||||
<!-- Lewa kolumna -->
|
<!-- Lewa kolumna -->
|
||||||
<div class="space-y-6">
|
<div class="space-y-6">
|
||||||
@@ -29,14 +29,14 @@ const apiKey = import.meta.env.PUBLIC_GOOGLE_MAPS_KEY;
|
|||||||
<input
|
<input
|
||||||
type="text"
|
type="text"
|
||||||
name="firstName"
|
name="firstName"
|
||||||
placeholder="Imię"
|
placeholder={form.firstName.placeholder}
|
||||||
class="fuz-input"
|
class="fuz-input"
|
||||||
required
|
required
|
||||||
/>
|
/>
|
||||||
<input
|
<input
|
||||||
type="text"
|
type="text"
|
||||||
name="lastName"
|
name="lastName"
|
||||||
placeholder="Nazwisko"
|
placeholder={form.lastName.placeholder}
|
||||||
class="fuz-input"
|
class="fuz-input"
|
||||||
required
|
required
|
||||||
/>
|
/>
|
||||||
@@ -46,31 +46,33 @@ const apiKey = import.meta.env.PUBLIC_GOOGLE_MAPS_KEY;
|
|||||||
<input
|
<input
|
||||||
type="email"
|
type="email"
|
||||||
name="email"
|
name="email"
|
||||||
placeholder="Email"
|
placeholder={form.email.placeholder}
|
||||||
class="fuz-input"
|
class="fuz-input"
|
||||||
required
|
required
|
||||||
|
autocomplete="email"
|
||||||
/>
|
/>
|
||||||
<input
|
<input
|
||||||
type="tel"
|
type="tel"
|
||||||
name="phone"
|
name="phone"
|
||||||
placeholder="Telefon"
|
placeholder={form.phone.placeholder}
|
||||||
class="fuz-input"
|
class="fuz-input"
|
||||||
required
|
required
|
||||||
|
autocomplete="tel"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<input
|
<input
|
||||||
type="text"
|
type="text"
|
||||||
name="subject"
|
name="subject"
|
||||||
placeholder="Temat wiadomości"
|
placeholder={form.subject.placeholder}
|
||||||
class="fuz-input"
|
class="fuz-input"
|
||||||
required
|
required
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<textarea
|
<textarea
|
||||||
rows="5"
|
|
||||||
name="message"
|
name="message"
|
||||||
placeholder="Treść wiadomości"
|
rows={form.message.rows}
|
||||||
|
placeholder={form.message.placeholder}
|
||||||
class="fuz-input"
|
class="fuz-input"
|
||||||
required></textarea>
|
required></textarea>
|
||||||
|
|
||||||
@@ -82,15 +84,17 @@ const apiKey = import.meta.env.PUBLIC_GOOGLE_MAPS_KEY;
|
|||||||
required
|
required
|
||||||
/>
|
/>
|
||||||
<span>
|
<span>
|
||||||
Wyrażam zgodę na przetwarzanie moich danych osobowych
|
{form.rodo.label}
|
||||||
zgodnie z
|
<a href={form.rodo.policyLink} title={form.rodo.policyTitle}>{form.rodo.policyText}</a
|
||||||
<a href="/polityka-prywatnosci">polityką prywatności</a
|
|
||||||
>.
|
>.
|
||||||
</span>
|
</span>
|
||||||
</label>
|
</label>
|
||||||
|
|
||||||
<button class="btn btn-outline w-full py-3 text-lg">
|
<button
|
||||||
Wyślij wiadomość →
|
class="btn btn-outline w-full py-3 text-lg"
|
||||||
|
title={form.submit.title}
|
||||||
|
>
|
||||||
|
{form.submit.label}
|
||||||
</button>
|
</button>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
@@ -106,7 +110,7 @@ const apiKey = import.meta.env.PUBLIC_GOOGLE_MAPS_KEY;
|
|||||||
description={data.markerAddress}
|
description={data.markerAddress}
|
||||||
showMarker={true}
|
showMarker={true}
|
||||||
mode="contact"
|
mode="contact"
|
||||||
/>
|
mapStyleId={data.maps.mapId} />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="toast" class="fuz-toast hidden"></div>
|
<div id="toast" class="fuz-toast hidden"></div>
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ const reverse = index % 2 === 1;
|
|||||||
|
|
||||||
{section.button && (
|
{section.button && (
|
||||||
<div class="mt-8 flex justify-center">
|
<div class="mt-8 flex justify-center">
|
||||||
<a href={section.button.url} class="btn btn-outline">
|
<a href={section.button.url} class="btn btn-outline" title={section.button.title}>
|
||||||
{section.button.text}
|
{section.button.text}
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
---
|
---
|
||||||
import IframeChannelSwitcher from "../../islands/ChannelSwitcher.jsx";
|
import ChannelSwitcher from "../../islands/ChannelSwitcher.jsx";
|
||||||
|
|
||||||
const { section } = Astro.props;
|
const { section } = Astro.props;
|
||||||
---
|
---
|
||||||
@@ -14,7 +14,7 @@ const { section } = Astro.props;
|
|||||||
<div class="fuz-markdown mb-10" set:html={section.html} />
|
<div class="fuz-markdown mb-10" set:html={section.html} />
|
||||||
)}
|
)}
|
||||||
|
|
||||||
<IframeChannelSwitcher client:load sets={section.iframe_sets} />
|
<ChannelSwitcher client:load sets={section.iframe_sets} title={section.title} />
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|||||||
@@ -17,3 +17,31 @@ lng: 21.456797
|
|||||||
markerTitle: "FUZ Adam Rojek"
|
markerTitle: "FUZ Adam Rojek"
|
||||||
markerAddress: ul. Świętojańska 46</br>07-200 Wyszków
|
markerAddress: ul. Świętojańska 46</br>07-200 Wyszków
|
||||||
contactFormTitle: Pisząc wiadomość ...
|
contactFormTitle: Pisząc wiadomość ...
|
||||||
|
|
||||||
|
maps:
|
||||||
|
mapId: "8e0a97af9476f2d3"
|
||||||
|
|
||||||
|
form:
|
||||||
|
firstName:
|
||||||
|
placeholder: "Imię"
|
||||||
|
lastName:
|
||||||
|
placeholder: "Nazwisko"
|
||||||
|
email:
|
||||||
|
placeholder: "Email"
|
||||||
|
phone:
|
||||||
|
placeholder: "Telefon"
|
||||||
|
subject:
|
||||||
|
placeholder: "Temat wiadomości"
|
||||||
|
message:
|
||||||
|
placeholder: "Treść wiadomości"
|
||||||
|
rows: 5
|
||||||
|
|
||||||
|
rodo:
|
||||||
|
label: "Wyrażam zgodę na przetwarzanie moich danych osobowych zgodnie z"
|
||||||
|
policyLink: "/polityka-prywatnosci"
|
||||||
|
policyText: "polityką prywatności"
|
||||||
|
policyTitle: "Polityka prywatności FUZ Adam Rojek"
|
||||||
|
|
||||||
|
submit:
|
||||||
|
label: "Wyślij wiadomość →"
|
||||||
|
title: "Wyślij wiadomość pocztową"
|
||||||
@@ -2,12 +2,13 @@ przelaczniki:
|
|||||||
- id: "umowa"
|
- id: "umowa"
|
||||||
etykieta: "Okres umowy"
|
etykieta: "Okres umowy"
|
||||||
domyslny: "24m"
|
domyslny: "24m"
|
||||||
|
title: Wybierz okres umowy by zobaczyć odpowiednie ceny
|
||||||
opcje:
|
opcje:
|
||||||
- id: "24m"
|
- id: "24m"
|
||||||
nazwa: "24 miesiące"
|
nazwa: "24 miesiące"
|
||||||
- id: "12m"
|
- id: "12m"
|
||||||
nazwa: "12 miesięcy"
|
nazwa: "12 miesięcy"
|
||||||
- id: "bez"
|
- id: "bezterminowa"
|
||||||
nazwa: "Bezterminowa"
|
nazwa: "Bezterminowa"
|
||||||
|
|
||||||
funkcje:
|
funkcje:
|
||||||
@@ -30,7 +31,7 @@ plany:
|
|||||||
ceny:
|
ceny:
|
||||||
24m: "38 zł/mc"
|
24m: "38 zł/mc"
|
||||||
12m: "45 zł/mc"
|
12m: "45 zł/mc"
|
||||||
bez: "80 zł/mc"
|
bezterminowa: "80 zł/mc"
|
||||||
funkcje:
|
funkcje:
|
||||||
predkosc: "4 Mb/s"
|
predkosc: "4 Mb/s"
|
||||||
wysylanie: "1 Mb/s"
|
wysylanie: "1 Mb/s"
|
||||||
@@ -45,7 +46,7 @@ plany:
|
|||||||
ceny:
|
ceny:
|
||||||
24m: "45 zł/mc"
|
24m: "45 zł/mc"
|
||||||
12m: "60 zł/mc"
|
12m: "60 zł/mc"
|
||||||
bez: "110 zł/mc"
|
bezterminowa: "110 zł/mc"
|
||||||
funkcje:
|
funkcje:
|
||||||
predkosc: "6 Mb/s"
|
predkosc: "6 Mb/s"
|
||||||
wysylanie: "1 Mb/s"
|
wysylanie: "1 Mb/s"
|
||||||
@@ -59,7 +60,7 @@ plany:
|
|||||||
ceny:
|
ceny:
|
||||||
24m: "55 zł/mc"
|
24m: "55 zł/mc"
|
||||||
12m: "75 zł/mc"
|
12m: "75 zł/mc"
|
||||||
bez: "120 zł/mc"
|
bezterminowa: "120 zł/mc"
|
||||||
funkcje:
|
funkcje:
|
||||||
predkosc: "8 Mb/s"
|
predkosc: "8 Mb/s"
|
||||||
wysylanie: "1.5 Mb/s"
|
wysylanie: "1.5 Mb/s"
|
||||||
@@ -73,7 +74,7 @@ plany:
|
|||||||
ceny:
|
ceny:
|
||||||
24m: "80 zł/mc"
|
24m: "80 zł/mc"
|
||||||
12m: "110 zł/mc"
|
12m: "110 zł/mc"
|
||||||
bez: "160 zł/mc"
|
bezterminowa: "160 zł/mc"
|
||||||
funkcje:
|
funkcje:
|
||||||
predkosc: "10 Mb/s"
|
predkosc: "10 Mb/s"
|
||||||
wysylanie: "2 Mb/s"
|
wysylanie: "2 Mb/s"
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ przelaczniki:
|
|||||||
- id: "budynek"
|
- id: "budynek"
|
||||||
etykieta: "Rodzaj budynku"
|
etykieta: "Rodzaj budynku"
|
||||||
domyslny: "jednorodzinny"
|
domyslny: "jednorodzinny"
|
||||||
|
title: Zmień rodzaj budynku by zobaczyć odpowiednie ceny
|
||||||
opcje:
|
opcje:
|
||||||
- id: "jednorodzinny"
|
- id: "jednorodzinny"
|
||||||
nazwa: "Jednorodzinny"
|
nazwa: "Jednorodzinny"
|
||||||
@@ -11,6 +12,7 @@ przelaczniki:
|
|||||||
- id: "umowa"
|
- id: "umowa"
|
||||||
etykieta: "Okres umowy"
|
etykieta: "Okres umowy"
|
||||||
domyslny: "24m"
|
domyslny: "24m"
|
||||||
|
title: Wybierz okres umowy by zobaczyć odpowiednie ceny
|
||||||
opcje:
|
opcje:
|
||||||
- id: "24m"
|
- id: "24m"
|
||||||
nazwa: "24 miesiące"
|
nazwa: "24 miesiące"
|
||||||
@@ -121,4 +123,4 @@ uslugi_dodatkowe:
|
|||||||
- Jeden numer dostępny na wielu urządzeniach jednocześnie
|
- Jeden numer dostępny na wielu urządzeniach jednocześnie
|
||||||
- Krystalicznie czysty dźwięk HD
|
- Krystalicznie czysty dźwięk HD
|
||||||
|
|
||||||
[Poznaj szczegóły oferty telefonii →](/telefon)
|
[Poznaj szczegóły oferty telefonii →](/telefon "Poznaj szczegóły oferty telefonii")
|
||||||
@@ -1,14 +1,18 @@
|
|||||||
sections:
|
sections:
|
||||||
- title: Sprawdź dostępność usługi
|
- title: Sprawdź dostępność usługi
|
||||||
image: "/assets/internet/internet.webp"
|
image: "/assets/internet/internet.webp"
|
||||||
|
button:
|
||||||
|
text: "Sprawdź dostępność pod Twoim adresem →"
|
||||||
|
url: "/mapa-zasiegu"
|
||||||
|
title: "Sprawdź zasięg Internetu światłowodowego i radiowego FUZ"
|
||||||
content: |
|
content: |
|
||||||
Światłowody nie docierają jeszcze niestety do wszystkich domów.
|
Światłowody nie docierają jeszcze niestety do wszystkich domów.
|
||||||
|
|
||||||
Sprawdź czy pod Twoim adresem dostępna jest nasza usługa internetu światłowodowego.
|
[Sprawdź](/mapa-zasięgu "Sprawdź zasięg Internetu światłowodowego i radiowego FUZ") czy pod Twoim adresem dostępna jest nasza usługa internetu światłowodowego.
|
||||||
|
|
||||||
Tam gdzie nie docierają światłowody stosuje się inne technologie.
|
Tam gdzie nie docierają światłowody stosuje się inne technologie.
|
||||||
|
|
||||||
Jeśli pod Twoim adresem nie ma jeszcze usług światłowodowych, to sprawdź czy dociera tam nasz [internet radiowy →](/internet-radiowy)
|
Jeśli pod Twoim adresem nie ma jeszcze usług światłowodowych, to sprawdź czy dociera tam nasz [internet radiowy](/internet-radiowy "Przejdź do oferty Internetu radiowego").
|
||||||
|
|
||||||
- title: Router WiFi 5 AC1200
|
- title: Router WiFi 5 AC1200
|
||||||
image: "/assets/internet/E5400.webp"
|
image: "/assets/internet/E5400.webp"
|
||||||
|
|||||||
@@ -11,14 +11,17 @@ description: |
|
|||||||
Sprawdź zasięg usług i wybierz najlepsze łącze dla swojego domu.
|
Sprawdź zasięg usług i wybierz najlepsze łącze dla swojego domu.
|
||||||
imageUrl: "/images/section-tv.webp"
|
imageUrl: "/images/section-tv.webp"
|
||||||
ctas:
|
ctas:
|
||||||
- label: "Zobacz ofertę Internetu"
|
- label: "Zobacz ofertę internetu światłowodowego"
|
||||||
href: "/internet-telewizja"
|
href: "/internet-swiatlowodowy"
|
||||||
|
title: "Przejdź do oferty Internetu światłowodowego"
|
||||||
primary: false
|
primary: false
|
||||||
|
|
||||||
- label: "Zobacz ofertę telefonu"
|
- label: "Zobacz ofertę telefonu"
|
||||||
href: "/telefon"
|
href: "/telefon"
|
||||||
|
title: "Przejdź do oferty telefonu"
|
||||||
|
primary: false
|
||||||
|
|
||||||
|
- label: "Sprawdź dostępność"
|
||||||
|
href: "/mapa-zasiegu"
|
||||||
|
title: "Sprawdź zasięg Internetu światłowodowego i radiowego FUZ"
|
||||||
primary: false
|
primary: false
|
||||||
# - label: "Sprawdź dostępność"
|
|
||||||
# href: "/mapa-zasiegu"
|
|
||||||
# primary: false
|
|
||||||
# - label: "Zobacz ofertę"
|
|
||||||
# href: "/oferta"
|
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ przelaczniki:
|
|||||||
- id: "budynek"
|
- id: "budynek"
|
||||||
etykieta: "Rodzaj budynku"
|
etykieta: "Rodzaj budynku"
|
||||||
domyslny: "jednorodzinny"
|
domyslny: "jednorodzinny"
|
||||||
|
title: Zmień rodzaj budynku by zobaczyć odpowiednie ceny
|
||||||
opcje:
|
opcje:
|
||||||
- id: "jednorodzinny"
|
- id: "jednorodzinny"
|
||||||
nazwa: "Jednorodzinny"
|
nazwa: "Jednorodzinny"
|
||||||
@@ -11,6 +12,7 @@ przelaczniki:
|
|||||||
- id: "umowa"
|
- id: "umowa"
|
||||||
etykieta: "Okres umowy"
|
etykieta: "Okres umowy"
|
||||||
domyslny: "24m"
|
domyslny: "24m"
|
||||||
|
title: Wybierz okres umowy by zobaczyć odpowiednie ceny
|
||||||
opcje:
|
opcje:
|
||||||
- id: "24m"
|
- id: "24m"
|
||||||
nazwa: "24 miesiące"
|
nazwa: "24 miesiące"
|
||||||
|
|||||||
@@ -2,13 +2,13 @@ sections:
|
|||||||
- title: Dodatkowe możliwości naszej telewizji"
|
- title: Dodatkowe możliwości naszej telewizji"
|
||||||
image: "/assets/tv/ekosystem-kyanit.png"
|
image: "/assets/tv/ekosystem-kyanit.png"
|
||||||
content: |
|
content: |
|
||||||
- **Catchup** — na wybranych kanałach możesz obejrzeć audycję z ostatnich 7 dni. [Więcej →](#catchup)
|
- **Catchup** — na wybranych kanałach możesz obejrzeć audycję z ostatnich 7 dni. [Więcej →](#catchup "Przeczytaj o usłudze CatchUp")
|
||||||
|
|
||||||
- **Nagrywanie** — nagraj interesującą Cię audycję i obejrzyj ją kiedy chcesz. [Więcej →](#nagrywarka)
|
- **Nagrywanie** — nagraj interesującą Cię audycję i obejrzyj ją kiedy chcesz. [Więcej →](#nagrywarka "Przeczytaj o nagrywaniu audycji")
|
||||||
|
|
||||||
- **StartOver** — obejrzyj od początku audycję, która już się rozpoczęła (do 3h wstecz). [Więcej →](#startover)
|
- **StartOver** — obejrzyj od początku audycję, która już się rozpoczęła (do 3h wstecz). [Więcej →](#startover "Przeczytaj o usłudze StartOver")
|
||||||
|
|
||||||
- **Nagrywanie serii** — zaplanuj nagrywanie kolejnych odcinków ulubionego serialu. [Więcej →](#nagrywanie_cykliczne)
|
- **Nagrywanie serii** — zaplanuj nagrywanie kolejnych odcinków ulubionego serialu. [Więcej →](#nagrywanie_cykliczne "Przeczytaj o nagrywaniu cyklicznym")
|
||||||
|
|
||||||
- **Pauzowanie** — zatrzymuj i cofaj audycje.
|
- **Pauzowanie** — zatrzymuj i cofaj audycje.
|
||||||
|
|
||||||
|
|||||||
@@ -13,15 +13,22 @@ contact:
|
|||||||
services:
|
services:
|
||||||
- name: "Internet Światłowodowy"
|
- name: "Internet Światłowodowy"
|
||||||
url: "/internet-swiatlowodowy"
|
url: "/internet-swiatlowodowy"
|
||||||
|
title: "Przejdź do oferty Internetu światłowodowego"
|
||||||
|
|
||||||
- name: "Internet Radiowy"
|
- name: "Internet Radiowy"
|
||||||
url: "/internet-radiowy"
|
url: "/internet-radiowy"
|
||||||
|
title: "Przejdź do oferty Internetu radiowego"
|
||||||
|
|
||||||
- name: "Internet + Telewizja"
|
- name: "Internet + Telewizja"
|
||||||
url: "/internet-telewizja"
|
url: "/internet-telewizja"
|
||||||
|
title: "Przejdź do oferty Internet + Telewizja w FUZ"
|
||||||
|
|
||||||
- name: "Telefon"
|
- name: "Telefon"
|
||||||
url: "/telefon"
|
url: "/telefon"
|
||||||
|
title: "Przejdź do oferty telefonu"
|
||||||
|
|
||||||
recaptcha:
|
recaptcha:
|
||||||
Ta strona jest chroniona przez reCAPTCHA.
|
Ta strona jest chroniona przez reCAPTCHA.
|
||||||
Obowiązują
|
Obowiązują
|
||||||
Google <a href="https://policies.google.com/privacy">Polityka prywatności</a> oraz
|
Google <a class="fuz-link" href="https://policies.google.com/privacy" title="Odnośnik do polityka prywatności Google">Polityka prywatności</a> oraz
|
||||||
<a href="https://policies.google.com/terms">Warunki korzystania</a>.
|
<a class="fuz-link" href="https://policies.google.com/terms" title="Odnośnik do warynków korzystania Google">Warunki korzystania</a>.
|
||||||
@@ -4,8 +4,9 @@ sections:
|
|||||||
dimmed: true
|
dimmed: true
|
||||||
type: default
|
type: default
|
||||||
button:
|
button:
|
||||||
text: "Zobacz ofertę →"
|
text: "Zobacz ofertę Internetu Światłowodowego →"
|
||||||
url: "/internet-swiatlowodowy"
|
url: "/internet-swiatlowodowy"
|
||||||
|
title: "Przejdź do oferty Internetu światłowodowego"
|
||||||
content: |
|
content: |
|
||||||
Z naszym światłowodem zyskujesz nie tylko internet, ale przewagę — najwyższą jakość połączenia, która nigdy nie zwalnia.
|
Z naszym światłowodem zyskujesz nie tylko internet, ale przewagę — najwyższą jakość połączenia, która nigdy nie zwalnia.
|
||||||
|
|
||||||
@@ -15,8 +16,9 @@ sections:
|
|||||||
image: "/images/section-tv.webp"
|
image: "/images/section-tv.webp"
|
||||||
dimmed: true
|
dimmed: true
|
||||||
button:
|
button:
|
||||||
text: "Zobacz ofertę →"
|
text: "Zobacz ofertę Internetu + Telewizja →"
|
||||||
url: "/internet-telewizja/"
|
url: "/internet-telewizja/"
|
||||||
|
title: "Przejdź do oferty Internet + Telewizja w FUZ"
|
||||||
content: |
|
content: |
|
||||||
Internet + TV to połączenie stabilnego, szybkiego łącza z bogatą ofertą telewizyjną dla całej rodziny.
|
Internet + TV to połączenie stabilnego, szybkiego łącza z bogatą ofertą telewizyjną dla całej rodziny.
|
||||||
|
|
||||||
@@ -27,8 +29,9 @@ sections:
|
|||||||
dimmed: true
|
dimmed: true
|
||||||
type: default
|
type: default
|
||||||
button:
|
button:
|
||||||
text: "Zobacz ofertę →"
|
text: "Zobacz ofertę Internetu Radiowego →"
|
||||||
url: "/internet-radiowy/"
|
url: "/internet-radiowy/"
|
||||||
|
title: "Przejdź do oferty Internetu radiowego"
|
||||||
content: |
|
content: |
|
||||||
Nowoczesna technologia radiowa gwarantuje stabilny internet o wysokiej wydajności tam, gdzie inne łącza nie mają szans.
|
Nowoczesna technologia radiowa gwarantuje stabilny internet o wysokiej wydajności tam, gdzie inne łącza nie mają szans.
|
||||||
|
|
||||||
@@ -38,8 +41,9 @@ sections:
|
|||||||
image: "/images/section-telefon.webp"
|
image: "/images/section-telefon.webp"
|
||||||
dimmed: true
|
dimmed: true
|
||||||
button:
|
button:
|
||||||
text: "Zobacz ofertę →"
|
text: "Zobacz ofertę telefonu →"
|
||||||
url: "/internet-telewizja/"
|
url: "/internet-telewizja/"
|
||||||
|
title: "Przejdź do oferty telefonu"
|
||||||
content: |
|
content: |
|
||||||
Nasza telefonia wykorzystuje zaawansowaną technologię VoIP, dzięki której dźwięk jest wyraźny, a połączenia stabilne.
|
Nasza telefonia wykorzystuje zaawansowaną technologię VoIP, dzięki której dźwięk jest wyraźny, a połączenia stabilne.
|
||||||
|
|
||||||
|
|||||||
@@ -9,9 +9,17 @@ description: |
|
|||||||
Dziś dla wielu to niezbędne narzędzie pełne funkcji – „bez telefonu jak bez ręki".
|
Dziś dla wielu to niezbędne narzędzie pełne funkcji – „bez telefonu jak bez ręki".
|
||||||
imageUrl: "/images/section-telefon.webp"
|
imageUrl: "/images/section-telefon.webp"
|
||||||
ctas:
|
ctas:
|
||||||
- label: "Zobacz ofertę Internetu + Telewizji"
|
|
||||||
href: "/internet-telewizja"
|
|
||||||
primary: false
|
|
||||||
- label: "Zobacz ofertę internetu światłowodowego"
|
- label: "Zobacz ofertę internetu światłowodowego"
|
||||||
href: "/internet-swiatlowodowy"
|
href: "/internet-swiatlowodowy"
|
||||||
|
title: "Przejdź do oferty Internetu światłowodowego"
|
||||||
|
primary: false
|
||||||
|
|
||||||
|
- label: "Zobacz ofertę Internetu + Telewizji"
|
||||||
|
href: "/internet-telewizja"
|
||||||
|
title: "Przejdź do oferty Internet + Telewizja w FUZ"
|
||||||
|
primary: false
|
||||||
|
|
||||||
|
- label: "Sprawdź dostępność"
|
||||||
|
href: "/mapa-zasiegu"
|
||||||
|
title: "Sprawdź zasięg Internetu światłowodowego i radiowego FUZ"
|
||||||
primary: false
|
primary: false
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ paragraphs:
|
|||||||
|
|
||||||
Dzięki temu możesz cieszyć się niezawodną łącznością głosową dzięki technologii VoIP, jednocześnie korzystając z szybkiego i stabilnego dostępu do Internetu oraz bogatej oferty telewizyjnej.
|
Dzięki temu możesz cieszyć się niezawodną łącznością głosową dzięki technologii VoIP, jednocześnie korzystając z szybkiego i stabilnego dostępu do Internetu oraz bogatej oferty telewizyjnej.
|
||||||
|
|
||||||
Wybierz naszą usługę telefonu stacjonarnego z [internetem światłowodowym](/internet-swiatlowodowy) lub [internetem + telewizją](/internet-telewizja) i zyskaj kompleksowe rozwiązanie komunikacyjne dostosowane do Twoich potrzeb.
|
Wybierz naszą usługę telefonu stacjonarnego z [internetem światłowodowym](/internet-swiatlowodowy "Przejdź do oferty Internetu światłowodowego") lub [internetem + telewizją](/internet-telewizja "Przejdź do oferty Internet + Telewizja w FUZ") i zyskaj kompleksowe rozwiązanie komunikacyjne dostosowane do Twoich potrzeb.
|
||||||
|
|
||||||
|
|
||||||
# Kolejne sekcje mozna dodawać poja wiać się bedą pod tabela produktów
|
# Kolejne sekcje mozna dodawać poja wiać się bedą pod tabela produktów
|
||||||
@@ -10,4 +10,4 @@ sections:
|
|||||||
|
|
||||||
Wszystko załatwisz w kilka minut, bez sporządzania pism, wysyłania listów, czy odwiedzania biur obsługi klienta.
|
Wszystko załatwisz w kilka minut, bez sporządzania pism, wysyłania listów, czy odwiedzania biur obsługi klienta.
|
||||||
|
|
||||||
Masz pytania? [Skontaktuj się](/#contact)
|
Masz pytania? [Skontaktuj się](/#contact "Skontaktuj się z nami")
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
import { useState } from "preact/hooks";
|
import { useState } from "preact/hooks";
|
||||||
|
|
||||||
export default function ChannelSwitcher({ sets = [] }) {
|
export default function ChannelSwitcher({ sets = [], title = "" }) {
|
||||||
const [activeId, setActiveId] = useState(sets[0]?.id);
|
const [activeId, setActiveId] = useState(sets[0]?.id);
|
||||||
|
|
||||||
const active = sets.find((x) => x.id === activeId);
|
const active = sets.find((x) => x.id === activeId);
|
||||||
@@ -15,6 +15,7 @@ export default function ChannelSwitcher({ sets = [] }) {
|
|||||||
type="button"
|
type="button"
|
||||||
class={`fuz-switch ${activeId === s.id ? "active" : ""}`}
|
class={`fuz-switch ${activeId === s.id ? "active" : ""}`}
|
||||||
onClick={() => setActiveId(s.id)}
|
onClick={() => setActiveId(s.id)}
|
||||||
|
title={title}
|
||||||
>
|
>
|
||||||
{s.name}
|
{s.name}
|
||||||
</button>
|
</button>
|
||||||
|
|||||||
@@ -48,14 +48,12 @@ export default function FuzMarkdown({ text, ctx = {} }) {
|
|||||||
|
|
||||||
// Konwersja kinków na modal linki
|
// Konwersja kinków na modal linki
|
||||||
processed = processed.replace(
|
processed = processed.replace(
|
||||||
/\[([^\]]+)\]\(#([^)]+)\)/g,
|
/\[([^\]]+)\]\(#([^) "]+)(?:\s+"([^"]+)")?\)/g,
|
||||||
`<a href="#" class="modal-link" data-modal="$2">$1</a>`
|
(match, label, modalId, title) => {
|
||||||
|
return `<a href="#" class="modal-link" data-modal="${modalId}"${title ? ` title="${title}"` : ""
|
||||||
|
}>${label}</a>`;
|
||||||
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
// processed = processed.replace(
|
|
||||||
// /\[([^\]]+)\]\(#([^)]+)\)/g,
|
|
||||||
// `<button type="button" class="btn btn-outline modal-link" data-modal="$2">$1</button>`
|
|
||||||
// );
|
|
||||||
const html = marked(processed);
|
const html = marked(processed);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ export default function OffersExtraServices({
|
|||||||
<td class="fuz-feature-name">{srv.nazwa}</td>
|
<td class="fuz-feature-name">{srv.nazwa}</td>
|
||||||
<td class="fuz-feature-cell center">{srv.cena}</td>
|
<td class="fuz-feature-cell center">{srv.cena}</td>
|
||||||
<td class="fuz-feature-cell-btn center">
|
<td class="fuz-feature-cell-btn center">
|
||||||
<button class="btn-link" onClick={() => toggle(srv.id)}>
|
<button class="btn-link" onClick={() => toggle(srv.id)} title={openId === srv.id ? "Zwiń opis usługi" : "Rozwiń opis usługi"}>
|
||||||
{openId === srv.id ? "Zwiń" : "Więcej"}
|
{openId === srv.id ? "Zwiń" : "Więcej"}
|
||||||
</button>
|
</button>
|
||||||
</td>
|
</td>
|
||||||
|
|||||||
@@ -11,10 +11,10 @@ export default function OffersSwitches({ switches, selected, onSwitch }) {
|
|||||||
{sw.opcje.map((op) => (
|
{sw.opcje.map((op) => (
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
class={`fuz-switch ${
|
class={`fuz-switch ${selected[sw.id] === op.id ? "active" : ""
|
||||||
selected[sw.id] === op.id ? "active" : ""
|
|
||||||
}`}
|
}`}
|
||||||
onClick={() => onSwitch(sw.id, op.id)}
|
onClick={() => onSwitch(sw.id, op.id)}
|
||||||
|
title={sw.title}
|
||||||
>
|
>
|
||||||
{op.nazwa}
|
{op.nazwa}
|
||||||
</button>
|
</button>
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import MapSwitch from "../../components/maps/MapSwitch.astro";
|
|||||||
const apiKey = import.meta.env.PUBLIC_GOOGLE_MAPS_KEY;
|
const apiKey = import.meta.env.PUBLIC_GOOGLE_MAPS_KEY;
|
||||||
const lat = 52.597388
|
const lat = 52.597388
|
||||||
const lon = 21.456797;
|
const lon = 21.456797;
|
||||||
|
const mapStyleId="8e0a97af9476f2d3"
|
||||||
---
|
---
|
||||||
|
|
||||||
<DefaultLayout title="FUZ Mapa zasięgu sieci">
|
<DefaultLayout title="FUZ Mapa zasięgu sieci">
|
||||||
@@ -61,6 +62,7 @@ const lon = 21.456797;
|
|||||||
zoom={14}
|
zoom={14}
|
||||||
showMarker={true}
|
showMarker={true}
|
||||||
mode="full"
|
mode="full"
|
||||||
|
mapStyleId={mapStyleId}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -84,6 +84,11 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Textarea */
|
/* Textarea */
|
||||||
textarea.fuz-input {
|
/* textarea.fuz-input {
|
||||||
resize: none;
|
resize: none;
|
||||||
|
} */
|
||||||
|
|
||||||
|
.fuz-link {
|
||||||
|
color: var(--fuz-accent);
|
||||||
|
transition: color 0.2s ease;
|
||||||
}
|
}
|
||||||
@@ -33,6 +33,13 @@
|
|||||||
color: var(--fuz-text);
|
color: var(--fuz-text);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.fuz-rodo a {
|
||||||
|
color: var(--fuz-accent); /* Twój kolor linków */
|
||||||
|
}
|
||||||
|
|
||||||
|
.fuz-rodo a:hover {
|
||||||
|
color: var(--fuz-accent-hover); /* jeśli masz globalne zmienne */
|
||||||
|
}
|
||||||
/* --- TOAST --- */
|
/* --- TOAST --- */
|
||||||
|
|
||||||
.fuz-toast {
|
.fuz-toast {
|
||||||
|
|||||||
@@ -2,9 +2,11 @@
|
|||||||
--fuz-bg: #ffffff;
|
--fuz-bg: #ffffff;
|
||||||
--fuz-text: #1a1a1a;
|
--fuz-text: #1a1a1a;
|
||||||
--fuz-accent: #0066ff;
|
--fuz-accent: #0066ff;
|
||||||
--fuz-accent: #0094ff;
|
--fuz-accent-hover: #9e133d;
|
||||||
--fuz-accent-text: #ffffff;
|
--fuz-accent-text: #ffffff;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Buttons */
|
/* Buttons */
|
||||||
--btn-bg: var(--fuz-accent);
|
--btn-bg: var(--fuz-accent);
|
||||||
--btn-text: var(--fuz-accent-text);
|
--btn-text: var(--fuz-accent-text);
|
||||||
@@ -21,8 +23,11 @@
|
|||||||
--fuz-text: #e6edf3;
|
--fuz-text: #e6edf3;
|
||||||
--fuz-bg: #0d1117;
|
--fuz-bg: #0d1117;
|
||||||
--fuz-accent: #58a6ff;
|
--fuz-accent: #58a6ff;
|
||||||
|
--fuz-accent-hover: #9e133d;
|
||||||
--fuz-accent-text: #0d1117;
|
--fuz-accent-text: #0d1117;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Buttons */
|
/* Buttons */
|
||||||
--btn-bg: var(--fuz-accent);
|
--btn-bg: var(--fuz-accent);
|
||||||
--btn-text: var(--fuz-accent-text);
|
--btn-text: var(--fuz-accent-text);
|
||||||
|
|||||||
Reference in New Issue
Block a user