🚀 improve demos

This commit is contained in:
platane
2020-10-24 10:48:18 +02:00
parent 64b04e9eba
commit a9c2cbc763
9 changed files with 71 additions and 54 deletions

View File

@@ -71,8 +71,6 @@ jobs:
- uses: bahmutov/npm-install@v1.4.3 - uses: bahmutov/npm-install@v1.4.3
- run: yarn build:demo - run: yarn build:demo
env:
BASE_PATHNAME: "snk"
- uses: crazy-max/ghaction-github-pages@v2.1.3 - uses: crazy-max/ghaction-github-pages@v2.1.3
if: success() && github.ref == 'refs/heads/master' if: success() && github.ref == 'refs/heads/master'

View File

@@ -55,5 +55,11 @@ export const createCanvas = ({
drawLerpWorld(ctx, grid, snake0, snake1, stack, k, drawOptions); drawLerpWorld(ctx, grid, snake0, snake1, stack, k, drawOptions);
}; };
return { draw, drawLerp, canvas, ctx }; const highlightCell = (x: number, y: number, color = "orange") => {
ctx.fillStyle = color;
ctx.beginPath();
ctx.fillRect((1 + x + 0.5) * 16 - 2, (2 + y + 0.5) * 16 - 2, 4, 4);
};
return { draw, drawLerp, highlightCell, canvas, ctx };
}; };

View File

@@ -1,3 +1,4 @@
import "./menu";
import { createCanvas } from "./canvas"; import { createCanvas } from "./canvas";
import { getHeadX, getHeadY, snakeToCells } from "@snk/types/snake"; import { getHeadX, getHeadY, snakeToCells } from "@snk/types/snake";
import { grid, snake } from "./sample"; import { grid, snake } from "./sample";
@@ -31,7 +32,7 @@ getAvailableRoutes(grid, snake, (chain) => {
}); });
solutions.sort((a, b) => a.color - b.color); solutions.sort((a, b) => a.color - b.color);
const { canvas, ctx, draw } = createCanvas(grid); const { canvas, ctx, draw, highlightCell } = createCanvas(grid);
document.body.appendChild(canvas); document.body.appendChild(canvas);
let k = 0; let k = 0;
@@ -44,14 +45,12 @@ const onChange = () => {
draw(grid, chain[i], []); draw(grid, chain[i], []);
ctx.fillStyle = "orange";
chain chain
.map(snakeToCells) .map(snakeToCells)
.flat() .flat()
.forEach(({ x, y }) => { .forEach(({ x, y }) => highlightCell(x, y));
ctx.beginPath();
ctx.fillRect((1 + x + 0.5) * 16 - 2, (2 + y + 0.5) * 16 - 2, 4, 4); highlightCell(2, 4);
});
}; };
onChange(); onChange();
@@ -83,3 +82,8 @@ inputI.addEventListener("input", () => {
onChange(); onChange();
}); });
document.body.append(inputI); document.body.append(inputI);
window.addEventListener("click", (e) => {
if (e.target === document.body || e.target === document.body.parentElement)
inputK.focus();
});

View File

@@ -1,3 +1,4 @@
import "./menu";
import { createCanvas } from "./canvas"; import { createCanvas } from "./canvas";
import { getBestRoute } from "@snk/compute/getBestRoute"; import { getBestRoute } from "@snk/compute/getBestRoute";
import { Color, copyGrid } from "@snk/types/grid"; import { Color, copyGrid } from "@snk/types/grid";
@@ -14,7 +15,7 @@ const spring = { x: 0, v: 0, target: 0 };
const springParams = { tension: 120, friction: 20, maxVelocity: 50 }; const springParams = { tension: 120, friction: 20, maxVelocity: 50 };
let animationFrame: number; let animationFrame: number;
const { canvas, drawLerp } = createCanvas(grid); const { canvas, highlightCell, drawLerp } = createCanvas(grid);
document.body.appendChild(canvas); document.body.appendChild(canvas);
const clamp = (x: number, a: number, b: number) => Math.max(a, Math.min(b, x)); const clamp = (x: number, a: number, b: number) => Math.max(a, Math.min(b, x));
@@ -54,4 +55,7 @@ input.addEventListener("input", () => {
animationFrame = requestAnimationFrame(loop); animationFrame = requestAnimationFrame(loop);
}); });
document.body.append(input); document.body.append(input);
document.body.addEventListener("click", () => input.focus()); window.addEventListener("click", (e) => {
if (e.target === document.body || e.target === document.body.parentElement)
input.focus();
});

View File

@@ -1,31 +0,0 @@
import * as grid from "@snk/types/__fixtures__/grid";
const container = document.createElement("div");
container.style.fontFamily = "helvetica";
document.body.appendChild(container);
for (const demo of require("./demo.json").filter(
(x: any) => !["index"].includes(x)
)) {
const title = document.createElement("h1");
title.innerText = demo;
container.appendChild(title);
if (["interactive"].includes(demo)) {
const a = document.createElement("a");
a.style.display = "block";
a.innerText = demo;
a.href = `./${demo}.html`;
container.appendChild(a);
} else
for (const g of Object.keys(grid)) {
const a = document.createElement("a");
a.style.display = "block";
a.innerText = `${demo} - ${g}`;
a.href = `./${demo}.html?grid=${g}`;
container.appendChild(a);
}
}

View File

@@ -1 +1 @@
["index", "getAvailableRoutes", "pruneLayer", "getBestRoute", "interactive"] ["getAvailableRoutes", "pruneLayer", "getBestRoute", "interactive"]

View File

@@ -1,3 +1,4 @@
import "./menu";
import { createCanvas } from "./canvas"; import { createCanvas } from "./canvas";
import { Color, copyGrid } from "@snk/types/grid"; import { Color, copyGrid } from "@snk/types/grid";
import { grid, snake } from "./sample"; import { grid, snake } from "./sample";
@@ -14,7 +15,7 @@ for (const color of colors) {
layers.push({ chunk, grid: copyGrid(grid0) }); layers.push({ chunk, grid: copyGrid(grid0) });
} }
const { canvas, ctx, draw } = createCanvas(grid); const { canvas, ctx, highlightCell, draw } = createCanvas(grid);
document.body.appendChild(canvas); document.body.appendChild(canvas);
let k = 0; let k = 0;
@@ -25,10 +26,7 @@ const loop = () => {
draw(grid, snake, []); draw(grid, snake, []);
ctx.fillStyle = "orange"; ctx.fillStyle = "orange";
chunk.forEach(({ x, y }) => { chunk.forEach(({ x, y }) => highlightCell(x, y));
ctx.beginPath();
ctx.fillRect((1 + x + 0.5) * 16 - 2, (2 + y + 0.5) * 16 - 2, 4, 4);
});
}; };
loop(); loop();
@@ -45,4 +43,8 @@ input.addEventListener("input", () => {
loop(); loop();
}); });
document.body.append(input); document.body.append(input);
document.body.addEventListener("click", () => input.focus());
window.addEventListener("click", (e) => {
if (e.target === document.body || e.target === document.body.parentElement)
input.focus();
});

38
packages/demo/menu.ts Normal file
View File

@@ -0,0 +1,38 @@
import { GUI } from "dat.gui";
import * as grids from "@snk/types/__fixtures__/grid";
import * as snakes from "@snk/types/__fixtures__/snake";
import { grid, snake } from "./sample";
const demos: string[] = require("./demo.json").filter(
(x: any) => x !== "interactive"
);
export const gui = new GUI();
const config = {
snake: Object.entries(snakes).find(([_, s]) => s === snake)![0],
grid: Object.entries(grids).find(([_, s]) => s === grid)![0],
demo: demos[0],
};
{
const d = window.location.pathname.match(/(\w+)\.html/)?.[1];
if (d && demos.includes(d)) config.demo = d;
}
const onChange = () => {
const search = new URLSearchParams({
snake: config.snake,
grid: config.grid,
}).toString();
const url = new URL(
config.demo + ".html?" + search,
window.location.href
).toString();
window.location.href = url;
};
gui.add(config, "demo", demos).onChange(onChange);
gui.add(config, "grid", Object.keys(grids)).onChange(onChange);
gui.add(config, "snake", Object.keys(snakes)).onChange(onChange);

View File

@@ -3,10 +3,6 @@ import HtmlWebpackPlugin from "html-webpack-plugin";
import type { Configuration } from "webpack"; import type { Configuration } from "webpack";
const basePathname = (process.env.BASE_PATHNAME || "")
.split("/")
.filter(Boolean);
const demos: string[] = require("./demo.json"); const demos: string[] = require("./demo.json");
const config: Configuration = { const config: Configuration = {
@@ -18,7 +14,6 @@ const config: Configuration = {
output: { output: {
path: path.join(__dirname, "dist"), path: path.join(__dirname, "dist"),
filename: "[contenthash].js", filename: "[contenthash].js",
publicPath: "/" + basePathname.map((x) => x + "/").join(""),
}, },
module: { module: {
rules: [ rules: [
@@ -40,6 +35,7 @@ const config: Configuration = {
...demos.map( ...demos.map(
(demo) => (demo) =>
new HtmlWebpackPlugin({ new HtmlWebpackPlugin({
title: "snk - " + demo,
filename: `${demo}.html`, filename: `${demo}.html`,
chunks: [demo], chunks: [demo],
}) })