Versions

What is current in each part of GS Creator and what the engine can do.

ProductVersionDateStatusJSON schema
GS Engine
Haxe 4.3 · OpenFL · target html5
v0.0.152026-10-15in developmentv2.4
GS Editor
Angular 22
v0.0.472026-10-16in developmentv2.4

Engine capabilities (GS Engine 0.0.15)

From the engine catalog (catalog.json, schema v2.4). An exercise is a scene of elements of five components; its behavior comes from their options and the solution rule. An exercise lists the names of the features it uses in the requires field.

Components

Imagetype: imagerequires: element.imageicon: image

A picture or an animation: background, decorations, characters. Not interactive; only actions that point to it change it.

Roles: — · Events: —

OptionKeyTypeRequiredDefaultrequires
Position and sizerectrectyes[0,0,200,200]—
Layerlayernumberno1—
Appearancevisualvisual (image, animation)yes——
Texttype: textrequires: element.texticon: text

A caption: an instruction, a label or a message. Not interactive; only actions that point to it change it.

Roles: — · Events: —

OptionKeyTypeRequiredDefaultrequires
Position and sizerectrectyes[0,0,400,80]—
Layerlayernumberno1—
Appearancevisualvisual (text)yes——
Componenttype: componentrequires: element.componenticon: pointer

An element the player interacts with: click, pick up and drop (on a Target or loose on the scene).

Roles: clickabledraggableconnectable · Events: tapdrag-startdrag-enddropdrop-outsidecorrectwrong

OptionKeyTypeRequiredDefaultrequires
Position and sizerectrectyes[0,0,200,200]—
Layerlayernumberno1—
Appearancevisualvisual (image, animation, text)yes——
Clickableclickableboolnofalsecomponent.clickable
Draggabledraggableobject (bounds, hit)no—component.draggable
Connectableconnectableboolnofalsecomponent.connectable
Line anchor point (only when connectable: true)anchorobject (point in rect, reach)no—component.anchor
Containertype: containerrequires: element.containericon: container

Holds Components: arranges them vertically, horizontally or in tiles; children can be taken out and put back. Invisible without an appearance.

Roles: contains · Events: child-addedchild-removed

OptionKeyTypeRequiredDefaultrequires
Position and sizerectrectyes[0,0,600,160]—
Layerlayernumberno1—
Appearancevisualvisual (image, animation, text)no——
Layoutlayoutobject (orientation, columns, gap, padding, align, order, overflow)no{"orientation":"vertical"}container.layout
Components insidechildrenrefList (element: component)no—container.children
Targettype: targetrequires: element.targeticon: target

A place where the player drops Components. Invisible without an appearance.

Roles: accepts · Events: over-targetleft-targetoccupiedvacateddropcorrectwrong

OptionKeyTypeRequiredDefaultrequires
Position and sizerectrectyes[0,0,200,200]—
Layerlayernumberno1—
Appearancevisualvisual (image, animation, text)no——
Capacitycapacitynumber | manyno1target.capacity
Hit detectionhitModeobject (mode, overlap, radius)no{"mode":"center"}target.hitMode
Placement after a hitsnapobject (mode, point)no{"mode":"center"}target.snap
When fullonOccupiedchoice (reject, replace, swap)no"reject"target.onOccupied

Appearance

Imagetype: image
OptionKeyTypeRequiredDefaultrequires
Imageassetref (asset: image)yes——
Animationtype: animationrequires: visual.animation
OptionKeyTypeRequiredDefaultrequires
Sprite sheetassetref (asset: animation)yes——
Frame countframesnumberno1—
Frames per secondfpsnumberno8—
Looploopboolnotrue—
Play on startautoplayboolnotrue—
Texttype: textrequires: visual.text
OptionKeyTypeRequiredDefaultrequires
Contenttextrich-textyes——
Sizesizenumberno32—
Colorcolorcolorno"#222222"—
Alignmentalignchoice (left, center, right)no"left"—
Line heightlineHeightnumberno1.2—
Appearance statesfield: visual.statesrequires: visual.states

Named overrides of the appearance options, set with the set-state action; built-in state: normal. Each state can also change:

OptionKeyTypeRequiredDefaultrequires
Tinttintcolorno——
Opacityopacitynumberno1—
Scalescalenumberno1—

Rules

Selectionkind: selectrequires: rule.selectjudges the elements with the role: clickable
OptionKeyTypeRequiredDefaultrequires
Correct elementscorrectrefList (element: clickable)yes——
Placement in Targetskind: placerequires: rule.placejudges the elements with the role: draggable
OptionKeyTypeRequiredDefaultrequires
PairspairsobjectList (components, targets)yes——
No evaluationkind: openrequires: rule.open
OptionKeyTypeRequiredDefaultrequires
Completioncompletechoice (all-placed, manual)no"all-placed"—
Connecting pairskind: connectrequires: rule.connectjudges the elements with the role: connectable
OptionKeyTypeRequiredDefaultrequires
PairspairsrefPairList (element: connectable)yes——
In orderinOrderboolnofalse—
Drawingdrawchoice (drag, freehand)no"drag"—
Line width (px)lineWidthnumberno6—
Line colorlineColorcolorno"#2f9e5b"—
Dot at line endsendDotnumberno16—
Wrong connectionswrongLineschoice (remove, keep)no"remove"—

Actions

Play sounddo: play-soundrequires: action.play-sound
OptionKeyTypeRequiredDefaultrequires
Soundassetref (asset: audio)yes——
Stop other soundsexclusiveboolnofalse—
Show elementdo: showrequires: action.show
OptionKeyTypeRequiredDefaultrequires
Elementtargetref (element)yes——
Hide elementdo: hiderequires: action.hide
OptionKeyTypeRequiredDefaultrequires
Elementtargetref (element)yes——
Set appearance statedo: set-staterequires: action.set-state
OptionKeyTypeRequiredDefaultrequires
Elementtargetref (element)yes——
Statestateref (state: state of the element with target)yes——
Movedo: move-torequires: action.move-to
OptionKeyTypeRequiredDefaultrequires
Elementtargetref (element)yes——
Destinationtodestination (accepts, [x, y], start)yes——
Return to startdo: returnrequires: action.return
OptionKeyTypeRequiredDefaultrequires
Elementtargetref (element)yes——
Lockdo: lockrequires: action.lock
OptionKeyTypeRequiredDefaultrequires
Elementtargetref (element)yes——
Unlockdo: unlockrequires: action.unlock
OptionKeyTypeRequiredDefaultrequires
Elementtargetref (element)yes——
Swap placesdo: swaprequires: action.swap
OptionKeyTypeRequiredDefaultrequires
Componenttargetref (element: draggable)yes——
With Componentwithref (element: draggable)yes——
Bring to frontdo: bring-to-toprequires: action.bring-to-top
OptionKeyTypeRequiredDefaultrequires
Elementtargetref (element)yes——
Play animationdo: play-animationrequires: action.play-animation
OptionKeyTypeRequiredDefaultrequires
Elementtargetref (element: appearance animation)yes——
Looploopboolno——
Stop animationdo: stop-animationrequires: action.stop-animation
OptionKeyTypeRequiredDefaultrequires
Elementtargetref (element: appearance animation)yes——
Emit particlesdo: emit-particlesrequires: action.emit-particles
OptionKeyTypeRequiredDefaultrequires
Elementtargetref (element)yes——
Complete the exercisedo: completerequires: action.completeonly with the rule: kind: open, complete: manual

Events

EventNameScopeRaised by
Taptapelementcomponent.clickable
Pick updrag-startelementcomponent.draggable
Releasedrag-endelementcomponent.draggable
Drop on a Targetdropelementcomponent.draggableelement.target
Drop outside a Targetdrop-outsideelementcomponent.draggable
Component over the Targetover-targetelementelement.target
Component left the Targetleft-targetelementelement.target
Place takenoccupiedelementelement.target
Place freedvacatedelementelement.target
Returned to the Containerchild-addedelementcontainer.children
Removed from the Containerchild-removedelementcontainer.children
Correct movecorrectelementrule.selectrule.placerule.connect
Wrong movewrongelementrule.selectrule.placerule.connect
Exercise startstartexercise—
Exercise completedcompletedexercise—

Change history

GS Engine

v0.0.15 2026-10-15

  • Choosing the exercise language at start: the address parameter ?language=<code> chooses the language of the exercise texts and asset versions from its languages list — first the whole code (pt-BR), then the part before the first “-” (pl-PL → pl), regardless of letter case; without the parameter or without a match (e.g. de) the exercise starts in defaultLanguage. The same parameter sets the language of the engine messages (Polish or English), so “Run in the engine” on the English examples site shows the example in English.
  • Texts (visual.text and the texts of appearance states) in the chosen language, and without a translation — in defaultLanguage, without an error; a text without content in defaultLanguage still stops the start (invalid-reference). Asset path: src.<chosen language>, then src.<defaultLanguage>, then src.default; only the chosen version of the file is loaded. The engine state has a new language field (the effective exercise language, null before loading and on a start error), and the text-overflow warning concerns the texts in the chosen language. The exercise file format and schema 2.4 are unchanged.

v0.0.14 2026-10-12

  • Schema 2.4 (a change in the engine catalog only, exercise files 2.0–2.3 work unchanged): the labels and descriptions of the catalog (label, description — components, roles, options and their fields, choice and special values, appearances, states, rules, actions, events, context positions and shared assets) are multilingual texts { "pl": …, "en": … }; the technical keys (type, key, value, requires, icon, color) stay plain texts. The names Image, Text, Component, Container and Target are the same in both languages.
  • The messages the engine draws on the scene (loading the exercise, start error) in Polish or English: the language is chosen by the address parameter ?language=<code> (e.g. ?language=en, passed by the examples site), without it by the browser language (Polish → Polish, any other → English). The parameter does not change the language of the exercise texts; the version label and the diagnostic messages errors[].message are not translated.

v0.0.13 2026-10-12

  • Schema 2.3 (an additive change, exercises 2.0, 2.1 and 2.2 work unchanged): the “Line anchor point” option (anchor, the component.anchor feature) of a connectable Component, allowed only with connectable: true. The point field [x, y] is the place where the lines of the point start and end, relative to the top left corner of the element and inside its rectangle; the reach field is the grab range in scene pixels (at least 1, 40 by default).
  • Lines are grabbed only near the dot: the pointer starts and ends a line of a point with anchor in a circle of radius reach (40 px by default) around the anchor point, also with a slightly inaccurate touch; when the zones of several points overlap, the nearest one wins. Lines (the preview, right and wrong lines, the connect(a, b) command and the polyline in connections) run from anchor point to anchor point. A point without anchor works as before: it is grabbed by its whole rectangle and connected from its middle.
  • The “Dot at line ends” option of the connect rule (endDot): a dot in the line color at both of its ends, diameter in px — 16 by default (larger than the default line width), 0 turns the dots off. The hand cursor over a point with anchor shows only in the zone of the dot.
  • Catalog: the when condition on a component option (anchor only with connectable: true) and inside on a field of the point type (a point inside the element rectangle); invalid-reference errors with the paths elements[i].anchor, elements[i].anchor.point and elements[i].anchor.reach, and requires-missing without component.anchor. The “Connect the pairs” example on the site has images with drawn connection points, and the line anchor points are aimed at their middles.

v0.0.12 2026-10-11

  • Schema 2.2 (an additive change, exercises 2.0 and 2.1 work unchanged): the connect rule — connecting pairs. A point is a Component with the connectable option (the connectable role, the component.connectable feature; an image, text or animation, not together with draggable); the pairs [a, b] in rule.pairs (option type refPairList, chosen from the list of points) are undirected, and the line limit of a point is the number of pairs it appears in.
  • Rule options: inOrder (the pairs in the order of the list), draw (drag — a straight line from the point to the pointer, freehand — a freehand line), lineWidth and lineColor (the preview and right lines) and wrongLines (remove — a wrong line disappears at once, keep — it stays red, takes the place of both points and disappears when clicked).
  • Judging a connection: correct or wrong on both points, attempts grows by 1; the wrong reasons not-a-pair, out-of-order and occupied. Releasing on an empty spot or on the same point is not judged. Lines are drawn above the scene elements; the exercise ends when all the pairs are connected correctly and there are no wrong lines.
  • The engine state has the connections field (lines in the order they were made: points, status good or bad, pair index and the polyline in scene pixels), and the test mode has the commands connect(a, b) and removeLine(a, b). A new example on the site: “Connect the pairs”.

v0.0.11 2026-10-11

  • The built-in example (the engine without the ?exercise= parameter) has the default scene of 1200 × 675 (16:9), and its background is at 2× density (2400 × 1350): on a 16:9 screen (e.g. a 4K TV) the scene fills the window, on an iPad it takes about 75% of the window. Exercises with another scene size (e.g. 1136 × 518) are fitted into the window the same way, with no layout changes; the exercise schema is unchanged.
  • The instruction and the pictures of the built-in example are centered on the scene. The example exercises on the site are rebuilt on the 1200 × 675 (16:9) scene with assets at 2× density (backgrounds 2400 × 1350): sharper graphics on iPads and 4K screens; the elements keep their size, and the composition uses the whole scene.

v0.0.10 2026-10-11

  • Its own page icon for the engine (favicon.png with the logo: three overlapping tiles with a cogwheel) instead of the default icon of the graphics library; the exercise schema and the engine behavior are unchanged.

v0.0.9 2026-10-10

  • Schema 2.1 (an additive change, exercises 2.0 work unchanged): shared assets from libraries — the libraries list [{id, base}] and the library field of an asset; the src of a shared asset is relative to the base address of the library (http(s), a path from / or a relative path), and the file is not in the exercise package. Using them requires the asset.library feature in requires; the engine catalog has an assets section.
  • A shared asset that fails to load is asset-missing with the library field (the library identifier) and the file address — the exercise keeps working; a bad base address (e.g. javascript:, data:, file:) or a library that does not exist is invalid-reference. The parameters of the exercise address (?v=) are not added to shared assets.
  • Assets from another origin: images require the Access-Control-Allow-Origin header on the library server, sounds work without it.

v0.0.8 2026-10-10

  • Sharp text and images at any window size and on high-DPI screens (e.g. 4K): the engine itself fits the scene (size from the file) into the window and draws it at the display resolution (buffer = window size × devicePixelRatio) instead of letting the browser stretch the image; the bars outside the scene are black, elements outside size are clipped.
  • The engine state has the view field {scale, x, y, pixelRatio}: how the scene is fitted to the surface (the element positions stay in scene pixels).

v0.0.7 2026-10-10

  • The drag test command respects the clipping of a Container and the scene bounds like the pointer: it returns false without changing the state when no part of the element is visible (e.g. a child of a Container with overflow: scroll outside its rectangle — it has to be scrolled into view first with the scroll command).

v0.0.6 2026-10-09

  • A text taller than the element rectangle shows the beginning of the text clipped to rect (before, the last lines were visible); the text-overflow warning is unchanged.
  • The engine files (the catalog, the built-in example) are loaded on demand, not before the start: a failed download ends with a status (load-failed or a missing asset) instead of a stuck start; an exercise from an address does not download the files of the built-in example.

v0.0.5 2026-10-09

  • The model of five scene components: Image, Text, Component, Container and Target in one elements list; an element has a type and the options of its component.
  • The engine catalog with the components (roles, options, icon and color), appearance types and states, rules, actions, events and context positions; the registry of components in the engine matches the catalog.
  • The image, animation (sprite sheet: frames, fps, loop, autoplay) and text appearances with states (visual.states); the set-state, show, hide, play-animation and stop-animation actions.
  • Dragging Components (draggable with a movement area and grabbing by the outline of the image) and Target with the capacity, hitMode, snap and onOccupied options; the move-to, return, lock, unlock, swap and bring-to-top actions and the dropped and drop-target positions.
  • Container: a vertical, horizontal or tiled layout (gap, padding, align), a repeatable random order, clipping and scrolling, taking children out and putting them back (child-added, child-removed).
  • The select, place and open rules (completion all-placed or with the complete action); the emit-particles action (particles) and play-sound with the exclusive option.
  • Engine state: elements with type, state, position, placement, lock, appearance and animation; the text-overflow warning, the error paths of invalid-reference and requires-missing; the test mode with the tap, drag and scroll commands and actionLog, registry and playing.

v0.0.4 2026-10-09

  • The tap interaction: a touch toggles the selection of an element.
  • The select rule: the exercise is solved when exactly the correct elements are selected; the progress in progress.
  • The play-sound and hide actions assigned to the events of an element (tap, correct, wrong) and of the exercise (start, completed).
  • Test mode: the tap(id) command and the log of the actions performed (actionLog).

v0.0.3 2026-10-09

  • Schema v2: an exercise is a scene with elements (schema, requires, size, assets, elements); no exercise type choosing the logic.
  • The engine catalog (catalog.json) published next to the engine: element kinds, interactions, rules, actions and events with their properties.
  • File validation with readable error codes: schema-unsupported, requires-missing, invalid-reference (with a path), asset-missing, load-failed.

v0.0.2 2026-10-09

  • The attempts field in the engine state — a counter of clicks on choice elements.

v0.0.1 2026-10-01

  • The first exercise: selecting the correct pictures (Basic Select).
  • Elements: BackgroundElement, BasicElement, SelectElement; correct/wrong sounds.
  • A development environment in Docker (html5 build + automatic rebuild).

GS Editor

v0.0.47 2026-10-16

  • The hint with the default-language text in an empty text field of another language (also “no change” in the text field of a visual state) is italic, in a grey lighter than the typed text (contrast with the field background at least 4.5:1), so it does not look like typed text. With one language the fields look as before.

v0.0.46 2026-10-16

  • Scene keyboard shortcuts work only while working on the scene: Delete, Backspace and the arrows remove and move the selected element when the focus is on a scene element, on the element list or on no control. On buttons, language tabs, scene language switches and drop-down lists these keys do not change the scene, and while a window is open no shortcut works. Ctrl+Z, Ctrl+Y and Shift+1 also work after a click on a toolbar button, and a mouse click on a scene element moves the focus to it.

v0.0.45 2026-10-15

  • Language slots of assets in the asset library: in an exercise with several languages every asset has language keys. An asset with one file is common to all languages; a file added for another language makes it a language asset, which needs a file for every exercise language (a missing file is marked with a dot on the key and a validation error, whose click opens the library on the missing language). The files of the slots can be added, replaced and removed; the last file goes back to a common asset. Changing the default language leaves the files alone, and removing a language removes the files of its slots after a confirmation with their number.
  • Export, “Run” and saving: a language asset has a key in src for every language in languages and src.default with the same file as the default language (one file in the package); a common asset — src.default as before. Opening an exercise, an editor save or a browser save puts the files into slots without losing bytes; a src.default other than the file of the default language is skipped with a message.
  • Preview and checking of language files: the scene shows the image of an asset in the language of the scene preview (an empty slot — the file of the default language), and “Run” in that language loads only its files in the engine. Validation reports a file of another kind than the asset and a frame sheet whose width cannot be divided by the frame count as errors, and other image proportions than in the file of the default language as a warning. The element size on the first assignment of an image comes from the file of the default language. Saving a ZIP and “Run” refuse a package with more than 500 files.

v0.0.44 2026-10-15

  • Several exercise languages: in “Exercise configuration” a list of languages with one default — adding from a list of popular languages or with a custom code (ll or ll-RR, e.g. pt-BR), a warning for a language written from right to left, removing a language with a confirmation showing the number of its texts. Export writes languages in the order of the list and defaultLanguage; opening an exercise reads all its languages, and exercises and saves with one language open without loss.
  • Texts in every language: with more than one language the text field in the inspector (the base text and the texts of appearance states) has language tabs with a dot at a language missing the text, the name of the editing language at the field and a hint from the default language in an empty field. Validation reports a text filled in one language and empty in another (element, field and language) and tags that are not allowed in any language; a click on the problem switches the tab to its language.
  • Language of the scene preview: language switches on the scene heading show the scene texts in the chosen language (without a translation — in the default language, as in the engine), independently of the inspector tabs, and “Run” starts the engine in that language (the language parameter). An exercise with one language looks and works as before.

v0.0.43 2026-10-15

  • Language versions of asset files (src.<language>, e.g. src.pl and src.en next to src.default) pass through the editor without loss: opening an exercise (ZIP, folder, editor save, browser save) and exporting it again (ZIP, projekt.json, “Run”) keep all src keys and the file under each of them, and the languages of the versions go to languages. The exercise file format does not change.
  • An asset without src.default (with language files only) is no longer skipped when opening nor changed when exporting; the library shows its first version. A version file missing from the package gives a validation message with the file path, and “Delete asset” also removes the files of its versions.

v0.0.42 2026-10-14

  • The “Exercise configuration” window: simpler field descriptions without names from the exercise file (the scene size “in scene pixels”, the exercise identifier derived from the name), and the language list shows the language names (“Polish”, “English”) instead of codes — also in the “Project definition” window.
  • Enter in the “Content” field of a Text element starts a new line: the editor saves it in the file as <br>, and the scene preview and the engine show two lines; a <br> from an opened file is shown in the field as a new line.
  • A copy of an element is placed next to the original (24 px right and down, inside the scene) instead of the top left corner of the scene.
  • A clearer question about unsaved work: it says that the exercise has not been saved to a file (ZIP or projekt.json) and that its copy in the browser will be removed or replaced.
  • New data-* markers for the help: the rule editor (section, rule list, “Add” buttons, pair ends) and the editor version number.

v0.0.41 2026-10-14

  • Fixed data-* markers on the controls shown in the help (window areas, dialogs, buttons of the toolbar and of the start window, the asset library, the element list and the inspector): the help screenshot generator finds the elements by them, independently of the interface language. No change in the look or behavior of the editor.

v0.0.40 2026-10-14

  • A “Help” button at the end of the action group of the toolbar opens the GS Editor help on the GS Creator site (step-by-step pages with screenshots, /pomoc) in a new tab, in the language of the editor interface (?lang=). The help address comes from the editor configuration (helpUrl in gs-editor.config.json); without it there is no button. The toolbar still fits in one row.

v0.0.39 2026-10-14

  • “Fit to window” zoom: a button in the zoom group of the toolbar and the Shift+1 shortcut set the largest zoom at which the whole scene fits in the scene area, and put the scene in the middle. The scene keeps fitting when the window, the inspector column or the scene size changes, until the author moves the slider; the choice is remembered in the browser with the view settings. The zoom slider goes from 10 to 150% in steps of 1%, and the toolbar still fits in one row.
  • The scene is centered at any zoom: a scene smaller than the area stands in its middle (horizontally and vertically), a larger one starts at the left and top edge and all of it can be reached by scrolling; a change of the zoom keeps the middle of the visible part of the scene.
  • Rule options are saved separately for each rule (e.g. the pairs of the “Placement in Targets” rule and the pairs of the “Connecting pairs” rule do not mix when the rule changes); a local save and ZIP packages with the earlier layout open unchanged, and the exercise file stays the same.

v0.0.38 2026-10-13

  • A Component's behavior is chosen with one “Behavior” control instead of three checkboxes: None, Clickable, Draggable or Connectable — one role per Component, and each change is one undo step. Under the control there is a short description of the chosen role; “Draggable” shows the “Movement area” and “Grab area” fields, “Connectable” the line anchor point. The control is a named group of radio buttons: one Tab stop, the arrow keys change the role, the focus is visible. The segments come from the engine catalog, so a new role appears by itself. The file format is unchanged.
  • A file in which a Component has several roles (e.g. Clickable and Draggable) opens without losing data: the control shows one role, and a warning lists the others with a “Remove extra roles” button (one undo step). Connectable together with Draggable still blocks the export until the extra role is removed.

v0.0.37 2026-10-13

  • Loading screen: until the editor has loaded, the middle of the window shows the logo and a spinning indicator on the editor background; it disappears when the interface appears, without moving the layout. Screen readers get a loading message, and with reduced motion (prefers-reduced-motion) the indicator does not spin.

v0.0.36 2026-10-12

  • The grid controls are in the “Grid” menu of the toolbar: the button shows the grid state (“Grid: on” or “Grid: off”) and opens a panel with the “Show grid”, “Size”, “On top”, “Transparency” and “Snapping” fields. Changing a setting does not close the panel; it closes with Esc (the focus goes back to the button), a click outside the panel (which reaches what is under it, e.g. a scene element), the focus leaving the panel with the Tab key and a second click on the button. The panel has the role of a non-modal dialog, and the button has aria-expanded and aria-controls.
  • The toolbar fits in one row from a window width of about 1150 px (e.g. 1280, 1440 and 1512 px — MacBook Pro 14), in Polish and in English, without horizontal scrolling; a narrower window moves the view section to a second row. Order of the view section: the “Grid” menu, “Zoom” and the interface language switch at the right edge of the bar.
  • New grid defaults: size 10 px, “On top” on, transparency 70%, snapping on. They apply only to a browser without saved view settings — saved settings (gseditor.view.v1) stay unchanged. The grid on top still does not catch the mouse.

v0.0.35 2026-10-12

  • The editor interface in Polish and English: all screens (toolbar, start window, status bar, palette, element list, scene, inspector with the action, reaction and rule editors, asset library, the “Exercise configuration”, validation and “Project definition” windows), hints, alt and aria texts, validation messages, errors of opening and saving exercises and projects, browser questions and the labels of the engine catalog. The interface language is independent of the exercise language.
  • The language switch in the toolbar and in the start window changes the language on the fly, without a reload: the exercise, the selection, the undo history, open windows and unsaved work stay. The choice is saved in the browser (gseditor.language.v1); on the first start the language comes from the browser (Polish → PL, any other → EN), and the address parameter ?lang=<code> (e.g. from the “Open in the editor” button on the examples site) chooses the language and saves it.
  • The interface texts are in JSON dictionaries loaded at run time (public/i18n: pl.json, en.json and the languages.json manifest) — a new language is a new dictionary file and an entry in the manifest, with no code changes. Every message is a full sentence with parameters, and plurals take the forms of the language.
  • Default data (the name of a new exercise, the content of a new Text, the names of element copies, appearance states and slots) is created in the interface language at the moment it is made. The names Image, Text, Component, Container and Target stay in English in the Polish interface as well.
  • The labels of the engine catalog in schema 2.4 (pl/en maps) are shown in the interface language; the editor also reads catalogs with plain texts. Exported exercises are unchanged (schemas 2.0–2.3).

v0.0.34 2026-10-12

  • The “Line anchor point” option (anchor) of a Component with “Connectable” on: on the scene the dot of the anchor point (faded while the option is not set, in the middle of the element — where the engine anchors the line), dragged with the mouse over the element (the position rounded to whole pixels and kept inside the element rectangle, one drag is one undo step); in the inspector the X and Y fields of the point and “Reach (px)” (reach, 40 by default). Turning “Connectable” off hides the option and the dot, and the editor remembers the point.
  • The “Connecting pairs” rule has the “Dot at line ends” option (endDot, 16 px by default, 0 — no dots). Validation before export: an anchor point outside the element rectangle (e.g. after making the element smaller), a reach below 1 and a dot below 0.
  • Export in schema 2.3 (component.anchor in requires) only when the exercise uses a line anchor point or a dot other than the default; exercises with connectable Components without these features stay in 2.2. Import, saving in the browser, ZIP, undo/redo and “Run” keep the anchor point, and the “Connect the pairs” example with drawn connection points opens in the editor with the dots on their middles.

v0.0.33 2026-10-11

  • The “Connectable” option (connectable) of a Component and the “Connecting pairs” rule (connect) in the “Exercise configuration”: the list of pairs (pairs) — each row is a point A and a point B chosen from lists of connectable Components, with adding and removing pairs — and the options “In order” (inOrder), “Drawing” (draw), “Line width (px)” (lineWidth), “Line color” (lineColor) and “Wrong connections” (wrongLines).
  • Validation before export: a connect rule without pairs, an incomplete pair, the same point twice, a repeated pair, a point that was removed or has no “Connectable” option, and a Component that is both connectable and draggable. The Correct and Wrong slots of the project add a sound with exclusive under the connect rule, so a connection (correct or wrong on both points) is heard once.
  • Export in schema 2.2 (component.connectable and rule.connect in requires) only when the exercise uses the connect rule or connectable Components; other exercises stay in 2.0 or 2.1. Import, saving in the browser, ZIP and undo/redo keep the pairs and the rule options.

v0.0.32 2026-10-11

  • A new exercise in the GSEngine project has the default scene of 1200 × 675 (16:9) — the definition of the built-in project shows this size and its copy takes it over (“Create your own project based on it”). Opened exercises keep their scene size (e.g. 1136 × 518); a file without a scene size gets 1200 × 675.
  • The example exercises from the site opened in the editor have the 1200 × 675 (16:9) scene and assets at 2× density (sharper graphics on iPads and 4K screens).

v0.0.31 2026-10-11

  • Toolbar: the actions aligned to the left right after the logo, in groups divided by separators, with “Run” highlighted; the view section (grid, zoom) at the right edge, and in a narrow window (e.g. 1280 px) in a second row.
  • A status bar at the bottom of the scene: short-lived messages on the left (they disappear after a few seconds and do not move the toolbar), the scene size and the save state on the right.
  • Grid: always visible controls — on/off, cell size (5, 10, 20, 25 or 50 px; look and snapping), “On top” (above the elements, without catching the mouse, in the editor only), transparency and snapping. The grid settings and the zoom are remembered in the browser independently of the project and the exercise (they do not go into projekt.json or the ZIP).
  • The “New exercise” window without the text with the project values; the “New exercise” button in the toolbar always clears the work and opens this window. The “X” button in the window headers is centered.
  • The built-in project is called “GSEngine” and is read-only: “Define” shows its values without editing and the “Create your own project based on it” button (a copy of the scene size, language and density into a new project).
  • Confirming discarded work: “New exercise” and opening an exercise from a ZIP or a folder, with changes since the last ZIP save, projekt.json export or opening, ask “Do you really want to discard the unsaved work?” (Yes/No); the autosave in the browser does not count as saving.
  • Clearer panel contrast: three background levels (page, panel, field), stronger outlines of fields and buttons (at least 3:1), section headers with a background and a thicker bottom outline, helper text at least 4.5:1.
  • The logo (three overlapping tiles with a cogwheel) in the toolbar and in the “New exercise” window (the default project logo); the editor's own favicon (SVG, ICO 16/32/48, PNG 16/32/48 and an apple-touch-icon 180×180).

v0.0.30 2026-10-10

  • Start window: the project logo, the “Project” list with the “Define” button and the “+ New project…” item, the “Engine” list (GSEngine-generics) and “New exercise”, “Open ZIP” and “Open folder”; a button in the toolbar opens the start window.
  • Projects: a project definition (name, logo, scene size, language) saved in the browser; “New exercise” gets a copy of the values of the active project. The built-in project “My exercises” is saved only after it is edited, and the exercises saved earlier belong to it.
  • The project definition file .gsproject (a ZIP with project-definition.json and the logo) for export, import and redistribution; the import checks the format, version, identifier, logo (up to 1 MB) and the base address of shared assets (http(s) or a path only); with a repeated identifier the definition can replace the existing one or be saved as a new project. Deleting a project deletes its files from the browser.
  • Asset density (1, 1.5, 2 or 3) in the project definition, with a description under the field; a new exercise gets a copy of it, and the “Exercise configuration” shows it read-only (projekt.json does not contain it). The first image or sprite sheet assigned to an element sets its size: the file dimensions (of one frame) divided by the density, and an image larger than the scene is scaled down proportionally; replacing the image or changing the density does not change the size of elements already placed.
  • Shared assets of a project: in the project definition a base address (http(s), a path from / or a relative path — in a customer installation a folder next to the engine) and files (images, animations with a frame count, sounds; up to 5 MB per file, 50 files and 30 MB per project). The asset library of an exercise has a “From the project” section: a chosen shared asset goes into the exercise without copying the file, and “Delete asset” does not delete it.
  • Export of an exercise with shared assets in schema 2.1: libraries (the project identifier and the base address), library and src relative to the base address, asset.library in requires; the shared files are not in the ZIP package, and an exercise without them stays in 2.0. The import reads libraries; a shared asset without a file in the browser gives a warning in the validation window, without blocking the export. The editor does not download anything from the base address.
  • “Run” sends the shared files from the browser together with the exercise (shared/, api/run.php accepts only images and sounds there); when they are missing, the engine downloads them from the base address, and an address on another server needs the author's consent — once per host in a session.
  • Project slots: in the project definition six fixed slots (correct, wrong, pick up, drop, win, click) with a shared sound or “none”, and custom slots — named shortcuts to any shared asset, which the asset choice lists of an exercise show as “Slot: <name>” by the kind of the field. A slot in a .gsproject pointing to an asset that does not exist is cleared on import.
  • Automatic sounds of the fixed slots: new elements and rules get the “Play sound” action when the event becomes available for the first time (correct and wrong on a Target when dragging or on a clickable Component when selecting, pick up and drop on a draggable Component, click on a clickable one, win on completing a new exercise). These are ordinary actions to edit; one removed by hand does not come back, changing a slot does not change existing elements, and opened and imported exercises get nothing.

v0.0.29 2026-10-10

  • ZIP package limits when loading from an address and from a file (“Open ZIP”): 50 MB per file, 500 entries, 100 MB for one file and 200 MB in total after unpacking (unpacking stops once a limit is exceeded — protection against a decompression bomb), 30 s for the download; past a limit a message is shown and the project stays unchanged.
  • Trusted sources of ?open=: an address from the origin of the editor or from the trustedOrigins list in gs-editor.config.json loads without asking; an address from another origin (also after a redirect) only with the author's consent — the question names the host, also with an empty editor.

v0.0.28 2026-10-10

  • Loading an exercise from an address: the ?open=<ZIP address> parameter (e.g. from the “Open in the editor” button on the examples site); with an existing project the editor asks whether to replace it.

v0.0.27 2026-10-09

  • A layout of fixed window height: the palette, the scene, the element list and the inspector scroll inside; the scene is visible from the top of the area.
  • A wider right column: the element list takes about 20% of the height, the inspector the rest.
  • Autosave of the project in the browser after every change (the “Save the project” button saves at once).
  • The thumbnail of an animation sprite sheet in the asset library shows the first frame.
  • A clear plus sign for adding next to every component of the palette.

v0.0.26 2026-10-09

  • A palette of five components with the icon and color from the engine catalog; the inspector shows only the options of the component of the selected element.
  • The appearance of an element: an image, an animation (a sprite sheet marked in the asset library) or a text, with an editor of the appearance states.
  • Dragging and Target options; a Container with children chosen from a list and a preview of the layout on the scene.
  • The select, place (pairs from choice lists) and open rules in the “Exercise configuration”; the action editor from the catalog, including animations, particles, sound with exclusive and complete.
  • The “Reactions” section in the inspector of every element: the actions of the exercise that point to it, and adding a new “after the event, do” reaction saved in the source of the event.
  • References to elements, assets, states, events and actions only from choice lists; export and import in the component model, the local save under a new key (older saves get a message about the old format).

v0.0.25 2026-10-09

  • The tap interaction and marking the correct elements in the inspector; export of the select rule.
  • The action editor: play-sound and hide assigned to the events of an element and of the exercise, parameters from the engine catalog.

v0.0.24 2026-10-09

  • The palette, the inspector and the export from the engine catalog (catalog.json); exercise export in schema v2.
  • A copy of the engine in engine/ together with the editor — “Run” opens the same engine the catalog comes from.
  • Projects and packages in the old format are rejected with a message.

v0.0.23 2026-10-02

  • The “GS Engine” project with the Basic Select selection exercise (components: Background, Picture, Choice element).
  • A development environment in Docker.