From 10cea708f04219e3356aa531009d6f0a54f9c758 Mon Sep 17 00:00:00 2001 From: Maciej Caderek Date: Thu, 17 Feb 2022 03:36:40 +0100 Subject: [PATCH] WIP --- index.html | 7 +- public/img/logo-dark.svg | 4 +- public/img/logo.svg | 4 +- public/img/pattern-light.png | Bin 45406 -> 26570 bytes src/board/Board.ts | 4 + src/board/layers/drawCoords.ts | 2 +- src/encoders/createAnimation.ts | 17 ++-- src/game/Game.ts | 13 +++ src/imports/importFromLink.ts | 23 +++-- src/main.tsx | 103 ++++++++++++---------- src/state.ts | 6 +- src/ui/App.css | 52 +++++++---- src/ui/components/GameTabs.css | 10 ++- src/ui/components/GameTabs.tsx | 2 + src/ui/components/Header.css | 2 +- src/ui/components/Info.css | 54 ++++++++++++ src/ui/components/Info.tsx | 55 ++++++++++++ src/ui/components/Load.css | 2 +- src/ui/components/Moves.css | 5 ++ src/ui/components/Moves.tsx | 7 +- src/ui/components/SetupTabs.css | 8 +- src/ui/components/Share.tsx | 36 ++++---- src/ui/components/reusable/Scrollable.css | 10 ++- src/utils/download.ts | 1 + src/utils/isSafeLink.ts | 14 +++ 25 files changed, 326 insertions(+), 115 deletions(-) create mode 100644 src/ui/components/Info.css create mode 100644 src/ui/components/Info.tsx create mode 100644 src/utils/isSafeLink.ts diff --git a/index.html b/index.html index d7ef81d..a564e18 100644 --- a/index.html +++ b/index.html @@ -3,12 +3,15 @@ - + - shortcastle + SHORTCASTLE
diff --git a/public/img/logo-dark.svg b/public/img/logo-dark.svg index 9dcf106..8de93c5 100644 --- a/public/img/logo-dark.svg +++ b/public/img/logo-dark.svg @@ -1,7 +1,7 @@ - - + + diff --git a/public/img/logo.svg b/public/img/logo.svg index c23b702..ae482d7 100644 --- a/public/img/logo.svg +++ b/public/img/logo.svg @@ -1,7 +1,7 @@ - - + + diff --git a/public/img/pattern-light.png b/public/img/pattern-light.png index 6a5f0d7bc2624a169ab365e3e6205542b16b9734..96ce5fec879df208754f21ef2ef0cab3a94519af 100644 GIT binary patch literal 26570 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 literal 45406 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 NNQlS^R|)C*|35&Bm0|z@ diff --git a/src/board/Board.ts b/src/board/Board.ts index c7cd4d9..2572089 100644 --- a/src/board/Board.ts +++ b/src/board/Board.ts @@ -331,6 +331,10 @@ class Board { } toImageData() { + return this.ctx.getImageData(0, 0, this.width, this.height); + } + + toClampedArray() { return this.ctx.getImageData(0, 0, this.width, this.height).data; } diff --git a/src/board/layers/drawCoords.ts b/src/board/layers/drawCoords.ts index c9e27b1..6d117ef 100644 --- a/src/board/layers/drawCoords.ts +++ b/src/board/layers/drawCoords.ts @@ -1,6 +1,6 @@ import { Coords } from "../../types"; -const BASE_FONT_SIZE = 20; +const BASE_FONT_SIZE = 24; const FONT_FAMILY = "Fira Mono"; const drawCoords = ( diff --git a/src/encoders/createAnimation.ts b/src/encoders/createAnimation.ts index f8ee71b..1972654 100644 --- a/src/encoders/createAnimation.ts +++ b/src/encoders/createAnimation.ts @@ -8,9 +8,9 @@ import MP4 from "./MP4"; const getData = (board: Board, encoder: GIF | WebM | MP4) => { return encoder instanceof GIF - ? board.toImgElement() - : encoder instanceof MP4 ? board.toImageData() + : encoder instanceof MP4 + ? board.toClampedArray() : board.canvas; }; @@ -18,7 +18,8 @@ const createAnimation = async ( pgn: string, boardConfig: BoardConfig, format: "GIF" | "WebM" | "MP4", - size: Size + size: Size, + includeTitleScreen: boolean ) => { const game = new Game().loadPGN(pgn); const board = new Board({ ...boardConfig, size: sizeToPX[size] }); @@ -31,11 +32,13 @@ const createAnimation = async ( const header = game.header; - await board.titleFrame(header); - board.render(); + if (includeTitleScreen) { + await board.titleFrame(header); + board.render(); - // @ts-ignore - await encoder.add(getData(board, encoder), 4); + // @ts-ignore + await encoder.add(getData(board, encoder), 4); + } for (let ply = 0; ply < game.length; ply++) { const position = game.getPosition(ply); diff --git a/src/game/Game.ts b/src/game/Game.ts index 98609fa..1785a1a 100644 --- a/src/game/Game.ts +++ b/src/game/Game.ts @@ -179,6 +179,19 @@ class Game { }; } + getTitle({ anonymous }: { anonymous: boolean }) { + const header = this.header; + const w = anonymous ? "Anonymous" : header.WhitePretty; + const b = anonymous ? "Anonymous" : header.BlackPretty; + + return ( + `${w} vs ${b}` + + (header.Event ? ` | ${header.Event}` : "") + + (header.Round ? `, Round ${header.Round}` : "") + + (header.DatePretty ? ` | ${header.DatePretty}` : "") + ); + } + get pgn() { return this.game.pgn(); } diff --git a/src/imports/importFromLink.ts b/src/imports/importFromLink.ts index e2fbd6f..8823a2d 100644 --- a/src/imports/importFromLink.ts +++ b/src/imports/importFromLink.ts @@ -2,9 +2,9 @@ type Result = | { error: false; pgn: string; side: "w" | "b" } | { error: true; errorType: "INCORRECT_LINK" | "SERVER_ERROR" }; -const importFromLichess = async (link: string): Promise => { - const [first, second] = link - .replace(/^https:\/\/(www\.)*lichess\.org\/*/, "") +const importFromLichess = async (url: URL): Promise => { + const [first, second] = url.pathname + .replace(/^\//, "") .split("/") .map((x) => x.trim()); @@ -24,7 +24,10 @@ const importFromLichess = async (link: string): Promise => { return { error: false, pgn, - side: String(second).startsWith("black") ? "b" : "w", + side: + String(second).startsWith("black") || url.hash.startsWith("black") + ? "b" + : "w", }; } @@ -32,8 +35,16 @@ const importFromLichess = async (link: string): Promise => { }; const importFromLink = async (link: string): Promise => { - if (/^https:\/\/(www\.)*lichess\.org/.test(link)) { - return importFromLichess(link); + let url; + + try { + url = new URL(link); + } catch { + return { error: true, errorType: "INCORRECT_LINK" }; + } + + if (/^(www\.)*lichess\.org/.test(url.hostname)) { + return importFromLichess(url); } return { error: true, errorType: "INCORRECT_LINK" }; diff --git a/src/main.tsx b/src/main.tsx index 61985e2..0464d5e 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -103,11 +103,15 @@ const main = async () => { await player.load(game); setState("activeTab", "game"); + document.title = `SHORTCASTLE - ${game.getTitle({ anonymous: false })}`; }, async loadFEN(fen: string) { const game = new Game().loadFEN(fen); setState({ pgn: "", fen, moves: game.getMoves(), ply: 0, game }); + window.location.hash = `v1/fen/${state.fen}`; await player.load(game); + + document.title = `SHORTCASTLE - FEN ${fen}`; }, async importPGN(link: string) { const result = await importFromLink(link); @@ -135,7 +139,8 @@ const main = async () => { state.pgn, state.boardConfig, state.gameConfig.format, - state.gameConfig.animationSize + state.gameConfig.animationSize, + state.gameConfig.titleScreen ); download(data, "game", state.gameConfig.format.toLowerCase()); }, @@ -165,59 +170,61 @@ const main = async () => { /* Register events */ - const keyMapping: { [key: string]: () => void } = { - ArrowLeft: handlers.prev, - ArrowRight: handlers.next, - ArrowUp: handlers.first, - ArrowDown: handlers.last, - " ": handlers.togglePlay, - b: handlers.toggleBorder, - f: handlers.flip, - e: handlers.toggleExtraInfo, - }; + if (!state.mobile) { + const keyMapping: { [key: string]: () => void } = { + ArrowLeft: handlers.prev, + ArrowRight: handlers.next, + ArrowUp: handlers.first, + ArrowDown: handlers.last, + " ": handlers.togglePlay, + b: handlers.toggleBorder, + f: handlers.flip, + e: handlers.toggleExtraInfo, + }; - document.addEventListener("keydown", (e) => { - const target = e.target as HTMLElement | null; + document.addEventListener("keydown", (e) => { + const target = e.target as HTMLElement | null; - if ( - keyMapping[e.key] && - target?.nodeName !== "INPUT" && - target?.nodeName !== "TEXTAREA" - ) { - keyMapping[e.key](); - } - }); + if ( + keyMapping[e.key] && + target?.nodeName !== "INPUT" && + target?.nodeName !== "TEXTAREA" + ) { + keyMapping[e.key](); + } + }); - const preventDefaults = (e: Event) => { - e.preventDefault(); - e.stopPropagation(); - }; + const preventDefaults = (e: Event) => { + e.preventDefault(); + e.stopPropagation(); + }; - ["dragenter", "dragover", "dragleave", "drop"].forEach((eventName) => { - document.addEventListener(eventName, preventDefaults, false); - }); + ["dragenter", "dragover", "dragleave", "drop"].forEach((eventName) => { + document.addEventListener(eventName, preventDefaults, false); + }); - document.addEventListener("drop", async (e) => { - if (e.dataTransfer?.files && e.dataTransfer.files.length > 0) { - const content = await readFile(e.dataTransfer.files[0]); - handlers.loadPGN(content); - } - }); + document.addEventListener("drop", async (e) => { + if (e.dataTransfer?.files && e.dataTransfer.files.length > 0) { + const content = await readFile(e.dataTransfer.files[0]); + handlers.loadPGN(content); + } + }); + } else { + const hammer = new Hammer.Manager(board.canvas); + hammer.add(new Hammer.Swipe()); + hammer.add(new Hammer.Pinch()); + hammer.add(new Hammer.Press({ time: 500 })); + hammer.add(new Hammer.Tap({ taps: 1 })); - const hammer = new Hammer.Manager(board.canvas); - hammer.add(new Hammer.Swipe()); - hammer.add(new Hammer.Pinch()); - hammer.add(new Hammer.Press({ time: 500 })); - hammer.add(new Hammer.Tap({ taps: 1 })); - - hammer.on("swiperight", handlers.next); - hammer.on("swipeleft", handlers.prev); - hammer.on("swipeup", handlers.first); - hammer.on("swipedown", handlers.last); - hammer.on("pinchin", handlers.showBorder); - hammer.on("pinchout", handlers.hideBorder); - hammer.on("tap", handlers.next); - hammer.on("press", handlers.flip); + hammer.on("swiperight", handlers.next); + hammer.on("swipeleft", handlers.prev); + hammer.on("swipeup", handlers.first); + hammer.on("swipedown", handlers.last); + hammer.on("pinchin", handlers.showBorder); + hammer.on("pinchout", handlers.hideBorder); + hammer.on("tap", handlers.next); + hammer.on("press", handlers.flip); + } }; /* Boot */ diff --git a/src/state.ts b/src/state.ts index 19e69d3..539d7d4 100644 --- a/src/state.ts +++ b/src/state.ts @@ -3,12 +3,14 @@ import { createStore } from "solid-js/store"; import Game from "./game/Game"; import { BoardConfig, GameConfig } from "./types"; +const mobile = isMobile(); + const boardConfig: BoardConfig = { size: 1024, tiles: 8, boardStyle: "calm", piecesStyle: "tatiana", - showBorder: true, + showBorder: !mobile, showExtraInfo: true, showMaterial: true, showMoveIndicator: true, @@ -48,7 +50,7 @@ const initialState: State = { fen: "", moves: [], ply: 0, - mobile: isMobile(), + mobile, activeTab: "load", }; diff --git a/src/ui/App.css b/src/ui/App.css index 5bf13aa..3e21d5a 100644 --- a/src/ui/App.css +++ b/src/ui/App.css @@ -26,16 +26,17 @@ body { } .dark { - background-color: #232831; + background-color: #313742; background-image: url(/img/pattern.png); - color: #ddd; + background-size: 12rem; + color: rgb(212, 221, 224); --logo-url: url(/img/logo.svg); --color-btn: rgb(0, 173, 136); --color-btn-light: rgb(0, 207, 162); --color-tab: #899399; --color-tab-light: #a9b4bd; - --color-bg-block: #0e0e13; + --color-bg-block: #17171f; --color-bg-input: #20242a; --color-border-input: #2d323a; --color-highlight: #ffffff22; @@ -43,26 +44,30 @@ body { --color-text-contrast: #0e0e13; --color-text-input: #acbddb; --color-text-dimmed: #677794; + --color-scrollbar: rgb(0, 59, 47); + --color-scrollbar-track: #ffffff22; } .light { - background-color: #c1ced4; + background-color: #b2bcc0; background-image: url(/img/pattern-light.png); - color: #222; + color: rgb(29, 31, 32); --logo-url: url(/img/logo-dark.svg); --color-btn: rgb(0, 148, 116); --color-btn-light: rgb(0, 114, 89); --color-tab: #5d6468; --color-tab-light: #3e4346; - --color-bg-block: #f1f1f1; - --color-bg-input: #fcfcfc; + --color-bg-block: #dddddd; + --color-bg-input: #eeeeee; --color-border-input: #7f8999; --color-highlight: #00000022; --color-text: rgb(46, 54, 58); --color-text-contrast: #fff; --color-text-input: #46494e; --color-text-dimmed: #767980; + --color-scrollbar: rgb(133, 184, 173); + --color-scrollbar-track: #00000022; } .upload { @@ -106,6 +111,7 @@ textarea { border: solid 1px var(--color-border-input); color: var(--color-text-input); outline: none; + resize: none; } input:focus, @@ -116,7 +122,7 @@ textarea:focus { h2 { color: var(--color-text); text-align: left; - font-size: 1.8rem; + font-size: 1.5rem; margin: 2.5rem 0 1.5rem 0; font-weight: 500; } @@ -134,8 +140,29 @@ hr { border-top: solid 1px var(--color-highlight); } +a, +a:visited, +a:active { + color: var(--color-btn); + text-decoration: none; +} + +a:hover { + text-decoration: underline; +} + +.invisible { + opacity: 0; +} + +.board-box { + height: 100vh; + grid-area: board; + padding: var(--header-margin) 0 2rem 0; +} + .board { - /* box-shadow: 0 0 30px rgba(0, 0, 0, 0.5); */ + border: solid 1rem var(--color-bg-block); border-radius: 5px; max-width: 100%; max-height: 100%; @@ -159,13 +186,6 @@ hr { height: 100vh; } -.board-box { - /* background: rgba(255, 166, 0, 0.1); */ - height: 100vh; - grid-area: board; - padding: var(--header-margin) 0 2rem 0; -} - @media screen and (max-width: 1024px) { .layout { grid-template-columns: 1fr; diff --git a/src/ui/components/GameTabs.css b/src/ui/components/GameTabs.css index 4e1ac47..da829b7 100644 --- a/src/ui/components/GameTabs.css +++ b/src/ui/components/GameTabs.css @@ -2,14 +2,20 @@ grid-area: moves; padding: 20px; padding-top: var(--header-margin); - min-width: 360px; + min-width: 375px; height: 100vh; } +@media screen and (max-width: 1024px) { + .game-box { + height: auto; + } +} + .game-tabs { height: 100%; display: grid; - grid-template-rows: 38px 1fr 84px; + grid-template-rows: 38px 195px 1fr 84px; } .game-tabs__btn { diff --git a/src/ui/components/GameTabs.tsx b/src/ui/components/GameTabs.tsx index 1865d22..2e8089a 100644 --- a/src/ui/components/GameTabs.tsx +++ b/src/ui/components/GameTabs.tsx @@ -1,6 +1,7 @@ import { Component, Switch, Match } from "solid-js"; import Moves from "./Moves"; import Controls from "./Controls"; +import Info from "./Info"; import Load from "./Load"; import { Handlers } from "../../types"; import "./GameTabs.css"; @@ -33,6 +34,7 @@ const GameTabs: Component<{ moves: readonly string[]; handlers: Handlers }> = ( + diff --git a/src/ui/components/Header.css b/src/ui/components/Header.css index b3e85c8..7da4c43 100644 --- a/src/ui/components/Header.css +++ b/src/ui/components/Header.css @@ -5,7 +5,7 @@ top: 0; width: 100%; display: grid; - grid-template-columns: 1fr 1fr; + grid-template-columns: 2fr 1fr; font-size: 1.8rem; } diff --git a/src/ui/components/Info.css b/src/ui/components/Info.css new file mode 100644 index 0000000..e6eb62d --- /dev/null +++ b/src/ui/components/Info.css @@ -0,0 +1,54 @@ +.info-box { + grid-area: controls; + padding: 0 20px 20px 20px; +} + +.info { + background: var(--color-bg-block); + padding: 30px 20px; + font-size: 1.5rem; + text-align: left; +} + +.info__players { + position: relative; + line-height: 2rem; + margin-bottom: 2rem; + padding: 0 1rem; +} + +.info__rating { + font-family: "Fira Code", monospace; + color: var(--color-text-dimmed); + position: absolute; + right: 1rem; +} + +.info__color { + border-radius: 1rem; + padding: 0; + border: solid 2px var(--color-tab); + width: 1.4rem; + height: 1.4rem; + margin-right: 0.8rem; +} + +.info__color--white { + background-color: #eee; +} + +.info__color--black { + background-color: #111; +} + +.info__event { + margin-bottom: 1rem; +} + +.info__event, +.info__site { + font-size: 1.3rem; + line-height: 1.5rem; + color: var(--color-text); + padding: 0 1rem; +} diff --git a/src/ui/components/Info.tsx b/src/ui/components/Info.tsx new file mode 100644 index 0000000..9efa4f1 --- /dev/null +++ b/src/ui/components/Info.tsx @@ -0,0 +1,55 @@ +import { Component, Show } from "solid-js"; +import { Handlers } from "../../types"; +import { state } from "../../state"; +import "./Info.css"; +import isSafeLink from "../../utils/isSafeLink"; + +const Info: Component<{ handlers: Handlers }> = () => { + return ( +
+
+

+ + {state.game.header.WhitePretty}{" "} + + {state.game.header.WhiteElo ?? "????"} + +

+

+ + {state.game.header.BlackPretty}{" "} + + {state.game.header.BlackElo ?? "????"} + +

+
+
+ +

{state.game.header.Event}

+
+ +

Round {state.game.header.Round}

+
+
+
+ +

+ + + {state.game.header.Site?.replace(/^https:\/\//, "")} + + +

+
+ +

{state.game.header.DatePretty}

+
+
+
+ ); +}; + +export default Info; diff --git a/src/ui/components/Load.css b/src/ui/components/Load.css index 0b752cd..16318c3 100644 --- a/src/ui/components/Load.css +++ b/src/ui/components/Load.css @@ -3,7 +3,7 @@ padding: 20px; border-bottom-left-radius: 5px; border-bottom-right-radius: 5px; - grid-row-end: span 2; + grid-row-end: span 3; } .load__pgn-input { diff --git a/src/ui/components/Moves.css b/src/ui/components/Moves.css index 7fb2f0d..6e69b17 100644 --- a/src/ui/components/Moves.css +++ b/src/ui/components/Moves.css @@ -2,6 +2,11 @@ font-size: 1.4rem; font-family: "Fira Mono"; text-align: left; + background-color: var(--color-bg-input); +} + +.moves__turn { + text-align: center; } .move { diff --git a/src/ui/components/Moves.tsx b/src/ui/components/Moves.tsx index 29d46ca..71a8461 100644 --- a/src/ui/components/Moves.tsx +++ b/src/ui/components/Moves.tsx @@ -1,4 +1,4 @@ -import { Component, For, createEffect } from "solid-js"; +import { Component, For, Show, createEffect } from "solid-js"; import chunk_ from "@arrows/array/chunk_"; import { Handlers } from "../../types"; import Scrollable from "./reusable/Scrollable"; @@ -16,6 +16,11 @@ const Moves: Component<{ moves: readonly string[]; handlers: Handlers }> = ( return ( + +

+ {state.game.getPosition(0).turn === "w" ? "White" : "Black"} to move. +

+
{(move, i) => { const [white, black] = move as [string, string]; diff --git a/src/ui/components/SetupTabs.css b/src/ui/components/SetupTabs.css index 2e7f989..81e7282 100644 --- a/src/ui/components/SetupTabs.css +++ b/src/ui/components/SetupTabs.css @@ -3,7 +3,13 @@ grid-area: setup; padding: 20px; padding-top: var(--header-margin); - min-width: 360px; + min-width: 375px; +} + +@media screen and (max-width: 1024px) { + .setup-box { + height: auto; + } } .setup { diff --git a/src/ui/components/Share.tsx b/src/ui/components/Share.tsx index 6559179..3034480 100644 --- a/src/ui/components/Share.tsx +++ b/src/ui/components/Share.tsx @@ -43,7 +43,7 @@ const Share: Component<{ handlers: Handlers }> = (props) => { "options__button--active": state.boardConfig.showBorder, }} onClick={props.handlers.toggleBorder} - title="BORDER" + title={state.boardConfig.showBorder ? "HIDE BORDER" : "SHOW BORDER"} > @@ -53,7 +53,11 @@ const Share: Component<{ handlers: Handlers }> = (props) => { "options__button--active": state.boardConfig.showExtraInfo, }} onClick={props.handlers.toggleExtraInfo} - title="EXTRA INFO" + title={ + state.boardConfig.showExtraInfo + ? "HIDE EXTRA INFO" + : "SHOW EXTRA INFO" + } > @@ -63,7 +67,11 @@ const Share: Component<{ handlers: Handlers }> = (props) => { "options__button--active": state.gameConfig.titleScreen, }} onClick={props.handlers.toggleTitleScreen} - title="TITLE SCREEN" + title={ + state.gameConfig.titleScreen + ? "EXCLUDE TITLE SCREEN" + : "INCLUDE TITLE SCREEN" + } > @@ -74,7 +82,7 @@ const Share: Component<{ handlers: Handlers }> = (props) => { "options__button--active": state.boardConfig.anonymous, }} onClick={props.handlers.toggleAnonymous} - title="ANONYMOUS" + title="TOGGLE ANONYMOUS" > @@ -116,7 +124,7 @@ const Share: Component<{ handlers: Handlers }> = (props) => { -

Image

+