Compare commits
29 Commits
222b8a5f4c
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
ef4b2653a8
|
|||
|
3237fcfa7c
|
|||
|
fcef986d2b
|
|||
|
4c6f4d5865
|
|||
|
3052fed279
|
|||
|
fa983c6777
|
|||
|
2a1ddf92aa
|
|||
|
a5b93c1198
|
|||
|
be014fc3c8
|
|||
|
269db48aec
|
|||
|
fe72508717
|
|||
|
70ba5ebdb3
|
|||
|
5aaa8c7357
|
|||
|
bf7cc4cb1d
|
|||
|
1aff1a0857
|
|||
|
a59aeb93e6
|
|||
|
8291c8f74c
|
|||
|
0f240596cc
|
|||
|
6fc3e1c057
|
|||
|
d488531358
|
|||
|
e3d2b630e1
|
|||
|
1392a9f3d5
|
|||
|
8ccf5de972
|
|||
|
ddf6a31f55
|
|||
|
62f35ec35e
|
|||
|
cdaa10c282
|
|||
|
56bff9fc59
|
|||
|
ff520b53f7
|
|||
|
c5e09a51e8
|
@@ -1,6 +1,4 @@
|
|||||||
name: Deploy to Production
|
name: Build and Deploy
|
||||||
run-name: Deploy to Production by @${{ github.actor }}
|
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
@@ -10,14 +8,11 @@ jobs:
|
|||||||
deploy:
|
deploy:
|
||||||
runs-on: self-hosted
|
runs-on: self-hosted
|
||||||
steps:
|
steps:
|
||||||
- name: Check out repository code
|
- uses: actions/checkout@v4
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Build and deploy with Docker Compose
|
- name: Deploy nonograms-app
|
||||||
run: |
|
run: |
|
||||||
# Próba zatrzymania i usunięcia starego kontenera (ignoruje błąd jeśli nie istnieje)
|
|
||||||
docker compose down --remove-orphans || true
|
docker compose down --remove-orphans || true
|
||||||
docker rm -f nonograms-app || true
|
|
||||||
|
|
||||||
# Start nowej wersji
|
|
||||||
docker compose up -d --build
|
docker compose up -d --build
|
||||||
|
|
||||||
|
|
||||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -3,6 +3,7 @@ node_modules
|
|||||||
.DS_Store
|
.DS_Store
|
||||||
dist/
|
dist/
|
||||||
dist-ssr/
|
dist-ssr/
|
||||||
|
dev-dist/
|
||||||
*.local
|
*.local
|
||||||
.npmrc
|
.npmrc
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 78 KiB |
@@ -1,92 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright 2018 Google Inc. All Rights Reserved.
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
// If the loader is already loaded, just stop.
|
|
||||||
if (!self.define) {
|
|
||||||
let registry = {};
|
|
||||||
|
|
||||||
// Used for `eval` and `importScripts` where we can't get script URL by other means.
|
|
||||||
// In both cases, it's safe to use a global var because those functions are synchronous.
|
|
||||||
let nextDefineUri;
|
|
||||||
|
|
||||||
const singleRequire = (uri, parentUri) => {
|
|
||||||
uri = new URL(uri + ".js", parentUri).href;
|
|
||||||
return registry[uri] || (
|
|
||||||
|
|
||||||
new Promise(resolve => {
|
|
||||||
if ("document" in self) {
|
|
||||||
const script = document.createElement("script");
|
|
||||||
script.src = uri;
|
|
||||||
script.onload = resolve;
|
|
||||||
document.head.appendChild(script);
|
|
||||||
} else {
|
|
||||||
nextDefineUri = uri;
|
|
||||||
importScripts(uri);
|
|
||||||
resolve();
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
.then(() => {
|
|
||||||
let promise = registry[uri];
|
|
||||||
if (!promise) {
|
|
||||||
throw new Error(`Module ${uri} didn’t register its module`);
|
|
||||||
}
|
|
||||||
return promise;
|
|
||||||
})
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
self.define = (depsNames, factory) => {
|
|
||||||
const uri = nextDefineUri || ("document" in self ? document.currentScript.src : "") || location.href;
|
|
||||||
if (registry[uri]) {
|
|
||||||
// Module is already loading or loaded.
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
let exports = {};
|
|
||||||
const require = depUri => singleRequire(depUri, uri);
|
|
||||||
const specialDeps = {
|
|
||||||
module: { uri },
|
|
||||||
exports,
|
|
||||||
require
|
|
||||||
};
|
|
||||||
registry[uri] = Promise.all(depsNames.map(
|
|
||||||
depName => specialDeps[depName] || require(depName)
|
|
||||||
)).then(deps => {
|
|
||||||
factory(...deps);
|
|
||||||
return exports;
|
|
||||||
});
|
|
||||||
};
|
|
||||||
}
|
|
||||||
define(['./workbox-7a5e81cd'], (function (workbox) { 'use strict';
|
|
||||||
|
|
||||||
self.addEventListener('message', event => {
|
|
||||||
if (event.data && event.data.type === 'SKIP_WAITING') {
|
|
||||||
self.skipWaiting();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The precacheAndRoute() method efficiently caches and responds to
|
|
||||||
* requests for URLs in the manifest.
|
|
||||||
* See https://goo.gl/S9QRab
|
|
||||||
*/
|
|
||||||
workbox.precacheAndRoute([{
|
|
||||||
"url": "index.html",
|
|
||||||
"revision": "0.b79gmi6tt88"
|
|
||||||
}], {});
|
|
||||||
workbox.cleanupOutdatedCaches();
|
|
||||||
workbox.registerRoute(new workbox.NavigationRoute(workbox.createHandlerBoundToURL("index.html"), {
|
|
||||||
allowlist: [/^\/$/]
|
|
||||||
}));
|
|
||||||
|
|
||||||
}));
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,16 +1,22 @@
|
|||||||
version: '3.8'
|
name: nonograms-app
|
||||||
|
|
||||||
services:
|
services:
|
||||||
nonograms:
|
nonograms-app:
|
||||||
container_name: ${CONTAINER_NAME:-nonograms}
|
container_name: nonograms-app
|
||||||
build:
|
build:
|
||||||
context: .
|
context: .
|
||||||
dockerfile: Dockerfile
|
dockerfile: Dockerfile
|
||||||
|
# ports:
|
||||||
|
# - "8083:80"
|
||||||
expose:
|
expose:
|
||||||
- "80"
|
- "80"
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
|
# volumes:
|
||||||
|
# - ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
|
||||||
networks:
|
networks:
|
||||||
- npm_public
|
npm_public:
|
||||||
|
aliases:
|
||||||
|
- nonograms-app
|
||||||
|
|
||||||
networks:
|
networks:
|
||||||
npm_public:
|
npm_public:
|
||||||
|
|||||||
16
index.html
16
index.html
@@ -6,7 +6,21 @@
|
|||||||
<link rel="apple-touch-icon" href="/apple-touch-icon.png" />
|
<link rel="apple-touch-icon" href="/apple-touch-icon.png" />
|
||||||
<link rel="mask-icon" href="/nonograms.svg" color="#00f2fe" />
|
<link rel="mask-icon" href="/nonograms.svg" color="#00f2fe" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover" />
|
||||||
<title>Nonograms Pro - Vue 3 SOLID</title>
|
|
||||||
|
<title>Nonograms Pro - Logic Puzzle Game</title>
|
||||||
|
<meta name="description" content="Interactive Nonogram logic puzzles with a modern interface. Solve puzzles, use the built-in solver, and create your own custom games.">
|
||||||
|
|
||||||
|
<!-- Open Graph (for social media sharing like Facebook/Discord) -->
|
||||||
|
<meta property="og:title" content="Nonograms Pro - Logic Puzzle Game">
|
||||||
|
<meta property="og:description" content="Interactive Nonogram logic puzzles with a modern interface. Solve puzzles, use the built-in solver, and create your own custom games.">
|
||||||
|
<meta property="og:image" content="/screenshot.png">
|
||||||
|
<meta property="og:type" content="website">
|
||||||
|
|
||||||
|
<!-- Twitter Cards -->
|
||||||
|
<meta name="twitter:card" content="summary_large_image">
|
||||||
|
<meta name="twitter:title" content="Nonograms Pro - Logic Puzzle Game">
|
||||||
|
<meta name="twitter:description" content="Interactive Nonogram logic puzzles with a modern interface. Solve puzzles, use the built-in solver, and create your own custom games.">
|
||||||
|
<meta name="twitter:image" content="/screenshot.png">
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="app"></div>
|
<div id="app"></div>
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
server {
|
server {
|
||||||
listen 80;
|
listen 80;
|
||||||
server_name localhost;
|
listen [::]:80;
|
||||||
|
server_name _;
|
||||||
root /usr/share/nginx/html;
|
root /usr/share/nginx/html;
|
||||||
index index.html;
|
index index.html;
|
||||||
|
|
||||||
|
|||||||
4
package-lock.json
generated
4
package-lock.json
generated
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "vue-nonograms-solid",
|
"name": "vue-nonograms-solid",
|
||||||
"version": "1.15.4",
|
"version": "1.15.17",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "vue-nonograms-solid",
|
"name": "vue-nonograms-solid",
|
||||||
"version": "1.15.4",
|
"version": "1.15.17",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@capacitor/android": "^8.1.0",
|
"@capacitor/android": "^8.1.0",
|
||||||
"@capacitor/cli": "^8.1.0",
|
"@capacitor/cli": "^8.1.0",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "vue-nonograms-solid",
|
"name": "vue-nonograms-solid",
|
||||||
"version": "1.15.4",
|
"version": "1.15.17",
|
||||||
"homepage": "https://nonograms.7u.pl/",
|
"homepage": "https://nonograms.7u.pl/",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 78 KiB After Width: | Height: | Size: 78 KiB |
@@ -657,13 +657,14 @@ onUnmounted(() => {
|
|||||||
|
|
||||||
.camera-controls {
|
.camera-controls {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
bottom: 20px;
|
bottom: 0;
|
||||||
left: 0;
|
left: 0;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: space-around;
|
justify-content: space-around;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
padding: 20px;
|
padding: 20px;
|
||||||
|
padding-bottom: 40px;
|
||||||
background: linear-gradient(to top, rgba(0,0,0,0.8), transparent);
|
background: linear-gradient(to top, rgba(0,0,0,0.8), transparent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -36,10 +36,14 @@ const handleKeyDown = (e) => {
|
|||||||
|
|
||||||
const triggerVibration = () => {
|
const triggerVibration = () => {
|
||||||
if (!('vibrate' in navigator)) return;
|
if (!('vibrate' in navigator)) return;
|
||||||
const isCoarse = window.matchMedia?.('(pointer: coarse)')?.matches;
|
try {
|
||||||
const isTouch = navigator.maxTouchPoints && navigator.maxTouchPoints > 0;
|
const isCoarse = window.matchMedia?.('(pointer: coarse)')?.matches;
|
||||||
if (isCoarse || isTouch) {
|
const isTouch = navigator.maxTouchPoints && navigator.maxTouchPoints > 0;
|
||||||
navigator.vibrate([80, 40, 120, 40, 180]);
|
if (isCoarse || isTouch) {
|
||||||
|
navigator.vibrate([200, 100, 200, 100, 200]);
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
console.error('Vibration failed:', e);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -38,8 +38,6 @@ export function buildShareCanvas(data, t, formattedTime) {
|
|||||||
bg.addColorStop(1, '#0a1324');
|
bg.addColorStop(1, '#0a1324');
|
||||||
ctx.fillStyle = bg;
|
ctx.fillStyle = bg;
|
||||||
ctx.fillRect(0, 0, width, height);
|
ctx.fillRect(0, 0, width, height);
|
||||||
ctx.fillStyle = 'rgba(0, 0, 0, 0.35)';
|
|
||||||
ctx.fillRect(12, 12, width - 24, height - 24);
|
|
||||||
|
|
||||||
ctx.fillStyle = '#e8fbff';
|
ctx.fillStyle = '#e8fbff';
|
||||||
ctx.font = '700 26px "Segoe UI", sans-serif';
|
ctx.font = '700 26px "Segoe UI", sans-serif';
|
||||||
@@ -204,7 +202,6 @@ export function buildShareSVG(data, t, formattedTime) {
|
|||||||
</linearGradient>
|
</linearGradient>
|
||||||
</defs>
|
</defs>
|
||||||
<rect width="100%" height="100%" fill="url(#bg)"/>
|
<rect width="100%" height="100%" fill="url(#bg)"/>
|
||||||
<rect x="12" y="12" width="${width - 24}" height="${height - 24}" fill="${overlayColor}"/>
|
|
||||||
`;
|
`;
|
||||||
|
|
||||||
// Text: Title & Time
|
// Text: Title & Time
|
||||||
@@ -253,8 +250,12 @@ export function buildShareSVG(data, t, formattedTime) {
|
|||||||
} else if (state === 2) { // Cross
|
} else if (state === 2) { // Cross
|
||||||
const d = cellSize * 0.6;
|
const d = cellSize * 0.6;
|
||||||
const off = cellSize * 0.2;
|
const off = cellSize * 0.2;
|
||||||
|
const x1 = (cx + off).toFixed(1);
|
||||||
|
const y1 = (cy + off).toFixed(1);
|
||||||
|
const x2 = (cx + off + d).toFixed(1);
|
||||||
|
const y2 = (cy + off + d).toFixed(1);
|
||||||
cells += `
|
cells += `
|
||||||
<path d="M${cx + off} ${cy + off} L${cx + off + d} ${cy + off + d} M${cx + off + d} ${cy + off} L${cx + off} ${cy + off + d}"
|
<path d="M${x1} ${y1} L${x2} ${y2} M${x2} ${y1} L${x1} ${y2}"
|
||||||
stroke="${crossColor}" stroke-width="${lineWidth}" stroke-linecap="round"/>
|
stroke="${crossColor}" stroke-width="${lineWidth}" stroke-linecap="round"/>
|
||||||
`;
|
`;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user