from pathlib import Path import zipfile, textwrap root = Path("/mnt/data/ggspot-portal") (root / "css").mkdir(parents=True, exist_ok=True) (root / "js").mkdir(parents=True, exist_ok=True) (root / "images").mkdir(parents=True, exist_ok=True) files = { "index.html": r''' GGSpot.pl — Twój świat gamingu
GGSPOT.

STREFA GRACZY I DOBREGO BRZMIENIA

Wskakuj do
GGSPOT.

Gry, nowości, poradniki i muzyka. Jedno miejsce, wiele pasji. Znajdź swój klimat i zostań z nami na dłużej.

01 / GAMING02 / NEWSY03 / MUZYKA
GAMING✳NEWSY✳MUZYKA✳SPOŁECZNOŚĆ✳GAMING✳NEWSY✳MUZYKA✳

POZNAJ GGSPOT

Twój internetowy hub.

Wybierz temat, który dziś Cię kręci.
Resztę zostaw nam.

Z REDAKCJI

Na radarze.

Wszystkie wpisy →
GAMING⌖
TECH⌘
MUZYKA♫

Przykładowe kafelki — możesz je później zastąpić własnymi artykułami.

GGSPOT.PL

Nie tylko grasz.
Jesteś częścią klimatu.

Poznaj portal ↗
''', "gaming.html": r''' Gaming — GGSpot.pl
GGSPOT.

GGSPOT / 01

Strefa gamingu.

Wszystko, co kręci się wokół grania — od wielkich premier po małe odkrycia.

KATEGORIE

Wybierz swój tryb.

🎮
01 / ROZGRYWKA

Gry

Rozmowy o grach PC, konsolowych i mobilnych.

⚙
02 / SPRZĘT

Technologia

Komputery, konsole, akcesoria i konfiguracje.

✦
03 / POMOC

Poradniki

Wskazówki, ustawienia i rozwiązania problemów.

''', "news.html": r''' Newsy — GGSpot.pl
GGSPOT.

GGSPOT / 02

Świeże info.

Artykuły, ciekawostki i tematy, o których warto pogadać.

ARTYKUŁY

Ostatnie publikacje.

GAMING⌖
TECH⌘
MUZYKA♫
''', "muzyka.html": r''' Muzyka — GGSpot.pl
GGSPOT.

GGSPOT / 03

Włącz brzmienie.

Muzyka do grania, odpoczynku i odkrywania nowych klimatów.

STREFA AUDIO

Co dziś słuchamy?

♫
01 / GATUNKI

Odkrywaj style

Rap, rock, elektronika, metal, pop i wiele więcej.

◉
02 / ARTYŚCI

Nowe odkrycia

Poznaj wykonawców i dziel się swoimi poleceniami.

▥
03 / PLAYLISTY

Dobry klimat

Muzyka na sesję, trening, podróż i chillout.

''', "o-nas.html": r''' O nas — GGSpot.pl
GGSPOT.

GGSPOT / O PROJEKCIE

Gramy po swojemu.

GGSpot to niezależny portal dla osób, które lubią gry, dobrą muzykę i internetową społeczność.

NASZA IDEA

Jedno miejsce.
Wiele zajawkowych tematów.

Chcemy tworzyć przestrzeń, w której można znaleźć gamingowe inspiracje, przeczytać ciekawe informacje, odkrywać muzykę i dzielić się pasją. Portal jest rozwijany od podstaw, bez gotowego systemu CMS.

To początek projektu — kolejne materiały i funkcje będą pojawiać się wraz z rozwojem GGSpot.pl.

Napisz do nas ↗
''', "kontakt.html": r''' Kontakt — GGSpot.pl
GGSPOT.

GGSPOT / KONTAKT

Odezwij się.

Masz pomysł, propozycję współpracy albo chcesz zgłosić temat?

NAPISZ DO NAS

Każda dobra
zajawka się liczy.

Wstaw tutaj swój adres e-mail, gdy będzie gotowy.

kontakt@ggspot.pl ↗

Uwaga: adres e-mail jest przykładowy. Zmień go na działającą skrzynkę przed publikacją.

''', "css/style.css": r'''@import url('https://fonts.googleapis.com/css2?family=Barlow+Condensed:wght@500;600;700;800;900&family=Inter:wght@400;500;600;700;800&display=swap'); :root{--bg:#080b12;--panel:#101722;--panel2:#131e2b;--line:#243242;--green:#00f5a0;--purple:#a855f7;--text:#f3f7fb;--muted:#98a6b8;--font:'Inter',Arial,sans-serif;--display:'Barlow Condensed',Impact,sans-serif} *{box-sizing:border-box}html{scroll-behavior:smooth}body{margin:0;background:var(--bg);color:var(--text);font-family:var(--font);font-size:15px;line-height:1.65}a{color:inherit;text-decoration:none}.site-shell{max-width:1600px;margin:auto;overflow:hidden}.topbar{height:82px;padding:0 clamp(20px,6vw,90px);display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid rgba(130,160,190,.14);background:rgba(8,11,18,.94);position:relative;z-index:10}.brand{display:inline-flex;align-items:center;gap:10px;font:800 25px var(--display);letter-spacing:1.5px}.brand-mark{display:grid;place-items:center;width:36px;height:36px;border:1px solid var(--green);color:var(--green);font:800 14px var(--font);letter-spacing:-1px;transform:skew(-8deg);box-shadow:0 0 16px #00f5a033}.brand-dot{color:var(--green)}.main-nav{display:flex;align-items:center;gap:clamp(16px,2.5vw,36px)}.main-nav a{font-size:12px;font-weight:700;letter-spacing:1px;text-transform:uppercase;color:#aab5c4;transition:.2s}.main-nav a:hover,.main-nav a.active{color:var(--green)}.main-nav .nav-cta{padding:10px 17px;border:1px solid #00f5a077;color:var(--green)}.menu-toggle{display:none;background:none;border:1px solid var(--line);color:var(--green);font-size:22px;padding:5px 11px}.hero{min-height:650px;position:relative;display:grid;grid-template-columns:1.1fr .9fr;align-items:center;padding:70px clamp(20px,10vw,150px);background:radial-gradient(ellipse at 75% 50%,#122d31 0,transparent 42%),linear-gradient(115deg,#080b12 45%,#0b151d)}.hero-grid{position:absolute;inset:0;opacity:.14;background-image:linear-gradient(rgba(0,245,160,.12) 1px,transparent 1px),linear-gradient(90deg,rgba(0,245,160,.12) 1px,transparent 1px);background-size:55px 55px;mask-image:linear-gradient(90deg,transparent,#000)}.hero-content{position:relative;z-index:1;max-width:620px}.eyebrow{margin:0 0 17px;color:var(--green);font-size:10px;font-weight:800;letter-spacing:2.5px}.live-dot{display:inline-block;width:7px;height:7px;margin-right:8px;border-radius:50%;background:var(--green);box-shadow:0 0 12px var(--green)}h1,h2,h3,p{margin-top:0}.hero h1,.page-hero h1{font:900 clamp(68px,9vw,120px)/.88 var(--display);letter-spacing:-2px;margin:0 0 26px}.neon-text{color:var(--green);text-shadow:0 0 22px #00f5a033}.hero-period{color:var(--purple)}.hero-copy{max-width:500px;color:var(--muted);font-size:16px;line-height:1.9}.hero-actions{display:flex;gap:12px;flex-wrap:wrap;margin-top:30px}.button{display:inline-flex;align-items:center;gap:22px;padding:13px 19px;font-size:11px;font-weight:800;letter-spacing:1px;text-transform:uppercase;transition:.2s}.button-primary{background:var(--green);color:#06110d;box-shadow:0 0 25px #00f5a022}.button-primary:hover{background:#fff;transform:translateY(-2px);box-shadow:0 0 30px #00f5a055}.button-ghost{border:1px solid #526171;color:#e4ebf3}.button-ghost:hover{border-color:var(--green);color:var(--green)}.hero-meta{display:flex;align-items:center;gap:13px;margin-top:60px;color:#627184;font-size:9px;font-weight:700;letter-spacing:1.5px}.hero-meta i{height:1px;width:24px;background:#344454}.hero-art{height:420px;position:relative;display:grid;place-items:center}.orbit{position:absolute;border:1px solid #00f5a044;border-radius:50%;transform:rotate(-25deg)}.orbit-one{width:340px;height:340px;box-shadow:0 0 55px #00f5a010}.orbit-two{width:430px;height:230px;border-color:#a855f755;transform:rotate(35deg)}.hero-core{width:220px;height:220px;border:1px solid #00f5a0a8;border-radius:50%;display:flex;flex-direction:column;align-items:center;justify-content:center;background:radial-gradient(circle,#173c39,#0a121a 70%);box-shadow:0 0 65px #00f5a022,inset 0 0 35px #00f5a022;transform:rotate(-8deg)}.hero-core strong{font:900 58px/.9 var(--display);letter-spacing:2px}.core-small{font-size:11px;color:var(--green);font-weight:800;letter-spacing:4px}.core-line{width:65px;height:2px;background:var(--green);margin:14px 0 9px;box-shadow:0 0 10px var(--green)}.hero-core small{font-size:8px;letter-spacing:2px;color:#a8b7c5}.float-tag{position:absolute;padding:9px 13px;background:#101b25;border:1px solid #314451;color:#b8c6d3;font-size:9px;font-weight:800;letter-spacing:1.5px}.float-tag b{color:var(--green);margin-left:8px}.tag-top{top:60px;right:5%}.tag-bottom{bottom:58px;left:2%}.ticker{overflow:hidden;border-top:1px solid #1d2d39;border-bottom:1px solid #1d2d39;background:#0d141d}.ticker-track{min-width:max-content;display:flex;align-items:center;justify-content:space-around;gap:38px;padding:15px 0;color:#9baabb;font:700 12px var(--display);letter-spacing:3px}.ticker-track b{color:var(--green);font-size:15px}.section{padding:100px clamp(20px,9vw,135px)}.section-heading{display:flex;align-items:end;justify-content:space-between;gap:25px;margin-bottom:35px}.section-heading h2,.community-banner h2,.prose h2{font:800 clamp(38px,5vw,58px)/.98 var(--display);letter-spacing:-.5px;margin:0}.section-note{color:var(--muted);font-size:12px;line-height:1.8;margin:0}.feature-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:16px}.feature-card{position:relative;min-height:260px;padding:28px;background:linear-gradient(145deg,#121e2a,#0d141e);border:1px solid #273747;transition:.25s;overflow:hidden}.feature-card:after{content:"";position:absolute;width:160px;height:160px;border-radius:50%;right:-80px;bottom:-100px;background:var(--glow,var(--green));filter:blur(75px);opacity:.15}.feature-card:hover{transform:translateY(-5px);border-color:var(--green);box-shadow:0 12px 35px #0005}.feature-gaming{--glow:#00f5a0}.feature-news{--glow:#a855f7}.feature-music{--glow:#00b7ff}.feature-icon{font-size:30px;color:var(--green);margin-bottom:25px}.card-kicker{display:block;color:#718397;font-size:9px;font-weight:800;letter-spacing:2px}.feature-card h3{font:800 34px var(--display);margin:7px 0}.feature-card p{max-width:260px;color:var(--muted);font-size:12px;line-height:1.8}.card-arrow{position:absolute;right:25px;bottom:23px;color:var(--green);font-size:20px}.latest-section{padding-top:35px;background:#0b1119}.text-link{color:var(--green);font-size:11px;font-weight:800;letter-spacing:.7px}.text-link span{margin-left:8px}.article-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:18px}.article-card{background:#101822;border:1px solid #263543}.article-visual{height:175px;position:relative;display:grid;place-items:center;overflow:hidden}.article-visual:before,.article-visual:after{content:"";position:absolute;border:1px solid #ffffff20;transform:rotate(35deg)}.article-visual:before{width:220px;height:130px}.article-visual:after{width:150px;height:220px}.visual-one{background:radial-gradient(circle at 50% 50%,#1b6552,#102b30 50%,#101822)}.visual-two{background:radial-gradient(circle at 50% 50%,#49306c,#201b38 55%,#101822)}.visual-three{background:radial-gradient(circle at 50% 50%,#164f71,#102c42 55%,#101822)}.visual-label{position:absolute;top:15px;left:16px;font-size:9px;font-weight:800;letter-spacing:2px;color:#d4e1e8}.visual-symbol{font:700 80px var(--display);color:#d9fff1;text-shadow:0 0 30px var(--green)}.article-info{padding:22px}.article-meta{color:#718397;font-size:9px;font-weight:800;letter-spacing:1.4px}.article-meta span{color:var(--green);padding:0 5px}.article-info h3{font:700 25px/1.1 var(--display);margin:12px 0}.article-info>p:not(.article-meta){font-size:11px;color:var(--muted);line-height:1.8;min-height:40px}.demo-note{color:#68798a;font-size:10px;margin:18px 0 0}.community-banner{margin:0 clamp(20px,9vw,135px) 90px;padding:48px 55px;display:flex;justify-content:space-between;align-items:center;gap:25px;background:linear-gradient(110deg,#112a28,#111c2b);border:1px solid #28634f}.community-banner h2{font-size:clamp(35px,4vw,52px)}.footer{padding:35px clamp(20px,6vw,90px) 22px;border-top:1px solid #263543;background:#070a10}.footer>p{color:#778799;font-size:11px;margin:12px 0 28px}.footer-bottom{display:flex;justify-content:space-between;gap:15px;flex-wrap:wrap;border-top:1px solid #202d39;padding-top:17px;color:#68798a;font-size:10px}.footer-bottom a{color:var(--green)}.page-hero{padding:110px clamp(20px,10vw,150px) 85px;background:radial-gradient(ellipse at 80% 50%,#12342f,transparent 45%),#0a1018;border-bottom:1px solid #253441}.page-hero h1{font-size:clamp(58px,8vw,96px)}.page-hero>p:last-child{max-width:620px;color:var(--muted);font-size:15px}.prose{max-width:1000px}.prose>p:not(.eyebrow){max-width:760px;color:var(--muted);line-height:2}.prose h2{margin-bottom:25px}.prose .button{margin-top:15px}.contact-panel{display:flex;justify-content:space-between;align-items:center;gap:30px;padding:35px;background:#101b26;border:1px solid #2a414c}.contact-panel h2{margin-bottom:20px}.contact-panel p:not(.eyebrow){color:var(--muted);font-size:12px} @media(max-width:850px){.main-nav{gap:14px}.main-nav a{font-size:10px}.hero{grid-template-columns:1fr;padding-top:90px}.hero-art{height:330px;margin-top:25px}.feature-grid,.article-grid{grid-template-columns:1fr 1fr}.feature-card:last-child,.article-card:last-child{grid-column:span 2}} @media(max-width:650px){.topbar{height:70px}.menu-toggle{display:block}.main-nav{display:none;position:absolute;top:69px;left:0;right:0;padding:18px 22px 24px;background:#0b121b;border-bottom:1px solid var(--line);flex-direction:column;align-items:stretch;gap:18px}.main-nav.open{display:flex}.main-nav a{font-size:12px}.main-nav .nav-cta{text-align:center}.hero{min-height:auto;padding:75px 22px 40px}.hero h1{font-size:70px}.hero-art{height:290px;transform:scale(.85);margin:-5px -30px}.hero-meta{margin-top:38px;gap:7px;font-size:7px}.hero-meta i{width:12px}.section{padding:70px 22px}.section-heading{align-items:start;flex-direction:column}.feature-grid,.article-grid{grid-template-columns:1fr}.feature-card:last-child,.article-card:last-child{grid-column:auto}.feature-card{min-height:220px}.community-banner{margin:0 22px 60px;padding:30px;align-items:flex-start;flex-direction:column}.page-hero{padding:80px 22px 60px}.page-hero h1{font-size:64px}.contact-panel{align-items:flex-start;flex-direction:column}.footer-bottom{flex-direction:column}.ticker-track{gap:22px}} ''', "js/main.js": r'''document.addEventListener("DOMContentLoaded", () => { const toggle = document.querySelector(".menu-toggle"); const nav = document.querySelector(".main-nav"); if (toggle && nav) { toggle.addEventListener("click", () => { const isOpen = nav.classList.toggle("open"); toggle.setAttribute("aria-expanded", String(isOpen)); toggle.textContent = isOpen ? "×" : "☰"; }); nav.querySelectorAll("a").forEach(link => { link.addEventListener("click", () => { nav.classList.remove("open"); toggle.setAttribute("aria-expanded", "false"); toggle.textContent = "☰"; }); }); } document.querySelectorAll("[data-year]").forEach(el => { el.textContent = new Date().getFullYear(); }); });''', "README.txt": '''GGSPOT.PL — PORTAL STATYCZNY ============================ ZAWARTOŚĆ - index.html strona główna - gaming.html dział gamingowy - news.html aktualności (przykładowe wpisy) - muzyka.html dział muzyczny - o-nas.html informacje o projekcie - kontakt.html kontakt - css/style.css wygląd strony - js/main.js menu mobilne i automatyczny rok stopki INSTALACJA NA CT8 1. Rozpakuj archiwum na komputerze. 2. Połącz się z hostingiem przez FTP. 3. Otwórz katalog przypisany do domeny ggspot.pl (często public_html lub katalog domeny — sprawdź w panelu CT8). 4. Wgraj CAŁĄ zawartość folderu ggspot-portal, zachowując strukturę katalogów. 5. Upewnij się, że plik startowy nazywa się dokładnie index.html. 6. Otwórz https://ggspot.pl i odśwież stronę. WAŻNE - To jest statyczny portal HTML/CSS/JS. Nie wymaga CMS ani bazy danych. - Nie ma panelu administratora, logowania, komentarzy ani publikowania wpisów z przeglądarki. - Kafelki artykułów są przykładowe. Zmień ich teksty i linki w plikach HTML. - W pliku kontakt.html adres kontakt@ggspot.pl jest przykładowy. Zmień go na działający adres. - Fonty Google są ładowane z zewnętrznej usługi. Strona ma fonty zapasowe, jeśli usługa będzie niedostępna. ''' } for name, content in files.items(): (root / name).write_text(content, encoding="utf-8") zip_path = Path("/mnt/data/GGSpot-portal-HTML-CSS-JS.zip") with zipfile.ZipFile(zip_path, "w", zipfile.ZIP_DEFLATED) as z: for p in root.rglob("*"): if p.is_file(): z.write(p, p.relative_to(root.parent)) print(f"Utworzono: {zip_path}") print(f"Liczba plików: {len(files)}")