Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| bb3752b8ae | |||
| be04f333b0 | |||
| fc25246594 | |||
| d7e104c17a |
23
LICENSE
Normal file
23
LICENSE
Normal file
@@ -0,0 +1,23 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2026 gkucmierz
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
|
||||
See README.md for project description.
|
||||
10
README.md
10
README.md
@@ -1,3 +1,13 @@
|
||||
# Nonograms
|
||||
|
||||
Link do aplikacji: https://nonograms.7u.pl
|
||||
|
||||
## English Description
|
||||
|
||||
Nonograms is a modern, fast, and accessible logic puzzle game (also known as Picross or Griddlers). Solve pixel-art puzzles by marking cells according to numeric clues for rows and columns. The app features:
|
||||
- Clean UX with keyboard and touch support
|
||||
- Multiple languages and PWA support (installable on desktop and mobile)
|
||||
- Difficulty simulation and guide to learn solving strategies
|
||||
- Shareable puzzles and persistent progress
|
||||
|
||||
Play online at https://nonograms.7u.pl or install as a PWA for an app-like experience.
|
||||
|
||||
4
package-lock.json
generated
4
package-lock.json
generated
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "vue-nonograms-solid",
|
||||
"version": "1.9.9",
|
||||
"version": "1.9.11",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "vue-nonograms-solid",
|
||||
"version": "1.9.9",
|
||||
"version": "1.9.11",
|
||||
"dependencies": {
|
||||
"fireworks-js": "^2.10.8",
|
||||
"flag-icons": "^7.5.0",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "vue-nonograms-solid",
|
||||
"version": "1.9.9",
|
||||
"version": "1.9.11",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
|
||||
17
src/App.vue
17
src/App.vue
@@ -28,6 +28,21 @@ const appVersion = __APP_VERSION__;
|
||||
let displayModeMedia = null;
|
||||
let prefersColorSchemeMedia = null;
|
||||
|
||||
const onKeyDownGlobal = (e) => {
|
||||
if (e.key !== 'Escape') return;
|
||||
if (showSimulation.value) {
|
||||
showSimulation.value = false;
|
||||
return;
|
||||
}
|
||||
if (showCustomModal.value) {
|
||||
showCustomModal.value = false;
|
||||
return;
|
||||
}
|
||||
if (store.isGameWon) {
|
||||
store.closeWinModal();
|
||||
}
|
||||
};
|
||||
|
||||
const installLabel = computed(() => {
|
||||
return isCoarsePointer.value ? t('pwa.installMobile') : t('pwa.installDesktop');
|
||||
});
|
||||
@@ -114,6 +129,7 @@ onMounted(() => {
|
||||
} else if (displayModeMedia?.addListener) {
|
||||
displayModeMedia.addListener(updateStandalone);
|
||||
}
|
||||
window.addEventListener('keydown', onKeyDownGlobal);
|
||||
}
|
||||
});
|
||||
|
||||
@@ -131,6 +147,7 @@ onUnmounted(() => {
|
||||
} else if (displayModeMedia?.removeListener) {
|
||||
displayModeMedia.removeListener(updateStandalone);
|
||||
}
|
||||
window.removeEventListener('keydown', onKeyDownGlobal);
|
||||
});
|
||||
</script>
|
||||
|
||||
|
||||
@@ -156,7 +156,6 @@ const stopDrag = () => {
|
||||
onUnmounted(() => {
|
||||
window.removeEventListener('mousemove', onDrag);
|
||||
window.removeEventListener('mouseup', stopDrag);
|
||||
window.removeEventListener('keydown', onKeyDown);
|
||||
});
|
||||
|
||||
const showAdvanced = ref(false);
|
||||
@@ -170,16 +169,6 @@ const toggleAdvanced = () => {
|
||||
}
|
||||
};
|
||||
|
||||
const handleClose = () => {
|
||||
emit('close');
|
||||
};
|
||||
|
||||
const onKeyDown = (e) => {
|
||||
if (e.key === 'Escape') {
|
||||
handleClose();
|
||||
}
|
||||
};
|
||||
|
||||
onMounted(() => {
|
||||
const savedSize = localStorage.getItem('nonograms_custom_size');
|
||||
if (savedSize && !isNaN(savedSize)) {
|
||||
@@ -192,7 +181,6 @@ onMounted(() => {
|
||||
}
|
||||
|
||||
// Don't draw map initially if hidden
|
||||
window.addEventListener('keydown', onKeyDown);
|
||||
});
|
||||
|
||||
watch([customSize, fillRate], () => {
|
||||
|
||||
@@ -23,6 +23,8 @@ let stopRequested = false;
|
||||
|
||||
const onKeyDown = (e) => {
|
||||
if (e.key === 'Escape') {
|
||||
e.stopImmediatePropagation?.();
|
||||
e.preventDefault?.();
|
||||
emit('close');
|
||||
}
|
||||
};
|
||||
|
||||
@@ -28,6 +28,8 @@ const handleClose = () => {
|
||||
|
||||
const handleKeyDown = (e) => {
|
||||
if (e.key === 'Escape') {
|
||||
e.stopImmediatePropagation?.();
|
||||
e.preventDefault?.();
|
||||
handleClose();
|
||||
}
|
||||
};
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -9,8 +9,8 @@ export function useSolver() {
|
||||
const isPlaying = ref(false);
|
||||
const isProcessing = ref(false);
|
||||
const speedIndex = ref(0);
|
||||
const speeds = [1000, 500, 250, 125, 62];
|
||||
const speedLabels = ['x1', 'x2', 'x4', 'x8', 'x16'];
|
||||
const speeds = [1000, 500, 250, 125, 62, 31, 16];
|
||||
const speedLabels = ['x1', 'x2', 'x4', 'x8', 'x16', 'x32', 'x64'];
|
||||
const statusText = ref(t('guide.waiting'));
|
||||
|
||||
let intervalId = null;
|
||||
|
||||
Reference in New Issue
Block a user