maze-blockly-wrapper 0.7.6 → 0.7.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -131,16 +131,72 @@ interface MazeConfig {
131
131
  ```
132
132
 
133
133
  ### RunResult
134
+ Each game component returns a result object via the `onRunFinish` callback when specific conditions are met.
134
135
 
136
+ #### MazeGame Result
137
+ **When sent:** Triggered when the spider reaches the finish line OR when maximum moves are exceeded.
135
138
  ```typescript
136
139
  interface RunResult {
137
- steps: number;
138
- reachedFinish: boolean;
139
- maxMovesExceeded: boolean;
140
- finalPosition: Position;
141
- path: Position[];
142
- executionTime: number;
143
- error?: string;
140
+ steps: number; // Number of steps taken
141
+ reachedFinish: boolean; // True if spider reached the finish cell
142
+ maxMovesExceeded: boolean; // True if maxMoves limit was hit
143
+ finalPosition: Position; // Where the spider ended up
144
+ path: Position[]; // Array of positions visited (todo)
145
+ executionTime: number; // Time in ms (todo)
146
+ inventory: string[]; // Collected items (COIN, KEY, etc.)
147
+ }
148
+ ```
149
+
150
+ #### FilmGame Result
151
+ **When sent:** Triggered when the user clicks the "Finish" button to check their movie against the target.
152
+ ```typescript
153
+ interface RunResult {
154
+ commands: number; // Total drawing commands used
155
+ reachedTarget: boolean; // True if accuracy > 80%
156
+ maxCommandsExceeded: boolean;
157
+ shapes: Shape[]; // Array of shapes drawn by student
158
+ executionTime: number; // Time in ms
159
+ accuracy: number; // 0-1 score representing similarity to target
160
+ tickCount: number; // Final tick count
161
+ comparisonResult: { // Detailed breakdown
162
+ shapeCountMatch: boolean;
163
+ shapeTypesMatch: boolean;
164
+ positionAccuracy: number;
165
+ sizeAccuracy: number;
166
+ colorAccuracy: number;
167
+ };
168
+ }
169
+ ```
170
+
171
+ #### DrawingGame Result
172
+ **When sent:** Triggered automatically when code execution completes.
173
+ ```typescript
174
+ interface RunResult {
175
+ commands: number; // Total commands executed
176
+ reachedTarget: boolean; // True if game state marked as won (custom logic)
177
+ maxCommandsExceeded: boolean;
178
+ finalPosition: Position; // Final pen position
179
+ drawnPath: Position[]; // Array of points visited by pen
180
+ executionTime: number; // Time in ms
181
+ accuracy: number; // 0-1 score comparing drawn path to target path
182
+ }
183
+ ```
184
+
185
+ #### MusicGame Result
186
+ **When sent:** Triggered automatically when the music finishes playing.
187
+ ```typescript
188
+ interface RunResult {
189
+ commands: number; // Total notes/pauses played
190
+ reachedTarget: boolean; // True if accuracy is 100%
191
+ maxCommandsExceeded: boolean;
192
+ notes: Note[]; // Array of notes played
193
+ executionTime: number; // Playback time in ms
194
+ accuracy: number; // 0-100 score comparing played notes to editor notes
195
+ comparisonResult: {
196
+ noteCountMatch: boolean;
197
+ melodyAccuracy: number; // Pitch/Duration match score
198
+ rhythmAccuracy: number; // Timing match score
199
+ };
144
200
  }
145
201
  ```
146
202
 
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ declare const MusicDemo: React.FC;
3
+ export default MusicDemo;
@@ -0,0 +1,11 @@
1
+ import React from 'react';
2
+ interface GameControlsProps {
3
+ isPlaying: boolean;
4
+ isPaused: boolean;
5
+ onPlay: () => void;
6
+ onPause: () => void;
7
+ onStop: () => void;
8
+ onReset: () => void;
9
+ }
10
+ declare const GameControls: React.FC<GameControlsProps>;
11
+ export default GameControls;
@@ -0,0 +1,41 @@
1
+ import { Component } from 'react';
2
+ import type { InstrumentType, MusicBlocklyConfig, NoteDuration, NoteName, NoteOctave } from './types';
3
+ interface MusicBlocklyContainerProps {
4
+ config: MusicBlocklyConfig;
5
+ onWorkspaceChange: (code: string) => void;
6
+ className?: string;
7
+ onPreloadInstruments?: (instruments: InstrumentType[]) => Promise<void>;
8
+ }
9
+ interface MusicBlocklyContainerState {
10
+ initialized: boolean;
11
+ error: string | null;
12
+ showNoteDialog: boolean;
13
+ noteDialogValues: {
14
+ note: NoteName;
15
+ octave: NoteOctave;
16
+ duration: NoteDuration;
17
+ };
18
+ activeField: any | null;
19
+ }
20
+ declare class MusicBlocklyContainer extends Component<MusicBlocklyContainerProps, MusicBlocklyContainerState> {
21
+ private blocklyDiv;
22
+ private workspace;
23
+ private updateTimeout;
24
+ constructor(props: MusicBlocklyContainerProps);
25
+ componentDidMount(): void;
26
+ componentDidUpdate(prevProps: MusicBlocklyContainerProps): void;
27
+ componentWillUnmount(): void;
28
+ /**
29
+ * Preload common instruments when Blockly container is ready
30
+ */
31
+ private preloadInstruments;
32
+ private initializeBlockly;
33
+ private generateCode;
34
+ private registerGenerators;
35
+ getWorkspace(): any;
36
+ private handleOpenNoteEditor;
37
+ private handleNoteSave;
38
+ private handleNoteClose;
39
+ render(): JSX.Element;
40
+ }
41
+ export default MusicBlocklyContainer;
@@ -0,0 +1,14 @@
1
+ import React from 'react';
2
+ import { type GraphicsConfig, type Note, type Pause } from './types';
3
+ interface MusicCanvasProps {
4
+ width: number;
5
+ height: number;
6
+ notes: (Note | Pause)[];
7
+ currentBeat: number;
8
+ isPlaying: boolean;
9
+ selectedRows: number;
10
+ graphicsConfig: GraphicsConfig;
11
+ editorNotes?: (Note | Pause)[];
12
+ }
13
+ declare const MusicCanvas: React.FC<MusicCanvasProps>;
14
+ export default MusicCanvas;
@@ -0,0 +1,11 @@
1
+ import React from 'react';
2
+ import type { MusicBlocklyConfig } from './types';
3
+ interface MusicEditorProps {
4
+ config: MusicBlocklyConfig;
5
+ onWorkspaceChange: (code: string) => void;
6
+ tempo: number;
7
+ onTempoChange: (tempo: number) => void;
8
+ blocklyRef?: React.RefObject<any>;
9
+ }
10
+ declare const MusicEditor: React.FC<MusicEditorProps>;
11
+ export default MusicEditor;
@@ -0,0 +1,15 @@
1
+ import React from 'react';
2
+ import { type WithTranslation } from 'react-i18next';
3
+ import { type GraphicsConfig, type MusicConfig, type RunResult } from './types';
4
+ interface MusicGameProps extends WithTranslation {
5
+ className?: string;
6
+ isEditable?: boolean;
7
+ configuration?: MusicConfig;
8
+ onChange?: (config: MusicConfig) => void;
9
+ onRunFinish?: (result: RunResult) => void;
10
+ maxCommands?: number;
11
+ showControls?: boolean;
12
+ graphicsConfig?: Partial<GraphicsConfig>;
13
+ }
14
+ declare const MusicGameWithTranslation: React.ComponentType<Omit<MusicGameProps, keyof WithTranslation>>;
15
+ export default MusicGameWithTranslation;
@@ -0,0 +1,21 @@
1
+ import React from 'react';
2
+ import type { GraphicsConfig, InstrumentType, MusicBlocklyConfig, MusicConfig, MusicState, Note, Pause } from './types';
3
+ interface MusicTabsProps {
4
+ musicConfig: MusicConfig;
5
+ gameState: MusicState;
6
+ editorState: MusicState;
7
+ generatedCode: string;
8
+ blocklyConfig: MusicBlocklyConfig;
9
+ onConfigChange: (config: MusicConfig) => void;
10
+ onCodeChange: (code: string) => void;
11
+ onEditorStateChange: (state: Partial<MusicState>) => void;
12
+ onEditorNotesChange?: (notes: (Note | Pause)[]) => void;
13
+ graphicsConfig: GraphicsConfig;
14
+ className?: string;
15
+ blocklyRef?: React.RefObject<any>;
16
+ editorBlocklyRef?: React.RefObject<any>;
17
+ editorNotes?: (Note | Pause)[];
18
+ onPreloadInstruments?: (instruments: InstrumentType[]) => Promise<void>;
19
+ }
20
+ declare const MusicTabs: React.FC<MusicTabsProps>;
21
+ export default MusicTabs;
@@ -0,0 +1,14 @@
1
+ import React from 'react';
2
+ import { type GraphicsConfig, type InstrumentType, type Note, type Pause } from './types';
3
+ interface MusicVisualEditorProps {
4
+ tempo: number;
5
+ onTempoChange: (tempo: number) => void;
6
+ selectedRows: number;
7
+ onSelectedRowsChange: (rows: number) => void;
8
+ onCodeChange: (code: string) => void;
9
+ onNotesChange?: (notes: (Note | Pause)[]) => void;
10
+ graphicsConfig: GraphicsConfig;
11
+ onPreloadInstruments?: (instruments: InstrumentType[]) => Promise<void>;
12
+ }
13
+ declare const MusicVisualEditor: React.FC<MusicVisualEditorProps>;
14
+ export default MusicVisualEditor;
@@ -0,0 +1,14 @@
1
+ import React from 'react';
2
+ import type { NoteDuration, NoteName, NoteOctave } from './types';
3
+ interface NoteDialogProps {
4
+ show: boolean;
5
+ onClose: () => void;
6
+ onSave: (note: NoteName, octave: NoteOctave, duration: NoteDuration) => void;
7
+ initialValues: {
8
+ note: NoteName;
9
+ octave: NoteOctave;
10
+ duration: NoteDuration;
11
+ };
12
+ }
13
+ declare const NoteDialog: React.FC<NoteDialogProps>;
14
+ export default NoteDialog;
@@ -0,0 +1,54 @@
1
+ import { type InstrumentType, type Note, type NoteDuration, type NoteOctave } from './types';
2
+ /**
3
+ * Audio engine for playing musical notes using real instrument samples (SoundFont)
4
+ */
5
+ export declare class AudioEngine {
6
+ private audioContext;
7
+ private masterGain;
8
+ private activeNotes;
9
+ private loadedInstruments;
10
+ private loadingInstruments;
11
+ private readonly instrumentMap;
12
+ constructor();
13
+ private initAudioContext;
14
+ /**
15
+ * Pre-load one or more instruments (public method for proactive loading)
16
+ */
17
+ preloadInstruments(instrumentTypes: InstrumentType[]): Promise<void>;
18
+ /**
19
+ * Load an instrument SoundFont (lazy loading)
20
+ */
21
+ private loadInstrument;
22
+ /**
23
+ * Play a single note using SoundFont samples
24
+ */
25
+ playNote(note: Note, tempo: number, instrument?: InstrumentType, onComplete?: () => void): Promise<void>;
26
+ /**
27
+ * Convert note name and octave to SoundFont format (e.g., "C4", "D#5")
28
+ */
29
+ private getNoteNameForSoundfont;
30
+ /**
31
+ * Fallback: Play note using oscillator (for drums or when SoundFont fails)
32
+ */
33
+ private playNoteWithOscillator;
34
+ /**
35
+ * Configure oscillator and gain based on instrument type with better synthesis
36
+ */
37
+ private configureInstrument;
38
+ /**
39
+ * Play a keyboard key (for interactive playing)
40
+ */
41
+ playKeyboardNote(noteName: string, octave: NoteOctave, duration?: NoteDuration, instrument?: InstrumentType): void;
42
+ /**
43
+ * Stop all playing notes
44
+ */
45
+ stopAll(): void;
46
+ /**
47
+ * Resume audio context (needed for browsers that suspend it)
48
+ */
49
+ resume(): Promise<void>;
50
+ /**
51
+ * Cleanup and close audio context
52
+ */
53
+ dispose(): void;
54
+ }
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Load music-specific Blockly messages
3
+ * This should be called before registerMusicBlocks()
4
+ */
5
+ export declare function loadMusicBlocklyMessages(): void;
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Register music blocks with Blockly
3
+ */
4
+ export declare function registerMusicBlocks(): void;
@@ -0,0 +1,2 @@
1
+ export declare function getFieldMusicNoteClass(): any;
2
+ export declare function registerFieldMusicNote(): void;
@@ -0,0 +1,3 @@
1
+ import type { GraphicsConfig } from './types';
2
+ export declare const defaultGraphicsConfig: GraphicsConfig;
3
+ export declare function mergeGraphicsConfig(userConfig?: Partial<GraphicsConfig>): GraphicsConfig;
@@ -0,0 +1,12 @@
1
+ export { default as MusicGame } from './MusicGame';
2
+ export { default as MusicCanvas } from './MusicCanvas';
3
+ export { default as MusicEditor } from './MusicEditor';
4
+ export { default as MusicVisualEditor } from './MusicVisualEditor';
5
+ export { default as MusicTabs } from './MusicTabs';
6
+ export { default as GameControls } from './GameControls';
7
+ export { default as MusicBlocklyContainer } from './MusicBlocklyContainer';
8
+ export * from './types';
9
+ export * from './blocks';
10
+ export * from './blockly-messages';
11
+ export * from './graphicsConfig';
12
+ export * from './audioEngine';
@@ -0,0 +1,76 @@
1
+ export type NoteDuration = 'whole' | 'half' | 'quarter' | 'eighth' | 'sixteenth';
2
+ export type NoteName = 'C' | 'D' | 'E' | 'F' | 'G' | 'A' | 'B';
3
+ export type NoteOctave = 1 | 2 | 3 | 4 | 5;
4
+ export type InstrumentType = 'piano' | 'guitar' | 'acoustic_guitar' | 'electric_guitar' | 'bass' | 'drums' | 'flute' | 'violin' | 'saxophone';
5
+ export interface Note {
6
+ id: string;
7
+ name: NoteName;
8
+ octave: NoteOctave;
9
+ duration: NoteDuration;
10
+ row: number;
11
+ startBeat: number;
12
+ instrument?: InstrumentType;
13
+ }
14
+ export interface Pause {
15
+ id: string;
16
+ duration: NoteDuration;
17
+ row: number;
18
+ startBeat: number;
19
+ }
20
+ export type MusicCommand = Note | Pause;
21
+ export interface MusicState {
22
+ isPlaying: boolean;
23
+ isPaused: boolean;
24
+ currentBeat: number;
25
+ commands: MusicCommand[];
26
+ commandCount: number;
27
+ maxCommands: number;
28
+ selectedRows: number;
29
+ instrument: InstrumentType;
30
+ tempo: number;
31
+ }
32
+ export interface MusicConfig {
33
+ targetNotes: Note[];
34
+ maxCommands: number;
35
+ selectedRows: number;
36
+ tempo: number;
37
+ instrument: InstrumentType;
38
+ }
39
+ export interface MusicBlocklyConfig {
40
+ allowedTypes: Set<string>;
41
+ limits: Record<string, number>;
42
+ toolbox: string;
43
+ initialXml: string;
44
+ }
45
+ export interface RunResult {
46
+ commands: number;
47
+ reachedTarget: boolean;
48
+ maxCommandsExceeded: boolean;
49
+ notes: Note[];
50
+ executionTime: number;
51
+ accuracy: number;
52
+ comparisonResult?: {
53
+ noteCountMatch: boolean;
54
+ melodyAccuracy: number;
55
+ rhythmAccuracy: number;
56
+ };
57
+ }
58
+ export interface GraphicsConfig {
59
+ canvas: {
60
+ backgroundColor: string;
61
+ borderColor: string;
62
+ borderWidth: number;
63
+ };
64
+ staff: {
65
+ lineColor: string;
66
+ lineWidth: number;
67
+ spacing: number;
68
+ };
69
+ notes: {
70
+ fillColor: string;
71
+ strokeColor: string;
72
+ strokeWidth: number;
73
+ };
74
+ }
75
+ export declare const DURATION_TO_BEATS: Record<NoteDuration, number>;
76
+ export declare function getNoteFrequency(note: NoteName, octave: NoteOctave): number;
package/dist/index.cjs.js CHANGED
@@ -2929,8 +2929,8 @@ class Browser {
2929
2929
  }
2930
2930
  }
2931
2931
  Browser.type = "languageDetector";
2932
- const common$2 = { "moves": "Tahy", "steps": "Kroky", "walls": "Steny", "running": "Spúšťam...", "runCode": "▶️ Spustiť kód", "reset": "🔄 Resetovať", "generating": "🔄 Generujem...", "generateNewMaze": "🎲 Generovať nový labyrint", "editor": "✏️ Editor", "game": "🎮 Hra a programovanie", "gameView": "Pohľad na hru", "programmingBlocks": "Programovacie bloky", "generatedCode": "Vygenerovaný kód:", "noCodeGenerated": "// Zatiaľ nebol vygenerovaný žiadny kód", "calculating": "Počítam...", "north": "Sever", "south": "Juh", "east": "Východ", "west": "Západ" };
2933
- const game$2 = { "congratulations": "🎉 Gratulujeme! Dosiahli ste cieľ! 🎯", "gameOver": "❌ Koniec hry! Prekročili ste maximálny počet ťahov.", "movement": "Pohyb", "coins": "Mince", "letters": "Písmená", "keys": "Kľúče", "control": "Riadenie", "logic": "Logika", "math": "Matematika", "pen": "Pero", "status": "Stav hry", "commands": "Príkazy", "time": "Čas", "shapes": "Tvary", "penPosition": "Pozícia pera", "penDirection": "Smer pera", "penDown": "Pero dole", "penColor": "Farba pera", "yes": "Áno", "no": "Nie", "executing": "Spúšťam...", "run": "Spustiť", "reset": "Resetovať", "loading": "Načítavam...", "executingCommands": "Spúšťam príkazy...", "canvas": "Plátno", "blocks": "Bloky", "code": "Kód", "generatedCode": "Vygenerovaný kód", "noCodeGenerated": "// Zatiaľ nebol vygenerovaný žiadny kód" };
2932
+ const common$2 = { "moves": "Tahy", "steps": "Kroky", "walls": "Steny", "running": "Spúšťam...", "runCode": "▶️ Spustiť kód", "reset": "🔄 Resetovať", "generating": "🔄 Generujem...", "generateNewMaze": "🎲 Generovať nový labyrint", "editor": "✏️ Editor", "game": "🎮 Hra a programovanie", "gameView": "Pohľad na hru", "programmingBlocks": "Programovacie bloky", "generatedCode": "Vygenerovaný kód:", "noCodeGenerated": "// Zatiaľ nebol vygenerovaný žiadny kód", "calculating": "Počítam...", "north": "Sever", "south": "Juh", "east": "Východ", "west": "Západ", "cancel": "Zrušiť", "save": "Uložiť" };
2933
+ const game$2 = { "congratulations": "🎉 Gratulujeme! Dosiahli ste cieľ! 🎯", "gameOver": "❌ Koniec hry! Prekročili ste maximálny počet ťahov.", "movement": "Pohyb", "coins": "Mince", "letters": "Písmená", "keys": "Kľúče", "control": "Riadenie", "logic": "Logika", "math": "Matematika", "pen": "Pero", "status": "Stav hry", "commands": "Príkazy", "time": "Čas", "shapes": "Tvary", "penPosition": "Pozícia pera", "penDirection": "Smer pera", "penDown": "Pero dole", "penColor": "Farba pera", "yes": "Áno", "no": "Nie", "executing": "Spúšťam...", "run": "Spustiť", "reset": "Resetovať", "loading": "Načítavam...", "executingCommands": "Spúšťam príkazy...", "canvas": "Plátno", "blocks": "Bloky", "code": "Kód", "generatedCode": "Vygenerovaný kód", "noCodeGenerated": "// Zatiaľ nebol vygenerován žiadny kód", "play": "Prehrať", "stop": "Zastaviť", "pause": "Pozastaviť" };
2934
2934
  const blocks$2 = { "moveForward": "Posunúť sa dopredu", "turnLeft": "Otočiť sa vľavo", "turnRight": "Otočiť sa vpravo", "turnAround": "Otočiť sa okolo", "repeat": "Opakovať", "if": "Ak", "moveForwardTooltip": "Posunúť pavúka o jeden krok dopredu", "turnLeftTooltip": "Otočiť pavúka o 90 stupňov vľavo", "turnRightTooltip": "Otočiť pavúka o 90 stupňov vpravo", "turnAroundTooltip": "Otočiť pavúka o 180 stupňov okolo", "repeatTooltip": "Opakovať bloky vnútri zadaný počet krát", "whileTooltip": "Opakovať bloky vnútri, kým je podmienka pravdivá", "compareTooltip": "Porovnať dve čísla a vrátiť true alebo false", "numberTooltip": "Číslo", "collectCoinTooltip": "Zozbierať mincu, ak je na aktuálnej pozícii", "coinsCollectedTooltip": "Vráti počet zozbieraných mincí", "collectLetterTooltip": "Zozbierať písmeno, ak je na aktuálnej pozícii", "hasCoinTooltip": "Vráti true, ak je na aktuálnej pozícii minca", "hasLetterTooltip": "Vráti true, ak je na aktuálnej pozícii písmeno" };
2935
2935
  const language$2 = { "select": "Vybrať jazyk", "slovak": "Slovenčina", "czech": "Čeština", "hungarian": "Maďarčina" };
2936
2936
  const validation$2 = { "errors": "Chyby validácie:", "warnings": "Upozornenia:", "doorsNoKeys": "Labyrint má dvere, ale žiadne kľúče. Dvere sa nedajú prejsť bez kľúčov.", "keysNoDoors": "Labyrint má kľúče, ale žiadne dvere. Kľúče nie sú potrebné, ak nie sú dvere.", "moreDoorsThanKeys": "Labyrint má {{doors}} dverí, ale len {{keys}} kľúčov. Niektoré dvere môžu byť nedostupné.", "missingLetters": 'Cieľový reťazec "{{targetString}}" vyžaduje písmená, ktoré chýbajú v labyrinte: {{missingLetters}}', "extraLetters": "Labyrint obsahuje písmená, ktoré nie sú potrebné pre cieľový reťazec: {{extraLetters}}" };
@@ -2938,6 +2938,8 @@ const tools$2 = { "wall": "Stena", "clear": "Vymazať", "start": "Štart", "fini
2938
2938
  const app$2 = { "imageGraphics": "Grafika obrázkov", "graphicsTest": "Test grafiky", "debugTest": "Debug test", "externalTest": "Test externého importu", "configTest": "Test konfigurácie", "drawingDemo": "Kreslenie" };
2939
2939
  const gameStatus$2 = { "coins": "Mince", "keys": "Kľúče", "moves": "Tahy", "inventory": "Inventár", "itemsCollected": "Zozbierané predmety" };
2940
2940
  const testing$2 = { "instructions": "Inštrukcie na testovanie:", "switchConfigurations": "Prepnutie konfigurácie:", "switchConfigurationsDesc": 'Kliknite na "Prepnutie konfigurácie" na testovanie rôznych grafických nastavení', "monitorLogs": "Sledovanie logov:", "monitorLogsDesc": "Sledujte logy, aby ste videli, kedy sa zmení grafická konfigurácia", "testImageLoading": "Testovanie načítania obrázkov:", "testImageLoadingDesc": "Overte, že sa obrázky načítajú správne a v prípade zlyhania sa použijú znaky", "testUrlValidity": "Testovanie platnosti URL:", "testUrlValidityDesc": "Použite URL tester na overenie platnosti URL obrázkov pred ich použitím", "testFallbackBehavior": "Testovanie záložného správania:", "testFallbackBehaviorDesc": "Konfigurácia 4 používa neplatné URL na testovanie záložných znakov", "checkToolSelection": "Kontrola výberu nástrojov:", "checkToolSelectionDesc": "Všimnite si, ako tlačidlá nástrojov teraz zobrazujú skutočné obrázky namiesto generických emoji", "verifyEditorGame": "Overenie editora/hry:", "verifyEditorGameDesc": "Skontrolujte, že oba taby editora a hry odrážajú zmeny" };
2941
+ const music$2 = { "play": "Prehrať", "stop": "Zastaviť", "pause": "Pozastaviť", "note": "Nota", "rest": "Pomlčka", "instrument": "Nástroj", "tempo": "Tempo", "volume": "Hlasitosť", "loop": "Slučka", "editNote": "Upraviť notu", "noteName": "Nota", "octave": "Oktáva", "duration": "Trvanie", "staff": "Notová osnova", "addNote": "Pridať notu", "settings": "Nastavenia", "rows": "Riadky", "instruments": "Nástroje", "clearAll": "Vymazať všetko", "totalNotes": "Celkom nôt", "clearRow": "Vymazať riadok", "clickToPlace": "Kliknite do osnovy pre pridanie noty.", "add": "Pridať", "cancel": "Zrušiť", "save": "Uložiť", "beat": "Doba", "row": "Riadok", "title": "Hudobný skladateľ" };
2942
+ const tempo$2 = { "slow": "Pomalé", "moderate": "Stredné", "fast": "Rýchle", "veryFast": "Veľmi rýchle" };
2941
2943
  const sk = {
2942
2944
  common: common$2,
2943
2945
  game: game$2,
@@ -2947,10 +2949,12 @@ const sk = {
2947
2949
  tools: tools$2,
2948
2950
  app: app$2,
2949
2951
  gameStatus: gameStatus$2,
2950
- testing: testing$2
2952
+ testing: testing$2,
2953
+ music: music$2,
2954
+ tempo: tempo$2
2951
2955
  };
2952
- const common$1 = { "moves": "Tahy", "steps": "Kroky", "walls": "Stěny", "running": "Spouštím...", "runCode": "▶️ Spustit kód", "reset": "🔄 Resetovat", "generating": "🔄 Generuji...", "generateNewMaze": "🎲 Generovat nový labyrint", "editor": "✏️ Editor", "game": "🎮 Hra a programování", "gameView": "Pohled na hru", "programmingBlocks": "Programovací bloky", "generatedCode": "Vygenerovaný kód:", "noCodeGenerated": "// Zatím nebyl vygenerován žádný kód", "calculating": "Počítám...", "north": "Sever", "south": "Jih", "east": "Východ", "west": "Západ" };
2953
- const game$1 = { "congratulations": "🎉 Gratulujeme! Dosáhli jste cíle! 🎯", "gameOver": "❌ Konec hry! Překročili jste maximální počet tahů.", "movement": "Pohyb", "coins": "Mince", "letters": "Písmena", "keys": "Klíče", "control": "Řízení", "logic": "Logika", "math": "Matematika", "pen": "Pero", "status": "Stav hry", "commands": "Příkazy", "time": "Čas", "shapes": "TV Tvary", "penPosition": "Pozice pera", "penDirection": "Směr pera", "penDown": "Pero dolů", "penColor": "Barva pera", "yes": "Ano", "no": "Ne", "executing": "Spouštím...", "run": "Spustit", "reset": "Resetovat", "loading": "Načítám...", "executingCommands": "Spouštím příkazy...", "canvas": "Plátno", "blocks": "Bloky", "code": "Kód", "generatedCode": "Vygenerovaný kód", "noCodeGenerated": "// Zatím nebyl vygenerován žádný kód" };
2956
+ const common$1 = { "moves": "Tahy", "steps": "Kroky", "walls": "Stěny", "running": "Spouštím...", "runCode": "▶️ Spustit kód", "reset": "🔄 Resetovat", "generating": "🔄 Generuji...", "generateNewMaze": "🎲 Generovat nový labyrint", "editor": "✏️ Editor", "game": "🎮 Hra a programování", "gameView": "Pohled na hru", "programmingBlocks": "Programovací bloky", "generatedCode": "Vygenerovaný kód:", "noCodeGenerated": "// Zatím nebyl vygenerován žádný kód", "calculating": "Počítám...", "north": "Sever", "south": "Jih", "east": "Východ", "west": "Západ", "cancel": "Zrušit", "save": "Uložit" };
2957
+ const game$1 = { "congratulations": "🎉 Gratulujeme! Dosáhli jste cíle! 🎯", "gameOver": "❌ Konec hry! Překročili jste maximální počet tahů.", "movement": "Pohyb", "coins": "Mince", "letters": "Písmena", "keys": "Klíče", "control": "Řízení", "logic": "Logika", "math": "Matematika", "pen": "Pero", "status": "Stav hry", "commands": "Příkazy", "time": "Čas", "shapes": "TV Tvary", "penPosition": "Pozice pera", "penDirection": "Směr pera", "penDown": "Pero dolů", "penColor": "Barva pera", "yes": "Ano", "no": "Ne", "executing": "Spouštím...", "run": "Spustit", "reset": "Resetovat", "loading": "Načítám...", "executingCommands": "Spouštím příkazy...", "canvas": "Plátno", "blocks": "Bloky", "code": "Kód", "generatedCode": "Vygenerovaný kód", "noCodeGenerated": "// Zatím nebyl vygenerován žádný kód", "play": "Přehrát", "stop": "Zastavit", "pause": "Pozastavit" };
2954
2958
  const blocks$1 = { "moveForward": "Posunout se dopředu", "turnLeft": "Otočit se vlevo", "turnRight": "Otočit se vpravo", "turnAround": "Otočit se kolem", "repeat": "Opakovat", "if": "Pokud", "moveForwardTooltip": "Posunout pavouka o jeden krok dopředu", "turnLeftTooltip": "Otočit pavouka o 90 stupňů vlevo", "turnRightTooltip": "Otočit pavouka o 90 stupňů vpravo", "turnAroundTooltip": "Otočit pavouka o 180 stupňů kolem", "repeatTooltip": "Opakovat bloky uvnitř zadaný počet krát", "whileTooltip": "Opakovat bloky uvnitř, dokud je podmínka pravdivá", "compareTooltip": "Porovnat dvě čísla a vrátit true nebo false", "numberTooltip": "Číslo", "collectCoinTooltip": "Sebrat minci, pokud je na aktuální pozici", "coinsCollectedTooltip": "Vrátí počet sebraných mincí", "collectLetterTooltip": "Sebrat písmeno, pokud je na aktuální pozici", "hasCoinTooltip": "Vrátí true, pokud je na aktuální pozici mince", "hasLetterTooltip": "Vrátí true, pokud je na aktuální pozici písmeno" };
2955
2959
  const language$1 = { "select": "Vybrat jazyk", "slovak": "Slovenština", "czech": "Čeština", "hungarian": "Maďarština" };
2956
2960
  const validation$1 = { "errors": "Chyby validace:", "warnings": "Upozornění:", "doorsNoKeys": "Labyrint má dveře, ale žádné klíče. Dveře se nedají projít bez klíčů.", "keysNoDoors": "Labyrint má klíče, ale žádné dveře. Klíče nejsou potřeba, pokud nejsou dveře.", "moreDoorsThanKeys": "Labyrint má {{doors}} dveří, ale jen {{keys}} klíčů. Některé dveře mohou být nedostupné.", "missingLetters": 'Cílový řetězec "{{targetString}}" vyžaduje písmena, která chybí v labyrintu: {{missingLetters}}', "extraLetters": "Labyrint obsahuje písmena, která nejsou potřebná pro cílový řetězec: {{extraLetters}}" };
@@ -2958,6 +2962,8 @@ const tools$1 = { "wall": "Stěna", "clear": "Vymazat", "start": "Start", "finis
2958
2962
  const app$1 = { "imageGraphics": "Grafika obrázků", "graphicsTest": "Test grafiky", "debugTest": "Debug test", "externalTest": "Test externího importu", "configTest": "Test konfigurace", "drawingDemo": "Kreslení" };
2959
2963
  const gameStatus$1 = { "coins": "Mince", "keys": "Klíče", "moves": "Tahy", "inventory": "Inventář", "itemsCollected": "Sebrané předměty" };
2960
2964
  const testing$1 = { "instructions": "Testovací instrukce:", "switchConfigurations": "Přepnutí konfigurace:", "switchConfigurationsDesc": 'Klikněte na "Přepnutí konfigurace" na testování různých grafických nastavení', "monitorLogs": "Sledování logů:", "monitorLogsDesc": "Sledujte logy, abyste viděli, kdy se změní grafická konfigurace", "testImageLoading": "Testování načítání obrázků:", "testImageLoadingDesc": "Ověřte, že se obrázky načítají správně a v případě selhání se použijí znaky", "testUrlValidity": "Testování platnosti URL:", "testUrlValidityDesc": "Použijte URL tester na ověření platnosti URL obrázků před jejich použitím", "testFallbackBehavior": "Testování záložního chování:", "testFallbackBehaviorDesc": "Konfigurace 4 používá neplatné URL na testování záložních znaků", "checkToolSelection": "Kontrola výběru nástrojů:", "checkToolSelectionDesc": "Všimněte si, jak tlačítka nástrojů nyní zobrazují skutečné obrázky místo generických emoji", "verifyEditorGame": "Ověření editoru/hry:", "verifyEditorGameDesc": "Zkontrolujte, že oba taby editoru a hry odrážejí změny" };
2965
+ const music$1 = { "play": "Přehrát", "stop": "Zastavit", "pause": "Pozastavit", "note": "Nota", "rest": "Pomlka", "instrument": "Nástroj", "tempo": "Tempo", "volume": "Hlasitost", "loop": "Smyčka", "editNote": "Upravit notu", "noteName": "Nota", "octave": "Oktáva", "duration": "Délka", "staff": "Notová osnova", "addNote": "Přidat notu", "settings": "Nastavení", "rows": "Řádky", "instruments": "Nástroje", "clearAll": "Vymazat vše", "totalNotes": "Celkem not", "clearRow": "Vymazat řádek", "clickToPlace": "Klikněte do osnovy pro přidání noty.", "add": "Přidat", "cancel": "Zrušit", "save": "Uložit", "beat": "Doba", "row": "Řádek", "title": "Hudební skladatel" };
2966
+ const tempo$1 = { "slow": "Pomalé", "moderate": "Střední", "fast": "Rychlé", "veryFast": "Velmi rychlé" };
2961
2967
  const cs = {
2962
2968
  common: common$1,
2963
2969
  game: game$1,
@@ -2967,10 +2973,12 @@ const cs = {
2967
2973
  tools: tools$1,
2968
2974
  app: app$1,
2969
2975
  gameStatus: gameStatus$1,
2970
- testing: testing$1
2976
+ testing: testing$1,
2977
+ music: music$1,
2978
+ tempo: tempo$1
2971
2979
  };
2972
- const common = { "moves": "Lépések", "steps": "Lépések", "walls": "Falak", "running": "Futtatom...", "runCode": "▶️ Kód futtatása", "reset": "🔄 Visszaállítás", "generating": "🔄 Generálás...", "generateNewMaze": "🎲 Új labirintus generálása", "editor": "✏️ Szerkesztő", "game": "🎮 Játék és programozás", "gameView": "Játék nézet", "programmingBlocks": "Programozási blokkok", "generatedCode": "Generált kód:", "noCodeGenerated": "// Még nincs generált kód", "calculating": "Számítás...", "north": "Észak", "south": "Dél", "east": "Kelet", "west": "Nyugat" };
2973
- const game = { "congratulations": "🎉 Gratulálunk! Elérted a célt! 🎯", "gameOver": "❌ Játék vége! Túllépted a maximális lépésszámot.", "movement": "Mozgás", "coins": "Érmék", "letters": "Betűk", "keys": "Kulcsok", "control": "Vezérlés", "logic": "Logika", "math": "Matematika", "pen": "Toll", "status": "Játék állapota", "commands": "Parancsok", "time": "Idő", "shapes": "Alakzatok", "penPosition": "Toll pozíciója", "penDirection": "Toll iránya", "penDown": "Toll le", "penColor": "Toll színe", "yes": "Igen", "no": "Nem", "executing": "Futtatás...", "run": "Futtatás", "reset": "Reset", "loading": "Betöltés...", "executingCommands": "Parancsok futtatása...", "canvas": "Vászon", "blocks": "Blokkok", "code": "Kód", "generatedCode": "Generált kód", "noCodeGenerated": "// Még nincs generált kód" };
2980
+ const common = { "moves": "Lépések", "steps": "Lépések", "walls": "Falak", "running": "Futtatom...", "runCode": "▶️ Kód futtatása", "reset": "🔄 Visszaállítás", "generating": "🔄 Generálás...", "generateNewMaze": "🎲 Új labirintus generálása", "editor": "✏️ Szerkesztő", "game": "🎮 Játék és programozás", "gameView": "Játék nézet", "programmingBlocks": "Programozási blokkok", "generatedCode": "Generált kód:", "noCodeGenerated": "// Még nincs generált kód", "calculating": "Számítás...", "north": "Észak", "south": "Dél", "east": "Kelet", "west": "Nyugat", "cancel": "Mégsem", "save": "Mentés" };
2981
+ const game = { "congratulations": "🎉 Gratulálunk! Elérted a célt! 🎯", "gameOver": "❌ Játék vége! Túllépted a maximális lépésszámot.", "movement": "Mozgás", "coins": "Érmék", "letters": "Betűk", "keys": "Kulcsok", "control": "Vezérlés", "logic": "Logika", "math": "Matematika", "pen": "Toll", "status": "Játék állapota", "commands": "Parancsok", "time": "Idő", "shapes": "Alakzatok", "penPosition": "Toll pozíciója", "penDirection": "Toll iránya", "penDown": "Toll le", "penColor": "Toll színe", "yes": "Igen", "no": "Nem", "executing": "Futtatás...", "run": "Futtatás", "reset": "Reset", "loading": "Betöltés...", "executingCommands": "Parancsok futtatása...", "canvas": "Vászon", "blocks": "Blokkok", "code": "Kód", "generatedCode": "Generált kód", "noCodeGenerated": "// Még nincs generált kód", "play": "Lejátszás", "stop": "Leállítás", "pause": "Szünet" };
2974
2982
  const blocks = { "moveForward": "Előre lépés", "turnLeft": "Balra fordulás", "turnRight": "Jobbra fordulás", "turnAround": "Megfordulás", "repeat": "Ismétlés", "if": "Ha", "moveForwardTooltip": "A pók egy lépést előre mozgatása", "turnLeftTooltip": "A pók 90 fokkal balra fordítása", "turnRightTooltip": "A pók 90 fokkal jobbra fordítása", "turnAroundTooltip": "A pók 180 fokkal megfordítása", "repeatTooltip": "A blokkok megadott számú ismétlése", "whileTooltip": "A blokkok ismétlése, amíg a feltétel igaz", "compareTooltip": "Két szám összehasonlítása és true vagy false visszaadása", "numberTooltip": "Szám", "collectCoinTooltip": "Érme gyűjtése, ha van a jelenlegi pozíción", "coinsCollectedTooltip": "Az eddig gyűjtött érmék számát adja vissza", "collectLetterTooltip": "Betű gyűjtése, ha van a jelenlegi pozíción", "hasCoinTooltip": "True-t ad vissza, ha van érme a jelenlegi pozíción", "hasLetterTooltip": "True-t ad vissza, ha van betű a jelenlegi pozíción" };
2975
2983
  const language = { "select": "Nyelv kiválasztása", "slovak": "Szlovák", "czech": "Cseh", "hungarian": "Magyar" };
2976
2984
  const validation = { "errors": "Validációs hibák:", "warnings": "Figyelmeztetések:", "doorsNoKeys": "A labirintusnak vannak ajtói, de nincsenek kulcsok. Az ajtók nem járhatók át kulcs nélkül.", "keysNoDoors": "A labirintusnak vannak kulcsai, de nincsenek ajtók. A kulcsok nem szükségesek, ha nincsenek ajtók.", "moreDoorsThanKeys": "A labirintusnak {{doors}} ajtója van, de csak {{keys}} kulcsa. Néhány ajtó elérhetetlen lehet.", "missingLetters": 'A "{{targetString}}" célkarakterlánc olyan betűket igényel, amelyek hiányoznak a labirintusból: {{missingLetters}}', "extraLetters": "A labirintus olyan betűket tartalmaz, amelyekre nincs szükség a célkarakterlánc esetében: {{extraLetters}}" };
@@ -2978,6 +2986,8 @@ const tools = { "wall": "Fal", "clear": "Törlés", "start": "Kezdés", "finish"
2978
2986
  const app = { "imageGraphics": "Képek grafikája", "graphicsTest": "Grafika teszt", "debugTest": "Debug teszt", "externalTest": "Külső import teszt", "configTest": "Konfiguráció teszt", "drawingDemo": "Rajzolás" };
2979
2987
  const gameStatus = { "coins": "Érmék", "keys": "Kulcsok", "moves": "Lépések", "inventory": "Leltár", "itemsCollected": "Összegyűjtött tárgyak" };
2980
2988
  const testing = { "instructions": "Tesztelési utasítások:", "switchConfigurations": "Konfiguráció váltás:", "switchConfigurationsDesc": 'Kattintson a "Konfiguráció váltás" gombra a különböző grafikai beállítások teszteléséhez', "monitorLogs": "Naplók figyelése:", "monitorLogsDesc": "Figyelje a naplókat, hogy lássa, mikor változik a grafikai konfiguráció", "testImageLoading": "Képek betöltésének tesztelése:", "testImageLoadingDesc": "Ellenőrizze, hogy a képek megfelelően töltődnek be, és hiba esetén karakterekre váltanak", "testUrlValidity": "URL érvényesség tesztelése:", "testUrlValidityDesc": "Használja az URL tesztelőt a kép URL-ek érvényességének ellenőrzéséhez használat előtt", "testFallbackBehavior": "Tartalék viselkedés tesztelése:", "testFallbackBehaviorDesc": "A 4. konfiguráció hibás URL-eket használ a tartalék karakterek teszteléséhez", "checkToolSelection": "Eszköz kiválasztás ellenőrzése:", "checkToolSelectionDesc": "Figyelje meg, hogyan jelenítik meg most az eszközgombok a tényleges képeket a generikus emoji helyett", "verifyEditorGame": "Szerkesztő/játék ellenőrzése:", "verifyEditorGameDesc": "Ellenőrizze, hogy mindkét szerkesztő és játék tab tükrözi a változásokat" };
2989
+ const music = { "play": "Lejátszás", "stop": "Leállítás", "pause": "Szünet", "note": "Hangjegy", "rest": "Szünetjel", "instrument": "Hangszer", "tempo": "Tempó", "volume": "Hangerő", "loop": "Ismétlés", "editNote": "Hangjegy szerkesztése", "noteName": "Hangjegy", "octave": "Oktáv", "duration": "Időtartam", "staff": "Kotta", "addNote": "Hangjegy hozzáadása", "settings": "Beállítások", "rows": "Sorok", "instruments": "Hangszerek", "clearAll": "Összes törlése", "totalNotes": "Összes hangjegy", "clearRow": "Sor törlése", "clickToPlace": "Kattintson a kottára egy hangjegy hozzáadásához.", "add": "Hozzáadás", "cancel": "Mégsem", "save": "Mentés", "beat": "Ütem", "row": "Sor", "title": "Zeneszerző" };
2990
+ const tempo = { "slow": "Lassú", "moderate": "Közepes", "fast": "Gyors", "veryFast": "Nagyon gyors" };
2981
2991
  const hu = {
2982
2992
  common,
2983
2993
  game,
@@ -2987,7 +2997,9 @@ const hu = {
2987
2997
  tools,
2988
2998
  app,
2989
2999
  gameStatus,
2990
- testing
3000
+ testing,
3001
+ music,
3002
+ tempo
2991
3003
  };
2992
3004
  const resources = {
2993
3005
  sk: {