diff --git a/Transcendence/srcs/frontend/src/game2/doodle.css b/Transcendence/srcs/frontend/src/game2/doodle.css new file mode 100644 index 0000000..2995ebc --- /dev/null +++ b/Transcendence/srcs/frontend/src/game2/doodle.css @@ -0,0 +1,87 @@ + +.shape { + /* The "Physical" properties */ + position: fixed; + /* transform: translate(-50%, -50%); Optional: This makes 'left/top' refer to the CENTER of the doodle */ + + width: 142px; + height: 142px; + + /* The "Stenciling" instructions (but no image yet!) */ + -webkit-mask-size: contain; + mask-size: contain; + -webkit-mask-repeat: no-repeat; + mask-repeat: no-repeat; + + /* The default "Paint" color */ + background-color: white; +} + +.shape:hover { + transform: scale(1.2); /* Grow by 20% when you hover the mouse over it */ + transition: transform 0.3s ease; /* Make it a smooth grow */ +} + +/* Individual Doodle Definitions */ +.doodle-0 { -webkit-mask-image: url('doodles/cat.png'); mask-image: url('doodles/cat.png'); left: 60vw; top: 35vh; } +.doodle-1 { -webkit-mask-image: url('doodles/ball.png'); mask-image: url('doodles/ball.png'); left: 10vw; top: 10vh; } +.doodle-2 { -webkit-mask-image: url('doodles/batman.png'); mask-image: url('doodles/batman.png'); left: 20vw; top: 15vh; } +.doodle-3 { -webkit-mask-image: url('doodles/building.png'); mask-image: url('doodles/building.png'); left: 30vw; top: 20vh; } +.doodle-4 { -webkit-mask-image: url('doodles/butterfly.png'); mask-image: url('doodles/butterfly.png'); left: 40vw; top: 25vh; } +.doodle-5 { -webkit-mask-image: url('doodles/car.png'); mask-image: url('doodles/car.png'); left: 50vw; top: 30vh; } +.doodle-6 { -webkit-mask-image: url('doodles/yin_yang.png'); mask-image: url('doodles/yin_yang.png'); left: 88vw; top: 12vh; } +.doodle-7 { -webkit-mask-image: url('doodles/clouds.png'); mask-image: url('doodles/clouds.png'); left: 70vw; top: 40vh; } +.doodle-8 { -webkit-mask-image: url('doodles/controls.png'); mask-image: url('doodles/controls.png'); left: 80vw; top: 45vh; } +.doodle-9 { -webkit-mask-image: url('doodles/dead.png'); mask-image: url('doodles/dead.png'); left: 90vw; top: 50vh; } +.doodle-10 { -webkit-mask-image: url('doodles/diamant.png'); mask-image: url('doodles/diamant.png'); left: 15vw; top: 55vh; } +.doodle-11 { -webkit-mask-image: url('doodles/dice.png'); mask-image: url('doodles/dice.png'); left: 25vw; top: 60vh; } +.doodle-12 { -webkit-mask-image: url('doodles/earth.png'); mask-image: url('doodles/earth.png'); left: 35vw; top: 65vh; } +.doodle-13 { -webkit-mask-image: url('doodles/egypt.png'); mask-image: url('doodles/egypt.png'); left: 45vw; top: 70vh; } +.doodle-14 { -webkit-mask-image: url('doodles/fire.png'); mask-image: url('doodles/fire.png'); left: 55vw; top: 75vh; } +.doodle-15 { -webkit-mask-image: url('doodles/fish.png'); mask-image: url('doodles/fish.png'); left: 65vw; top: 80vh; } +.doodle-16 { -webkit-mask-image: url('doodles/flag.png'); mask-image: url('doodles/flag.png'); left: 75vw; top: 85vh; } +.doodle-17 { -webkit-mask-image: url('doodles/hearts.png'); mask-image: url('doodles/hearts.png'); left: 85vw; top: 90vh; } +.doodle-18 { -webkit-mask-image: url('doodles/house.png'); mask-image: url('doodles/house.png'); left: 5vw; top: 45vh; } +.doodle-19 { -webkit-mask-image: url('doodles/idol.png'); mask-image: url('doodles/idol.png'); left: 12vw; top: 22vh; } +.doodle-20 { -webkit-mask-image: url('doodles/lotus.png'); mask-image: url('doodles/lotus.png'); left: 22vw; top: 32vh; } +.doodle-21 { -webkit-mask-image: url('doodles/mail.png'); mask-image: url('doodles/mail.png'); left: 32vw; top: 42vh; } +.doodle-22 { -webkit-mask-image: url('doodles/moon.png'); mask-image: url('doodles/moon.png'); left: 42vw; top: 52vh; } +.doodle-23 { -webkit-mask-image: url('doodles/pokeball.png'); mask-image: url('doodles/pokeball.png'); left: 52vw; top: 62vh; } +.doodle-24 { -webkit-mask-image: url('doodles/runes.png'); mask-image: url('doodles/runes.png'); left: 62vw; top: 72vh; } +.doodle-25 { -webkit-mask-image: url('doodles/shield.png'); mask-image: url('doodles/shield.png'); left: 72vw; top: 82vh; } +.doodle-26 { -webkit-mask-image: url('doodles/shiny.png'); mask-image: url('doodles/shiny.png'); left: 82vw; top: 12vh; } +.doodle-27 { -webkit-mask-image: url('doodles/snail.png'); mask-image: url('doodles/snail.png'); left: 92vw; top: 22vh; } +.doodle-28 { -webkit-mask-image: url('doodles/sound.png'); mask-image: url('doodles/sound.png'); left: 18vw; top: 82vh; } +.doodle-29 { -webkit-mask-image: url('doodles/spiral.png'); mask-image: url('doodles/spiral.png'); left: 28vw; top: 72vh; } +.doodle-30 { -webkit-mask-image: url('doodles/star.png'); mask-image: url('doodles/star.png'); left: 38vw; top: 62vh; } +.doodle-31 { -webkit-mask-image: url('doodles/stop.png'); mask-image: url('doodles/stop.png'); left: 48vw; top: 52vh; } +.doodle-32 { -webkit-mask-image: url('doodles/sun.png'); mask-image: url('doodles/sun.png'); left: 58vw; top: 42vh; } +.doodle-33 { -webkit-mask-image: url('doodles/tree.png'); mask-image: url('doodles/tree.png'); left: 68vw; top: 32vh; } +.doodle-34 { -webkit-mask-image: url('doodles/triskel.png'); mask-image: url('doodles/triskel.png'); left: 78vw; top: 22vh; } + + +/* 3. A quick animation for the color loop */ +.loop-color { + animation: colorShift 12s infinite alternate ease-in-out; +} +@keyframes colorShift { + /* 0% and 100% are identical to create the "Infinite Circle" effect */ + 0% { background-color: #3075ff; } /* Royal Blue (Start) */ + + 8% { background-color: #24a1ff; } /* Sky Blue */ + 17% { background-color: #1ad8ff; } /* Cyan */ + + 25% { background-color: #1bffa7; } /* Seafoam Green */ + 33% { background-color: #1fff4d; } /* Bright Green */ + 42% { background-color: #8bff32; } /* Lime Green */ + + 50% { background-color: #dcff38; } /* Electric Yellow */ + 58% { background-color: #ffbc29; } /* Golden Yellow */ + 67% { background-color: #ff8c4a; } /* Coral Orange */ + + 75% { background-color: #ff1d1d; } /* Hot Red */ + 83% { background-color: #ff2bf3; } /* Magenta Pink */ + 92% { background-color: #ac37ff; } /* Electric Purple */ + + 100% { background-color: #3075ff; } /* Royal Blue (Seamless Loop) */ +} \ No newline at end of file diff --git a/Transcendence/srcs/frontend/src/game2/doodle.js b/Transcendence/srcs/frontend/src/game2/doodle.js new file mode 100644 index 0000000..2a20df4 --- /dev/null +++ b/Transcendence/srcs/frontend/src/game2/doodle.js @@ -0,0 +1,113 @@ +const maxdoodles = 34; + +// /////////////////////////////////////////////////////////////////////////////////////////>\ +// container for all doodles, create them +class DoodleContainer { + + constructor(parent) { + + this.parent = parent; + this.obj = document.createElement('div'); + Object.assign(this.obj.style, { + width: '100vw', + height: '100vw', + }); + + this.createAllDoodles(); + parent.append(this.obj); + this.randomizeAnimationStarts(); + } + + createAllDoodles() { + + for (let i = 0; i <= maxdoodles; i++) { + let d = document.createElement('div'); + d.classList.add('shape', 'doodle-' + i, 'loop-color'); + d.id = 'shape' + i; + this.obj.append(d); + d.addEventListener('click', () => { + console.log(`hi from ${d.id}!`); + }) + } + } + + startSmoothRandomMove(id, speed = 2) { + + const el = document.getElementById(id); + if (!el) + return; + + // 1. Get initial pixel position or pick random if CSS isn't loaded yet + const rect = el.getBoundingClientRect(); + + const state = { + x: rect.left || Math.random() * (window.innerWidth - 142), + y: rect.top || Math.random() * (window.innerHeight - 142), + angle: Math.random() * Math.PI * 2, + speed: speed + }; + + function update() { + // 2. Refresh screen boundaries every frame + const screenW = window.innerWidth; + const screenH = window.innerHeight; + const shapeSize = 142; // Matches your CSS width/height + + // 3. Calculate next step + state.x += Math.cos(state.angle) * state.speed; + state.y += Math.sin(state.angle) * state.speed; + + // 4. BOUNCE LOGIC + // Horizontal check + if (state.x <= 0) { + state.x = 0; + state.angle = Math.PI - state.angle; + } else if (state.x + shapeSize >= screenW) { + state.x = screenW - shapeSize; + state.angle = Math.PI - state.angle; + } + + // Vertical check + if (state.y <= 0) { + state.y = 0; + state.angle = -state.angle; + } else if (state.y + shapeSize >= screenH) { + state.y = screenH - shapeSize; + state.angle = -state.angle; + } + + // 5. Apply position using pixels for precision + el.style.left = state.x + "px"; + el.style.top = state.y + "px"; + + requestAnimationFrame(update); + } + + requestAnimationFrame(update); + } + + randomizeAnimationStarts() { + for (let i = 0; i <= maxdoodles; i++) { + const randomSpeed = 1 + Math.random() * 3; + this.startSmoothRandomMove(`shape${i}`, randomSpeed); + } + } +} + +// /////////////////////////////////////////////////////////////////////////////////////////> +// all loop-color have the same @colorShift animation cycle, this disynchronize them +function randomizeColorsStarts() { + const shapes = document.querySelectorAll('.loop-color'); + + shapes.forEach(shape => { + // Pick a random number between 0 and 10 (since your loop is 10s) + const randomDelay = Math.random() * - 15; + + // Apply it directly to the element's style + shape.style.animationDelay = randomDelay + "s"; + }); +} + +const a = new DoodleContainer(document.body); +// Call this once when the script loads +randomizeColorsStarts(); diff --git a/Transcendence/srcs/frontend/src/game2/doodles/ball.png b/Transcendence/srcs/frontend/src/game2/doodles/ball.png new file mode 100644 index 0000000..f01603b Binary files /dev/null and b/Transcendence/srcs/frontend/src/game2/doodles/ball.png differ diff --git a/Transcendence/srcs/frontend/src/game2/doodles/batman.png b/Transcendence/srcs/frontend/src/game2/doodles/batman.png new file mode 100644 index 0000000..b2a3694 Binary files /dev/null and b/Transcendence/srcs/frontend/src/game2/doodles/batman.png differ diff --git a/Transcendence/srcs/frontend/src/game2/doodles/building.png b/Transcendence/srcs/frontend/src/game2/doodles/building.png new file mode 100644 index 0000000..4f6f8f9 Binary files /dev/null and b/Transcendence/srcs/frontend/src/game2/doodles/building.png differ diff --git a/Transcendence/srcs/frontend/src/game2/doodles/butterfly.png b/Transcendence/srcs/frontend/src/game2/doodles/butterfly.png new file mode 100644 index 0000000..8e07155 Binary files /dev/null and b/Transcendence/srcs/frontend/src/game2/doodles/butterfly.png differ diff --git a/Transcendence/srcs/frontend/src/game2/doodles/car.png b/Transcendence/srcs/frontend/src/game2/doodles/car.png new file mode 100644 index 0000000..c795467 Binary files /dev/null and b/Transcendence/srcs/frontend/src/game2/doodles/car.png differ diff --git a/Transcendence/srcs/frontend/src/game2/doodles/cat.png b/Transcendence/srcs/frontend/src/game2/doodles/cat.png new file mode 100644 index 0000000..6127dad Binary files /dev/null and b/Transcendence/srcs/frontend/src/game2/doodles/cat.png differ diff --git a/Transcendence/srcs/frontend/src/game2/doodles/clouds.png b/Transcendence/srcs/frontend/src/game2/doodles/clouds.png new file mode 100644 index 0000000..bac58ea Binary files /dev/null and b/Transcendence/srcs/frontend/src/game2/doodles/clouds.png differ diff --git a/Transcendence/srcs/frontend/src/game2/doodles/controls.png b/Transcendence/srcs/frontend/src/game2/doodles/controls.png new file mode 100644 index 0000000..bc190b8 Binary files /dev/null and b/Transcendence/srcs/frontend/src/game2/doodles/controls.png differ diff --git a/Transcendence/srcs/frontend/src/game2/doodles/dead.png b/Transcendence/srcs/frontend/src/game2/doodles/dead.png new file mode 100644 index 0000000..71b08a8 Binary files /dev/null and b/Transcendence/srcs/frontend/src/game2/doodles/dead.png differ diff --git a/Transcendence/srcs/frontend/src/game2/doodles/diamant.png b/Transcendence/srcs/frontend/src/game2/doodles/diamant.png new file mode 100644 index 0000000..5c37ce1 Binary files /dev/null and b/Transcendence/srcs/frontend/src/game2/doodles/diamant.png differ diff --git a/Transcendence/srcs/frontend/src/game2/doodles/dice.png b/Transcendence/srcs/frontend/src/game2/doodles/dice.png new file mode 100644 index 0000000..0910f5f Binary files /dev/null and b/Transcendence/srcs/frontend/src/game2/doodles/dice.png differ diff --git a/Transcendence/srcs/frontend/src/game2/doodles/earth.png b/Transcendence/srcs/frontend/src/game2/doodles/earth.png new file mode 100644 index 0000000..d212cc1 Binary files /dev/null and b/Transcendence/srcs/frontend/src/game2/doodles/earth.png differ diff --git a/Transcendence/srcs/frontend/src/game2/doodles/egypt.png b/Transcendence/srcs/frontend/src/game2/doodles/egypt.png new file mode 100644 index 0000000..0d63d78 Binary files /dev/null and b/Transcendence/srcs/frontend/src/game2/doodles/egypt.png differ diff --git a/Transcendence/srcs/frontend/src/game2/doodles/fire.png b/Transcendence/srcs/frontend/src/game2/doodles/fire.png new file mode 100644 index 0000000..0ef93cf Binary files /dev/null and b/Transcendence/srcs/frontend/src/game2/doodles/fire.png differ diff --git a/Transcendence/srcs/frontend/src/game2/doodles/fish.png b/Transcendence/srcs/frontend/src/game2/doodles/fish.png new file mode 100644 index 0000000..4e6e441 Binary files /dev/null and b/Transcendence/srcs/frontend/src/game2/doodles/fish.png differ diff --git a/Transcendence/srcs/frontend/src/game2/doodles/flag.png b/Transcendence/srcs/frontend/src/game2/doodles/flag.png new file mode 100644 index 0000000..c866ada Binary files /dev/null and b/Transcendence/srcs/frontend/src/game2/doodles/flag.png differ diff --git a/Transcendence/srcs/frontend/src/game2/doodles/hearts.png b/Transcendence/srcs/frontend/src/game2/doodles/hearts.png new file mode 100644 index 0000000..128ab91 Binary files /dev/null and b/Transcendence/srcs/frontend/src/game2/doodles/hearts.png differ diff --git a/Transcendence/srcs/frontend/src/game2/doodles/house.png b/Transcendence/srcs/frontend/src/game2/doodles/house.png new file mode 100644 index 0000000..f60baeb Binary files /dev/null and b/Transcendence/srcs/frontend/src/game2/doodles/house.png differ diff --git a/Transcendence/srcs/frontend/src/game2/doodles/idol.png b/Transcendence/srcs/frontend/src/game2/doodles/idol.png new file mode 100644 index 0000000..8580784 Binary files /dev/null and b/Transcendence/srcs/frontend/src/game2/doodles/idol.png differ diff --git a/Transcendence/srcs/frontend/src/game2/doodles/lotus.png b/Transcendence/srcs/frontend/src/game2/doodles/lotus.png new file mode 100644 index 0000000..5998344 Binary files /dev/null and b/Transcendence/srcs/frontend/src/game2/doodles/lotus.png differ diff --git a/Transcendence/srcs/frontend/src/game2/doodles/mail.png b/Transcendence/srcs/frontend/src/game2/doodles/mail.png new file mode 100644 index 0000000..1ea8432 Binary files /dev/null and b/Transcendence/srcs/frontend/src/game2/doodles/mail.png differ diff --git a/Transcendence/srcs/frontend/src/game2/doodles/moon.png b/Transcendence/srcs/frontend/src/game2/doodles/moon.png new file mode 100644 index 0000000..18becad Binary files /dev/null and b/Transcendence/srcs/frontend/src/game2/doodles/moon.png differ diff --git a/Transcendence/srcs/frontend/src/game2/doodles/pokeball.png b/Transcendence/srcs/frontend/src/game2/doodles/pokeball.png new file mode 100644 index 0000000..281c79b Binary files /dev/null and b/Transcendence/srcs/frontend/src/game2/doodles/pokeball.png differ diff --git a/Transcendence/srcs/frontend/src/game2/doodles/runes.png b/Transcendence/srcs/frontend/src/game2/doodles/runes.png new file mode 100644 index 0000000..0afdb45 Binary files /dev/null and b/Transcendence/srcs/frontend/src/game2/doodles/runes.png differ diff --git a/Transcendence/srcs/frontend/src/game2/doodles/shield.png b/Transcendence/srcs/frontend/src/game2/doodles/shield.png new file mode 100644 index 0000000..515220c Binary files /dev/null and b/Transcendence/srcs/frontend/src/game2/doodles/shield.png differ diff --git a/Transcendence/srcs/frontend/src/game2/doodles/shiny.png b/Transcendence/srcs/frontend/src/game2/doodles/shiny.png new file mode 100644 index 0000000..1c16355 Binary files /dev/null and b/Transcendence/srcs/frontend/src/game2/doodles/shiny.png differ diff --git a/Transcendence/srcs/frontend/src/game2/doodles/snail.png b/Transcendence/srcs/frontend/src/game2/doodles/snail.png new file mode 100644 index 0000000..11cf068 Binary files /dev/null and b/Transcendence/srcs/frontend/src/game2/doodles/snail.png differ diff --git a/Transcendence/srcs/frontend/src/game2/doodles/sound.png b/Transcendence/srcs/frontend/src/game2/doodles/sound.png new file mode 100644 index 0000000..270f9c7 Binary files /dev/null and b/Transcendence/srcs/frontend/src/game2/doodles/sound.png differ diff --git a/Transcendence/srcs/frontend/src/game2/doodles/spiral.png b/Transcendence/srcs/frontend/src/game2/doodles/spiral.png new file mode 100644 index 0000000..8fa1874 Binary files /dev/null and b/Transcendence/srcs/frontend/src/game2/doodles/spiral.png differ diff --git a/Transcendence/srcs/frontend/src/game2/doodles/star.png b/Transcendence/srcs/frontend/src/game2/doodles/star.png new file mode 100644 index 0000000..4d9a16f Binary files /dev/null and b/Transcendence/srcs/frontend/src/game2/doodles/star.png differ diff --git a/Transcendence/srcs/frontend/src/game2/doodles/stop.png b/Transcendence/srcs/frontend/src/game2/doodles/stop.png new file mode 100644 index 0000000..cfa176f Binary files /dev/null and b/Transcendence/srcs/frontend/src/game2/doodles/stop.png differ diff --git a/Transcendence/srcs/frontend/src/game2/doodles/sun.png b/Transcendence/srcs/frontend/src/game2/doodles/sun.png new file mode 100644 index 0000000..2f00539 Binary files /dev/null and b/Transcendence/srcs/frontend/src/game2/doodles/sun.png differ diff --git a/Transcendence/srcs/frontend/src/game2/doodles/tree.png b/Transcendence/srcs/frontend/src/game2/doodles/tree.png new file mode 100644 index 0000000..9ee2f8a Binary files /dev/null and b/Transcendence/srcs/frontend/src/game2/doodles/tree.png differ diff --git a/Transcendence/srcs/frontend/src/game2/doodles/triskel.png b/Transcendence/srcs/frontend/src/game2/doodles/triskel.png new file mode 100644 index 0000000..e1c34ba Binary files /dev/null and b/Transcendence/srcs/frontend/src/game2/doodles/triskel.png differ diff --git a/Transcendence/srcs/frontend/src/game2/doodles/yin_yang.png b/Transcendence/srcs/frontend/src/game2/doodles/yin_yang.png new file mode 100644 index 0000000..63c1ecc Binary files /dev/null and b/Transcendence/srcs/frontend/src/game2/doodles/yin_yang.png differ diff --git a/Transcendence/srcs/frontend/src/game2/game.css b/Transcendence/srcs/frontend/src/game2/game.css new file mode 100644 index 0000000..03d0a00 --- /dev/null +++ b/Transcendence/srcs/frontend/src/game2/game.css @@ -0,0 +1,1127 @@ +:root { + --color-primary: #ffc75e; + --color-primary-hover: #ffc75e; + --color-success: #3cff01; + --color-success-dark: #ffc75e; + --color-error: #ff4d4d; + --color-warning: #ffc75e; + --color-github: #ffc75e; + + --color-bg: #ffe5b5; + + --app-background-base: radial-gradient( + circle at top, + #3fc9ff, + #21fcc5 + + ); + + --color-surface: #ffcc00; + --color-surface-light: #feffa6; + --color-text: #000000; + --color-text-muted: #353535; + + --font-size-base: 10px; + --font-size-sm: 1.2rem; + --font-size-md: 1.4rem; + --font-size-lg: 1.6rem; + --font-size-xl: 3rem; + + --spacing-xs: 4px; + --spacing-sm: 8px; + --spacing-md: 12px; + --spacing-lg: 16px; + --spacing-xl: 24px; + + --radius-sm: 4px; + --radius-md: 6px; + --radius-lg: 12px; + --radius-full: 50%; + + --shadow-sm: 0 2px 4px rgba(0, 0, 0, 0.3); + --shadow-md: 0 4px 8px rgba(0, 0, 0, 0.5); + --shadow-lg: 0 8px 16px rgba(0, 0, 0, 0.5); + + --transition-fast: 150ms ease; + --transition-normal: 250ms ease; + + --z-menu: 2; + --z-window: 100; + --z-modal: 200; +} + +/* ============================================ + RESET & BASE + ============================================ */ +*, +*::before, +*::after { + box-sizing: border-box; +} + +html { + height: 100%; + background-image: + var(--app-background-base); + + background-size: contain, cover; + background-position: center, center; + background-repeat: no-repeat, no-repeat; + + + background-size: + contain, + cover; + + background-position: + center; + + background-repeat: + no-repeat; +} + +body { + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; + color: var(--color-text); + line-height: 1.5; +} + +.app { + position: relative; + width: 70%; + min-width: 800px; + margin: 0 auto; +} + + +/* ============================================ + ANIMATIONS + ============================================ */ + +@keyframes wobble { + 0% { transform: translate(0%, 0) rotate(0deg); } + 25% { transform: translate(-5%, -1px) rotate(-0.5deg); } + 50% { transform: translate(0%, 1px) rotate(0.5deg); } + 75% { transform: translate(+5%, -1px) rotate(0.5deg); } + 100% { transform: translate(0%, 0) rotate(0deg); } +} + +@keyframes bounce { + 0% { transform: translateY(0) rotate(var(--rot)); } + 33% { transform: translateY(-6px) rotate(var(--rot)); } + 66% { transform: translateY(-8px) rotate(var(--rot)); } + 100% { transform: translateY(0) rotate(var(--rot)); } +} + +/* ============================================ + TYPOGRAPHY + ============================================ */ + +.title { + position: absolute; + z-index: 1; + top: 20px; + left: 50%; + translate: -50% 0; + background: #ffcc00; + color: #000; + + border: 4px solid #feffa6; + border-radius: 18px; + + padding: 0.6rem 1.2rem; + + animation: wobble 2s infinite ease-in-out; +} + +.title span { + display: inline-block; + transform-origin: center; + font-size: 4rem; + font-weight: bold; + text-shadow: 2px 2px 6px rgba(0, 0, 0, 0.5); + + animation: bounce 1.2s infinite alternate; + animation-timing-function: ease-in-out; +} + +.title span:nth-child(1) { --rot: -5deg; color: #ff4d4d; } +.title span:nth-child(2) { --rot: 3deg; color: #5beb67; } +.title span:nth-child(3) { --rot: -3deg; color: #ca8dfc; } +.title span:nth-child(4) { --rot: 2deg; color: #6698f5; } +.title span:nth-child(5) { --rot: -4deg; color: #ff66cc; } + +.title span:nth-child(2) { animation-delay: 0.2s; } +.title span:nth-child(3) { animation-delay: 0.4s; } +.title span:nth-child(4) { animation-delay: 0.6s; } +.title span:nth-child(5) { animation-delay: 0.8s; } + +.title span { will-change: transform; } + +/* ============================================ + PAGES + ============================================ */ + +.page { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + + display: flex; + flex-direction: column; + gap: var(--spacing-xs); + + z-index: var(--z-menu); +} + +.page__item { + + border-radius: var(--radius-lg); + background: var(--color-surface); + color: var(--color-text); + border: 1px solid var(--color-surface-light); + border-color: #fda725; + padding: var(--spacing-sm) var(--spacing-md); + font-size: var(--font-size-md); + cursor: pointer; + transition: all var(--transition-fast); + text-align: center; +} + +.page__item:hover { + background: var(--color-surface-light); + font-size: var(--font-size-lg); +} + +.page__item--active { + background: var(--color-primary); + border-color: var(--color-primary); +} + +/* ============================================ + MENU + ============================================ */ + +.menu { + position: fixed; + top: var(--spacing-lg); + left: 50px; + + display: flex; + flex-direction: column; + gap: var(--spacing-lg); + + z-index: var(--z-menu); +} + +.menu__item { + background: var(--color-surface); + color: var(--color-text); + border: 1px solid var(--color-surface-light); + border-radius: var(--radius-lg); + border-color: #fda725; + padding: var(--spacing-sm) var(--spacing-md); + font-size: var(--font-size-md); + cursor: pointer; + transition: all var(--transition-fast); + text-align: center; +} + +.menu__item:hover { + background: var(--color-surface-light); + font-size: var(--font-size-lg); +} + +.menu__item--active { + background: var(--color-primary); + border-color: var(--color-primary); +} + +/* ============================================ + GAME + ============================================ */ + + +.game { + position: fixed; + top: var(--spacing-lg); + right: 50px; + + display: flex; + flex-direction: column; + gap: var(--spacing-lg); + + z-index: var(--z-menu); +} + +.game__item { + background: var(--color-surface); + color: var(--color-text); + border: 1px solid var(--color-surface-light); + border-radius: var(--radius-lg); + border-color: #fda725; + padding: var(--spacing-sm) var(--spacing-md); + font-size: var(--font-size-md); + cursor: pointer; + transition: all var(--transition-fast); + text-align: center; +} + +.game__item:hover { + background: var(--color-surface-light); + font-size: var(--font-size-lg); +} + +.game__item--active { + background: var(--color-primary); + border-color: var(--color-primary); +} + +/* ============================================ + BUTTONS + ============================================ */ +.btn { + display: inline-flex; + align-items: center; + justify-content: center; + padding: var(--spacing-sm) var(--spacing-md); + font-size: var(--font-size-md); + font-weight: 500; + border: none; + border-radius: var(--radius-md); + cursor: pointer; + transition: all var(--transition-fast); + text-decoration: none; +} + +.btn:hover { + opacity: 0.9; + transform: translateY(-1px); +} + +.btn:active { + transform: translateY(0); +} + +.btn--primary { + background: var(--color-surface); + color: var(--color-text); +} + +.btn--primary:hover { + background: var(--color-primary-hover); +} + +.btn--secondary { + background: var(--color-surface); + color: var(--color-text); +} + +.btn--success { + background: var(--color-success-dark); + color: var(--color-text); +} + +.btn--danger { + background: var(--color-error); + color: var(--color-text); +} + +.btn--github { + background: var(--color-github); + color: var(--color-text); +} + +.btn--ghost { + background: transparent; + color: var(--color-text); + border: 1px solid var(--color-surface-light); +} + +/* ============================================ + INPUTS + ============================================ */ +.input { + width: 100%; + padding: var(--spacing-sm) var(--spacing-md); + font-size: var(--font-size-md); + background: var(--color-surface); + color: var(--color-text); + border: 1px solid var(--color-surface-light); + border-radius: var(--radius-md); + transition: border-color var(--transition-fast); +} + +.input:focus { + outline: none; + border-color: var(--color-primary); +} + +.input::placeholder { + color: var(--color-text-muted); +} + +.input-group { + display: flex; + flex-direction: column; + gap: var(--spacing-sm); +} + +/* ============================================ + WINDOWS + ============================================ */ +.window { + position: fixed; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + background: var(--color-bg); + color: var(--color-text); + z-index: var(--z-window); + display: none; + flex-direction: column; + min-width: 280px; + box-shadow: var(--shadow-lg); + border-radius: 5px; + border-color: #aa1f1f; + border: 6px solid #faac37; +} + +.window--visible { + display: flex; +} + +.window--left { + left: 25%; +} + +.window--right { + left: 75%; +} + +.window__header { + display: flex; + justify-content: space-between; + align-items: center; + padding: var(--spacing-sm) var(--spacing-md); + background: var(--color-surface); + cursor: move; + user-select: none; +} + +.window__title { + font-weight: 500; + font-size: var(--font-size-md); +} + +.window__close { + cursor: pointer; + font-size: var(--font-size-lg); + opacity: 0.8; + transition: opacity var(--transition-fast); + background: none; + border: none; + color: var(--color-text); + padding: 0; + line-height: 1; +} + +.window__close:hover { + opacity: 1; +} + +.window__body { + padding: var(--spacing-md); + display: flex; + flex-direction: column; + gap: var(--spacing-sm); + flex: 1; + overflow: auto; +} + +/* ============================================ + MESSAGES + ============================================ */ +.message { + font-size: var(--font-size-sm); + padding: var(--spacing-xs); + border-radius: var(--radius-lg); + border-color: #000; +} + +.message--success { + color: var(--color-success); +} + +.message--error { + color: var(--color-error); +} + +.message--info { + color: var(--color-text-muted); +} + +/* ============================================ + LOGIN WINDOW + ============================================ */ +.login { + width: 320px; + border-radius: 5px; + border-color: #aa1f1f; + border: 6px solid #faac37; + background: #ffffff; + color: #000; +} + +.login__form { + display: flex; + flex-direction: column; + gap: var(--spacing-sm); +} + +.login__actions { + display: flex; + gap: var(--spacing-sm); + margin-top: var(--spacing-xs); +} + +.login__divider { + display: flex; + align-items: center; + gap: var(--spacing-sm); + color: var(--color-text-muted); + font-size: var(--font-size-sm); + margin: var(--spacing-sm) 0; +} + +.login__divider::before, +.login__divider::after { + content: ''; + flex: 1; + height: 1px; + background: var(--color-surface-light); +} + +/* ============================================ + CHAT WINDOW + ============================================ */ +.chat { + width: 380px; + height: 400px; +} + +.chat__output { + flex: 1; + overflow-y: auto; + padding: var(--spacing-sm); + background: var(--color-surface); + border-radius: var(--radius-md); + display: flex; + flex-direction: column; + gap: var(--spacing-sm); + min-height: 150px; +} + +.chat__message { + padding: var(--spacing-xs) var(--spacing-sm); + background: var(--color-surface-light); + border-radius: var(--radius-sm); + font-size: var(--font-size-sm); +} + +.chat__message--own { + background: var(--color-primary); + align-self: flex-end; +} + +.chat__friend-indicator { + display: inline-block; + width: 8px; + height: 8px; + background-color: var(--color-success); + border-radius: 50%; + margin-right: var(--spacing-xs); + vertical-align: middle; +} + +.chat__system { + color: var(--color-text-muted); + font-size: var(--font-size-sm); + font-style: italic; + text-align: center; +} + +.chat__system--error { + color: var(--color-error); +} + +.chat__system--success { + color: var(--color-success); +} + +.chat__input-container { + display: flex; + gap: var(--spacing-sm); + margin-top: var(--spacing-sm); +} + +.chat__input { + flex: 1; +} + +.chat__controls { + display: flex; + gap: var(--spacing-sm); + margin-top: var(--spacing-sm); +} + +/* ============================================ + AVATAR WINDOW + ============================================ */ +.avatar-window { + width: 360px; +} + +.avatar__preview { + width: 120px; + height: 120px; + object-fit: cover; + border-radius: var(--radius-full); + border: 3px solid var(--color-text); + box-shadow: var(--shadow-md); + background: var(--color-surface-light); + align-self: center; +} + +.avatar__username { + font-size: var(--font-size-lg); + font-weight: 600; + text-align: center; + color: var(--color-text); + margin-top: var(--spacing-sm); +} + +.avatar__controls { + display: flex; + flex-direction: column; + gap: var(--spacing-sm); + align-items: center; +} + +.avatar__file-input { + display: none; +} + +/* ============================================ + STATS WINDOW + ============================================ */ +.stats-window { + width: 320px; +} + +.stats__avatar { + width: 72px; + height: 72px; + object-fit: cover; + border-radius: var(--radius-full); + border: 2px solid var(--color-text); + align-self: center; + display: block; + margin: 0 auto var(--spacing-xs); +} + +.stats__username { + font-size: var(--font-size-lg); + font-weight: 600; + text-align: center; + color: #000; + margin-bottom: var(--spacing-md); +} + +.stats__section { + margin-bottom: var(--spacing-md); +} + +.stats__section-title { + font-size: var(--font-size-sm); + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.08em; + color: var(--color-primary); + border-bottom: 1px solid var(--color-surface-light); + padding-bottom: var(--spacing-xs); + margin-bottom: var(--spacing-xs); +} + +.stats__section-body { + display: flex; + flex-direction: column; + gap: 4px; +} + +.stats__row { + display: flex; + justify-content: space-between; + font-size: var(--font-size-sm); + padding: 3px 0; +} + +.stats__label { + color: #333; +} + +.stats__value { + font-weight: 600; + color: #000; +} + +.stats__loading { + font-size: var(--font-size-sm); + color: #333; + text-align: center; + padding: var(--spacing-sm) 0; +} + +/* ============================================ + UTILITIES + ============================================ */ +.hidden { + display: none !important; +} + +.visually-hidden { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; +} + +.text-center { + text-align: center; +} + +.flex-center { + display: flex; + align-items: center; + justify-content: center; +} + +/* ============================================ + FRIENDS WINDOW + ============================================ */ +.friends-window { + width: 400px; + height: 450px; +} + +.friends__tabs { + display: flex; + gap: var(--spacing-xs); + margin-bottom: var(--spacing-sm); +} + +.friends__tab { + flex: 1; + padding: var(--spacing-sm); + background: var(--color-surface); + border: 1px solid var(--color-surface); + color: var(--color-text); + cursor: pointer; + font-size: var(--font-size-sm); + transition: all var(--transition-fast); +} + +.friends__tab:hover { + background: var(--color-surface-light); +} + +.friends__tab--active { + background: var(--color-primary); + border-color: var(--color-primary); +} + +.friends__content { + display: flex; + flex-direction: column; + flex: 1; + overflow: hidden; +} + +.friends__search { + display: flex; + gap: var(--spacing-sm); + margin-bottom: var(--spacing-sm); +} + +.friends__search .input { + flex: 1; +} + +.friends__list { + flex: 1; + overflow-y: auto; + display: flex; + flex-direction: column; + gap: var(--spacing-sm); +} + +.friends__item { + display: flex; + align-items: center; + gap: var(--spacing-sm); + padding: var(--spacing-sm); + background: var(--color-surface); + border-radius: var(--radius-md); +} + +.friends__avatar { + width: 40px; + height: 40px; + border-radius: var(--radius-full); + object-fit: cover; + border: 2px solid var(--color-surface-light); +} + +.friends__name { + flex: 1; + font-size: var(--font-size-md); + font-weight: 500; +} + +.friends__actions { + display: flex; + gap: var(--spacing-xs); +} + +.friends__actions .btn { + padding: var(--spacing-xs) var(--spacing-sm); + font-size: var(--font-size-sm); +} + +.friends__empty { + text-align: center; + color: var(--color-text-muted); + padding: var(--spacing-lg); +} + +/* ============================================ + GAME ROOM WINDOW + ============================================ */ + +.gameroom-window { + width: 800px; + height: 900px; +} + +.gameroom__tabs { + display: flex; + gap: var(--spacing-xs); + margin-bottom: var(--spacing-sm); +} + +.gameroom__tab { + flex: 1; + padding: var(--spacing-sm); + background: var(--color-surface); + border: 1px solid var(--color-surface-light); + color: var(--color-text); + cursor: pointer; + font-size: var(--font-size-sm); + transition: all var(--transition-fast); +} + +.gameroom__tab:hover { + background: var(--color-surface-light); +} + +.gameroom__tab--active { + background: var(--color-primary); + border-color: var(--color-primary); +} + +.gameroom__content { + display: flex; + flex-direction: column; + flex: 1; + overflow: hidden; +} + +.gameroom__create { + display: flex; + flex-direction: column; + gap: var(--spacing-sm); + margin-bottom: var(--spacing-sm); +} + +.gameroom__list { + flex: 1; + overflow-y: auto; + display: flex; + flex-direction: column; + gap: var(--spacing-sm); +} + +.gameroom__item { + display: flex; + align-items: center; + gap: var(--spacing-sm); + padding: var(--spacing-sm); + background: var(--color-surface); + border-radius: var(--radius-md); +} + +.gameroom__name { + flex: 1; + font-size: var(--font-size-md); + font-weight: 500; +} + +.gameroom__players { + font-size: var(--font-size-sm); + color: var(--color-text-muted); + padding: var(--spacing-xs) var(--spacing-sm); + background: var(--color-surface-light); + border-radius: var(--radius-sm); +} + +.gameroom__actions { + display: flex; + gap: var(--spacing-xs); +} + +.gameroom__actions .btn { + padding: var(--spacing-xs) var(--spacing-sm); + font-size: var(--font-size-sm); +} + +.gameroom__lobby { + display: flex; + flex-direction: column; + flex: 1; + gap: var(--spacing-sm); +} + +.gameroom__lobby-title { + margin: 0; + font-size: var(--font-size-lg); + text-align: center; + color: var(--color-success); +} + +.gameroom__player-list { + flex: 1; + overflow-y: auto; + display: flex; + flex-direction: column; + gap: var(--spacing-sm); + background: var(--color-surface); + border-radius: var(--radius-md); + padding: var(--spacing-sm); +} + +.gameroom__player { + display: flex; + align-items: center; + gap: var(--spacing-sm); + padding: var(--spacing-xs) var(--spacing-sm); + background: var(--color-surface-light); + border-radius: var(--radius-sm); +} + +.gameroom__player-avatar { + width: 32px; + height: 32px; + border-radius: var(--radius-full); + object-fit: cover; + border: 2px solid var(--color-surface-light); +} + +.gameroom__player-name { + flex: 1; + font-size: var(--font-size-md); +} + +.gameroom__player-stats { + display: flex; + flex-direction: column; + align-items: flex-end; + gap: 2px; +} + +.gameroom__player-score { + font-size: var(--font-size-sm); + color: var(--color-success); + font-weight: 500; +} + +.gameroom__player-total { + font-size: var(--font-size-sm); + color: var(--color-text-muted); +} + +.gameroom__empty { + text-align: center; + color: var(--color-text-muted); + padding: var(--spacing-lg); +} + +/* ============================================ + GAME - JEU DU PENDU/DESSIN + ============================================ */ + +.gameroom__lobby-buttons { + display: flex; + gap: var(--spacing-sm); + margin-top: auto; +} + +.gameroom__lobby-buttons .btn { + flex: 1; +} + +.gameroom__game { + display: flex; + flex-direction: column; + gap: var(--spacing-sm); + flex: 1; +} + +.gameroom__game-info { + text-align: center; +} + +.gameroom__drawer-info { + font-size: var(--font-size-md); + color: var(--color-text-muted); + padding: var(--spacing-xs); +} + +.gameroom__scores-display { + font-size: var(--font-size-sm); + color: var(--color-success); + padding: var(--spacing-xs); + background: var(--color-surface); + border-radius: var(--radius-sm); + margin-top: var(--spacing-xs); +} + +.gameroom__drawer-info--winner { + color: var(--color-success); + font-weight: bold; + animation: pulse 0.5s ease-in-out 3; +} + +@keyframes pulse { + 0%, 100% { transform: scale(1); } + 50% { transform: scale(1.05); } +} + +.gameroom__word-display { + font-size: var(--font-size-xl); + font-family: monospace; + text-align: center; + letter-spacing: 8px; + padding: var(--spacing-md); + background: var(--color-surface); + border-radius: var(--radius-md); + min-height: 60px; + display: flex; + align-items: center; + justify-content: center; + color: var(--color-success); +} + +.gameroom__canvas-container { + display: flex; + justify-content: center; +} + +.gameroom__canvas { + background: var(--color-surface-light); + border-radius: var(--radius-md); + cursor: crosshair; + border: 2px solid var(--color-surface-light); +} + +.gameroom__draw-tools { + display: flex; + gap: var(--spacing-sm); + justify-content: center; + align-items: center; +} + +.gameroom__color-picker { + width: 40px; + height: 32px; + border: none; + border-radius: var(--radius-sm); + cursor: pointer; + background: transparent; +} + +.gameroom__word-input-container, +.gameroom__guess-container { + display: flex; + gap: var(--spacing-sm); +} + +.gameroom__word-input-container .input, +.gameroom__guess-container .input { + flex: 1; +} + +.gameroom__guess-container .input:disabled { + opacity: 0.5; + cursor: not-allowed; +} + +.gameroom__guess-container .btn:disabled { + opacity: 0.5; + cursor: not-allowed; +} + +.gameroom__guess-history { + flex: 1; + min-height: 60px; + max-height: 100px; + overflow-y: auto; + background: var(--color-surface); + border-radius: var(--radius-md); + padding: var(--spacing-sm); + display: flex; + flex-direction: column; + gap: var(--spacing-xs); +} + +.gameroom__guess-item { + font-size: var(--font-size-sm); + padding: var(--spacing-xs) var(--spacing-sm); + border-radius: var(--radius-sm); +} + +.gameroom__guess-item--success { + background: rgba(60, 255, 1, 0.2); + color: var(--color-success); +} + +.gameroom__guess-item--fail { + background: rgba(255, 77, 77, 0.2); + color: var(--color-error); +} + +.gameroom__game-buttons { + display: flex; + gap: var(--spacing-sm); + margin-top: var(--spacing-sm); +} + +.gameroom__game-buttons .btn { + flex: 1; +} + diff --git a/Transcendence/srcs/frontend/src/game2/game.html b/Transcendence/srcs/frontend/src/game2/game.html new file mode 100644 index 0000000..214d68a --- /dev/null +++ b/Transcendence/srcs/frontend/src/game2/game.html @@ -0,0 +1,43 @@ + + +
+ + +