From eff849549b4d8fa661d1b07c2c1d742ecae7df3d Mon Sep 17 00:00:00 2001 From: Lang <7system7@gmail.com> Date: Sat, 11 Apr 2026 19:23:59 +0200 Subject: [PATCH] chg: usr: refactor and redesign the gfx on front-end #4 --- .gitignore | 1 + assets/css/style.homepage.scss | 683 ++++++++++++++---- assets/css/style.mineseeker.scss | 106 ++- .../hooks/useServerCommunication.jsx | 40 +- public/images/technologies/bun.svg | 1 + public/images/technologies/howler.svg | 1 + public/images/technologies/jquery.png | Bin 9067 -> 0 bytes public/images/technologies/lets-encrypt.png | Bin 14857 -> 0 bytes public/images/technologies/mercure.svg | 18 + public/images/technologies/phpstorm.svg | 1 + public/images/technologies/react.png | Bin 12988 -> 0 bytes public/images/technologies/symfony.png | Bin 10632 -> 0 bytes public/images/technologies/symfony.svg | 1 + public/images/technologies/tanstack-query.svg | 1 + public/images/technologies/vite.svg | 1 + public/images/technologies/websocket.png | Bin 5111 -> 0 bytes templates/Game/index.html.twig | 140 ++-- 17 files changed, 745 insertions(+), 249 deletions(-) create mode 100644 public/images/technologies/bun.svg create mode 100644 public/images/technologies/howler.svg delete mode 100644 public/images/technologies/jquery.png delete mode 100644 public/images/technologies/lets-encrypt.png create mode 100644 public/images/technologies/mercure.svg create mode 100644 public/images/technologies/phpstorm.svg delete mode 100644 public/images/technologies/react.png delete mode 100644 public/images/technologies/symfony.png create mode 100644 public/images/technologies/symfony.svg create mode 100644 public/images/technologies/tanstack-query.svg create mode 100644 public/images/technologies/vite.svg delete mode 100644 public/images/technologies/websocket.png diff --git a/.gitignore b/.gitignore index 6d48fef..e3de4fa 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ node_modules/ nohup.out /public/build/ +/config/reference.php ###< system7 - jotunheimr ### ###> symfony/framework-bundle ### diff --git a/assets/css/style.homepage.scss b/assets/css/style.homepage.scss index 92b0aa2..2094ef5 100644 --- a/assets/css/style.homepage.scss +++ b/assets/css/style.homepage.scss @@ -1,181 +1,592 @@ +// ── Reset ──────────────────────────────────────────────────────────────────── + * { outline: none; padding: 0; margin: 0; + box-sizing: border-box; } -html, body { - background: #ffffff; - display: block; +html { + // Grid lives on html so it tiles across all pages including content pages + background-color: #07090d; + background-image: + linear-gradient(rgba(35, 111, 135, 0.1) 1px, transparent 1px), + linear-gradient(90deg, rgba(35, 111, 135, 0.1) 1px, transparent 1px); + background-size: 46px 46px; width: 100%; height: 100%; } +body { + background: transparent; + width: 100%; + height: 100%; +} + +// ── Hero ───────────────────────────────────────────────────────────────────── + header { - background: #d1e8ff; position: relative; width: 100%; - height: 950px; - color: #ffffff; - overflow: hidden; + + // Minesweeper grid texture + background-color: #07090d; + background-image: + linear-gradient(rgba(35, 111, 135, 0.1) 1px, transparent 1px), + linear-gradient(90deg, rgba(35, 111, 135, 0.1) 1px, transparent 1px); + background-size: 46px 46px; } -header section { +// Deep radial vignette – grid fades toward the centre +header::before { + content: ''; + position: absolute; + inset: 0; + background: radial-gradient( + ellipse 85% 75% at 50% 50%, + #07090d 10%, + transparent 75% + ); + z-index: 0; + pointer-events: none; +} + +// Smoke at the bottom so header bleeds into body +header::after { + content: ''; + position: absolute; + bottom: 0; + left: 0; + width: 100%; + height: 160px; + background: linear-gradient(to bottom, transparent, #07090d); + z-index: 1; + pointer-events: none; +} + +// ── Hero section ───────────────────────────────────────────────────────────── + +.hero { + position: relative; + z-index: 2; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + text-align: center; + min-height: 100vh; + padding: 80px 40px 160px; + gap: 0; +} + +// Decorative glow blobs in opposite corners +.hero::before { + content: ''; + position: absolute; + top: -60px; + left: -60px; + width: 420px; + height: 420px; + border-radius: 50%; + background: radial-gradient(circle, rgba(173, 10, 5, 0.09) 0%, transparent 65%); + pointer-events: none; + z-index: 0; +} + +.hero::after { + content: ''; + position: absolute; + bottom: 100px; + right: -60px; + width: 380px; + height: 380px; + border-radius: 50%; + background: radial-gradient(circle, rgba(35, 111, 135, 0.1) 0%, transparent 65%); + pointer-events: none; + z-index: 0; +} + +// Logo +.hero-logo { + display: block; + margin-bottom: 72px; + position: relative; + z-index: 1; + animation: appear 0.9s cubic-bezier(0.22, 1, 0.36, 1) both; +} + +.hero-logo img { + width: 400px; + max-width: 82vw; + filter: + drop-shadow(0 0 40px rgba(35, 111, 135, 0.35)) + drop-shadow(0 6px 20px rgba(0, 0, 0, 0.8)); +} + +// Body text block +.hero-body { + position: relative; + z-index: 1; + display: flex; + flex-direction: column; + align-items: center; + gap: 0; +} + +.hero-sub { + font: 300 17px 'Rajdhani', sans-serif; + color: rgba(149, 207, 245, 0.9); + letter-spacing: 3px; + text-transform: uppercase; + margin-bottom: 18px; + animation: rise 0.8s 0.15s cubic-bezier(0.22, 1, 0.36, 1) both; +} + +.hero-sub strong { + font-weight: 600; + color: #95cff5; +} + +.hero-avatar { + width: 36px; + height: 36px; + border-radius: 50%; + border: 2px solid rgba(149, 207, 245, 0.25); + vertical-align: middle; + margin-right: 10px; + margin-bottom: 2px; +} + +.hero h1 { + font: 800 58px 'Rajdhani', sans-serif; + color: #ffffff; + line-height: 1.1; + letter-spacing: 1px; + margin-bottom: 56px; + text-shadow: 0 4px 30px rgba(0, 0, 0, 0.7); + animation: rise 0.8s 0.28s cubic-bezier(0.22, 1, 0.36, 1) both; +} + +// ── CTA button ─────────────────────────────────────────────────────────────── + +.hero-cta { + position: relative; + display: inline-block; + font: 800 28px 'Rajdhani', sans-serif; + text-transform: uppercase; + letter-spacing: 6px; + text-decoration: none; + color: #ffffff; + padding: 22px 100px 20px; + border-radius: 4px; + border: 1px solid rgba(246, 125, 82, 0.25); + + background: linear-gradient(to bottom, #b30c06 0%, #d63d15 50%, #f67d52 100%); + + box-shadow: + 0 0 0 1px rgba(173, 10, 5, 0.2), + 0 0 30px rgba(173, 10, 5, 0.35), + 0 6px 24px rgba(0, 0, 0, 0.5), + inset 0 1px 0 rgba(255, 255, 255, 0.12); + + transition: transform 220ms ease, box-shadow 220ms ease, letter-spacing 220ms ease; + animation: rise 0.8s 0.42s cubic-bezier(0.22, 1, 0.36, 1) both; +} + +// Outer glow layer (blurred duplicate, always visible) +.hero-cta::before { + content: ''; + position: absolute; + inset: -4px; + border-radius: 7px; + background: linear-gradient(to bottom, #ad0a05, #f67d52); + filter: blur(18px); + opacity: 0.3; + z-index: -1; + transition: opacity 220ms ease; +} + +.hero-cta:hover { + transform: translateY(-4px); + letter-spacing: 8px; + box-shadow: + 0 0 0 1px rgba(246, 125, 82, 0.3), + 0 0 50px rgba(173, 10, 5, 0.65), + 0 10px 32px rgba(0, 0, 0, 0.45), + inset 0 1px 0 rgba(255, 255, 255, 0.15); +} + +.hero-cta:hover::before { + opacity: 0.55; +} + +.hero-cta:active { + transform: translateY(-1px); +} + +// Version / copyright line +.hero-meta { + position: relative; + z-index: 1; + font: 400 12px 'Rajdhani', sans-serif; + color: rgba(255, 255, 255, 0.5); + letter-spacing: 0.5px; + margin-top: 58px; + animation: rise 0.8s 0.55s cubic-bezier(0.22, 1, 0.36, 1) both; +} + +.hero-meta a { + color: rgba(149, 207, 245, 0.65); + text-decoration: none; + transition: color 180ms; +} + +.hero-meta a:hover { + color: #95cff5; +} + +// ── Compact hero (sub-pages) ───────────────────────────────────────────────── + +.hero--compact { + min-height: unset; + padding: 36px 60px 48px; + flex-direction: row; + align-items: center; + justify-content: center; + text-align: left; + gap: 52px; + + &::before, &::after { display: none; } + + .hero-logo { + flex-shrink: 0; + margin-bottom: 0; + + img { width: 180px; } + } + + .hero-body { + align-items: flex-start; + } + + .hero-sub { + font-size: 14px; + letter-spacing: 2px; + margin-bottom: 10px; + } + + h1 { + font-size: 26px; + margin-bottom: 24px; + letter-spacing: 0; + } + + .hero-cta { + padding: 12px 52px 10px; + font-size: 18px; + letter-spacing: 4px; + } + + .hero-meta { + margin-top: 20px; + } +} + +// Also shrink the bottom fade on sub-pages +header:has(.hero--compact)::after { + height: 60px; +} + +// ── Animations ─────────────────────────────────────────────────────────────── + +@keyframes appear { + from { opacity: 0; transform: scale(0.94); } + to { opacity: 1; transform: scale(1); } +} + +@keyframes rise { + from { opacity: 0; transform: translateY(16px); } + to { opacity: 1; transform: translateY(0); } +} + +// ── Content pages (terms, privacy, contact) ────────────────────────────────── + +main div.txt { + color: rgba(255, 255, 255, 0.85); + max-width: 900px; + margin: 0 auto; + padding: 60px 40px 80px; +} + +main div.txt h2 { + font: bold 28px 'Rajdhani', sans-serif; + color: #ffffff; + margin-bottom: 30px; + letter-spacing: 1px; +} + +main div.txt h3 { + font: bold 17px 'Rajdhani', sans-serif; + color: rgba(149, 207, 245, 0.9); + margin: 28px 0 10px; + letter-spacing: 0.5px; +} + +main div.txt p, +main div.txt li { + font: 400 15px 'Rajdhani', sans-serif; + color: rgba(255, 255, 255, 0.72); + line-height: 1.75; +} + +main div.txt a { + color: #95cff5; + text-decoration: none; + transition: color 180ms; + + &:hover { color: #c5e8ff; } +} + +// ── Technologies strip ──────────────────────────────────────────────────────── + +main { + background: #07090d; +} + +.tech-section { + padding: 48px 20px 72px; + text-align: center; + border-top: 1px solid rgba(255, 255, 255, 0.04); +} + +.tech-label { + font: 600 11px 'Rajdhani', sans-serif; + text-transform: uppercase; + letter-spacing: 6px; + color: rgba(255, 255, 255, 0.14); + margin-bottom: 28px; +} + +.tech-logos img { + display: inline-block; + width: 52px; + height: 52px; + object-fit: contain; + margin: 8px 24px; + // Force all logos to white, then tint with the game's blue + filter: brightness(0) invert(1) opacity(0.35); + transition: filter 220ms ease, transform 220ms ease; +} + +.tech-logos img:hover { + // Bright white → blue-tinted on hover + filter: + brightness(0) invert(1) + sepia(1) saturate(3) hue-rotate(175deg) brightness(1.1) + opacity(0.9); + transform: translateY(-4px); +} + +// ── Footer ─────────────────────────────────────────────────────────────────── + +footer { + background: #040608; + border-top: 1px solid rgba(35, 111, 135, 0.12); + width: 100%; +} + +.footer-inner { display: flex; align-items: flex-start; - justify-content: flex-start; - flex-direction: column; - max-width: 1300px; - width: 100%; - height: 100%; - padding: 20px; + justify-content: space-between; + max-width: 1100px; margin: 0 auto; + padding: 60px 60px 52px; + gap: 40px; } -header section div.logo img { - width: 350px; - margin: 50px 0; +// Left: brand block +.footer-brand { + display: flex; + flex-direction: column; + align-items: flex-start; + gap: 10px; } -header section div.logo a { - display: block; +.footer-logo { + width: 72px; + height: 72px; + opacity: 0.55; + filter: + drop-shadow(0 0 12px rgba(35, 111, 135, 0.4)) + brightness(1.1); + transition: opacity 250ms ease, filter 250ms ease; + + &:hover { + opacity: 0.9; + filter: + drop-shadow(0 0 20px rgba(35, 111, 135, 0.65)) + brightness(1.2); + } } -header section > img { - position: absolute; - width: 1300px; - height: 1300px; - right: -20%; - top: -10%; - - z-index: 1; -} - -header section > div { - z-index: 2; -} - -header section h1 { - font: bold 40px 'Rajdhani', sans-serif; - color: #434242; - margin-bottom: 100px; -} - -header section h2 { - font: normal 32px 'Rajdhani', sans-serif; - color: #434242; - margin-top: 100px; -} - -header section h3 { - display: block; - font: bold 16px 'Rajdhani', sans-serif; - color: #434242; - margin-top: 10px; -} - -header section h3 img { - width: 16px; -} - -header section div.buttons > a { - background: #69788e; - display: table; - font: bold 32px 'Rajdhani', sans-serif; +.footer-name { + font: 700 22px 'Rajdhani', sans-serif; + color: rgba(255, 255, 255, 0.75); + letter-spacing: 2px; text-transform: uppercase; + margin-top: 4px; +} + +.footer-tagline { + font: 400 13px 'Rajdhani', sans-serif; + color: rgba(149, 207, 245, 0.7); + letter-spacing: 0.5px; + max-width: 240px; + line-height: 1.5; +} + +// Right: navigation +.footer-nav-label { + font: 700 11px 'Rajdhani', sans-serif; + text-transform: uppercase; + letter-spacing: 4px; + color: rgba(255, 255, 255, 0.5); + margin-bottom: 18px; + text-align: left; +} + +.footer-nav ul { + list-style: none; + display: flex; + flex-direction: column; + align-items: flex-start; + gap: 6px; + min-width: 180px; +} + +.footer-nav ul li a { + display: block; + font: 500 15px 'Rajdhani', sans-serif; + color: rgba(255, 255, 255, 0.7); text-decoration: none; - border: 5px solid #57667b; - color: #FFFFFF; - padding: 25px 150px; - margin-bottom: 20px; + text-transform: uppercase; + letter-spacing: 1.5px; + white-space: nowrap; + padding: 6px 0; + transition: color 180ms ease, letter-spacing 180ms ease; - box-shadow: 0 3px 10px rgba(0, 0, 0, 0.3); - border-radius: 20px; - transition: all 250ms ease-in-out; + &:hover { + color: #95cff5; + letter-spacing: 2px; + } } -header section div.buttons > a:hover { - background: #57667b; +// Bottom copyright bar +.footer-copy { + border-top: 1px solid rgba(255, 255, 255, 0.05); + padding: 16px 60px; + max-width: 1100px; + margin: 0 auto; - -webkit-box-shadow: 0 7px 15px rgba(0, 0, 0, 0.2); - box-shadow: 0 7px 15px rgba(0, 0, 0, 0.2); - -webkit-transition: all 250ms ease-in-out; - -moz-transition: all 250ms ease-in-out; - -o-transition: all 250ms ease-in-out; - transition: all 250ms ease-in-out; -} - -header section div.buttons > a.small { - background: #83aed9; - display: inline-block; - font: bold 22px 'Rajdhani', sans-serif; - border: 1px solid #6890ba; - color: #FFFFFF; - padding: 10px; - - -webkit-box-shadow: 0 3px 10px rgba(0, 0, 0, 0.3); - box-shadow: 0 3px 10px rgba(0, 0, 0, 0.3); - -webkit-transition: all 250ms ease-in-out; - -moz-transition: all 250ms ease-in-out; - -o-transition: all 250ms ease-in-out; - transition: all 250ms ease-in-out; - -} - -header section div.buttons > a.small:hover { - background: #86b5e1; - border: 1px solid #658fb8; - color: #FFFFFF; - - -webkit-box-shadow: 0 7px 15px rgba(0, 0, 0, 0.2); - box-shadow: 0 7px 15px rgba(0, 0, 0, 0.2); - -webkit-transition: all 250ms ease-in-out; - -moz-transition: all 250ms ease-in-out; - -o-transition: all 250ms ease-in-out; - transition: all 250ms ease-in-out; -} - -@media screen and (max-width: 1100px) { - header section { - align-items: center; - justify-content: center; + p { + font: 400 11px 'Rajdhani', sans-serif; + color: rgba(255, 255, 255, 0.45); + letter-spacing: 0.5px; text-align: center; } - header section div.buttons > a { - margin: 0 auto 20px auto; - } + a { + color: rgba(149, 207, 245, 0.6); + text-decoration: none; + transition: color 180ms; - header section h1 { - margin-bottom: 20px; - } - - header section div.logo img { - margin-bottom: 0; - } - - header section > img { - display: none; + &:hover { color: #95cff5; } } } -@media screen and (max-width: 500px) { - /*header {*/ - /*min-height: 100%;*/ - /*height: auto;*/ - /*}*/ +// ── Responsive ─────────────────────────────────────────────────────────────── - header section { - width: auto; +@media screen and (max-width: 768px) { + .hero--compact { + flex-direction: column; + text-align: center; + padding: 36px 24px 44px; + gap: 28px; + + .hero-body { align-items: center; } } - header section div.logo img { - width: 100%; + .footer-inner { + flex-direction: column; + align-items: center; + text-align: center; + padding: 48px 30px 36px; } - header section div.buttons > a { - display: block; - padding: 25px 5px; + .footer-brand { + align-items: center; + } + + .footer-tagline { + text-align: center; + } + + .footer-nav-label { + text-align: center; + } + + .footer-nav ul { + align-items: center; + } + + .footer-copy { + padding: 16px 30px; } } + +@media screen and (max-width: 900px) { + .hero h1 { + font-size: 44px; + } + + .hero-cta { + padding: 20px 72px 18px; + font-size: 24px; + letter-spacing: 5px; + } +} + +@media screen and (max-width: 550px) { + .hero { + padding: 60px 24px 140px; + } + + .hero-logo img { + width: 260px; + } + + .hero-logo { + margin-bottom: 52px; + } + + .hero h1 { + font-size: 32px; + margin-bottom: 40px; + } + + .hero-sub { + font-size: 14px; + letter-spacing: 2px; + } + + .hero-cta { + padding: 18px 48px 16px; + font-size: 20px; + letter-spacing: 4px; + } + + +} \ No newline at end of file diff --git a/assets/css/style.mineseeker.scss b/assets/css/style.mineseeker.scss index 274fe92..624a0a4 100644 --- a/assets/css/style.mineseeker.scss +++ b/assets/css/style.mineseeker.scss @@ -88,7 +88,7 @@ main { font-family: 'Open Sans', sans-serif; text-align: center; color: #354d6a; - width: 500px; + width: 660px; padding: 10px; -webkit-border-radius: 10px; @@ -109,47 +109,93 @@ main { color: #386e8c; } -#mine-wrapper .game-wrapper .game-overlay .game-overlay-window .clippy { +#mine-wrapper .game-wrapper .game-overlay .game-overlay-window .share-invite { + padding: 0 4px 4px; +} + +#mine-wrapper .game-wrapper .game-overlay .game-overlay-window .share-invite-label { + font-size: 13px; + color: #386e8c; + margin: 0 0 8px; + font-style: italic; +} + +#mine-wrapper .game-wrapper .game-overlay .game-overlay-window .share-url-box { display: flex; align-items: center; - width: 100%; - margin-bottom: 10px; + background: #d0e8f5; + border: 1px solid #7ab8d8; + border-radius: 6px; + padding: 0 12px; + margin-bottom: 12px; + cursor: text; + transition: border-color 200ms ease; + + &:hover { + border-color: #236f87; + } } -#mine-wrapper .game-wrapper .game-overlay .game-overlay-window .clippy input { +#mine-wrapper .game-wrapper .game-overlay .game-overlay-window .share-url-icon { + color: #236f87; + font-size: 13px; + flex-shrink: 0; + margin-right: 8px; + opacity: 0.7; +} + +#mine-wrapper .game-wrapper .game-overlay .game-overlay-window .share-url-input { + flex: 1; + background: transparent; border: 0; + outline: 0; height: 40px; - width: 100%; - padding: 0 20px; + color: #1a4a6a; + font-family: 'Courier New', monospace; + font-size: 13px; + font-weight: bold; + letter-spacing: 0.3px; + text-align: center; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + cursor: text; + min-width: 0; - -webkit-border-radius: 3px; - border-radius: 3px; - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.075); + &::selection { + background: rgba(35, 111, 135, 0.2); + } } -#mine-wrapper .game-wrapper .game-overlay .game-overlay-window a { - background: #d8e3ea; - display: inline-table; - text-decoration: none; - color: #126aa2; - padding: 10px 50px; - margin: 0 2.5px; - +#mine-wrapper .game-wrapper .game-overlay .game-overlay-window .share-copy-btn { + display: inline-flex; + align-items: center; + gap: 7px; + background: linear-gradient(to bottom, #236f87 0%, #1a5068 100%); + border: 1px solid #2e7a9a; + color: #e0f4ff; + font-family: 'Rajdhani', sans-serif; + font-size: 15px; + font-weight: bold; + letter-spacing: 0.5px; + padding: 9px 32px; + border-radius: 5px; cursor: pointer; + transition: all 220ms ease; - -webkit-border-radius: 3px; - border-radius: 3px; - -webkit-transition: all 250ms ease-in-out; - transition: all 250ms ease-in-out; -} + &:hover { + background: linear-gradient(to bottom, #2d8aa8 0%, #236f87 100%); + border-color: #5ba4d4; + color: #fff; + box-shadow: 0 0 10px rgba(35, 111, 135, 0.5); + } -#mine-wrapper .game-wrapper .game-overlay .game-overlay-window a:hover { - background: #a4afb6; - color: #ffffff; - - -webkit-transition: all 250ms ease-in-out; - transition: all 250ms ease-in-out; + &.copied { + background: linear-gradient(to bottom, #1a6844 0%, #135233 100%); + border-color: #2a9e60; + color: #a0f0c0; + box-shadow: 0 0 8px rgba(26, 104, 68, 0.5); + } } #mine-wrapper .game-wrapper .users { diff --git a/assets/js/mine-seeker/hooks/useServerCommunication.jsx b/assets/js/mine-seeker/hooks/useServerCommunication.jsx index 49581b2..b5d66ce 100644 --- a/assets/js/mine-seeker/hooks/useServerCommunication.jsx +++ b/assets/js/mine-seeker/hooks/useServerCommunication.jsx @@ -7,12 +7,42 @@ * file that was distributed with this source code. */ -import React, { useEffect, useRef } from 'react'; +import React, { useEffect, useRef, useState } from 'react'; import { useMutation, useQuery } from '@tanstack/react-query'; import { useGame } from '@mine-contexts'; import { DESC } from '@mine-utils'; import useStepTimer from './useStepTimer'; +const ShareLinkBox = ({ url }) => { + const [copied, setCopied] = useState(false); + + const handleCopy = () => { + navigator.clipboard.writeText(url).then(() => { + setCopied(true); + setTimeout(() => setCopied(false), 2500); + }).catch(() => {}); + }; + + return ( +
+

Share this link with your opponent

+
e.currentTarget.querySelector('input').select()}> + + e.target.select()} + /> +
+ +
+ ); +}; + /** Handles all server communication: SSE (Mercure), REST calls, and the initialization lifecycle. */ const useServerCommunication = (gameAssoc, gameInherited, isEnvDev) => { const { @@ -76,13 +106,7 @@ const useServerCommunication = (gameAssoc, gameInherited, isEnvDev) => { const wInit = (revealedCells = []) => { setGridReady(true); showOverlay('We are waiting for your opponent...', gameAssoc ? ( -
-

Share this unique link w/ your opponent

-
- -
- Play w/ me! -
+ ) : ''); setTimeout(() => revealedCells.forEach(cell => applyRevealedCell(cell, cell.player)), 0); }; diff --git a/public/images/technologies/bun.svg b/public/images/technologies/bun.svg new file mode 100644 index 0000000..e1918b9 --- /dev/null +++ b/public/images/technologies/bun.svg @@ -0,0 +1 @@ +Bun \ No newline at end of file diff --git a/public/images/technologies/howler.svg b/public/images/technologies/howler.svg new file mode 100644 index 0000000..bf9ea0a --- /dev/null +++ b/public/images/technologies/howler.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/images/technologies/jquery.png b/public/images/technologies/jquery.png deleted file mode 100644 index 5f63b0134ae14d5486142e640b266e9e8ce97b2c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9067 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 diff --git a/public/images/technologies/lets-encrypt.png b/public/images/technologies/lets-encrypt.png deleted file mode 100644 index e1fae90d893a979b25ca97c0e2dfc5f680ad6f3d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14857 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 AQ2+n{ diff --git a/public/images/technologies/mercure.svg b/public/images/technologies/mercure.svg new file mode 100644 index 0000000..dbd2da3 --- /dev/null +++ b/public/images/technologies/mercure.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + diff --git a/public/images/technologies/phpstorm.svg b/public/images/technologies/phpstorm.svg new file mode 100644 index 0000000..39e48b8 --- /dev/null +++ b/public/images/technologies/phpstorm.svg @@ -0,0 +1 @@ +PhpStorm \ No newline at end of file diff --git a/public/images/technologies/react.png b/public/images/technologies/react.png deleted file mode 100644 index c27bd6ba52a1bdd9626b51669719ce240fa3141a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12988 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 \ No newline at end of file diff --git a/public/images/technologies/tanstack-query.svg b/public/images/technologies/tanstack-query.svg new file mode 100644 index 0000000..ed38f7f --- /dev/null +++ b/public/images/technologies/tanstack-query.svg @@ -0,0 +1 @@ +React Query \ No newline at end of file diff --git a/public/images/technologies/vite.svg b/public/images/technologies/vite.svg new file mode 100644 index 0000000..585b2ab --- /dev/null +++ b/public/images/technologies/vite.svg @@ -0,0 +1 @@ +Vite \ No newline at end of file diff --git a/public/images/technologies/websocket.png b/public/images/technologies/websocket.png deleted file mode 100644 index 93fee91c4dd7c7de2980d380c0f9e6f24059548d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5111 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 - - - - + + + + + {% endblock %} {% block header %} -
- -
-
- {% if is_granted("IS_AUTHENTICATED_REMEMBERED") %} - {% if app.user.facebookId is not null %} -
- Facebook profile -
- {% endif %} -
- - Hello, {{ app.user.realName is not null ? app.user.realName : app.user.username }}! - -

Let's play!! :D

-
- {% else %} -
-

A minesweeper game rethought...

-

...and you can play w/o register!!

-
- {% endif %} -
-
- Play NOW! - {# - {% if is_granted("IS_AUTHENTICATED_REMEMBERED") %} - - {{ 'layout.logout'|trans({}, 'FOSUserBundle') }} - - {% else %} - Sign up · - Sign in - {% endif %} - #} -
-

- version {{ version }} • MineSeeker © {{ "now"|date("Y") }} • - www.splendidbear.org -

-
- MineSeeker Logo -
+
+ + + +
+ {% if is_granted("IS_AUTHENTICATED_REMEMBERED") %} +

+ {% if app.user.facebookId is defined and app.user.facebookId is not null %} + + {% endif %} + Welcome back, {{ app.user.realName is not null ? app.user.realName : app.user.username }} +

+

Ready for another round?

+ {% else %} +

Multiplayer minesweeper — reimagined

+

No account needed.
Just play.

+ {% endif %} + Play Now +
+ +
{% endblock %} {% block body %} -
-
-

Used technologies

- Used Websocket - Used React.js - Used Symfony - Used jQuery - Used Let's Encrypt -
+
+

Built with

+
+ Symfony + Howler.js + TanStack Query + Mercure + Vite + Bun + PHPStorm
+
{% endblock %} {% block footer %} -