initial commit
This commit is contained in:
commit
17e319990c
|
@ -0,0 +1,5 @@
|
||||||
|
root = true
|
||||||
|
|
||||||
|
[*.{css,html,js,json}]
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 4
|
|
@ -0,0 +1 @@
|
||||||
|
config.json
|
|
@ -0,0 +1,60 @@
|
||||||
|
function randInt(max) {
|
||||||
|
return Math.floor(Math.random() * max);
|
||||||
|
}
|
||||||
|
|
||||||
|
class App {
|
||||||
|
constructor() {
|
||||||
|
if (document.readyState === "loading") {
|
||||||
|
document.addEventListener("DOMContentLoaded", this.init);
|
||||||
|
} else {
|
||||||
|
this.init();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async init() {
|
||||||
|
this.config = await (await fetch("/config.json")).json();
|
||||||
|
|
||||||
|
const gridConfig = this.config["grid"] ?? {};
|
||||||
|
const grid = document.getElementById("grid");
|
||||||
|
|
||||||
|
const width = parseInt(gridConfig["width"] ?? 5);
|
||||||
|
if (width !== 5) {
|
||||||
|
grid.style.gridTemplateColumns = `repeat(${width}, 1fr)`;
|
||||||
|
}
|
||||||
|
|
||||||
|
const height = parseInt(gridConfig["height"] ?? 5);
|
||||||
|
if (height !== 5) {
|
||||||
|
grid.style.gridTemplateRows = `repeat(${height}, 1fr)`;
|
||||||
|
}
|
||||||
|
|
||||||
|
const phrases = this.config["phrases"] ?? [];
|
||||||
|
const probability = Math.min(phrases.length / Math.max(width * height - 1, 1), 1);
|
||||||
|
|
||||||
|
const freeTile = this.config["freeTile"] ?? false;
|
||||||
|
for (let y = 0; y < height; ++y) {
|
||||||
|
for (let x = 0; x < width; ++x) {
|
||||||
|
const tile = document.createElement("div");
|
||||||
|
tile.classList.add("tile");
|
||||||
|
|
||||||
|
if (x === 0) tile.classList.add("row-start");
|
||||||
|
if (y === 0) tile.classList.add("col-start");
|
||||||
|
|
||||||
|
if (
|
||||||
|
freeTile && freeTile.length
|
||||||
|
&& x === Math.floor(width / 2)
|
||||||
|
&& y === Math.floor(height / 2)
|
||||||
|
) {
|
||||||
|
tile.innerText = freeTile[randInt(freeTile.length)];
|
||||||
|
} else if (phrases && phrases.length && Math.random() < probability) {
|
||||||
|
const phrase = randInt(phrases.length);
|
||||||
|
tile.innerText = phrases[phrase];
|
||||||
|
phrases.splice(phrase, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
grid.append(tile);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const app = new App();
|
|
@ -0,0 +1,11 @@
|
||||||
|
{
|
||||||
|
"freeTile": [
|
||||||
|
"FREE"
|
||||||
|
],
|
||||||
|
"grid": {
|
||||||
|
"height": 5,
|
||||||
|
"width": 5
|
||||||
|
},
|
||||||
|
"phrases": [
|
||||||
|
]
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<title>GNOBI</title>
|
||||||
|
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
|
||||||
|
<link rel="stylesheet" href="style.css">
|
||||||
|
<script src="app.js"></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<main id="grid">
|
||||||
|
</main>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,76 @@
|
||||||
|
* {
|
||||||
|
box-sizing: border-box;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
align-items: center;
|
||||||
|
display: flex;
|
||||||
|
font-family: "Maven Pro", sans-serif;
|
||||||
|
justify-content: center;
|
||||||
|
min-height: 100vh;
|
||||||
|
}
|
||||||
|
|
||||||
|
#grid {
|
||||||
|
aspect-ratio: 1 / 1;
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: repeat(5, 1fr);
|
||||||
|
grid-template-rows: repeat(5, 1fr);
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tile {
|
||||||
|
--border-width: 1px;
|
||||||
|
align-content: center;
|
||||||
|
border-color: #000;
|
||||||
|
border-style: solid;
|
||||||
|
border-width: 0 var(--border-width) var(--border-width) 0;
|
||||||
|
font-size: 12pt;
|
||||||
|
padding: 1em;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tile.col-start {
|
||||||
|
border-top-width: var(--border-width);
|
||||||
|
}
|
||||||
|
|
||||||
|
.tile.row-start {
|
||||||
|
border-left-width: var(--border-width);
|
||||||
|
}
|
||||||
|
|
||||||
|
@media print {
|
||||||
|
#grid {
|
||||||
|
margin: 20mm;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tile {
|
||||||
|
--border-width: 1pt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media print and (orientation: landscape) {
|
||||||
|
body {
|
||||||
|
height: 210mm;
|
||||||
|
width: 297mm;
|
||||||
|
}
|
||||||
|
|
||||||
|
#grid {
|
||||||
|
height: calc(100% - 20mm * 2);
|
||||||
|
width: auto;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media print and (orientation: portrait) {
|
||||||
|
body {
|
||||||
|
height: 297mm;
|
||||||
|
width: 210mm;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen {
|
||||||
|
#grid {
|
||||||
|
margin: 2em;
|
||||||
|
max-width: 1000px;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue