Wersje

Co jest aktualne w każdym elemencie GS Creator i co potrafi silnik.

ElementWersjaDataStatusSchemat JSON
GS Engine
Haxe 4.3 · OpenFL · target html5
v0.0.152026-10-15w rozwojuv2.4
GS Editor
Angular 22
v0.0.472026-10-16w rozwojuv2.4

Możliwości silnika (GS Engine 0.0.15)

Z katalogu silnika (catalog.json, schemat v2.4). Ćwiczenie to scena z elementów pięciu Componentów; zachowanie wynika z ich opcji i reguły rozwiązania. Ćwiczenie podaje w polu requires nazwy funkcji, których używa.

Componenty

Imagetype: imagerequires: element.imageikona: image

Obraz albo animacja: tło, ozdoby, postacie. Nieinteraktywny; zmieniają go tylko akcje, które go wskazują.

Role: — · Zdarzenia: —

OpcjaKluczTypWymaganaDomyślnierequires
Położenie i rozmiarrectrecttak[0,0,200,200]—
Warstwalayernumbernie1—
Wyglądvisualvisual (image, animation)tak——
Texttype: textrequires: element.textikona: text

Napis: polecenie, etykieta, komunikat. Nieinteraktywny; zmieniają go tylko akcje, które go wskazują.

Role: — · Zdarzenia: —

OpcjaKluczTypWymaganaDomyślnierequires
Położenie i rozmiarrectrecttak[0,0,400,80]—
Warstwalayernumbernie1—
Wyglądvisualvisual (text)tak——
Componenttype: componentrequires: element.componentikona: pointer

Element, z którym gracz coś robi: kliknięcie, podniesienie i upuszczenie (na Target albo luzem na scenie).

Role: clickable (klikalny)draggable (przeciągalny)connectable (łączony) · Zdarzenia: tapdrag-startdrag-enddropdrop-outsidecorrectwrong

OpcjaKluczTypWymaganaDomyślnierequires
Położenie i rozmiarrectrecttak[0,0,200,200]—
Warstwalayernumbernie1—
Wyglądvisualvisual (image, animation, text)tak——
Klikalnyclickableboolniefalsecomponent.clickable
Przeciągalnydraggableobject (bounds, hit)nie—component.draggable
Łączonyconnectableboolniefalsecomponent.connectable
Punkt zaczepienia linii (tylko gdy connectable: true)anchorobject (point w rect, reach)nie—component.anchor
Containertype: containerrequires: element.containerikona: container

Mieści Componenty: układa je pionowo, poziomo albo kafelkami; dzieci da się wyjmować i odkładać. Bez wyglądu jest niewidoczny.

Role: contains (zawiera) · Zdarzenia: child-addedchild-removed

OpcjaKluczTypWymaganaDomyślnierequires
Położenie i rozmiarrectrecttak[0,0,600,160]—
Warstwalayernumbernie1—
Wyglądvisualvisual (image, animation, text)nie——
Układlayoutobject (orientation, columns, gap, padding, align, order, overflow)nie{"orientation":"vertical"}container.layout
Componenty w środkuchildrenrefList (element: component)nie—container.children
Targettype: targetrequires: element.targetikona: target

Miejsce, w które gracz upuszcza Componenty. Bez wyglądu jest niewidoczne.

Role: accepts (przyjmuje) · Zdarzenia: over-targetleft-targetoccupiedvacateddropcorrectwrong

OpcjaKluczTypWymaganaDomyślnierequires
Położenie i rozmiarrectrecttak[0,0,200,200]—
Warstwalayernumbernie1—
Wyglądvisualvisual (image, animation, text)nie——
Pojemnośćcapacitynumber | manynie1target.capacity
TrafieniehitModeobject (mode, overlap, radius)nie{"mode":"center"}target.hitMode
Ustawienie po trafieniusnapobject (mode, point)nie{"mode":"center"}target.snap
Gdy pełnyonOccupiedchoice (reject, replace, swap)nie"reject"target.onOccupied

Wygląd

Obraztype: image
OpcjaKluczTypWymaganaDomyślnierequires
Obrazassetref (asset: image)tak——
Animacjatype: animationrequires: visual.animation
OpcjaKluczTypWymaganaDomyślnierequires
Arkusz klatekassetref (asset: animation)tak——
Liczba klatekframesnumbernie1—
Klatki na sekundęfpsnumbernie8—
W pętliloopboolnietrue—
Odtwarzaj od startuautoplayboolnietrue—
Teksttype: textrequires: visual.text
OpcjaKluczTypWymaganaDomyślnierequires
Treśćtextrich-texttak——
Rozmiarsizenumbernie32—
Kolorcolorcolornie"#222222"—
Wyrównaniealignchoice (left, center, right)nie"left"—
InterlinialineHeightnumbernie1.2—
Stany wyglądupole: visual.statesrequires: visual.states

Nazwane nadpisania opcji wyglądu, ustawiane akcją set-state; stan wbudowany: normal. Dodatkowo każdy stan może zmienić:

OpcjaKluczTypWymaganaDomyślnierequires
Zabarwienietintcolornie——
Krycieopacitynumbernie1—
Skalascalenumbernie1—

Reguły

Zaznaczaniekind: selectrequires: rule.selectocenia elementy z rolą: clickable
OpcjaKluczTypWymaganaDomyślnierequires
Poprawne elementycorrectrefList (element: clickable)tak——
Umieszczanie w Targetachkind: placerequires: rule.placeocenia elementy z rolą: draggable
OpcjaKluczTypWymaganaDomyślnierequires
ParypairsobjectList (components, targets)tak——
Bez ocenykind: openrequires: rule.open
OpcjaKluczTypWymaganaDomyślnierequires
Ukończeniecompletechoice (all-placed, manual)nie"all-placed"—
Łączenie w parykind: connectrequires: rule.connectocenia elementy z rolą: connectable
OpcjaKluczTypWymaganaDomyślnierequires
ParypairsrefPairList (element: connectable)tak——
Po koleiinOrderboolniefalse—
Rysowaniedrawchoice (drag, freehand)nie"drag"—
Grubość linii (px)lineWidthnumbernie6—
Kolor liniilineColorcolornie"#2f9e5b"—
Kropka na końcach liniiendDotnumbernie16—
Złe połączeniawrongLineschoice (remove, keep)nie"remove"—

Akcje

Odtwórz dźwiękdo: play-soundrequires: action.play-sound
OpcjaKluczTypWymaganaDomyślnierequires
Dźwiękassetref (asset: audio)tak——
Zatrzymaj inne dźwiękiexclusiveboolniefalse—
Pokaż elementdo: showrequires: action.show
OpcjaKluczTypWymaganaDomyślnierequires
Elementtargetref (element)tak——
Ukryj elementdo: hiderequires: action.hide
OpcjaKluczTypWymaganaDomyślnierequires
Elementtargetref (element)tak——
Ustaw stan wyglądudo: set-staterequires: action.set-state
OpcjaKluczTypWymaganaDomyślnierequires
Elementtargetref (element)tak——
Stanstateref (state: stan elementu z target)tak——
Przesuńdo: move-torequires: action.move-to
OpcjaKluczTypWymaganaDomyślnierequires
Elementtargetref (element)tak——
Dokądtodestination (accepts, [x, y], start)tak——
Odeślij na startdo: returnrequires: action.return
OpcjaKluczTypWymaganaDomyślnierequires
Elementtargetref (element)tak——
Zablokujdo: lockrequires: action.lock
OpcjaKluczTypWymaganaDomyślnierequires
Elementtargetref (element)tak——
Odblokujdo: unlockrequires: action.unlock
OpcjaKluczTypWymaganaDomyślnierequires
Elementtargetref (element)tak——
Zamień miejscamido: swaprequires: action.swap
OpcjaKluczTypWymaganaDomyślnierequires
Componenttargetref (element: draggable)tak——
Z Componentemwithref (element: draggable)tak——
Na wierzchdo: bring-to-toprequires: action.bring-to-top
OpcjaKluczTypWymaganaDomyślnierequires
Elementtargetref (element)tak——
Odtwórz animacjędo: play-animationrequires: action.play-animation
OpcjaKluczTypWymaganaDomyślnierequires
Elementtargetref (element: wygląd animation)tak——
W pętliloopboolnie——
Zatrzymaj animacjędo: stop-animationrequires: action.stop-animation
OpcjaKluczTypWymaganaDomyślnierequires
Elementtargetref (element: wygląd animation)tak——
Cząsteczkido: emit-particlesrequires: action.emit-particles
OpcjaKluczTypWymaganaDomyślnierequires
Elementtargetref (element)tak——
Zakończ ćwiczeniedo: completerequires: action.completetylko przy regule: kind: open, complete: manual

Zdarzenia

ZdarzenieNazwaZakresWywołuje
Dotknięcietapelementcomponent.clickable
Podniesieniedrag-startelementcomponent.draggable
Puszczeniedrag-endelementcomponent.draggable
Upuszczenie na Targetdropelementcomponent.draggableelement.target
Upuszczenie poza Targetemdrop-outsideelementcomponent.draggable
Component nad Targetemover-targetelementelement.target
Component opuścił Targetleft-targetelementelement.target
Zajęcie miejscaoccupiedelementelement.target
Zwolnienie miejscavacatedelementelement.target
Odłożenie do Containerachild-addedelementcontainer.children
Wyjęcie z Containerachild-removedelementcontainer.children
Dobry ruchcorrectelementrule.selectrule.placerule.connect
Zły ruchwrongelementrule.selectrule.placerule.connect
Start ćwiczeniastartćwiczenie—
Ukończenie ćwiczeniacompletedćwiczenie—

Historia zmian

GS Engine

v0.0.15 2026-10-15

  • Wybór języka ćwiczenia przy starcie: parametr adresu ?language=<kod> wybiera język tekstów i wersji zasobów ćwiczenia spośród jego listy languages — najpierw cały kod (pt-BR), potem część przed pierwszym „-” (pl-PL → pl), bez względu na wielkość liter; bez parametru albo bez dopasowania (np. de) ćwiczenie startuje w defaultLanguage. Ten sam parametr ustala język napisów silnika (po polsku albo po angielsku), więc „Uruchom w silniku” na angielskiej stronie przykładów pokazuje przykład po angielsku.
  • Teksty (visual.text i teksty stanów wyglądu) w wybranym języku, a bez tłumaczenia — w defaultLanguage, bez błędu; tekst bez treści w defaultLanguage nadal zatrzymuje start (invalid-reference). Ścieżka zasobu: src.<wybrany język>, potem src.<defaultLanguage>, potem src.default; wczytywana jest tylko wybrana wersja pliku. Stan silnika ma nowe pole language (efektywny język ćwiczenia, null przed wczytaniem i przy błędzie startu), a ostrzeżenie text-overflow dotyczy tekstów w wybranym języku. Format pliku ćwiczenia i schemat 2.4 bez zmian.

v0.0.14 2026-10-12

  • Schemat 2.4 (zmiana tylko w katalogu silnika, pliki ćwiczeń 2.0–2.3 działają bez zmian): etykiety i opisy katalogu (label, description — Componenty, role, opcje i ich pola, wartości wyboru i specjalne, wyglądy, stany, reguły, akcje, zdarzenia, pozycje kontekstowe i zasoby wspólne) są tekstami wielojęzycznymi { "pl": …, "en": … }; klucze techniczne (type, key, value, requires, icon, color) zostają zwykłymi tekstami. Nazwy Image, Text, Component, Container i Target są takie same w obu językach.
  • Napisy, które silnik rysuje na scenie (wczytywanie ćwiczenia, błąd uruchomienia), po polsku albo po angielsku: język wybiera parametr adresu ?language=<kod> (np. ?language=en, przekazywany przez stronę przykładów), a bez niego język przeglądarki (polski → po polsku, inny → po angielsku). Parametr nie zmienia języka tekstów ćwiczenia; etykieta wersji i komunikaty diagnostyczne errors[].message nie są tłumaczone.

v0.0.13 2026-10-12

  • Schemat 2.3 (zmiana addytywna, ćwiczenia 2.0, 2.1 i 2.2 działają bez zmian): opcja „Punkt zaczepienia linii” (anchor, funkcja component.anchor) Componentu łączonego, dozwolona tylko przy connectable: true. Pole point [x, y] to miejsce, w którym linie punktu zaczynają się i kończą, względem lewego górnego rogu elementu i w jego prostokącie; pole reach to zasięg chwytu w pikselach sceny (co najmniej 1, domyślnie 40).
  • Chwyt linii tylko w pobliżu kropki: wskaźnik zaczyna i kończy linię punktu z anchor w kole o promieniu reach (domyślnie 40 px) wokół punktu zaczepienia, także przy lekko niecelnym dotknięciu; gdy strefy kilku punktów się nakładają, wygrywa najbliższy. Linie (podgląd, dobre i złe, polecenie connect(a, b) i łamana w connections) biegną od punktu zaczepienia do punktu zaczepienia. Punkt bez anchor działa jak dotąd: chwyta całym prostokątem i łączy od środka.
  • Opcja reguły connect „Kropka na końcach linii” (endDot): kropka w kolorze linii na obu jej końcach, średnica w px — domyślnie 16 (większa od domyślnej grubości linii), 0 wyłącza kropki. Kursor-rączka nad punktem z anchor pokazuje się tylko w strefie kropki.
  • Katalog: warunek when na opcji Componentu (anchor tylko przy connectable: true) i inside na polu typu point (punkt w prostokącie elementu); błędy invalid-reference ze ścieżkami elements[i].anchor, elements[i].anchor.point i elements[i].anchor.reach oraz requires-missing bez component.anchor. Przykład „Połącz w pary” na stronie ma grafiki z narysowanymi punktami łączenia, a punkty zaczepienia linii są wycelowane w ich środki.

v0.0.12 2026-10-11

  • Schemat 2.2 (zmiana addytywna, ćwiczenia 2.0 i 2.1 działają bez zmian): reguła connect — łączenie w pary. Punkt to Component z opcją connectable (rola connectable, funkcja component.connectable; obraz, tekst albo animacja, nie razem z draggable); pary [a, b] w rule.pairs (typ opcji refPairList, wybór z listy punktów) są nieskierowane, a limit linii punktu to liczba par, w których występuje.
  • Opcje reguły: inOrder (pary w kolejności z listy), draw (drag — linia prosta od punktu do wskaźnika, freehand — linia odręczna), lineWidth i lineColor (podgląd i dobre linie) oraz wrongLines (remove — zła linia znika od razu, keep — zostaje na czerwono, zajmuje miejsce obu punktów i znika po kliknięciu).
  • Ocena połączenia: correct albo wrong na obu punktach, attempts rośnie o 1; powody wrong not-a-pair, out-of-order i occupied. Puszczenie w pustym miejscu albo na tym samym punkcie nie jest oceną. Linie są rysowane nad elementami sceny; ćwiczenie kończy się, gdy wszystkie pary są połączone dobrze i nie ma złych linii.
  • Stan silnika ma pole connections (linie w kolejności tworzenia: punkty, status good albo bad, indeks pary i łamana w pikselach sceny), a tryb testowy polecenia connect(a, b) i removeLine(a, b). Na stronie nowy przykład „Połącz w pary”.

v0.0.11 2026-10-11

  • Przykład wbudowany (silnik bez parametru ?exercise=) ma domyślną scenę 1200 × 675 (16:9), a jego tło jest w gęstości 2× (2400 × 1350): na ekranie 16:9 (np. telewizor 4K) scena wypełnia okno, na iPadzie zajmuje ok. 75% okna. Ćwiczenia o innym rozmiarze sceny (np. 1136 × 518) silnik wpisuje w okno tak samo, bez zmian układu; schemat ćwiczenia bez zmian.
  • Polecenie i obrazki przykładu wbudowanego są wyśrodkowane na scenie. Przykładowe ćwiczenia na stronie są przebudowane na scenę 1200 × 675 (16:9) z zasobami w gęstości 2× (tła 2400 × 1350): ostrzejsza grafika na iPadach i ekranach 4K; elementy zachowują swój rozmiar, a kompozycja wykorzystuje całą scenę.

v0.0.10 2026-10-11

  • Własna ikona strony silnika (favicon.png z logo: trzy zachodzące kafle z zębatką) zamiast domyślnej ikony biblioteki graficznej; schemat ćwiczenia i zachowanie silnika bez zmian.

v0.0.9 2026-10-10

  • Schemat 2.1 (zmiana addytywna, ćwiczenia 2.0 działają bez zmian): zasoby wspólne z bibliotek — lista libraries [{id, base}] i pole library zasobu; src zasobu wspólnego jest względny do adresu bazowego biblioteki (http(s), ścieżka od / albo ścieżka względna), a pliku nie ma w paczce ćwiczenia. Użycie wymaga funkcji asset.library w requires; katalog silnika ma sekcję assets.
  • Nieudane wczytanie zasobu wspólnego to asset-missing z polem library (identyfikator biblioteki) i adresem pliku — ćwiczenie działa dalej; zły adres bazowy (np. javascript:, data:, file:) albo nieistniejąca biblioteka to invalid-reference. Parametry adresu ćwiczenia (?v=) nie są doklejane do zasobów wspólnych.
  • Zasoby z innego pochodzenia: obrazy wymagają nagłówka Access-Control-Allow-Origin na serwerze biblioteki, dźwięki działają bez niego.

v0.0.8 2026-10-10

  • Ostry tekst i obrazy przy każdym rozmiarze okna i na ekranach o wysokim DPI (np. 4K): silnik sam wpisuje scenę (size z pliku) w okno i rysuje ją w rozdzielczości wyświetlania (bufor = rozmiar okna × devicePixelRatio) zamiast rozciągania obrazu przez przeglądarkę; paski poza sceną są czarne, elementy poza size przycięte.
  • Stan silnika ma pole view {scale, x, y, pixelRatio}: dopasowanie sceny do powierzchni (pozycje elementów zostają w pikselach sceny).

v0.0.7 2026-10-10

  • Polecenie testowe drag respektuje przycięcie Containera i granice sceny jak wskaźnik: zwraca false bez zmiany stanu, gdy żadna część elementu nie jest widoczna (np. dziecko Containera z overflow: scroll poza jego prostokątem — trzeba je najpierw przewinąć poleceniem scroll).

v0.0.6 2026-10-09

  • Tekst wyższy od prostokątu elementu pokazuje początek tekstu przycięty do rect (wcześniej widać było ostatnie linie); ostrzeżenie text-overflow bez zmian.
  • Pliki silnika (katalog, przykład wbudowany) wczytywane na żądanie, a nie przed startem: nieudane pobranie kończy się statusem (load-failed albo brakujący zasób) zamiast zawieszenia startu; ćwiczenie z adresu nie pobiera plików przykładu wbudowanego.

v0.0.5 2026-10-09

  • Model pięciu Componentów sceny: Image, Text, Component, Container i Target w jednej liście elements; element ma type i opcje swojego Componentu.
  • Katalog silnika z Componentami (role, opcje, ikona i kolor), rodzajami i stanami wyglądu, regułami, akcjami, zdarzeniami i pozycjami kontekstowymi; rejestr Componentów w silniku zgodny z katalogiem.
  • Wygląd image, animation (arkusz klatek: frames, fps, loop, autoplay) i text ze stanami (visual.states); akcje set-state, show, hide, play-animation i stop-animation.
  • Przeciąganie Componentów (draggable z obszarem ruchu i chwytaniem po konturze obrazka) i Target z opcjami capacity, hitMode, snap i onOccupied; akcje move-to, return, lock, unlock, swap i bring-to-top oraz pozycje dropped i drop-target.
  • Container: układ pionowo, poziomo albo kafelkami (gap, padding, align), kolejność losowa powtarzalna, przycinanie i przewijanie, wyjmowanie i odkładanie dzieci (child-added, child-removed).
  • Reguły select, place i open (ukończenie all-placed albo akcją complete); akcja emit-particles (cząsteczki) i play-sound z opcją exclusive.
  • Stan silnika: elementy z type, state, położeniem, umiejscowieniem, blokadą, wyglądem i animacją; ostrzeżenie text-overflow, ścieżki błędów invalid-reference i requires-missing; tryb testowy z poleceniami tap, drag i scroll oraz actionLog, registry i playing.

v0.0.4 2026-10-09

  • Interakcja tap: dotknięcie przełącza zaznaczenie elementu.
  • Reguła select: ćwiczenie jest rozwiązane, gdy zaznaczone są dokładnie poprawne elementy; postęp w progress.
  • Akcje play-sound i hide przypisane do zdarzeń elementu (tap, correct, wrong) i ćwiczenia (start, completed).
  • Tryb testowy: polecenie tap(id) i dziennik wykonanych akcji (actionLog).

v0.0.3 2026-10-09

  • Schemat v2: ćwiczenie to scena z elementami (schema, requires, size, assets, elements); bez typu ćwiczenia wybierającego logikę.
  • Katalog silnika catalog.json publikowany obok silnika: rodzaje elementów, interakcje, reguły, akcje i zdarzenia z ich właściwościami.
  • Walidacja pliku z czytelnymi kodami błędów: schema-unsupported, requires-missing, invalid-reference (ze ścieżką), asset-missing, load-failed.

v0.0.2 2026-10-09

  • Pole attempts w stanie silnika — licznik kliknięć elementów wyboru.

v0.0.1 2026-10-01

  • Pierwsze ćwiczenie: zaznaczanie poprawnych obrazków (Basic Select).
  • Elementy: BackgroundElement, BasicElement, SelectElement; dźwięki dobrze/źle.
  • Środowisko deweloperskie w Dockerze (build html5 + automatyczna przebudowa).

GS Editor

v0.0.47 2026-10-16

  • Podpowiedź z tekstem języka domyślnego w pustym polu tekstu innego języka (także „bez zmiany” w polu tekstu stanu wyglądu) jest pisana kursywą, szarym kolorem jaśniejszym od wpisanego tekstu (kontrast z tłem pola co najmniej 4,5:1), więc nie wygląda jak wpisany tekst. Przy jednym języku pola wyglądają jak dotąd.

v0.0.46 2026-10-16

  • Skróty klawiszowe sceny działają tylko przy pracy na scenie: Delete, Backspace i strzałki usuwają i przesuwają zaznaczony element, gdy fokus jest na elemencie sceny, na liście elementów albo na żadnej kontrolce. Na przyciskach, zakładkach języków, przełącznikach języka sceny i listach rozwijanych te klawisze nie zmieniają sceny, a przy otwartym oknie nie działa żaden skrót. Ctrl+Z, Ctrl+Y i Shift+1 działają także po kliknięciu przycisku paska narzędzi, a kliknięcie elementu sceny myszą przenosi na niego fokus.

v0.0.45 2026-10-15

  • Sloty języków zasobów w bibliotece zasobów: w ćwiczeniu z kilkoma językami pod każdym zasobem są klucze języków. Zasób z jednym plikiem jest wspólny dla wszystkich języków; plik dodany dla innego języka robi z niego zasób językowy, który potrzebuje pliku dla każdego języka ćwiczenia (brakujący plik oznacza kropka na kluczu i błąd walidacji, którego kliknięcie otwiera bibliotekę na brakującym języku). Pliki slotów można dodawać, podmieniać i usuwać; ostatni plik wraca jako zasób wspólny. Zmiana języka domyślnego nie rusza plików, a usunięcie języka usuwa pliki jego slotów po potwierdzeniu z ich liczbą.
  • Eksport, „Uruchom” i zapis: zasób językowy ma w src klucz każdego języka z languages i src.default z tym samym plikiem co język domyślny (w paczce jeden plik); zasób wspólny — jak dotąd src.default. Otwarcie ćwiczenia, zapisu edytora i zapisu w przeglądarce układa pliki w sloty bez utraty bajtów; src.default inny niż plik języka domyślnego jest pomijany z komunikatem.
  • Podgląd i sprawdzanie plików języków: scena pokazuje obraz zasobu w języku podglądu sceny (pusty slot — plik języka domyślnego), a „Uruchom” w tym języku wczytuje w silniku tylko jego pliki. Walidacja zgłasza plik innego rodzaju niż zasób i arkusz klatek o szerokości niepodzielnej przez liczbę klatek jako błędy, a inne proporcje obrazu niż w pliku języka domyślnego — jako ostrzeżenie. Rozmiar elementu przy pierwszym przypisaniu obrazu liczy się z pliku języka domyślnego. Zapis ZIP i „Uruchom” odmawiają paczki z więcej niż 500 plikami.

v0.0.44 2026-10-15

  • Wiele języków ćwiczenia: w „Konfiguracji ćwiczenia” lista języków z jednym domyślnym — dodawanie z listy popularnych języków albo własnym kodem (ll lub ll-RR, np. pt-BR), ostrzeżenie przy języku pisanym od prawej do lewej, usuwanie języka z potwierdzeniem pokazującym liczbę jego tekstów. Eksport zapisuje languages w kolejności listy i defaultLanguage; otwarcie ćwiczenia wczytuje wszystkie jego języki, a ćwiczenia i zapisy z jednym językiem otwierają się bez strat.
  • Teksty w każdym języku: przy więcej niż jednym języku nad polem tekstu w inspektorze (tekst bazowy i teksty stanów wyglądu) są zakładki języków z kropką przy języku, w którym brakuje tekstu, nazwą języka edycji przy polu i podpowiedzią z języka domyślnego w pustym polu. Walidacja zgłasza tekst wypełniony w jednym języku, a pusty w innym (element, pole i język), oraz niedozwolone znaczniki w każdym języku; kliknięcie zgłoszenia przełącza zakładkę na właściwy język.
  • Język podglądu sceny: przełączniki języków na belce sceny pokazują teksty sceny w wybranym języku (bez tłumaczenia — w języku domyślnym, jak w silniku), niezależnie od zakładek inspektora, a „Uruchom” startuje silnik w tym języku (parametr language). Ćwiczenie z jednym językiem wygląda i działa jak dotąd.

v0.0.43 2026-10-15

  • Wersje językowe plików zasobów (src.<język>, np. src.pl i src.en obok src.default) przechodzą przez edytor bez strat: otwarcie ćwiczenia (ZIP, folder, zapis edytora, zapis w przeglądarce) i ponowny eksport (ZIP, projekt.json, „Uruchom”) zachowują wszystkie klucze src i pliki pod każdym z nich, a języki wersji trafiają do languages. Format pliku ćwiczenia się nie zmienia.
  • Zasób bez src.default (tylko z plikami dla języków) nie jest już pomijany przy otwarciu ani zmieniany przy eksporcie; biblioteka pokazuje jego pierwszą wersję. Brak pliku wersji w paczce daje komunikat walidacji ze ścieżką pliku, a „Usuń zasób” usuwa także pliki jego wersji.

v0.0.42 2026-10-14

  • Okno „Konfiguracja ćwiczenia”: prostsze opisy pól, bez nazw z pliku ćwiczenia (rozmiar sceny „w pikselach sceny”, identyfikator ćwiczenia powstający z nazwy), a lista języka pokazuje nazwy języków („polski”, „angielski”) zamiast kodów — także w oknie „Definicja projektu”.
  • Enter w polu „Treść” elementu Text wstawia nowy wiersz: edytor zapisuje go w pliku jako <br>, a podgląd sceny i silnik pokazują dwa wiersze; <br> z otwartego pliku pole pokazuje jako nowy wiersz.
  • Kopia elementu stoi obok oryginału (24 px w prawo i w dół, w obrębie sceny), a nie w lewym górnym rogu sceny.
  • Jaśniejsze pytanie o niezapisaną pracę: mówi, że ćwiczenie nie zostało zapisane do pliku (ZIP albo projekt.json), a jego kopia w przeglądarce zostanie usunięta lub zastąpiona.
  • Nowe znaczniki data-* dla pomocy: edytor reguły (sekcja, lista reguły, przyciski „Dodaj”, końce pary) i numer wersji edytora.

v0.0.41 2026-10-14

  • Stałe znaczniki data-* na kontrolkach, które pokazuje pomoc (obszary okna, okna dialogowe, przyciski paska narzędzi i okna startowego, Biblioteka zasobów, lista elementów i inspektor): generator zrzutów pomocy wskazuje nimi elementy niezależnie od języka interfejsu. Bez zmian w wyglądzie i działaniu edytora.

v0.0.40 2026-10-14

  • Przycisk „Pomoc” na końcu grupy akcji paska narzędzi otwiera w nowej karcie pomoc do GS Editora na stronie GS Creator (strony krok po kroku ze zrzutami ekranu, /pomoc) w języku interfejsu edytora (?lang=). Adres pomocy pochodzi z konfiguracji edytora (helpUrl w gs-editor.config.json); bez niego przycisku nie ma. Pasek narzędzi nadal mieści się w jednym rzędzie.

v0.0.39 2026-10-14

  • Zoom „Dopasuj do okna”: przycisk w grupie zoomu na pasku narzędzi i skrót Shift+1 ustawiają największy zoom, przy którym cała scena mieści się w obszarze sceny, i stawiają ją na środku. Scena pasuje dalej po zmianie rozmiaru okna, kolumny inspektora i rozmiaru sceny, aż autor przesunie suwak; wybór jest zapamiętany w przeglądarce razem z ustawieniami widoku. Suwak zoomu ma zakres 10–150% z krokiem 1%, a pasek narzędzi nadal mieści się w jednym rzędzie.
  • Centrowanie sceny przy każdym zoomie: scena mniejsza od obszaru stoi na jego środku (w poziomie i w pionie), a większa zaczyna się od lewej i górnej krawędzi i cała jest osiągalna przewijaniem; zmiana zoomu zachowuje środek widocznej części sceny.
  • Opcje reguł są zapisywane osobno dla każdej reguły (np. pary reguły „Umieszczanie w Targetach” i pary reguły „Łączenie w pary” nie mieszają się przy zmianie reguły); zapis lokalny i paczki ZIP z wcześniejszym układem wczytują się bez zmian, a plik ćwiczenia pozostaje taki sam.

v0.0.38 2026-10-13

  • Zachowanie Componentu wybiera się jednym kontrolem „Zachowanie” zamiast trzech pól wyboru: Brak, Klikalny, Przeciągalny albo Łączony — jedna rola na Component, a każda zmiana to jeden krok cofania. Pod kontrolem jest krótki opis wybranej roli; „Przeciągalny” pokazuje pola „Obszar ruchu” i „Chwytanie”, „Łączony” — punkt zaczepienia linii. Kontrol to grupa przycisków radio z nazwą: jeden przystanek klawisza Tab, strzałki zmieniają rolę, fokus jest widoczny. Segmenty pochodzą z katalogu silnika, więc nowa rola pojawi się sama. Układ plików bez zmian.
  • Plik, w którym Component ma kilka ról (np. Klikalny i Przeciągalny), wczytuje się bez utraty danych: kontrol pokazuje jedną rolę, a ostrzeżenie wymienia pozostałe z przyciskiem „Usuń dodatkowe role” (jeden krok cofania). Połączenie Łączony i Przeciągalny nadal blokuje eksport, dopóki dodatkowa rola nie zostanie usunięta.

v0.0.37 2026-10-13

  • Ekran ładowania: zanim edytor się wczyta, na środku okna widać logo i obracający się wskaźnik na tle edytora; znika, gdy pojawia się interfejs, bez przesuwania układu. Czytniki ekranu dostają komunikat o ładowaniu, a przy ograniczonym ruchu (prefers-reduced-motion) wskaźnik się nie obraca.

v0.0.36 2026-10-12

  • Kontrolki siatki są w menu „Siatka” na pasku narzędzi: przycisk pokazuje stan siatki („Siatka: wł.” albo „Siatka: wył.”) i otwiera panel z polami „Pokaż siatkę”, „Rozmiar”, „Na wierzchu”, „Przezroczystość” i „Przyciąganie”. Zmiana ustawienia nie zamyka panelu; zamyka go Esc (fokus wraca na przycisk), kliknięcie poza panelem (trafia w to, co pod nim, np. w element sceny), wyjście fokusu z panelu klawiszem Tab i ponowne kliknięcie przycisku. Panel ma rolę okna niemodalnego, a przycisk aria-expanded i aria-controls.
  • Pasek narzędzi mieści się w jednym rzędzie od ok. 1150 px szerokości okna (m.in. 1280, 1440 i 1512 px — MacBook Pro 14), po polsku i po angielsku, bez przewijania w poziomie; węższe okno przenosi sekcję widoku do drugiego rzędu. Kolejność sekcji widoku: menu „Siatka”, „Zoom” i przełącznik języka interfejsu przy prawej krawędzi paska.
  • Nowe ustawienia domyślne siatki: rozmiar 10 px, „Na wierzchu” włączone, przezroczystość 70%, przyciąganie włączone. Dotyczą tylko przeglądarki bez zapisanych ustawień widoku — zapisane ustawienia (gseditor.view.v1) zostają bez zmian. Siatka na wierzchu nadal nie przechwytuje myszy.

v0.0.35 2026-10-12

  • Interfejs edytora po polsku i po angielsku: wszystkie ekrany (pasek narzędzi, okno startowe, pasek statusu, paleta, lista elementów, scena, inspektor z edytorami akcji, reakcji i reguły, biblioteka zasobów, okna „Konfiguracja ćwiczenia”, walidacji i „Definicja projektu”), podpowiedzi, teksty alt i aria, komunikaty walidacji, błędy otwierania i zapisu ćwiczeń i projektów, pytania przeglądarki oraz etykiety katalogu silnika. Język interfejsu jest niezależny od języka ćwiczenia.
  • Przełącznik języka w pasku narzędzi i w oknie startowym zmienia język w locie, bez przeładowania: ćwiczenie, zaznaczenie, historia cofania, otwarte okna i niezapisana praca zostają. Wybór jest zapamiętany w przeglądarce (gseditor.language.v1); przy pierwszym uruchomieniu język pochodzi z przeglądarki (polska → PL, inna → EN), a parametr adresu ?lang=<kod> (np. z przycisku „Otwórz w edytorze” na stronie przykładów) wybiera język i go zapamiętuje.
  • Teksty interfejsu w słownikach JSON pobieranych w czasie działania (public/i18n: pl.json, en.json i manifest languages.json) — nowy język to nowy plik słownika i wpis w manifeście, bez zmian w kodzie. Każdy komunikat jest pełnym zdaniem z parametrami, a liczba mnoga ma formy według reguł języka.
  • Dane domyślne (nazwa nowego ćwiczenia, treść nowego Text, nazwy kopii elementów, stanów wyglądu i slotów) powstają w języku interfejsu w chwili utworzenia. Nazwy Image, Text, Component, Container i Target zostają po angielsku także w polskim interfejsie (np. paleta „Componenty”).
  • Etykiety katalogu silnika w schemacie 2.4 (mapy pl/en) są pokazywane w języku interfejsu; edytor czyta też katalogi ze zwykłymi tekstami. Eksportowane ćwiczenia bez zmian (schematy 2.0–2.3).

v0.0.34 2026-10-12

  • Opcja „Punkt zaczepienia linii” (anchor) Componentu z włączonym „Łączony”: na scenie kropka punktu zaczepienia (bez ustawionej opcji wyblakła, w środku elementu — tam silnik zaczepia linię), przeciągana myszą po elemencie (położenie zaokrąglone do pełnych pikseli i ograniczone do prostokąta elementu, jedno przeciągnięcie to jeden krok cofania); w inspektorze pola X i Y punktu oraz „Zasięg (px)” (reach, domyślnie 40). Wyłączenie „Łączony” ukrywa opcję i kropkę, a edytor pamięta punkt.
  • Reguła „Łączenie w pary” ma opcję „Kropka na końcach linii” (endDot, domyślnie 16 px, 0 — bez kropek). Walidacja przed eksportem: punkt zaczepienia poza prostokątem elementu (np. po zmniejszeniu elementu), zasięg poniżej 1 i kropka poniżej 0.
  • Eksport w schemacie 2.3 (component.anchor w requires) tylko wtedy, gdy ćwiczenie używa punktu zaczepienia linii albo kropki innej niż domyślna; ćwiczenia z łączonymi Componentami bez tych funkcji zostają w 2.2. Import, zapis w przeglądarce, ZIP, cofnij/ponów i „Uruchom” zachowują punkt zaczepienia, a przykład „Połącz w pary” z narysowanymi punktami łączenia otwiera się w edytorze z kropkami na ich środkach.

v0.0.33 2026-10-11

  • Opcja „Łączony” (connectable) Componentu i reguła „Łączenie w pary” (connect) w „Konfiguracji ćwiczenia”: lista par (pairs) — każdy wiersz to punkt A i punkt B wybrane z list Componentów łączonych, z dodawaniem i usuwaniem par — oraz opcje „Po kolei” (inOrder), „Rysowanie” (draw), „Grubość linii (px)” (lineWidth), „Kolor linii” (lineColor) i „Złe połączenia” (wrongLines).
  • Walidacja przed eksportem: reguła connect bez par, para niepełna, ten sam punkt dwa razy, powtórzona para, punkt usunięty albo bez opcji „Łączony” oraz Component jednocześnie łączony i przeciągalny. Sloty Dobrze i Źle projektu dodają przy regule connect dźwięk z exclusive, więc połączenie (correct albo wrong na obu punktach) słychać raz.
  • Eksport w schemacie 2.2 (component.connectable i rule.connect w requires) tylko wtedy, gdy ćwiczenie używa reguły connect albo łączonych Componentów; inne ćwiczenia zostają w 2.0 albo 2.1. Import, zapis w przeglądarce, ZIP oraz cofnij/ponów zachowują pary i opcje reguły.

v0.0.32 2026-10-11

  • Nowe ćwiczenie w projekcie GSEngine ma domyślną scenę 1200 × 675 (16:9) — taki rozmiar pokazuje definicja wbudowanego projektu i przejmuje jego kopia („Utwórz własny projekt na tej bazie”). Otwierane ćwiczenia zachowują swój rozmiar sceny (np. 1136 × 518); plik bez wymiaru sceny dostaje 1200 × 675.
  • Przykładowe ćwiczenia ze strony otwierane w edytorze mają scenę 1200 × 675 (16:9) i zasoby w gęstości 2× (ostrzejsza grafika na iPadach i ekranach 4K).

v0.0.31 2026-10-11

  • Pasek narzędzi: akcje wyrównane do lewej tuż za logo, w grupach rozdzielonych separatorami, z wyróżnionym „Uruchom”; sekcja widoku (siatka, zoom) przy prawej krawędzi, a w wąskim oknie (np. 1280 px) w drugim rzędzie.
  • Pasek statusu u dołu sceny: komunikaty przejściowe po lewej (znikają po kilku sekundach i nie przesuwają paska narzędzi), rozmiar sceny i stan zapisu po prawej.
  • Siatka: zawsze widoczne kontrolki — włączenie, rozmiar oczka (5, 10, 20, 25 albo 50 px; wygląd i przyciąganie), „Na wierzchu” (nad elementami, bez przechwytywania myszy, tylko w edytorze), przezroczystość i przyciąganie. Ustawienia siatki i zoom są pamiętane w przeglądarce niezależnie od projektu i ćwiczenia (nie trafiają do projekt.json ani ZIP).
  • Okno „Nowe ćwiczenie” bez tekstu z wartościami projektu; przycisk „Nowe ćwiczenie” w pasku zawsze czyści pracę i otwiera to okno. Przycisk „X” w nagłówkach okien jest wyśrodkowany.
  • Wbudowany projekt nazywa się „GSEngine” i jest tylko do odczytu: „Zdefiniuj” pokazuje jego wartości bez edycji oraz przycisk „Utwórz własny projekt na tej bazie” (kopia rozmiaru sceny, języka i gęstości do nowego projektu).
  • Potwierdzenie porzucenia pracy: „Nowe ćwiczenie” i otwieranie ćwiczenia z ZIP albo folderu przy zmianach od ostatniego zapisu ZIP, eksportu projekt.json lub otwarcia pyta „Czy na pewno chcesz porzucić niezapisaną pracę?” (Tak/Nie); autozapis w przeglądarce nie liczy się jako zapis.
  • Wyraźniejszy kontrast paneli: trzy poziomy tła (strona, panel, pole), mocniejsze obrysy pól i przycisków (co najmniej 3:1), nagłówki sekcji z tłem i grubszym dolnym obrysem, tekst pomocniczy co najmniej 4,5:1.
  • Logo (trzy zachodzące kafle z zębatką) w pasku narzędzi i w oknie „Nowe ćwiczenie” (domyślne logo projektu); własny favicon edytora (SVG, ICO 16/32/48, PNG 16/32/48 i ikona apple-touch-icon 180×180).

v0.0.30 2026-10-10

  • Okno startowe: logo projektu, lista „Projekt” z przyciskiem „Zdefiniuj” i pozycją „+ Nowy projekt…”, lista „Silnik” (GSEngine-generics) oraz „Nowe ćwiczenie”, „Otwórz ZIP” i „Otwórz folder”; przycisk w pasku narzędzi otwiera okno startowe.
  • Projekty: definicja projektu (nazwa, logo, rozmiar sceny, język) zapisana w przeglądarce; „Nowe ćwiczenie” dostaje kopię wartości aktywnego projektu. Wbudowany projekt „Moje ćwiczenia” jest zapisywany dopiero po edycji, a ćwiczenia zapisane wcześniej należą do niego.
  • Plik definicji projektu .gsproject (ZIP z project-definition.json i logo) do eksportu, importu i redystrybucji; import sprawdza format, wersję, identyfikator, logo (do 1 MB) i adres bazowy zasobów wspólnych (tylko http(s) albo ścieżka); przy powtórzonym identyfikatorze definicję można zastąpić albo zapisać jako nowy projekt. Usunięcie projektu usuwa jego pliki z przeglądarki.
  • Gęstość zasobów (1, 1,5, 2 albo 3) w definicji projektu, z opisem pod polem; nowe ćwiczenie dostaje jej kopię, a „Konfiguracja ćwiczenia” pokazuje ją tylko do odczytu (projekt.json jej nie zawiera). Pierwszy obraz albo arkusz klatek przypisany elementowi ustawia jego rozmiar: wymiary pliku (jednej klatki) podzielone przez gęstość, a obraz większy niż scena jest proporcjonalnie zmniejszany; podmiana obrazu i zmiana gęstości nie zmieniają rozmiaru wstawionych elementów.
  • Zasoby wspólne projektu: w definicji projektu adres bazowy (http(s), ścieżka od / albo ścieżka względna — w instalacji u klienta folder obok silnika) i pliki (obrazy, animacje z liczbą klatek, dźwięki; do 5 MB na plik, 50 plików i 30 MB w projekcie). Biblioteka zasobów ćwiczenia ma sekcję „Z projektu”: wybrany zasób wspólny trafia do ćwiczenia bez kopiowania pliku, a „Usuń zasób” go nie usuwa.
  • Eksport ćwiczenia z zasobami wspólnymi w schemacie 2.1: libraries (identyfikator projektu i adres bazowy), library i src względny do adresu bazowego, asset.library w requires; plików wspólnych nie ma w paczce ZIP, a ćwiczenie bez nich zostaje w 2.0. Import czyta libraries; zasób wspólny bez pliku w przeglądarce daje ostrzeżenie w oknie walidacji, bez blokady eksportu. Edytor niczego nie pobiera z adresu bazowego.
  • „Uruchom” wysyła pliki wspólne z przeglądarki razem z ćwiczeniem (shared/, api/run.php przyjmuje tam tylko obrazy i dźwięki); gdy ich brakuje, silnik pobiera je z adresu bazowego, a adres z innego serwera wymaga zgody autora — raz na host w sesji.
  • Sloty projektu: w definicji projektu sześć slotów stałych (dobrze, źle, podniesienie, upuszczenie, wygrana, kliknięcie) z dźwiękiem wspólnym albo „brak” oraz sloty własne — nazwane skróty do dowolnego zasobu wspólnego, które listy wyboru zasobów w ćwiczeniu pokazują jako „Slot: <nazwa>” według rodzaju pola. Slot w .gsproject wskazujący nieistniejący zasób jest przy imporcie czyszczony.
  • Automatyczne dźwięki slotów stałych: nowe elementy i reguły dostają akcję „Odtwórz dźwięk”, gdy zdarzenie pierwszy raz staje się dostępne (dobrze i źle na Targecie przy przeciąganiu albo na klikalnym Componencie przy zaznaczaniu, podniesienie i upuszczenie na przeciągalnym Componencie, kliknięcie na klikalnym, wygrana na ukończeniu nowego ćwiczenia). To zwykłe akcje do edycji; ręcznie usunięta nie wraca, zmiana slotu nie zmienia istniejących elementów, a otwarte i zaimportowane ćwiczenia niczego nie dostają.

v0.0.29 2026-10-10

  • Limity paczki ZIP przy wczytywaniu z adresu i z pliku („Otwórz ZIP”): 50 MB pliku, 500 wpisów, 100 MB jednego pliku i 200 MB łącznie po rozpakowaniu (rozpakowywanie przerywane po przekroczeniu — ochrona przed bombą dekompresyjną), 30 s na pobranie; po przekroczeniu komunikat, projekt bez zmian.
  • Zaufane źródła ?open=: adres z pochodzenia edytora albo z listy trustedOrigins w gs-editor.config.json wczytuje się bez pytania; adres z innego pochodzenia (także po przekierowaniu) tylko po zgodzie autora — pytanie podaje host, również przy pustym edytorze.

v0.0.28 2026-10-10

  • Wczytanie ćwiczenia z adresu: parametr ?open=<adres ZIP> (np. z przycisku „Otwórz w edytorze” na stronie przykładów); przy istniejącym projekcie edytor pyta, czy go zastąpić.

v0.0.27 2026-10-09

  • Układ o stałej wysokości okna: paleta, scena, lista elementów i inspektor przewijają się wewnątrz; scena widoczna od góry obszaru.
  • Szersza prawa kolumna: lista elementów zajmuje ok. 20% wysokości, inspektor resztę.
  • Autozapis projektu w przeglądarce po każdej zmianie (przycisk „Zapamiętaj projekt” zapisuje od razu).
  • Miniatura arkusza klatek animacji w bibliotece zasobów pokazuje pierwszą klatkę.
  • Czytelny plusik dodawania przy każdym Componencie palety.

v0.0.26 2026-10-09

  • Paleta pięciu Componentów z ikoną i kolorem z katalogu silnika; inspektor pokazuje tylko opcje Componentu wybranego elementu.
  • Wygląd elementu: obraz, animacja (arkusz klatek oznaczony w bibliotece zasobów) albo tekst, z edytorem stanów wyglądu.
  • Opcje przeciągania i Targetu; Container z dziećmi wybieranymi z listy i podglądem układu na scenie.
  • Reguły select, place (pary z list wyboru) i open w „Konfiguracji ćwiczenia”; edytor akcji z katalogu, w tym animacje, cząsteczki, dźwięk z exclusive i complete.
  • Sekcja „Reakcje” w inspektorze każdego elementu: akcje ćwiczenia, które go wskazują, i dodawanie nowej reakcji „po zdarzeniu zrób” zapisywanej w źródle zdarzenia.
  • Wskazania elementów, zasobów, stanów, zdarzeń i akcji wyłącznie z list wyboru; eksport i import w modelu Componentów, zapis lokalny pod nowym kluczem (starsze zapisy dostają komunikat o starym formacie).

v0.0.25 2026-10-09

  • Interakcja tap i oznaczanie poprawnych elementów w inspektorze; eksport reguły select.
  • Edytor akcji: play-sound i hide przypisane do zdarzeń elementu i ćwiczenia, parametry z katalogu silnika.

v0.0.24 2026-10-09

  • Paleta, inspektor i eksport z katalogu silnika (catalog.json); eksport ćwiczenia w schemacie v2.
  • Kopia silnika w engine/ razem z edytorem — „Uruchom” otwiera ten sam silnik, z którego pochodzi katalog.
  • Projekty i paczki w starym formacie są odrzucane z komunikatem.

v0.0.23 2026-10-02

  • Projekt „GS Engine” z ćwiczeniem zaznaczania Basic Select (Componenty: Tło, Obrazek, Element wyboru).
  • Środowisko deweloperskie w Dockerze.