Przejdź do głównej treści
INF.03-10-24.06-SGCzerwiec 2024 · 36 kroków · ok. 77 min · 37 kryteriów z klucza

Rozwiązanie krok po kroku: Witryna z kartami pracowników (Nowoczesny kod (grid))

To drugi sposób rozwiązania tego samego arkusza. Wynik jest ten sam - baza kadra z czterema zapytaniami, logo z przezroczystym tłem i strona pracownicy.html z dwoma banerami, trzema kartami pracowniczymi, cytatami zmienianymi kliknięciem i stopką - i tak samo spełnia każde kryterium klucza. Inna jest droga:

  • siatka CSS na całej stronie: dwa banery w kolumnach 50% 50% (klucz R.4.5 przyjmuje grid-template-columns), a pod nimi pozostałe bloki na całą szerokość - bez float i clear; trzy karty też na siatce,
  • kolory w zmiennych CSS,
  • cytaty bez identyfikatorów: drugi i trzeci ukrywa selektor sąsiedztwa blockquote + blockquote, a skrypt pracuje na liście cytatów,
  • cytaty obsługiwane także z klawiatury od pierwszej wersji skryptu: da się do nich przejść klawiszem Tab i zmienić je Enterem albo spacją,
  • współczesny JavaScript: const, querySelectorAll, addEventListener i jedna funkcja z resztą z dzielenia zamiast trzech gałęzi if,
  • SQL czytelniej: alias dla COUNT(*), aliasy tabel i nieujemny typ nowej kolumny.

Na końcu krótkie porównanie z wersją podstawową (zakładka obok). Baza, zdjęcia i teksty pochodzą z prawdziwego archiwum pliki10, zapytania zostały wykonane na tej bazie w MariaDB z XAMPP-a, a skrypt jest sprawdzony w prawdziwej przeglądarce Chrome: kliknięcia, Enter i spacja, położenie bloków i kart.

Jak liczą się punkty. Klucz ma 37 kryteriów (R.1.1 - R.5.7), każde za 1 punkt. Próg zdania to 75%, czyli 28 punktów. Przy każdym kroku jest napisane, które kryteria spełnia.

  1. Etap 1: Baza danych

    Kroki 1-7 · po tym etapie masz 6 z 37 kryteriów (pkt)

    Krok 1: Baza danych kadra

    ok. 2 min
    Polecenie z arkusza

    Utwórz bazę danych o nazwie kadra, z zestawem polskich znaków (np. utf8_unicode_ci)

    Archiwum pliki10.zip rozpakuj hasłem K@dra_FirMy# (małpa zamiast „a”, podkreślnik, wielkie M, krzyżyk na końcu) do folderu z numerem zdającego. W phpMyAdmin Nowa → kadra, porównywanie utf8_unicode_ci, albo zapytaniem:

    CREATE DATABASE kadra CHARACTER SET utf8 COLLATE utf8_unicode_ci;
    
  2. Krok 2: Import tabel z pliku baza.sql

    ok. 2 min
    Polecenie z arkusza

    Do bazy zaimportuj tabele z pliku baza.sql z rozpakowanego archiwum

    Zaznaczona baza kadra, Import → baza.sql. Dwie tabele z obrazu 1: pracownicy (imię, nazwisko, pensja, staż w latach i klucz obcy stanowiska_id) oraz stanowiska (identyfikator i nazwa).

  3. Krok 3: Zrzut ekranu import.png

    Kryteria:

    R.1.1 Wykonano import tabel do bazy danych kadra czynność udokumentowano plikiem o nazwie import w formacie PNG

    ok. 2 min
    Polecenie z arkusza

    Wykonaj zrzut ekranu po imporcie. Zrzut zapisz w formacie PNG i nazwij import. Nie kadruj zrzutu. Powinien on obejmować cały ekran monitora, z widocznym paskiem zadań. Na zrzucie powinny być widoczne elementy wskazujące na poprawnie wykonany import tabel.

    Cały ekran z paskiem zadań, w PNG. Zrzuty zapytań idą później do JPEG (kw1.jpg - kw4.jpg).

    Typowe błędy

    Wykadrowany zrzut albo zrzut bez paska zadań nie jest oceniany (uwaga w kluczu przy R.1).

  4. Krok 4: Zapytanie 1: liczba osób z każdą pensją

    Kryteria: ,

    R.1.2 Zapisano plik kwerendy.txt zawierający co najmniej jedno zapytanie SQL, wynikające z treści zadania

    R.1.3 Wykonano zapytanie 1 wybierające jedynie liczbę wierszy i pensję grupując pracowników według pensji i sortując dane malejąco ze względu na pensję. W pliku z kwerendami lub na zrzucie istnieje zapis np.: SELECT COUNT(*), pensja FROM pracownicy GROUP BY pensja ORDER BY pensja DESC; oraz wynik działania udokumentowano zrzutem, na którym jest widocznych dokładnie 7 rekordów z danymi: 1 8000; 2 6000; 1 5050; 3 5000; 2 4700; 3 4000; 2 3800

    ok. 3 min
    Polecenie z arkusza

    Zapytanie 1: wybierające jedynie liczbę wierszy i pensję grupując pracowników według pensji i sortując dane malejąco ze względu na pensję. W wyniku zapytania są wyświetlane poszczególne pensje oraz liczba osób, które pobierają taką pensję

    • GROUP BY pensja - jedna grupa na każdą różną pensję, COUNT(*) liczy wiersze w grupie,
    • AS liczbaOsob - bez aliasu kolumna wyniku nazywa się dosłownie COUNT(*); alias mówi, co liczba znaczy (arkusz go nie wymaga),
    • ORDER BY pensja DESC - od najwyższej pensji.

    Wynik: 7 wierszy, od 1 osoby z pensją 8000 do 2 osób z pensją 3800, jak w kluczu. Zapytania zapisz w kwerendy.txt, zrzut jako kw1.jpg.

    Typowe błędy

    ORDER BY bez DESC sortuje rosnąco - te same 7 wierszy w odwrotnej kolejności nie spełnia polecenia.

    kwerendy.txt Tekst nowy plik
    -- Zapytanie 1
    SELECT COUNT(*) AS liczbaOsob, pensja
    FROM pracownicy
    GROUP BY pensja
    ORDER BY pensja DESC;
    Podgląd strony po tym kroku
    Podgląd strony po kroku 4
  5. Krok 5: Zapytanie 2: pracownicy ze stażem powyżej 10 lat

    Kryteria:

    R.1.4 Wykonano zapytanie 2 wybierające jedynie imiona i nazwiska pracowników oraz odpowiadające im nazwy stanowisk dla pracowników o stażu wyższym niż 10 lat. W pliku z kwerendami lub na zrzucie istnieje zapis np.: SELECT imie, nazwisko, nazwa FROM pracownicy JOIN stanowiska ON stanowiska_id = stanowiska.id WHERE staz > 10; (możliwe również INNER JOIN lub porównanie kluczy po WHERE) oraz wynik działania udokumentowano zrzutem, na którym są widoczne dokładnie 4 rekordy z wartościami: Krzysztof Dobromilski Dyrektor, Ewa Nowak Kadrowa, Joanna Trojanowska Kierownik, Konrad Grzegorzewski Kierownik

    ok. 3 min
    Polecenie z arkusza

    Zapytanie 2: wybierające jedynie imiona i nazwiska pracowników oraz odpowiadające im nazwy stanowisk dla pracowników o stażu wyższym niż 10 lat. Należy posłużyć się relacją

    Aliasy p (pracownicy) i s (stanowiska) - przy każdej kolumnie widać tabelę, a ON s.id = p.stanowiska_id pokazuje parę kluczy relacji. p.staz > 10 - „wyższym niż 10”, bez równości, więc Jan Nowacki ze stażem 10 odpada. Wynik: 4 wiersze - Dobromilski (Dyrektor), Nowak (Kadrowa), Trojanowska i Grzegorzewski (Kierownik). Zrzut: kw2.jpg.

    Typowe błędy

    staz >= 10 dopisuje piątego pracownika (Nowacki) - klucz wymaga dokładnie 4 rekordów.

    kwerendy.txt Tekst zmienione: 6 linii
    -- Zapytanie 1
    SELECT COUNT(*) AS liczbaOsob, pensja
    FROM pracownicy
    GROUP BY pensja
    ORDER BY pensja DESC;
    
    -- Zapytanie 2
    SELECT p.imie, p.nazwisko, s.nazwa
    FROM pracownicy AS p
    JOIN stanowiska AS s ON s.id = p.stanowiska_id
    WHERE p.staz > 10;
    Podgląd strony po tym kroku
    Podgląd strony po kroku 5
  6. Krok 6: Zapytanie 3: staż od 10 do 20 lat

    Kryteria:

    R.1.5 Wykonano zapytanie 3 wybierające jedynie nazwiska i pensję dla pracowników, których staż wynosi od 10 do 20 lat. W pliku z kwerendami lub na zrzucie istnieje zapis np.: SELECT nazwisko, pensja FROM pracownicy WHERE staz >= 10 AND staz <= 20; (możliwe również z zastosowaniem BETWEEN) oraz wynik działania udokumentowano zrzutem, na którym jest widocznych dokładnie 5 rekordów z danymi: Nowak 5000, Trojanowska 6000, Nowacki 5050, Grzegorzewski 6000, Trębosz 4000

    ok. 2 min
    Polecenie z arkusza

    Zapytanie 3: wybierające jedynie nazwiska i pensję dla pracowników, których staż wynosi od 10 do 20 lat

    BETWEEN 10 AND 20 obejmuje oba końce - to samo co staz >= 10 AND staz <= 20, a czyta się jak polecenie. Wynik: 5 wierszy - Nowak 5000, Trojanowska 6000, Nowacki 5050, Grzegorzewski 6000, Trębosz 4000; staż 10 i 20 wchodzi. Zrzut: kw3.jpg.

    kwerendy.txt Tekst zmienione: 5 linii
    -- Zapytanie 1
    SELECT COUNT(*) AS liczbaOsob, pensja
    FROM pracownicy
    GROUP BY pensja
    ORDER BY pensja DESC;
    
    -- Zapytanie 2
    SELECT p.imie, p.nazwisko, s.nazwa
    FROM pracownicy AS p
    JOIN stanowiska AS s ON s.id = p.stanowiska_id
    WHERE p.staz > 10;
    
    -- Zapytanie 3
    SELECT nazwisko, pensja
    FROM pracownicy
    WHERE staz BETWEEN 10 AND 20;
    Podgląd strony po tym kroku
    Podgląd strony po kroku 6
  7. Krok 7: Zapytanie 4: kolumna minPensja

    Kryteria:

    R.1.6 Wykonano zapytanie 4 Dodające do tabeli stanowiska kolumnę o nazwie minPensja dowolnego typu całkowitego. W pliku z kwerendami lub na zrzucie istnieje zapis np.: ALTER TABLE stanowiska ADD COLUMN minPensja INT; (COLUMN jest opcjonalne, dozwolone różne inne typy całkowite) oraz wynik działania udokumentowano zrzutem, na którym widoczne jest poprawnie wykonane zapytanie lub struktura tabeli stanowiska z kolumną minPensja

    ok. 2 min
    Polecenie z arkusza

    Zapytanie 4: Dodające do tabeli stanowiska kolumnę o nazwie minPensja dowolnego typu całkowitego

    ALTER TABLE ... ADD COLUMN. Typ INT UNSIGNED - pensja nie bywa ujemna, a w tabeli pracownicy kolumna pensja ma właśnie ten typ, więc obie wartości da się porównywać bez zastrzeżeń. NULL wprost: dla istniejących stanowisk minimalnej pensji jeszcze nie ustalono. Klucz przyjmuje dowolny typ całkowity. Na zrzucie kw4.jpg struktura tabeli stanowiska z nową kolumną.

    Typowe błędy

    DECIMAL albo FLOAT to nie typ całkowity - kryterium nie jest spełnione.

    kwerendy.txt Tekst zmienione: 4 linie
    -- Zapytanie 1
    SELECT COUNT(*) AS liczbaOsob, pensja
    FROM pracownicy
    GROUP BY pensja
    ORDER BY pensja DESC;
    
    -- Zapytanie 2
    SELECT p.imie, p.nazwisko, s.nazwa
    FROM pracownicy AS p
    JOIN stanowiska AS s ON s.id = p.stanowiska_id
    WHERE p.staz > 10;
    
    -- Zapytanie 3
    SELECT nazwisko, pensja
    FROM pracownicy
    WHERE staz BETWEEN 10 AND 20;
    
    -- Zapytanie 4
    ALTER TABLE stanowiska
    ADD COLUMN minPensja INT UNSIGNED NULL;
    Podgląd strony po tym kroku
    Podgląd strony po kroku 7
  8. Etap 2: Grafika i strona HTML

    Kroki 8-18 · po tym etapie masz 17 z 37 kryteriów (pkt)

    Krok 8: Logo: przezroczyste tło, kadr i 100 px wysokości

    Kryteria:

    R.2.1 Nadano grafice logo.png przezroczyste tło oraz wykadrowano tak, aby kształt wypełniał całość obrazu. Wymiary grafiki to: wysokość 100 px i szerokość 102 px (± 10 px)

    ok. 4 min
    Polecenie z arkusza

    Dla grafiki logo.png (górny lewy róg obrazu 2) należy: Ustawić przezroczyste tło. Skadrować, tak aby kształt wypełniał całość obrazu. Przeskalować z zachowaniem proporcji do dokładnej wysokości 100 px

    Grafika jest taka sama jak w wersji podstawowej. W GIMP-ie, w tej kolejności:

    1. Warstwa → Przezroczystość → Dodaj kanał alfa, różdżka na białym tle i Delete,
    2. Obraz → Przytnij do zawartości - z 640 × 640 px zostaje sama kula, 330 × 325 px,
    3. Obraz → Skaluj obraz, wysokość 100 px przy zamkniętym łańcuchu - szerokość wychodzi 102 px (klucz: 102 ±10).

    Eksport pod tą samą nazwą, w PNG. Po lewej oryginał, po prawej wynik na szachownicy.

    Typowe błędy

    Skalowanie przed kadrowaniem daje obraz 100 × 100 px z małą kulą w środku - kształt nie wypełnia obrazu.

    Podgląd strony po tym kroku
    Podgląd strony po kroku 8
  9. Krok 9: Plik pracownicy.html: HTML5, język, kodowanie

    Kryteria:

    R.2.2 Witrynę internetową zapisano w pliku pracownicy.html oraz zapisano jawnie standard kodowania polskich znaków i deklarację HTML5 <!DOCTYPE HTML> i zadeklarowano język witryny polski np.<HTML lang="pl">. Strona zawiera sekcje head i body

    ok. 2 min
    Polecenie z arkusza

    Składa się ze strony o nazwie pracownicy.html zapisanej w języku HTML5. Ustawiony język zawartości strony na polski. Jawnie zastosowany właściwy standard kodowania polskich znaków

    <!DOCTYPE html>, <html lang="pl"> i <meta charset="UTF-8"> jako pierwszy element <head> - razem jedno kryterium (R.2.2).

    pracownicy.html HTML nowy plik
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
    </head>
    <body>
    </body>
    </html>
    Podgląd strony po tym kroku (pracownicy.html)
  10. Krok 10: Tytuł strony

    Kryteria:

    R.2.3 Nadano tytuł stronie: Nasz zespół

    ok. 1 min
    Polecenie z arkusza

    Tytuł strony widoczny na karcie przeglądarki: „Nasz zespół”

    <title> i viewport - telefon nie pomniejsza strony do rozmiaru ekranu komputera.

    pracownicy.html HTML zmienione: 2 linie
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Nasz zespół</title>
    </head>
    <body>
    </body>
    </html>
    Podgląd strony po tym kroku (pracownicy.html)
  11. Krok 11: Podpięcie arkusza stylów

    Kryteria:

    R.3.5 Strona zawiera działające połączenie z zewnętrznym arkuszem stylów o nazwie styl.css , formatowanie CSS pochodzi jedynie z tego arkusza Uwaga: kryterium to nie jest spełnione również, gdy zdający źle przypisał co najmniej jeden selektor do bloku (np. kropka zamiast #)

    ok. 1 min
    Polecenie z arkusza

    Arkusz stylów w pliku o nazwie styl.css prawidłowo połączony z kodem strony

    Całe formatowanie pochodzi ze styl.css - bez atrybutów style i znacznika <style> w HTML-u (R.3.5).

    Typowe błędy

    Klucz odbiera R.3.5 także wtedy, gdy choć jeden selektor nie trafia w blok (np. kropka zamiast #).

    pracownicy.html HTML zmienione: 1 linia
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Nasz zespół</title>
        <link rel="stylesheet" href="styl.css">
    </head>
    <body>
    </body>
    </html>
    Podgląd strony po tym kroku (pracownicy.html)
  12. Krok 12: Bloki: dwa banery, główny, cytaty, stopka

    Kryteria:

    R.2.4 Układ strony zdefiniowano dzieląc ją na: dwa bloki banera, blok główny, blok cytatu, stopka. Zastosowano semantyczne znaczniki sekcji HTML5 zgodnie z ich znaczeniem, w tym do części nagłówkowej - header, stopki - footer, dopuszcza się zagnieżdżenie bloków div w znacznikach semantycznych

    ok. 3 min
    Polecenie z arkusza

    Podział strony na: dwa bloki banera obok siebie, poniżej blok główny, poniżej blok cytatu, na dole stopka. Podział zrealizowany wyłącznie za pomocą semantycznych znaczników sekcji języka HTML5 tak, aby po uruchomieniu w przeglądarce wygląd układu bloków był zgodny z obrazem 2

    • dwa banery to dwa <header> (klucz R.2.4 wymaga header dla części nagłówkowej; na stronie może ich być kilka). Każdy ma dwie klasy: wspólną banner (jeden styl dla obu) i własną - logo albo title - która wskaże mu kolumnę siatki,
    • blok główny <main>, blok cytatów <section class="quotes">, stopka <footer>.

    Klasy zamiast identyfikatorów: identyfikator musi być jedyny na stronie, a klasa niczego nie zakłada - przy stylach to wygodniejszy i częstszy wybór. Identyfikatorów nie będzie potrzebował nawet skrypt (R.2.4).

    pracownicy.html HTML zmienione: 10 linii
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Nasz zespół</title>
        <link rel="stylesheet" href="styl.css">
    </head>
    <body>
        <header class="banner logo">
        </header>
        <header class="banner title">
        </header>
        <main>
        </main>
        <section class="quotes">
        </section>
        <footer>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (pracownicy.html)
  13. Krok 13: Pierwszy baner: logo

    Kryteria:

    R.2.5 W pierwszym bloku banera umieszczono obraz logo.png z tekstem alternatywnym "logo firmy"

    ok. 1 min
    Polecenie z arkusza

    Zawartość pierwszego banera: obraz logo.png z tekstem alternatywnym „logo firmy”

    <img> z przygotowanym plikiem i alt="logo firmy".

    pracownicy.html HTML zmienione: 1 linia
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Nasz zespół</title>
        <link rel="stylesheet" href="styl.css">
    </head>
    <body>
        <header class="banner logo">
            <img src="logo.png" alt="logo firmy">
        </header>
        <header class="banner title">
        </header>
        <main>
        </main>
        <section class="quotes">
        </section>
        <footer>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (pracownicy.html)
  14. Krok 14: Drugi baner: nagłówek

    ok. 1 min
    Polecenie z arkusza

    Zawartość drugiego banera: nagłówek pierwszego stopnia o treści „Nasz zespół”

    <h1> - jedyny nagłówek pierwszego stopnia na stronie.

    pracownicy.html HTML zmienione: 1 linia
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Nasz zespół</title>
        <link rel="stylesheet" href="styl.css">
    </head>
    <body>
        <header class="banner logo">
            <img src="logo.png" alt="logo firmy">
        </header>
        <header class="banner title">
            <h1>Nasz zespół</h1>
        </header>
        <main>
        </main>
        <section class="quotes">
        </section>
        <footer>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (pracownicy.html)
  15. Krok 15: Pierwsza karta pracownicza

    Kryteria: , ,

    R.2.7 Umieszczono obraz osoba1.jpg z tekstem alternatywnym "Dyrektor" lub obraz osoba2.jpg z tekstem alternatywnym "Kierownik logistyków" lub obraz osoba3.jpg z tekstem alternatywnym "Kadry"

    R.2.8 Umieszczono w przynajmniej jednym bloku karty nagłówek h2 z imieniem i nazwiskiem, h3 ze stanowiskiem, h5 z odnośnikiem oraz dwa paragrafy z opisem i numerem telefonu

    R.3.3 Umieszczono przynajmniej jeden odnośnik pocztowy o treści "Kontakt" , prowadzący do adresu email, np. <a href="mailto:[email protected]">Kontakt</a>

    ok. 4 min
    Polecenie z arkusza

    Zawartość bloku głównego: trzy bloki kart pracowniczych, umieszczone obok siebie. Zawartość kart jest zgodna z obrazem 2. Dane do kart należy skopiować do dokumentu HTML z pliku tekstyNaStrone.txt, wypakowanego z archiwum. Każdy z bloków zawiera: Obraz z tekstem alternatywnym. Imię i nazwisko w nagłówku drugiego stopnia. Stanowisko w nagłówku trzeciego stopnia. Opis i numer telefonu w dwóch paragrafach (akapitach). Odnośnik pocztowy o treści „Kontakt” do adresu e-mail danej osoby, zapisany w nagłówku piątego stopnia

    Karta to zamknięta treść o jednej osobie - <article> z klasą card. W środku, w kolejności z arkusza:

    • <img> z plikiem i tekstem alternatywnym z tekstyNaStrone.txt (dla dyrektora osoba1.jpg, „Dyrektor”) - R.2.7,
    • <h2> z imieniem i nazwiskiem, <h3> ze stanowiskiem, dwa akapity: opis i telefon,
    • <h5> z odnośnikiem mailto: - kliknięcie otwiera program pocztowy z wpisanym odbiorcą (R.3.3).

    Pierwsza karta jest kompletna (R.2.8).

    Typowe błędy

    Adres bez mailto: przeglądarka traktuje jak plik na serwerze - odnośnik nie jest pocztowy.

    pracownicy.html HTML zmienione: 8 linii
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Nasz zespół</title>
        <link rel="stylesheet" href="styl.css">
    </head>
    <body>
        <header class="banner logo">
            <img src="logo.png" alt="logo firmy">
        </header>
        <header class="banner title">
            <h1>Nasz zespół</h1>
        </header>
        <main>
            <article class="card">
                <img src="osoba1.jpg" alt="Dyrektor">
                <h2>Krzysztof Dobromilski</h2>
                <h3>Dyrektor</h3>
                <p>Firma logistyczna była jego marzeniem. Zrealizował je 10 lat temu. Nasza firma prosperuje dzięki Krzysztofowi</p>
                <p>telefon: 111222333</p>
                <h5><a href="mailto:[email protected]">Kontakt</a></h5>
            </article>
        </main>
        <section class="quotes">
        </section>
        <footer>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (pracownicy.html)
  16. Krok 16: Druga i trzecia karta

    ok. 3 min
    Polecenie z arkusza

    Zawartość kart jest zgodna z obrazem 2.

    Dwie kopie karty z danymi z tekstyNaStrone.txt: Joanna Trojanowska (osoba2.jpg, alt „Kierownik logistyków”) i Ewa Nowak (osoba3.jpg, alt „Kadry”, stanowisko „Księgowość i kadry”). Obok siebie postawi je CSS.

    pracownicy.html HTML zmienione: 16 linii
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Nasz zespół</title>
        <link rel="stylesheet" href="styl.css">
    </head>
    <body>
        <header class="banner logo">
            <img src="logo.png" alt="logo firmy">
        </header>
        <header class="banner title">
            <h1>Nasz zespół</h1>
        </header>
        <main>
            <article class="card">
                <img src="osoba1.jpg" alt="Dyrektor">
                <h2>Krzysztof Dobromilski</h2>
                <h3>Dyrektor</h3>
                <p>Firma logistyczna była jego marzeniem. Zrealizował je 10 lat temu. Nasza firma prosperuje dzięki Krzysztofowi</p>
                <p>telefon: 111222333</p>
                <h5><a href="mailto:[email protected]">Kontakt</a></h5>
            </article>
            <article class="card">
                <img src="osoba2.jpg" alt="Kierownik logistyków">
                <h2>Joanna Trojanowska</h2>
                <h3>Kierownik logistyków</h3>
                <p>Od początku firmy z nami. Wie jak zorganizować pracę swoich logistyków aby wszystko było na czas</p>
                <p>telefon: 222333444</p>
                <h5><a href="mailto:[email protected]">Kontakt</a></h5>
            </article>
            <article class="card">
                <img src="osoba3.jpg" alt="Kadry">
                <h2>Ewa Nowak</h2>
                <h3>Księgowość i kadry</h3>
                <p>Od lat finanse powierzamy niezawodnej Ewie. Twardą ręką trzyma kasę i dba o wszystkich pracowników</p>
                <p>telefon: 333444555</p>
                <h5><a href="mailto:[email protected]">Kontakt</a></h5>
            </article>
        </main>
        <section class="quotes">
        </section>
        <footer>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (pracownicy.html)
  17. Krok 17: Blok cytatów: trzy cytaty

    Kryteria:

    R.2.9 W bloku cytatów umieszczono przynajmniej jeden cytat, zastosowano znacznik blockquote lub q

    ok. 3 min
    Polecenie z arkusza

    Zawartość bloku cytatów: Trzy cytaty, które należy skopiować do dokumentu HTML z pliku tekstynastrone.txt. Do zdefiniowania poszczególnych cytatów należy zastosować znacznik semantyczny przeznaczony dla cytatu. Treść cytatu jest zapisana w cudzysłowach, imię w paragrafie.

    <blockquote> - znacznik dłuższego cytatu (R.2.9). Treść w cudzysłowach, jak w pliku, autor w akapicie. Cytaty nie mają identyfikatorów: skrypt weźmie je jako listę, w kolejności z kodu.

    Cytat zmienia się po kliknięciu, więc działa jak przycisk - i tak go opisują dwa atrybuty:

    • tabindex="0" - do cytatu można przejść klawiszem Tab (zwykły blok tekstu nie dostaje fokusu),
    • role="button" - czytnik ekranu zapowie go jako przycisk, czyli coś, co da się nacisnąć.
    pracownicy.html HTML zmienione: 12 linii
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Nasz zespół</title>
        <link rel="stylesheet" href="styl.css">
    </head>
    <body>
        <header class="banner logo">
            <img src="logo.png" alt="logo firmy">
        </header>
        <header class="banner title">
            <h1>Nasz zespół</h1>
        </header>
        <main>
            <article class="card">
                <img src="osoba1.jpg" alt="Dyrektor">
                <h2>Krzysztof Dobromilski</h2>
                <h3>Dyrektor</h3>
                <p>Firma logistyczna była jego marzeniem. Zrealizował je 10 lat temu. Nasza firma prosperuje dzięki Krzysztofowi</p>
                <p>telefon: 111222333</p>
                <h5><a href="mailto:[email protected]">Kontakt</a></h5>
            </article>
            <article class="card">
                <img src="osoba2.jpg" alt="Kierownik logistyków">
                <h2>Joanna Trojanowska</h2>
                <h3>Kierownik logistyków</h3>
                <p>Od początku firmy z nami. Wie jak zorganizować pracę swoich logistyków aby wszystko było na czas</p>
                <p>telefon: 222333444</p>
                <h5><a href="mailto:[email protected]">Kontakt</a></h5>
            </article>
            <article class="card">
                <img src="osoba3.jpg" alt="Kadry">
                <h2>Ewa Nowak</h2>
                <h3>Księgowość i kadry</h3>
                <p>Od lat finanse powierzamy niezawodnej Ewie. Twardą ręką trzyma kasę i dba o wszystkich pracowników</p>
                <p>telefon: 333444555</p>
                <h5><a href="mailto:[email protected]">Kontakt</a></h5>
            </article>
        </main>
        <section class="quotes">
            <blockquote tabindex="0" role="button">
                "Każdego dnia stawiam sobie nieosiągalne wyzwania i próbuję je wykonać"
                <p>- Krzysztof</p>
            </blockquote>
            <blockquote tabindex="0" role="button">
                "Nie bój się porażek, im więcej ich rozwiążesz, tym szybciej osiągniesz cel"
                <p>- Joanna</p>
            </blockquote>
            <blockquote tabindex="0" role="button">
                "Niezadowolony pracownik jest dla mnie źródłem nauki"
                <p>- Ewa</p>
            </blockquote>
        </section>
        <footer>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (pracownicy.html)
  18. Krok 18: Stopka

    Kryteria:

    R.2.6 W drugim bloku banera zapisano nagłówek h1 "Nasz zespół" , zapisano przynajmniej jeden paragraf w bloku cytatów oraz paragraf w bloku stopki

    ok. 1 min
    Polecenie z arkusza

    Zawartość stopki: paragraf o treści: „Stronę wykonał: ”, dalej wstawiony numer zdającego.

    Akapit w <footer>. Na egzaminie po dwukropku wpisujesz swój numer zdającego (PESEL), tu stoi autor rozwiązania. Z <h1> i akapitami w cytatach to R.2.6.

    pracownicy.html HTML zmienione: 1 linia
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Nasz zespół</title>
        <link rel="stylesheet" href="styl.css">
    </head>
    <body>
        <header class="banner logo">
            <img src="logo.png" alt="logo firmy">
        </header>
        <header class="banner title">
            <h1>Nasz zespół</h1>
        </header>
        <main>
            <article class="card">
                <img src="osoba1.jpg" alt="Dyrektor">
                <h2>Krzysztof Dobromilski</h2>
                <h3>Dyrektor</h3>
                <p>Firma logistyczna była jego marzeniem. Zrealizował je 10 lat temu. Nasza firma prosperuje dzięki Krzysztofowi</p>
                <p>telefon: 111222333</p>
                <h5><a href="mailto:[email protected]">Kontakt</a></h5>
            </article>
            <article class="card">
                <img src="osoba2.jpg" alt="Kierownik logistyków">
                <h2>Joanna Trojanowska</h2>
                <h3>Kierownik logistyków</h3>
                <p>Od początku firmy z nami. Wie jak zorganizować pracę swoich logistyków aby wszystko było na czas</p>
                <p>telefon: 222333444</p>
                <h5><a href="mailto:[email protected]">Kontakt</a></h5>
            </article>
            <article class="card">
                <img src="osoba3.jpg" alt="Kadry">
                <h2>Ewa Nowak</h2>
                <h3>Księgowość i kadry</h3>
                <p>Od lat finanse powierzamy niezawodnej Ewie. Twardą ręką trzyma kasę i dba o wszystkich pracowników</p>
                <p>telefon: 333444555</p>
                <h5><a href="mailto:[email protected]">Kontakt</a></h5>
            </article>
        </main>
        <section class="quotes">
            <blockquote tabindex="0" role="button">
                "Każdego dnia stawiam sobie nieosiągalne wyzwania i próbuję je wykonać"
                <p>- Krzysztof</p>
            </blockquote>
            <blockquote tabindex="0" role="button">
                "Nie bój się porażek, im więcej ich rozwiążesz, tym szybciej osiągniesz cel"
                <p>- Joanna</p>
            </blockquote>
            <blockquote tabindex="0" role="button">
                "Niezadowolony pracownik jest dla mnie źródłem nauki"
                <p>- Ewa</p>
            </blockquote>
        </section>
        <footer>
            <p>Stronę wykonał: Bartosz Bryniarski</p>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (pracownicy.html)
  19. Etap 3: Styl CSS

    Kroki 19-30 · po tym etapie masz 30 z 37 kryteriów (pkt)

    Krok 19: Plik styl.css: zmienne i krój Bookman Old Style

    Kryteria:

    R.4.1 Ustawiono domyślne formatowanie wszystkich selektorów (dla *): krój czcionki "Bookman Old Style", Serif - tylko taka kolejność jest poprawna

    ok. 2 min
    Polecenie z arkusza

    Domyślne formatowanie wszystkich selektorów: krój czcionki Bookman Old Style, w przypadku braku - Serif

    Kolory z arkusza w zmiennych na :root - nazwy mówią, do czego służą (--contact-hover), a nie jaki to kolor. Krój ze spacjami w cudzysłowie, rodzina zapasowa serif na końcu - klucz uznaje tylko tę kolejność (R.4.1).

    styl.css CSS nowy plik
    :root {
        --banner-color: DarkCyan;
        --card-color: Azure;
        --contact-color: Teal;
        --contact-hover: LightSeaGreen;
    }
    
    * {
        font-family: "Bookman Old Style", serif;
    }
    Podgląd strony po tym kroku (pracownicy.html)
  20. Krok 20: Układ bloków na siatce

    Kryteria:

    R.3.1 Układ bloków po uruchomieniu strony w przeglądarce jest zgodny z obrazem 2 w arkuszu egzaminacyjnym, nie należy brać pod uwagę zawartości bloku głównego (prawidłowo zastosowano właściwości CSS decydujące o układzie strony, np. float i clear albo display flex albo grid)

    ok. 3 min
    Polecenie z arkusza

    Podział strony na: dwa bloki banera obok siebie, poniżej blok główny, poniżej blok cytatu, na dole stopka. Podział zrealizowany wyłącznie za pomocą semantycznych znaczników sekcji języka HTML5 tak, aby po uruchomieniu w przeglądarce wygląd układu bloków był zgodny z obrazem 2

    grid-template-areas rysuje obraz 2: w pierwszym wierszu dwa banery obok siebie, pod nimi blok główny, cytaty i stopka - każdy przez obie kolumny. grid-template-columns: 50% 50% to od razu szerokości banerów z arkusza (klucz R.4.5 przyjmuje je w tej postaci). Bez float nie trzeba clear - blok główny ma swój wiersz (R.3.1).

    styl.css CSS zmienione: 30 linii
    :root {
        --banner-color: DarkCyan;
        --card-color: Azure;
        --contact-color: Teal;
        --contact-hover: LightSeaGreen;
    }
    
    * {
        font-family: "Bookman Old Style", serif;
    }
    
    body {
        display: grid;
        grid-template-columns: 50% 50%;
        grid-template-areas:
            "logo   title"
            "main   main"
            "quotes quotes"
            "footer footer";
    }
    
    .logo {
        grid-area: logo;
    }
    
    .title {
        grid-area: title;
    }
    
    main {
        grid-area: main;
    }
    
    .quotes {
        grid-area: quotes;
    }
    
    footer {
        grid-area: footer;
    }
    Podgląd strony po tym kroku (pracownicy.html)
  21. Krok 21: Oba banery

    Kryteria:

    R.4.4 Ustawiono wysokość obu banerów: 100px

    ok. 2 min
    Polecenie z arkusza

    Dla obu bloków banera: kolor tła DarkCyan, biały kolor czcionki, szerokość 50%, wysokość 100 px, odstępy między literami 15 px

    Wspólna klasa .banner. Szerokość 50% daje kolumna siatki - dopisane width: 50% liczyłoby się od kolumny i zwęziło baner do ćwierci strony. letter-spacing rozstrzela litery „Nasz zespół” jak na obrazie 2 (R.4.4).

    Typowe błędy

    width: 50% na banerze w kolumnie 50% daje baner szeroki na 25% strony - procent szerokości elementu siatki liczy się od jego kolumny.

    styl.css CSS zmienione: 7 linii
    :root {
        --banner-color: DarkCyan;
        --card-color: Azure;
        --contact-color: Teal;
        --contact-hover: LightSeaGreen;
    }
    
    * {
        font-family: "Bookman Old Style", serif;
    }
    
    body {
        display: grid;
        grid-template-columns: 50% 50%;
        grid-template-areas:
            "logo   title"
            "main   main"
            "quotes quotes"
            "footer footer";
    }
    
    .logo {
        grid-area: logo;
    }
    
    .title {
        grid-area: title;
    }
    
    main {
        grid-area: main;
    }
    
    .quotes {
        grid-area: quotes;
    }
    
    footer {
        grid-area: footer;
    }
    
    .banner {
        background-color: var(--banner-color);
        color: white;
        height: 100px;
        letter-spacing: 15px;
    }
    Podgląd strony po tym kroku (pracownicy.html)
  22. Krok 22: Stopka

    ok. 1 min
    Polecenie z arkusza

    Dla bloku stopki kolor tła DarkCyan, biały kolor czcionki

    Ten sam kolor co banery - ze zmiennej.

    styl.css CSS zmienione: 5 linii
    :root {
        --banner-color: DarkCyan;
        --card-color: Azure;
        --contact-color: Teal;
        --contact-hover: LightSeaGreen;
    }
    
    * {
        font-family: "Bookman Old Style", serif;
    }
    
    body {
        display: grid;
        grid-template-columns: 50% 50%;
        grid-template-areas:
            "logo   title"
            "main   main"
            "quotes quotes"
            "footer footer";
    }
    
    .logo {
        grid-area: logo;
    }
    
    .title {
        grid-area: title;
    }
    
    main {
        grid-area: main;
    }
    
    .quotes {
        grid-area: quotes;
    }
    
    footer {
        grid-area: footer;
    }
    
    .banner {
        background-color: var(--banner-color);
        color: white;
        height: 100px;
        letter-spacing: 15px;
    }
    
    footer {
        background-color: var(--banner-color);
        color: white;
    }
    Podgląd strony po tym kroku (pracownicy.html)
  23. Krok 23: Karta pracownicza: siatka, tło, margines i cień

    Kryteria: ,

    R.3.2 W bloku głównym zdefiniowano trzy bloki kart pracowniczych, umieszczone obok siebie zgodnie z obrazem 2

    R.4.8 Ustawiono dla bloków kart pracowniczych cień bloku o przesunięciu w obu osiach 4px, rozmyciu 8px, kolorze DimGray, np. box-shadow: 4px 4px 8px DimGray;

    ok. 3 min
    Polecenie z arkusza

    Dla bloku karty pracowniczej: kolor tła Azure, szerokość 30%, marginesy zewnętrzne 1%, cień bloku o przesunięciu w obu osiach 4 px, rozmyciu 8 px, kolorze DimGray

    • main dostaje własną siatkę: repeat(3, 30%) to trzy kolumny po 30% - szerokość karty z arkusza zapisana raz, w siatce. Karty stają obok siebie (R.3.2),
    • margin: 1% - jak każe arkusz. Uwaga na siatkę: procentowy margines elementu siatki liczy się od jego kolumny (30%), więc wychodzi drobniejszy niż w wersji podstawowej. Odstęp między kartami daje column-gap: 2% - tyle, ile dwa marginesy po 1% w wersji podstawowej,
    • box-shadow: 4px 4px 8px DimGray - przesunięcie w poziomie i w pionie, rozmycie, kolor (R.4.8).
    styl.css CSS zmienione: 12 linii
    :root {
        --banner-color: DarkCyan;
        --card-color: Azure;
        --contact-color: Teal;
        --contact-hover: LightSeaGreen;
    }
    
    * {
        font-family: "Bookman Old Style", serif;
    }
    
    body {
        display: grid;
        grid-template-columns: 50% 50%;
        grid-template-areas:
            "logo   title"
            "main   main"
            "quotes quotes"
            "footer footer";
    }
    
    .logo {
        grid-area: logo;
    }
    
    .title {
        grid-area: title;
    }
    
    main {
        grid-area: main;
    }
    
    .quotes {
        grid-area: quotes;
    }
    
    footer {
        grid-area: footer;
    }
    
    .banner {
        background-color: var(--banner-color);
        color: white;
        height: 100px;
        letter-spacing: 15px;
    }
    
    footer {
        background-color: var(--banner-color);
        color: white;
    }
    
    main {
        display: grid;
        grid-template-columns: repeat(3, 30%);
        column-gap: 2%;
    }
    
    .card {
        background-color: var(--card-color);
        margin: 1%;
        box-shadow: 4px 4px 8px DimGray;
    }
    Podgląd strony po tym kroku (pracownicy.html)
  24. Krok 24: Zdjęcia tylko w kartach

    ok. 1 min
    Polecenie z arkusza

    Jedynie dla obrazów w karcie pracowniczej: szerokość 100%

    Selektor potomka .card img - logo w banerze zostaje w swoim rozmiarze. display: block (dodatek) usuwa kilka pikseli przerwy pod zdjęciem: obraz w linii tekstu zostawia pod sobą miejsce na „ogonki” liter.

    styl.css CSS zmienione: 5 linii
    :root {
        --banner-color: DarkCyan;
        --card-color: Azure;
        --contact-color: Teal;
        --contact-hover: LightSeaGreen;
    }
    
    * {
        font-family: "Bookman Old Style", serif;
    }
    
    body {
        display: grid;
        grid-template-columns: 50% 50%;
        grid-template-areas:
            "logo   title"
            "main   main"
            "quotes quotes"
            "footer footer";
    }
    
    .logo {
        grid-area: logo;
    }
    
    .title {
        grid-area: title;
    }
    
    main {
        grid-area: main;
    }
    
    .quotes {
        grid-area: quotes;
    }
    
    footer {
        grid-area: footer;
    }
    
    .banner {
        background-color: var(--banner-color);
        color: white;
        height: 100px;
        letter-spacing: 15px;
    }
    
    footer {
        background-color: var(--banner-color);
        color: white;
    }
    
    main {
        display: grid;
        grid-template-columns: repeat(3, 30%);
        column-gap: 2%;
    }
    
    .card {
        background-color: var(--card-color);
        margin: 1%;
        box-shadow: 4px 4px 8px DimGray;
    }
    
    .card img {
        width: 100%;
        display: block;
    }
    Podgląd strony po tym kroku (pracownicy.html)
  25. Krok 25: Akapity i nagłówki h2, h3

    ok. 1 min
    Polecenie z arkusza

    Dla paragrafu oraz nagłówków drugiego i trzeciego stopnia: marginesy zewnętrzne 15 px

    Trzy selektory w jednej regule - odsuwają tekst od brzegów karty.

    styl.css CSS zmienione: 4 linie
    :root {
        --banner-color: DarkCyan;
        --card-color: Azure;
        --contact-color: Teal;
        --contact-hover: LightSeaGreen;
    }
    
    * {
        font-family: "Bookman Old Style", serif;
    }
    
    body {
        display: grid;
        grid-template-columns: 50% 50%;
        grid-template-areas:
            "logo   title"
            "main   main"
            "quotes quotes"
            "footer footer";
    }
    
    .logo {
        grid-area: logo;
    }
    
    .title {
        grid-area: title;
    }
    
    main {
        grid-area: main;
    }
    
    .quotes {
        grid-area: quotes;
    }
    
    footer {
        grid-area: footer;
    }
    
    .banner {
        background-color: var(--banner-color);
        color: white;
        height: 100px;
        letter-spacing: 15px;
    }
    
    footer {
        background-color: var(--banner-color);
        color: white;
    }
    
    main {
        display: grid;
        grid-template-columns: repeat(3, 30%);
        column-gap: 2%;
    }
    
    .card {
        background-color: var(--card-color);
        margin: 1%;
        box-shadow: 4px 4px 8px DimGray;
    }
    
    .card img {
        width: 100%;
        display: block;
    }
    
    p, h2, h3 {
        margin: 15px;
    }
    Podgląd strony po tym kroku (pracownicy.html)
  26. Krok 26: Odnośniki: biały tekst

    Kryteria:

    R.4.3 Ustawiono biały kolor czcionki dla obu banerów, stopki oraz selektora a

    ok. 1 min
    Polecenie z arkusza

    Dla selektora odnośnika: biały kolor czcionki

    Uwaga w arkuszu i w kluczu: wyłącznie selektor a - nie klasa, nie h5 a. Tu nowoczesność ustępuje projektowi: arkusz zastrzega to pod „późniejszą rozbudowę witryny”. Banery, stopka i odnośniki mają już biały tekst (R.4.3).

    Typowe błędy

    Reguła .card a albo h5 a nie spełnia R.4.3, nawet jeśli tekst jest biały - klucz sprawdza selektor.

    styl.css CSS zmienione: 4 linie
    :root {
        --banner-color: DarkCyan;
        --card-color: Azure;
        --contact-color: Teal;
        --contact-hover: LightSeaGreen;
    }
    
    * {
        font-family: "Bookman Old Style", serif;
    }
    
    body {
        display: grid;
        grid-template-columns: 50% 50%;
        grid-template-areas:
            "logo   title"
            "main   main"
            "quotes quotes"
            "footer footer";
    }
    
    .logo {
        grid-area: logo;
    }
    
    .title {
        grid-area: title;
    }
    
    main {
        grid-area: main;
    }
    
    .quotes {
        grid-area: quotes;
    }
    
    footer {
        grid-area: footer;
    }
    
    .banner {
        background-color: var(--banner-color);
        color: white;
        height: 100px;
        letter-spacing: 15px;
    }
    
    footer {
        background-color: var(--banner-color);
        color: white;
    }
    
    main {
        display: grid;
        grid-template-columns: repeat(3, 30%);
        column-gap: 2%;
    }
    
    .card {
        background-color: var(--card-color);
        margin: 1%;
        box-shadow: 4px 4px 8px DimGray;
    }
    
    .card img {
        width: 100%;
        display: block;
    }
    
    p, h2, h3 {
        margin: 15px;
    }
    
    a {
        color: white;
    }
    Podgląd strony po tym kroku (pracownicy.html)
  27. Krok 27: Nagłówek piątego stopnia: pasek „Kontakt”

    Kryteria: ,

    R.4.2 Ustawiono kolor tła DarkCyan dla obu banerów i stopki oraz Azure dla bloków kart pracowniczych i Teal dla nagłówka h5

    R.4.5 Ustawiono szerokość obu banerów 50% (width lub grid-template-columns lub flex), bloków kart pracowniczych 30%, nagłówka h5 100%, oraz jedynie obrazów w blokach kart pracowniczych 100%

    ok. 2 min
    Polecenie z arkusza

    Dla nagłówka piątego stopnia: kolor tła Teal, szerokość 100%, wyrównanie tekstu do środka, marginesy wewnętrzne górny i dolny 10 px, pozostałe 0

    padding-block: 10px - margines wewnętrzny górny i dolny, padding-inline: 0 - lewy i prawy. To właściwości logiczne: dokładnie to, co mówi arkusz, bez liczenia, która wartość skrótu padding jest która. Ta reguła domyka kolory tła (R.4.2) i szerokości (R.4.5: banery w kolumnach, karty 30%, h5 i zdjęcia 100%).

    styl.css CSS zmienione: 8 linii
    :root {
        --banner-color: DarkCyan;
        --card-color: Azure;
        --contact-color: Teal;
        --contact-hover: LightSeaGreen;
    }
    
    * {
        font-family: "Bookman Old Style", serif;
    }
    
    body {
        display: grid;
        grid-template-columns: 50% 50%;
        grid-template-areas:
            "logo   title"
            "main   main"
            "quotes quotes"
            "footer footer";
    }
    
    .logo {
        grid-area: logo;
    }
    
    .title {
        grid-area: title;
    }
    
    main {
        grid-area: main;
    }
    
    .quotes {
        grid-area: quotes;
    }
    
    footer {
        grid-area: footer;
    }
    
    .banner {
        background-color: var(--banner-color);
        color: white;
        height: 100px;
        letter-spacing: 15px;
    }
    
    footer {
        background-color: var(--banner-color);
        color: white;
    }
    
    main {
        display: grid;
        grid-template-columns: repeat(3, 30%);
        column-gap: 2%;
    }
    
    .card {
        background-color: var(--card-color);
        margin: 1%;
        box-shadow: 4px 4px 8px DimGray;
    }
    
    .card img {
        width: 100%;
        display: block;
    }
    
    p, h2, h3 {
        margin: 15px;
    }
    
    a {
        color: white;
    }
    
    h5 {
        background-color: var(--contact-color);
        width: 100%;
        text-align: center;
        padding-block: 10px;
        padding-inline: 0;
    }
    Podgląd strony po tym kroku (pracownicy.html)
  28. Krok 28: Kursor na pasku „Kontakt”

    Kryteria:

    R.4.10 W momencie gdy kursor myszy znajdzie się na nagłówku h5 jego kolor tła zmienia się na LightSeaGreen

    ok. 1 min
    Polecenie z arkusza

    W momencie gdy kursor myszy znajdzie się na nagłówku piątego stopnia jego kolor tła zmienia się na LightSeaGreen (patrz obraz 2 – środkowa karta)

    :hover - kursor nad nagłówkiem (R.4.10). :focus-within - nagłówek, w którym coś ma fokus: przejście klawiszem Tab do odnośnika „Kontakt” podświetla cały pasek tak samo jak kursor.

    styl.css CSS zmienione: 5 linii
    :root {
        --banner-color: DarkCyan;
        --card-color: Azure;
        --contact-color: Teal;
        --contact-hover: LightSeaGreen;
    }
    
    * {
        font-family: "Bookman Old Style", serif;
    }
    
    body {
        display: grid;
        grid-template-columns: 50% 50%;
        grid-template-areas:
            "logo   title"
            "main   main"
            "quotes quotes"
            "footer footer";
    }
    
    .logo {
        grid-area: logo;
    }
    
    .title {
        grid-area: title;
    }
    
    main {
        grid-area: main;
    }
    
    .quotes {
        grid-area: quotes;
    }
    
    footer {
        grid-area: footer;
    }
    
    .banner {
        background-color: var(--banner-color);
        color: white;
        height: 100px;
        letter-spacing: 15px;
    }
    
    footer {
        background-color: var(--banner-color);
        color: white;
    }
    
    main {
        display: grid;
        grid-template-columns: repeat(3, 30%);
        column-gap: 2%;
    }
    
    .card {
        background-color: var(--card-color);
        margin: 1%;
        box-shadow: 4px 4px 8px DimGray;
    }
    
    .card img {
        width: 100%;
        display: block;
    }
    
    p, h2, h3 {
        margin: 15px;
    }
    
    a {
        color: white;
    }
    
    h5 {
        background-color: var(--contact-color);
        width: 100%;
        text-align: center;
        padding-block: 10px;
        padding-inline: 0;
    }
    
    h5:hover,
    h5:focus-within {
        background-color: var(--contact-hover);
    }
    Podgląd strony po tym kroku (pracownicy.html)
  29. Krok 29: Blok cytatów

    Kryteria: , ,

    R.4.6 Ustawiono wyrównanie tekstu do środka dla nagłówka h5 i bloku cytatów

    R.4.7 Ustawiono marginesy wewnętrzne (padding) dla nagłówka h5 jedynie górny i dolny 10px, dla bloku cytatów jedynie górny i dolny 30px oraz zewnętrzne (margin) dla paragrafu, nagłówków h2 i h3 15px, dla bloków kart pracowniczych 1%

    R.4.9 Ustawiono dla obu banerów odstępy między literami 15px (letter-spacing) oraz dla bloku cytatów czcionkę pochyloną

    ok. 2 min
    Polecenie z arkusza

    Dla bloku cytatów: wyrównanie tekstu do środka, marginesy wewnętrzne górny i dolny 30 px, pozostałe 0, czcionka pochylona

    Te same właściwości logiczne co przy h5, font-style: italic dla pochylenia. Domknięte: wyrównanie (h5 i cytaty - R.4.6), marginesy (R.4.7), rozstrzelenie liter banerów i kursywa cytatów (R.4.9).

    styl.css CSS zmienione: 7 linii
    :root {
        --banner-color: DarkCyan;
        --card-color: Azure;
        --contact-color: Teal;
        --contact-hover: LightSeaGreen;
    }
    
    * {
        font-family: "Bookman Old Style", serif;
    }
    
    body {
        display: grid;
        grid-template-columns: 50% 50%;
        grid-template-areas:
            "logo   title"
            "main   main"
            "quotes quotes"
            "footer footer";
    }
    
    .logo {
        grid-area: logo;
    }
    
    .title {
        grid-area: title;
    }
    
    main {
        grid-area: main;
    }
    
    .quotes {
        grid-area: quotes;
    }
    
    footer {
        grid-area: footer;
    }
    
    .banner {
        background-color: var(--banner-color);
        color: white;
        height: 100px;
        letter-spacing: 15px;
    }
    
    footer {
        background-color: var(--banner-color);
        color: white;
    }
    
    main {
        display: grid;
        grid-template-columns: repeat(3, 30%);
        column-gap: 2%;
    }
    
    .card {
        background-color: var(--card-color);
        margin: 1%;
        box-shadow: 4px 4px 8px DimGray;
    }
    
    .card img {
        width: 100%;
        display: block;
    }
    
    p, h2, h3 {
        margin: 15px;
    }
    
    a {
        color: white;
    }
    
    h5 {
        background-color: var(--contact-color);
        width: 100%;
        text-align: center;
        padding-block: 10px;
        padding-inline: 0;
    }
    
    h5:hover,
    h5:focus-within {
        background-color: var(--contact-hover);
    }
    
    .quotes {
        text-align: center;
        padding-block: 30px;
        padding-inline: 0;
        font-style: italic;
    }
    Podgląd strony po tym kroku (pracownicy.html)
  30. Krok 30: Drugi i trzeci cytat ukryte

    Kryteria:

    R.5.2 W stanie początkowym wyświetlany jest tylko pierwszy cytat ("Każdego dnia…"), pozostałe są niewidoczne

    ok. 2 min
    Polecenie z arkusza

    Drugi i trzeci cytat jest usunięty (nie jest wyświetlany)

    blockquote + blockquote to selektor sąsiedztwa: cytat, który stoi bezpośrednio po innym cytacie. Pierwszy cytat nie ma poprzednika, więc zostaje; drugi i trzeci znikają (display: none - nie zajmują miejsca). Bez identyfikatorów i bez wyliczania numerów - czwarty cytat w HTML-u też byłby na starcie ukryty (R.5.2).

    cursor: pointer pokazuje rączkę nad cytatem - podpowiedź, że da się go kliknąć.

    styl.css CSS zmienione: 8 linii
    :root {
        --banner-color: DarkCyan;
        --card-color: Azure;
        --contact-color: Teal;
        --contact-hover: LightSeaGreen;
    }
    
    * {
        font-family: "Bookman Old Style", serif;
    }
    
    body {
        display: grid;
        grid-template-columns: 50% 50%;
        grid-template-areas:
            "logo   title"
            "main   main"
            "quotes quotes"
            "footer footer";
    }
    
    .logo {
        grid-area: logo;
    }
    
    .title {
        grid-area: title;
    }
    
    main {
        grid-area: main;
    }
    
    .quotes {
        grid-area: quotes;
    }
    
    footer {
        grid-area: footer;
    }
    
    .banner {
        background-color: var(--banner-color);
        color: white;
        height: 100px;
        letter-spacing: 15px;
    }
    
    footer {
        background-color: var(--banner-color);
        color: white;
    }
    
    main {
        display: grid;
        grid-template-columns: repeat(3, 30%);
        column-gap: 2%;
    }
    
    .card {
        background-color: var(--card-color);
        margin: 1%;
        box-shadow: 4px 4px 8px DimGray;
    }
    
    .card img {
        width: 100%;
        display: block;
    }
    
    p, h2, h3 {
        margin: 15px;
    }
    
    a {
        color: white;
    }
    
    h5 {
        background-color: var(--contact-color);
        width: 100%;
        text-align: center;
        padding-block: 10px;
        padding-inline: 0;
    }
    
    h5:hover,
    h5:focus-within {
        background-color: var(--contact-hover);
    }
    
    .quotes {
        text-align: center;
        padding-block: 30px;
        padding-inline: 0;
        font-style: italic;
    }
    
    blockquote {
        cursor: pointer;
    }
    
    blockquote + blockquote {
        display: none;
    }
    Podgląd strony po tym kroku (pracownicy.html)
  31. Etap 4: JavaScript

    Kroki 31-34 · po tym etapie masz 37 z 37 kryteriów (pkt)

    Krok 31: Kliknięcie w pierwszy cytat

    Kryteria: , , ,

    R.3.4 Dla dowolnego cytatu zdefiniowano zdarzenie związane z jego kliknięciem , które uruchamia funkcję skryptu (atrybut onClick lub słuchacz zdarzenia click lub właściwość onclick obiektu DOM)

    R.5.1 Skrypt zapisano w języku JavaScript i zawiera on przynajmniej jedną instrukcję zapisaną zgodnie ze składnią

    R.5.3 Po kliknięciu na cytat jeżeli jest wyświetlony pierwszy cytat, zostaje on ukryty, a wyświetlony zostaje drugi cytat ("Nie bój się porażek...")

    R.5.6 Przynajmniej jedna czynność z R.5.3 do R.5.5 jest zrealizowana poprzez zmianę właściwości display lub visibility stylu CSS

    ok. 3 min
    Polecenie z arkusza

    Działanie funkcji dla kliknięcia w pierwszy cytat: Pierwszy cytat jest usuwany/ukryty. Drugi cytat jest uwidoczniony (blokowo)

    Skrypt na końcu <body>, w pliku strony (klucz sprawdza go „w kodzie strony”).

    • const quotes - lista trzech cytatów, w kolejności z HTML-u,
    • showNextQuote(index) ukrywa cytat o podanej pozycji i pokazuje następny „blokowo”. Klucz R.5.6 wymaga zmiany właściwości display (albo visibility) stylu, dlatego skrypt ustawia style.display, a nie klasę CSS,
    • forEach podpina każdemu cytatowi nasłuchiwacz click; funkcja strzałkowa pamięta pozycję cytatu (index) i przekazuje ją dalej (R.3.4).

    Arkusz pozwala na „jedną funkcję parametrową”. W podglądzie: kliknięcie cytatu Krzysztofa pokazuje cytat Joanny.

    pracownicy.html HTML zmienione: 12 linii
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Nasz zespół</title>
        <link rel="stylesheet" href="styl.css">
    </head>
    <body>
        <header class="banner logo">
            <img src="logo.png" alt="logo firmy">
        </header>
        <header class="banner title">
            <h1>Nasz zespół</h1>
        </header>
        <main>
            <article class="card">
                <img src="osoba1.jpg" alt="Dyrektor">
                <h2>Krzysztof Dobromilski</h2>
                <h3>Dyrektor</h3>
                <p>Firma logistyczna była jego marzeniem. Zrealizował je 10 lat temu. Nasza firma prosperuje dzięki Krzysztofowi</p>
                <p>telefon: 111222333</p>
                <h5><a href="mailto:[email protected]">Kontakt</a></h5>
            </article>
            <article class="card">
                <img src="osoba2.jpg" alt="Kierownik logistyków">
                <h2>Joanna Trojanowska</h2>
                <h3>Kierownik logistyków</h3>
                <p>Od początku firmy z nami. Wie jak zorganizować pracę swoich logistyków aby wszystko było na czas</p>
                <p>telefon: 222333444</p>
                <h5><a href="mailto:[email protected]">Kontakt</a></h5>
            </article>
            <article class="card">
                <img src="osoba3.jpg" alt="Kadry">
                <h2>Ewa Nowak</h2>
                <h3>Księgowość i kadry</h3>
                <p>Od lat finanse powierzamy niezawodnej Ewie. Twardą ręką trzyma kasę i dba o wszystkich pracowników</p>
                <p>telefon: 333444555</p>
                <h5><a href="mailto:[email protected]">Kontakt</a></h5>
            </article>
        </main>
        <section class="quotes">
            <blockquote tabindex="0" role="button">
                "Każdego dnia stawiam sobie nieosiągalne wyzwania i próbuję je wykonać"
                <p>- Krzysztof</p>
            </blockquote>
            <blockquote tabindex="0" role="button">
                "Nie bój się porażek, im więcej ich rozwiążesz, tym szybciej osiągniesz cel"
                <p>- Joanna</p>
            </blockquote>
            <blockquote tabindex="0" role="button">
                "Niezadowolony pracownik jest dla mnie źródłem nauki"
                <p>- Ewa</p>
            </blockquote>
        </section>
        <footer>
            <p>Stronę wykonał: Bartosz Bryniarski</p>
        </footer>
        <script>
            const quotes = document.querySelectorAll(".quotes blockquote");
    
            function showNextQuote(index) {
                quotes[index].style.display = "none";
                quotes[index + 1].style.display = "block";
            }
    
            quotes.forEach((quote, index) => {
                quote.addEventListener("click", () => showNextQuote(index));
            });
        </script>
    </body>
    </html>
    Podgląd strony po tym kroku (pracownicy.html)
  32. Krok 32: Kliknięcie w drugi cytat

    Kryteria:

    R.5.4 Po kliknięciu na cytat jeżeli jest wyświetlony drugi cytat, zostaje on ukryty, a wyświetlony zostaje trzeci cytat ("Niezadowolony pracownik...")

    ok. 1 min
    Polecenie z arkusza

    Działanie funkcji dla kliknięcia w drugi cytat: Drugi cytat jest usuwany/ukryty. Trzeci cytat jest uwidoczniony (blokowo)

    Ten przypadek działa bez nowej linii kodu: drugi cytat ma pozycję 1, więc funkcja ukrywa quotes[1] i pokazuje quotes[2] - trzeci. Jedna reguła („ukryj ten, pokaż następny”) obsługuje każdy cytat, który ma następcę. Sprawdzone w Chrome: po dwóch kliknięciach widać tylko cytat Ewy (R.5.4).

    Podgląd strony bez zmian - taki jak po kroku 31.

  33. Krok 33: Kliknięcie w trzeci cytat: powrót do pierwszego

    Kryteria:

    R.5.5 Po kliknięciu na cytat jeżeli jest wyświetlony trzeci cytat, zostaje on ukryty, a wyświetlony zostaje pierwszy cytat

    ok. 2 min
    Polecenie z arkusza

    Działanie funkcji dla kliknięcia w trzeci cytat: Trzeci cytat jest usuwany/ukryty. Pierwszy cytat jest uwidoczniony (blokowo)

    Trzeci cytat ma pozycję 2, a quotes[3] nie istnieje. Reszta z dzielenia przez liczbę cytatów zawija numerację: (2 + 1) % 3 daje 0 - pierwszy cytat. Dla pozostałych nic się nie zmienia (1 % 3 = 1, 2 % 3 = 2). Bez trzeciej gałęzi if i bez liczby 3 w kodzie (R.5.5).

    Typowe błędy

    Bez reszty z dzielenia kliknięcie trzeciego cytatu kończy się błędem quotes[3] is undefined - trzeci znika, a pierwszy się nie pojawia.

    pracownicy.html HTML zmienione: 1 linia
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Nasz zespół</title>
        <link rel="stylesheet" href="styl.css">
    </head>
    <body>
        <header class="banner logo">
            <img src="logo.png" alt="logo firmy">
        </header>
        <header class="banner title">
            <h1>Nasz zespół</h1>
        </header>
        <main>
            <article class="card">
                <img src="osoba1.jpg" alt="Dyrektor">
                <h2>Krzysztof Dobromilski</h2>
                <h3>Dyrektor</h3>
                <p>Firma logistyczna była jego marzeniem. Zrealizował je 10 lat temu. Nasza firma prosperuje dzięki Krzysztofowi</p>
                <p>telefon: 111222333</p>
                <h5><a href="mailto:[email protected]">Kontakt</a></h5>
            </article>
            <article class="card">
                <img src="osoba2.jpg" alt="Kierownik logistyków">
                <h2>Joanna Trojanowska</h2>
                <h3>Kierownik logistyków</h3>
                <p>Od początku firmy z nami. Wie jak zorganizować pracę swoich logistyków aby wszystko było na czas</p>
                <p>telefon: 222333444</p>
                <h5><a href="mailto:[email protected]">Kontakt</a></h5>
            </article>
            <article class="card">
                <img src="osoba3.jpg" alt="Kadry">
                <h2>Ewa Nowak</h2>
                <h3>Księgowość i kadry</h3>
                <p>Od lat finanse powierzamy niezawodnej Ewie. Twardą ręką trzyma kasę i dba o wszystkich pracowników</p>
                <p>telefon: 333444555</p>
                <h5><a href="mailto:[email protected]">Kontakt</a></h5>
            </article>
        </main>
        <section class="quotes">
            <blockquote tabindex="0" role="button">
                "Każdego dnia stawiam sobie nieosiągalne wyzwania i próbuję je wykonać"
                <p>- Krzysztof</p>
            </blockquote>
            <blockquote tabindex="0" role="button">
                "Nie bój się porażek, im więcej ich rozwiążesz, tym szybciej osiągniesz cel"
                <p>- Joanna</p>
            </blockquote>
            <blockquote tabindex="0" role="button">
                "Niezadowolony pracownik jest dla mnie źródłem nauki"
                <p>- Ewa</p>
            </blockquote>
        </section>
        <footer>
            <p>Stronę wykonał: Bartosz Bryniarski</p>
        </footer>
        <script>
            const quotes = document.querySelectorAll(".quotes blockquote");
    
            function showNextQuote(index) {
                quotes[index].style.display = "none";
                quotes[(index + 1) % quotes.length].style.display = "block";
            }
    
            quotes.forEach((quote, index) => {
                quote.addEventListener("click", () => showNextQuote(index));
            });
        </script>
    </body>
    </html>
    Podgląd strony po tym kroku (pracownicy.html)
  34. Krok 34: Cytaty obsługiwane z klawiatury

    Kryteria:

    R.5.7 Zastosowano znaczące nazewnictwo dla wszystkich zmiennych i funkcji w języku polskim lub angielskim. Nazwy odzwierciedlają cel zastosowania

    ok. 3 min

    Dodatek spoza arkusza - klucz go nie ocenia. Element z role="button" obiecuje zachowanie przycisku, a prawdziwy przycisk działa Enterem i spacją. Nasłuchiwacz keydown:

    • reaguje na Enter i spację (" "), === porównuje bez zamiany typów,
    • preventDefault() - spacja nie przewija przy okazji strony,
    • przenosi fokus na nowy cytat, bo ten, który miał fokus, właśnie zniknął.

    Nazwy mówią, do czego służą: quotes, showNextQuote, index (R.5.7).

    pracownicy.html HTML zmienione: 7 linii
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Nasz zespół</title>
        <link rel="stylesheet" href="styl.css">
    </head>
    <body>
        <header class="banner logo">
            <img src="logo.png" alt="logo firmy">
        </header>
        <header class="banner title">
            <h1>Nasz zespół</h1>
        </header>
        <main>
            <article class="card">
                <img src="osoba1.jpg" alt="Dyrektor">
                <h2>Krzysztof Dobromilski</h2>
                <h3>Dyrektor</h3>
                <p>Firma logistyczna była jego marzeniem. Zrealizował je 10 lat temu. Nasza firma prosperuje dzięki Krzysztofowi</p>
                <p>telefon: 111222333</p>
                <h5><a href="mailto:[email protected]">Kontakt</a></h5>
            </article>
            <article class="card">
                <img src="osoba2.jpg" alt="Kierownik logistyków">
                <h2>Joanna Trojanowska</h2>
                <h3>Kierownik logistyków</h3>
                <p>Od początku firmy z nami. Wie jak zorganizować pracę swoich logistyków aby wszystko było na czas</p>
                <p>telefon: 222333444</p>
                <h5><a href="mailto:[email protected]">Kontakt</a></h5>
            </article>
            <article class="card">
                <img src="osoba3.jpg" alt="Kadry">
                <h2>Ewa Nowak</h2>
                <h3>Księgowość i kadry</h3>
                <p>Od lat finanse powierzamy niezawodnej Ewie. Twardą ręką trzyma kasę i dba o wszystkich pracowników</p>
                <p>telefon: 333444555</p>
                <h5><a href="mailto:[email protected]">Kontakt</a></h5>
            </article>
        </main>
        <section class="quotes">
            <blockquote tabindex="0" role="button">
                "Każdego dnia stawiam sobie nieosiągalne wyzwania i próbuję je wykonać"
                <p>- Krzysztof</p>
            </blockquote>
            <blockquote tabindex="0" role="button">
                "Nie bój się porażek, im więcej ich rozwiążesz, tym szybciej osiągniesz cel"
                <p>- Joanna</p>
            </blockquote>
            <blockquote tabindex="0" role="button">
                "Niezadowolony pracownik jest dla mnie źródłem nauki"
                <p>- Ewa</p>
            </blockquote>
        </section>
        <footer>
            <p>Stronę wykonał: Bartosz Bryniarski</p>
        </footer>
        <script>
            const quotes = document.querySelectorAll(".quotes blockquote");
    
            function showNextQuote(index) {
                quotes[index].style.display = "none";
                quotes[(index + 1) % quotes.length].style.display = "block";
            }
    
            quotes.forEach((quote, index) => {
                quote.addEventListener("click", () => showNextQuote(index));
                quote.addEventListener("keydown", (event) => {
                    if (event.key === "Enter" || event.key === " ") {
                        event.preventDefault();
                        showNextQuote(index);
                        quotes[(index + 1) % quotes.length].focus();
                    }
                });
            });
        </script>
    </body>
    </html>
    Podgląd strony po tym kroku (pracownicy.html)
  35. Etap 5: Porównanie z wersją podstawową

    Krok 35 · po tym etapie masz 37 z 37 kryteriów (pkt)

    Krok 35: Co jest inaczej i którą wersję wybrać na egzaminie

    ok. 2 min

    Obie wersje dają komplet 37 punktów. Różnice:

    wersja podstawowawersja nowoczesna
    baneryfloat: left, width: 50%, clear bloku głównegokolumny siatki 50% 50% na <body>
    kartydisplay: flex w <main>, width: 30%siatka repeat(3, 30%) w <main>
    ukrycie cytatówidentyfikatory #quote2, #quote3selektor sąsiedztwa blockquote + blockquote
    odstępyskrót padding: 10px 0padding-block i padding-inline
    zdarzenieatrybut onclick="changeQuote(N)"addEventListener w pętli forEach
    zmiana cytatutrzy gałęzie if / else if / elsejedna linia z resztą z dzielenia
    klawiaturadopiero w dobrych praktykachod początku: tabindex, role="button", Enter i spacja

    W obu wersjach zostały dwie rzeczy wymuszone przez klucz: selektor a dla odnośników (R.4.3) i zmiana style.display w skrypcie (R.5.6) - zamiast przestawiania klasy CSS, które w innych arkuszach jest wygodniejsze.

    Na egzaminie trzy gałęzie if z wersji podstawowej trudno pomylić i łatwo sprawdzić kliknięciem. Wersja nowoczesna jest krótsza i działa dla dowolnej liczby cytatów. Przy siatce pilnuj, żeby szerokości bloków stały w grid-template-columns, a nie w width.

    Podgląd strony bez zmian - taki jak po kroku 34.

  36. Etap 6: Oddanie pracy

    Krok 36 · po tym etapie masz 37 z 37 kryteriów (pkt)

    Krok 36: Plik przeglądarka.txt i nagranie płyty

    ok. 5 min
    Polecenie z arkusza

    UWAGA: po zakończeniu pracy utwórz plik tekstowy o nazwie przeglądarka.txt. Zapisz w nim nazwę przeglądarki internetowej, w której weryfikowana była poprawność działania witryny. Umieść go w folderze z numerem zdającego. Nagraj płytę z rezultatami pracy.

    W przeglądarka.txt nazwa przeglądarki, w której sprawdzana była strona. W folderze z numerem zdającego: import.png, kw1.jpg - kw4.jpg, kwerendy.txt, logo.png, osoba1.jpg - osoba3.jpg, pracownicy.html, przeglądarka.txt, styl.css. Nagraj płytę, sprawdź jej odczyt i opisz ją numerem zdającego.

    przeglądarka.txt Tekst nowy plik
    Google Chrome

    Podgląd strony bez zmian - taki jak po kroku 34.

Podgląd

To jedno z możliwych rozwiązań. Egzaminator ocenia spełnienie kryteriów z klucza odpowiedzi, a nie zgodność z tym kodem - inna, poprawna droga też daje punkty.

Autor rozwiązania: . Licencja CC BY-NC 4.0 - kopiowanie i przeróbki do celów niekomercyjnych, z podaniem autora i źródła (link do tej strony) (zasady wykorzystania). Treść arkusza i klucza oceniania pochodzi z CKE.