diff --git a/error/403.html b/error/403.html new file mode 100755 index 0000000..aab3280 --- /dev/null +++ b/error/403.html @@ -0,0 +1,22 @@ + + + + + + + 403 Chyba + + + + + + + + diff --git a/error/404.html b/error/404.html new file mode 100755 index 0000000..c23b231 --- /dev/null +++ b/error/404.html @@ -0,0 +1,19 @@ + + + + + + + 404 Error + + + + + + + + diff --git a/error/413.html b/error/413.html new file mode 100755 index 0000000..c6bb92b --- /dev/null +++ b/error/413.html @@ -0,0 +1,20 @@ + + + + + + + 413 Error + + + + + + + + diff --git a/error/5xx.html b/error/5xx.html new file mode 100755 index 0000000..bb706a9 --- /dev/null +++ b/error/5xx.html @@ -0,0 +1,22 @@ + + + + + + + 5XX Error + + + + + + + + diff --git a/index.html b/index.html index da8d59b..eaba060 100644 --- a/index.html +++ b/index.html @@ -1,29 +1,60 @@ - - - + + + + + Oscloud - - - -
-

Vítejte na Oscloud

- -
-
-

Váš bezpečný cloud

-

Oscloud je váš bezpečný cloud. Naším cílem je ukázat lidem výhody bezpečného internetu a Open Source technologií.

-
- - - + + + + + + + +
+ + + + +
+ + + + diff --git a/index/about/img/qrcode-paypal.png b/index/about/img/qrcode-paypal.png new file mode 100644 index 0000000..e015781 Binary files /dev/null and b/index/about/img/qrcode-paypal.png differ diff --git a/index/about/index.html b/index/about/index.html new file mode 100755 index 0000000..5e2e03a --- /dev/null +++ b/index/about/index.html @@ -0,0 +1,137 @@ + + + + + + + + O mně + + + + + + + + +
+

O mně

+ +
+ +
+

+ Jsem IT nadšenec s pozitivním přístupem k životu a vášní pro + technologie, ve kterých se neustále vzdělávám. Absolvoval jsem kurz + testingu a SQL v Acamaru. A nyní se i jako tester živím, v budoucnu + bych chtěl být Web Developerem. Můj životopis najdete pod tímto odkazem. +

+ +
+
    +
  • Ve volném čase se věnuji:
  • +
  • Svému blogu: Lukáš Bloguje.
  • +
  • Linuxu, MacOS a Opensource (i si rozumím s Windows :-)).
  • +
  • Seberozvoji v oblasti komunikace a emoční inteligence.
  • +
  • Sportu, který mi dobíjí baterky.
  • +
  • Missing maps pro Lékaře bez hranic.
  • +
  • Mapování v OSM.
  • +
+ + + + +
+
    +
  • V osobním životě se snažím vedle komerčních aplikací poznávat a + používat Opensource.
  • +
  • To to jsou opensource aplikace, které používám vedle placených + aplikací a stojí myslím za vyzkoušení:
  • +
  • * Alternativa za OneNote od Microsoftu je aplikace Joplin
  • + +
  • * Pro cloud a tvorbu dokumentů k Microsoft 365 doporučuji NextCloud
  • + +
  • * Pokud potřebuji šifrovat dokumenty nebo jen s někým něco sdílet a + nechci sdílet s NextCloud nebo OneDrive použiji CryptPad
  • + +
  • * Náhradu za Jiru může být Vikunja
  • + +
  • * Mimo GitHub svůj kód ukládám na Gitea
  • + +
  • * Pro tvorbu tohoto blogu vedle VS Code používám Brackets
  • + +
  • * Jako RSS čtečku využívám minimalistickou MiniFlux
  • + +
  • * Správce hesel může být Bitwarden
  • + +
  • * Internetový prohlížeč Firefox
  • + +
  • * E-mail klienta používám Thunderbird
  • + +
  • * Alternativu k sociální sítím může být MastodonElement
  • + +
  • * Alternativou k Instagramu může být Pixelfed
  • + +
+
+ +
+
+
+
    +
  • Budu velmi vděčný za malý příspěvek na provoz mých projektů:
  • +
  • Přes paypal pomocí QR kódu:
  • +
  • Paypal qrcode
  • +
  • Mega můj Referral programm link na Mega, kde zapoužití získáme oba nějaké ty bonusy. Mega je cloud služba s dobrými ceny, která je pro všechny OS tak i mobilní zařízení. Nabízi galerii fotografií, možnost editovat vaše textové soubory a navíc je vše šyfrováno.
  • +
  • Pár satoshi nebo jiné krypto měny(po dohodě)
  • +
  • Aktivačním kódem na aplikaci k recenzi či článku
  • +
  • Kritikou, radou nebo e-mailem pár slov potěší
  • +
  • Také se můžeme potkat na WordPress pivu v Praze, Frodentisti akcích, PHPkáři akcích nebo jen tak na pivku + a jiné akci.
  • +
+
+
+ + + + +
+ + diff --git a/index/games/fractal/index.html b/index/games/fractal/index.html new file mode 100755 index 0000000..9a94f69 --- /dev/null +++ b/index/games/fractal/index.html @@ -0,0 +1,56 @@ + + + + + + + Fractal + + + + + + + + +
+ +

+ Your browser doesn't seem to support the <canvas> tag. Try + Firefox. +

+
+
+ + Reset + Capture
+
+
+ + + + diff --git a/index/games/fractal/script/starter-template.js b/index/games/fractal/script/starter-template.js new file mode 100755 index 0000000..1c740d9 --- /dev/null +++ b/index/games/fractal/script/starter-template.js @@ -0,0 +1,12 @@ +function saveCanvas() { + saveCanvasButton.download = "image.png"; + saveCanvasButton.href = canvas + .toDataURL("image/png") + .replace("image/png", "image/octet-stream"); +} + +function goFullScreen() { + if (canvas.requestFullScreen) canvas.requestFullScreen(); + else if (canvas.webkitRequestFullScreen) canvas.webkitRequestFullScreen(); + else if (canvas.mozRequestFullScreen) canvas.mozRequestFullScreen(); +} diff --git a/index/games/fractal/script/xaos.js b/index/games/fractal/script/xaos.js new file mode 100755 index 0000000..b5135f6 --- /dev/null +++ b/index/games/fractal/script/xaos.js @@ -0,0 +1,1518 @@ +/* + * XaoS.js + * https://github.com/jblang/XaoS.js + * + * Copyright (C)2011 John B. Langston III + * Copyright (C)2001, 2010 Andrea Medeghini + * Copyright (C)1996, 1997 Jan Hubicka and Thomas Marsh + * + * Based on code from XaoS by Jan Hubicka (http://xaos.sf.net) + * and from JAME by Andrea Medeghini (http://www.fractalwalk.net) + * + * This file is part of XaoS.js. + * + * XaoS.js is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * XaoS.js is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XaoS.js. If not, see . + * + */ +var xaos = xaos || {}; + +xaos.zoom = (function () { + "use strict"; + + const USE_XAOS = true; // Whether to use zooming or recalculate every frame + const USE_SYMMETRY = true; // Whether to use symmetry when possible + const USE_SOLIDGUESS = true; // Whether to use solid guessing to avoid calculations + const RANGES = 2; // Number of ranges to use for sizing approximation data + const RANGE = 4; // Maximum distance to use for approximation + const MASK = 0x7; // Mask value for maximum potential source lines + const DSIZE = RANGES + 1; // Shift value for target lines + const FPMUL = 64; // Multiplication factor for fixed-point representation + const FPRANGE = FPMUL * RANGE; // Fixed point range of approximation + const MAX_PRICE = Number.MAX_VALUE; // Maximum price of uninitialized approximation + const NEW_PRICE = FPRANGE * FPRANGE; // Price of calculating a new line + const GUESS_RANGE = 4; // Range to use for solid guessing + + /** A price entry in the approximation table + * @constructor + */ + function Price() { + this.previous = null; // Previous price calculated for the same line + this.index = 0; // Index of the source for this approximation (-1 means new calculation) + this.price = MAX_PRICE; // Price calculated for this line + } + + /** A group of pixels to be moved + * @constructor + */ + function Move() { + this.length = 0; // number of pixels to move + this.from = 0; // starting offset of pixel source + this.to = 0; // starting offset of pixel destination + } + + /** A single row or column of pixels in the image + * @constructor + */ + function Line() { + this.recalculate = false; // whether to recalculate this line + this.dirty = false; // whether this line needs to be redrawn + this.isRow = false; // whether this is a row (true) or column (false) + this.index = 0; // index of row or column within the image + this.symIndex = 0; // index of pixels to use for symmetry + this.symTo = 0; // position of pixels this is symmetrical to + this.symRef = 0; // position of pixels referring to this one + this.oldPosition = 0.0; // line's old position in the fractal's complex plane + this.newPosition = 0.0; // line's new position in the fractal's complex plane + this.priority = 0.0; // calculation priority for this row/column + } + + /** An image derived from an HTML5 canvas + * @param canvas - the canvas used to display the image + * @constructor + */ + function CanvasImage(canvas) { + let width = canvas.clientWidth; + let height = canvas.clientHeight; + if (canvas.width !== width || canvas.height !== height) { + canvas.width = width; + canvas.height = height; + } else { + ctx.clearRect(0, 0, width, height); + } + + this.canvas = canvas; + this.context = canvas.getContext("2d"); + this.width = canvas.width; + this.height = canvas.height; + this.newImageData = this.context.createImageData(this.width, this.height); + this.oldImageData = this.context.createImageData(this.width, this.height); + this.newBuffer = new Uint32Array(this.newImageData.data.buffer); + this.oldBuffer = new Uint32Array(this.oldImageData.data.buffer); + } + + /** Swap new and old buffers */ + CanvasImage.prototype.swapBuffers = function () { + var tmp = this.oldBuffer; + this.oldBuffer = this.newBuffer; + this.newBuffer = tmp; + tmp = this.oldImageData; + this.newImageData = this.oldImageData; + this.oldImageData = tmp; + }; + + /** Draw the current image */ + CanvasImage.prototype.paint = function () { + this.context.putImageData(this.newImageData, 0, 0); + }; + + /** Utility function to make an array of the specified size + * with the specified initial value. It will do the right thing + * to create unique items, whether you pass in a prototype, a + * constructor, or a primitive. + * @param {number} size - the size of the array. + * @param initial - the initial value for each entry. + */ + function makeArray(size, initial) { + var i, + data = []; + for (i = 0; i < size; i++) { + if (typeof initial === "object") { + // prototype object + data[i] = Object.create(initial); + } else if (typeof initial === "function") { + // constructor + data[i] = new initial(); + } else { + // primitive + data[i] = initial; + } + } + return data; + } + + /** Container for all zoom context data for a particular canvas. + * + * @param image {CanvasImage} Image on which to draw the fractal. + * @param fractal {FractalContext} Fractal parameters. + * @constructor + */ + function ZoomContext(image, fractal) { + var size = Math.max(image.width, image.height); + this.image = image; // the image to draw the fractal on + this.fractal = fractal; // the fractal formula used for the image + this.columns = makeArray(image.width, Line); // columns in the fractal image + this.rows = makeArray(image.height, Line); // rows in the fractal image + this.sourcePos = makeArray(size + 1, 0); // fixed-point positions for source lines + this.oldBest = makeArray(size, null); // best prices for previous line + this.newBest = makeArray(size, null); // best prices for current line + this.calcPrices = makeArray(size, Price); // prices for calculating new lines + this.movePrices = makeArray(size << DSIZE, Price); // prices for approximating new lines from exsiting ones + this.moveTable = makeArray(image.width + 1, Move); // table of pixels to be moved + this.fillTable = makeArray(image.width + 1, Move); // table of pixels to be filled + this.queue = makeArray(image.width + image.height, null); // queue of lines to calculate + this.queueLength = 0; // length of the calculation queue + this.startTime = 0; // time that the current frame was started + this.minFPS = 60; // target FPS to maintain + this.fudgeFactor = 0; // fudge factor used to achieve target FPS + this.incomplete = false; // flag indicates incomplete calculation + this.zooming = false; // flag indicates image is currently zooming + } + + /** Swaps the old and new best prices in the this container. */ + ZoomContext.prototype.swapBest = function () { + var tmpBest = this.oldBest; + this.oldBest = this.newBest; + this.newBest = tmpBest; + }; + + /** Convert fractal viewport from radius and center to x and y start to end ranges */ + ZoomContext.prototype.convertArea = function () { + var radius = this.fractal.region.radius; + var center = this.fractal.region.center; + var aspect = this.image.width / this.image.height; + var size = Math.max(radius.x, radius.y * aspect); + return { + begin: { + x: center.x - size / 2, + y: (center.y - size / 2) / aspect, + }, + end: { + x: center.x + size / 2, + y: (center.y + size / 2) / aspect, + }, + }; + }; + + /** Resets line of pixels for fresh calculation + * + * @param line - row or column of pixels + * @param begin - starting fractal cooridnate + * @param end - ending coordinate + * @param isRow - whether this is a row or column + * @returns {number} + */ + ZoomContext.prototype.initialize = function (lines, begin, end, isRow) { + var i; + var p; + var step = (end - begin) / lines.length; + var line = null; + + for (i = 0, p = begin; i < lines.length; i++, p += step) { + line = lines[i]; + line.recalculate = true; + line.dirty = true; + line.isRow = isRow; + line.index = i; + line.oldPosition = p; + line.newPosition = p; + line.symIndex = i; + line.symTo = -1; + line.symRef = -1; + } + return step; + }; + + /** Calculate price of approximating one line from another + * + * @param p1 - position of first line + * @param p2 - position of second line + * @returns {number} - price of approximation + */ + function calcPrice(p1, p2) { + return (p1 - p2) * (p1 - p2); + } + + /** Calculate fixed-point representation of each line's old position + * @param lines - lines to use for calculation + * @param begin - beginning of floating point range + * @param end - end of floating point range + */ + ZoomContext.prototype.calcFixedpoint = function (lines, begin, end) { + var tofix = (lines.length * FPMUL) / (end - begin); + var i; + this.sourcePos[lines.length] = Number.MAX_VALUE; + for (i = lines.length - 1; i >= 0; i--) { + this.sourcePos[i] = ((lines[i].oldPosition - begin) * tofix) | 0; + if (this.sourcePos[i] > this.sourcePos[i + 1]) { + this.sourcePos[i] = this.sourcePos[i + 1]; + } + } + }; + + /** Choose the best approximation for lines based on previous frame + * + * @param lines - relocation table for rows or columns + * @param begin - beginning coordinate (x or y) + * @param end - ending coordinate (x or y) + * @param newPosition - array of newPosition coordinates on the complex plane + * @returns {number} + */ + ZoomContext.prototype.approximate = function (lines, begin, end) { + var previous = null; // pointer to previous approximation + var best = null; // pointer to best approximation + var line = null; // pointer to current line + var price = 0; // price of current approximation + var dest; // index of the current destination line + var idealPos = 0; // ideal position for the current destination + var maxPos = 0; // maximum valid source position of the current destination + var source = 0; // index of current source line + var prevBegin = 0; // index of first potential source for current destination + var prevEnd = 0; // index of last potential source for current destination + var currBegin = 0; // index of first potential source for next destination + var flag = 0; + var size = lines.length; + var step = (end - begin) / size; + var sourcePos = this.sourcePos; + + // Calculate fixed-point positions of all source lines + this.calcFixedpoint(lines, begin, end); + + for (dest = 0, idealPos = 0; dest < size; dest++, idealPos += FPMUL) { + this.swapBest(); + maxPos = idealPos - FPRANGE; + if (maxPos < -FPMUL) { + maxPos = -FPMUL; + } + source = prevBegin; + while (sourcePos[source] < maxPos) { + source++; + } + currBegin = source; + maxPos = idealPos + FPRANGE; + + // Find the previous approximation + if (prevBegin !== prevEnd && source > prevBegin) { + // Previous line had approximations; use them + if (source < prevEnd) { + previous = this.oldBest[source - 1]; + } else { + previous = this.oldBest[prevEnd - 1]; + } + price = previous.price; + } else if (dest > 0) { + // Previous line had no approximations + // Use the price of calculating the previous line + previous = this.calcPrices[dest - 1]; + price = previous.price; + } else { + // We're on the first line; no previous prices exists + previous = null; + price = 0; + } + + // Add the price for calculating this line + price += NEW_PRICE; + best = this.calcPrices[dest]; + best.price = price; + best.index = -1; + best.previous = previous; + + // Try all possible approximations for this line and calculate the best one + if (prevBegin !== prevEnd) { + if (source === prevBegin) { + // We're on the first line so there is no previous line + if (sourcePos[source] !== sourcePos[source + 1]) { + previous = this.calcPrices[dest - 1]; + price = previous.price + calcPrice(sourcePos[source], idealPos); + if (price < best.price) { + best = this.movePrices[(source << DSIZE) + (dest & MASK)]; + best.price = price; + best.index = source; + best.previous = previous; + } + } + this.newBest[source++] = best; + } + previous = null; + + // Potential sources for the previous and current line overlap within + // this range, so we have to calculate every possibility and find the best + while (source < prevEnd) { + if (sourcePos[source] !== sourcePos[source + 1]) { + previous = this.oldBest[source - 1]; + price = previous.price + NEW_PRICE; + if (price < best.price) { + best = this.movePrices[((source - 1) << DSIZE) + (dest & MASK)]; + best.price = price; + best.index = -1; + best.previous = previous; + this.newBest[source - 1] = best; + } + price = previous.price + calcPrice(sourcePos[source], idealPos); + if (price < best.price) { + best = this.movePrices[(source << DSIZE) + (dest & MASK)]; + best.price = price; + best.index = source; + best.previous = previous; + } else if (sourcePos[source] > idealPos) { + this.newBest[source++] = best; + break; + } + } + this.newBest[source++] = best; + } + + // We are past the overlapping area + if (source > prevBegin) { + previous = this.oldBest[source - 1]; + } else { + previous = this.calcPrices[dest - 1]; + } + price = previous.price + NEW_PRICE; + if (price < best.price && source > currBegin) { + best = this.movePrices[((source - 1) << DSIZE) + (dest & MASK)]; + best.price = price; + best.index = -1; + best.previous = previous; + this.newBest[source - 1] = best; + } + while (sourcePos[source] < maxPos) { + if (sourcePos[source] !== sourcePos[source + 1]) { + price = previous.price + calcPrice(sourcePos[source], idealPos); + if (price < best.price) { + best = this.movePrices[(source << DSIZE) + (dest & MASK)]; + best.price = price; + best.index = source; + best.previous = previous; + } else if (sourcePos[source] > idealPos) { + break; + } + } + this.newBest[source++] = best; + } + while (sourcePos[source] < maxPos) { + this.newBest[source++] = best; + } + } else if (sourcePos[source] < maxPos) { + if (dest > 0) { + previous = this.calcPrices[dest - 1]; + price = previous.price; + } else { + previous = null; + price = 0; + } + while (sourcePos[source] < maxPos) { + if (sourcePos[source] !== sourcePos[source + 1]) { + price += calcPrice(sourcePos[source], idealPos); + if (price < best.price) { + best = this.movePrices[(source << DSIZE) + (dest & MASK)]; + best.price = price; + best.index = source; + best.previous = previous; + } else if (sourcePos[source] > idealPos) { + break; + } + } + this.newBest[source++] = best; + } + while (sourcePos[source] < maxPos) { + this.newBest[source++] = best; + } + } + prevBegin = currBegin; + currBegin = prevEnd; + prevEnd = source; + } + if (begin > lines[0].oldPosition && end < lines[size - 1].oldPosition) { + flag = 1; + } + if (sourcePos[0] > 0 && sourcePos[size - 1] < size * FPMUL) { + flag = 2; + } + for (dest = size - 1; dest >= 0; dest--) { + line = lines[dest]; + line.symTo = -1; + line.symRef = -1; + if (best.index < 0) { + line.recalculate = true; + line.dirty = true; + line.symIndex = line.index; + } else { + line.symIndex = best.index; + line.newPosition = lines[best.index].oldPosition; + line.recalculate = false; + line.dirty = false; + } + best = best.previous; + } + newPositions(lines, begin, end, step, flag); + return step; + }; + + /** Choose new positions for lines based on calculated prices + * + * @param lines + * @param size + * @param begin1 + * @param end1 + * @param step + * @param newPosition + * @param flag + */ + function newPositions(lines, begin1, end1, step, flag) { + var delta = 0; + var size = lines.length; + var begin = 0; + var end = 0; + var s = -1; + var e = -1; + if (begin1 > end1) { + begin1 = end1; + } + while (s < size - 1) { + e = s + 1; + if (lines[e].recalculate) { + while (e < size) { + if (!lines[e].recalculate) { + break; + } + e++; + } + if (e < size) { + end = lines[e].newPosition; + } else { + end = end1; + } + if (s < 0) { + begin = begin1; + } else { + begin = lines[s].newPosition; + } + if (e === size && begin > end) { + end = begin; + } + if (e - s === 2) { + delta = (end - begin) * 0.5; + } else { + delta = (end - begin) / (e - s); + } + switch (flag) { + case 1: + for (s++; s < e; s++) { + begin += delta; + lines[s].newPosition = begin; + lines[s].priority = + 1 / (1 + Math.abs(lines[s].oldPosition - begin) * step); + } + break; + case 2: + for (s++; s < e; s++) { + begin += delta; + lines[s].newPosition = begin; + lines[s].priority = Math.abs(lines[s].oldPosition - begin) * step; + } + break; + default: + for (s++; s < e; s++) { + begin += delta; + lines[s].newPosition = begin; + lines[s].priority = 1.0; + } + break; + } + } + s = e; + } + } + + /** Populate symmetry data into relocation table + * + * @param lines + * @param symi + * @param symPosition + * @param step + */ + function prepareSymmetry(lines, symi, symPosition, step) { + var i; + var j = 0; + var tmp; + var abs; + var distance; + var newPosition; + var size = lines.length; + var max = size - RANGE - 1; + var min = RANGE; + var istart = 0; + var line = null; + var otherLine = null; + var symj = 2 * symi - size; + symPosition *= 2; + if (symj < 0) { + symj = 0; + } + distance = step * RANGE; + for (i = symj; i < symi; i++) { + line = lines[i]; + if (line.symTo !== -1) { + continue; + } + newPosition = line.newPosition; + line.symTo = 2 * symi - i; + if (line.symTo > max) { + line.symTo = max; + } + j = line.symTo - istart > RANGE ? -RANGE : -line.symTo + istart; + if (line.recalculate) { + while (j < RANGE && line.symTo + j < size - 1) { + tmp = symPosition - lines[line.symTo + j].newPosition; + abs = Math.abs(tmp - newPosition); + if (abs < distance) { + if ( + (i === 0 || tmp > lines[i - 1].newPosition) && + tmp < lines[i + 1].newPosition + ) { + distance = abs; + min = j; + } + } else if (tmp < newPosition) { + break; + } + j++; + } + } else { + while (j < RANGE && line.symTo + j < size - 1) { + if (line.recalculate) { + tmp = symPosition - lines[line.symTo + j].newPosition; + abs = Math.abs(tmp - newPosition); + if (abs < distance) { + if ( + (i === 0 || tmp > lines[i - 1].newPosition) && + tmp < lines[i + 1].newPosition + ) { + distance = abs; + min = j; + } + } else if (tmp < newPosition) { + break; + } + } + j++; + } + } + line.symTo += min; + otherLine = lines[line.symTo]; + if ( + min === RANGE || + line.symTo <= symi || + otherLine.symTo !== -1 || + otherLine.symRef !== -1 + ) { + line.symTo = -1; + continue; + } + if (!line.recalculate) { + line.symTo = -1; + if (otherLine.symTo !== -1 || !otherLine.recalculate) { + continue; + } + otherLine.symIndex = line.symIndex; + otherLine.symTo = i; + istart = line.symTo - 1; + otherLine.recalculate = false; + otherLine.dirty = true; + line.symRef = line.symTo; + otherLine.newPosition = symPosition - line.newPosition; + } else { + if (otherLine.symTo !== -1) { + line.symTo = -1; + continue; + } + line.symIndex = otherLine.symIndex; + istart = line.symTo - 1; + line.recalculate = false; + line.dirty = true; + otherLine.symRef = i; + line.newPosition = symPosition - otherLine.newPosition; + } + } + } + + /** Optimized array copy using Duff's Device. + * + * @param from {Array} source array + * @param fromOffset {number} offset into source array + * @param to {Array} idealPos array + * @param toOffset {number} offset into idealPos array + * @param length {number} elements to copy + */ + function arrayCopy(from, fromOffset, to, toOffset, length) { + var n = length % 8; + while (n--) { + to[toOffset++] = from[fromOffset++]; + } + n = (length / 8) | 0; + while (n--) { + to[toOffset++] = from[fromOffset++]; + to[toOffset++] = from[fromOffset++]; + to[toOffset++] = from[fromOffset++]; + to[toOffset++] = from[fromOffset++]; + to[toOffset++] = from[fromOffset++]; + to[toOffset++] = from[fromOffset++]; + to[toOffset++] = from[fromOffset++]; + to[toOffset++] = from[fromOffset++]; + } + } + + /** Apply previously calculated symmetry to image */ + ZoomContext.prototype.doSymmetry = function () { + var from_offset = 0; + var to_offset = 0; + var i; + var j = 0; + var buffer = this.image.newBuffer; + var bufferWidth = this.image.width; + for (i = 0; i < this.rows.length; i++) { + if (this.rows[i].symTo >= 0 && !this.rows[this.rows[i].symTo].dirty) { + from_offset = this.rows[i].symTo * bufferWidth; + arrayCopy(buffer, from_offset, buffer, to_offset, bufferWidth); + this.rows[i].dirty = false; + } + to_offset += bufferWidth; + } + for (i = 0; i < this.columns.length; i++) { + if ( + this.columns[i].symTo >= 0 && + !this.columns[this.columns[i].symTo].dirty + ) { + to_offset = i; + from_offset = this.columns[i].symTo; + for (j = 0; j < this.rows.length; j++) { + buffer[to_offset] = buffer[from_offset]; + to_offset += bufferWidth; + from_offset += bufferWidth; + } + this.columns[i].dirty = false; + } + } + }; + + /** Build an optimized move table based on relocation table */ + ZoomContext.prototype.prepareMove = function () { + var move = null; + var i = 0; + var j = 0; + var s = 0; + while (i < this.columns.length) { + if (!this.columns[i].dirty) { + move = this.moveTable[s]; + move.to = i; + move.length = 1; + move.from = this.columns[i].symIndex; + for (j = i + 1; j < this.columns.length; j++) { + if ( + this.columns[j].dirty || + j - this.columns[j].symIndex !== move.to - move.from + ) { + break; + } + move.length++; + } + i = j; + s++; + } else { + i++; + } + } + move = this.moveTable[s]; + move.length = 0; + }; + + /** Execute moves defined in move table */ + ZoomContext.prototype.doMove = function () { + var move = null; + var newOffset = 0; + var oldOffset = 0; + var from = 0; + var to = 0; + var i; + var s = 0; + var length = 0; + var newBuffer = this.image.newBuffer; + var oldBuffer = this.image.oldBuffer; + var bufferWidth = this.image.width; + for (i = 0; i < this.rows.length; i++) { + if (!this.rows[i].dirty) { + s = 0; + oldOffset = this.rows[i].symIndex * bufferWidth; + while ((move = this.moveTable[s]).length > 0) { + from = oldOffset + move.from; + to = newOffset + move.to; + length = move.length; + arrayCopy(oldBuffer, from, newBuffer, to, length); + s++; + } + } + newOffset += bufferWidth; + } + }; + + /** Shortcut for prepare and execute move */ + ZoomContext.prototype.movePixels = function () { + this.prepareMove(); + this.doMove(); + }; + + /** Prepare fill table based on relocation table */ + ZoomContext.prototype.prepareFill = function () { + var fill = null; + var i; + var j = 0; + var k = 0; + var s = 0; + var n = 0; + for (i = 0; i < this.columns.length; i++) { + if (this.columns[i].dirty) { + j = i - 1; + for ( + k = i + 1; + k < this.columns.length && this.columns[k].dirty; + k++ + ) {} + while (i < this.columns.length && this.columns[i].dirty) { + if ( + k < this.columns.length && + (j < i || + this.columns[i].newPosition - this.columns[j].newPosition > + this.columns[k].newPosition - this.columns[i].newPosition) + ) { + j = k; + } else if (j < 0) { + break; + } + n = k - i; + fill = this.fillTable[s]; + fill.length = n; + fill.from = j; + fill.to = i; + while (n > 0) { + this.columns[i].newPosition = this.columns[j].newPosition; + this.columns[i].dirty = false; + n--; + i++; + } + s++; + } + } + } + fill = this.fillTable[s]; + fill.length = 0; + }; + + /** Apply fill table */ + ZoomContext.prototype.doFill = function () { + var fill = null; + var from_offset = 0; + var to_offset = 0; + var from = 0; + var to = 0; + var i; + var j = 0; + var k = 0; + var t = 0; + var s = 0; + var d = 0; + var buffer = this.image.newBuffer; + var bufferWidth = this.image.width; + for (i = 0; i < this.rows.length; i++) { + if (this.rows[i].dirty) { + j = i - 1; + for (k = i + 1; k < this.rows.length && this.rows[k].dirty; k++) {} + while (i < this.rows.length && this.rows[i].dirty) { + if ( + k < this.rows.length && + (j < i || + this.rows[i].newPosition - this.rows[j].newPosition > + this.rows[k].newPosition - this.rows[i].newPosition) + ) { + j = k; + } else if (j < 0) { + break; + } + to_offset = i * bufferWidth; + from_offset = j * bufferWidth; + if (!this.rows[j].dirty) { + s = 0; + while ((fill = this.fillTable[s]).length > 0) { + from = from_offset + fill.from; + to = from_offset + fill.to; + for (t = 0; t < fill.length; t++) { + d = to + t; + buffer[d] = buffer[from]; + } + s++; + } + } + arrayCopy(buffer, from_offset, buffer, to_offset, bufferWidth); + this.rows[i].newPosition = this.rows[j].newPosition; + this.rows[i].dirty = true; + i++; + } + } else { + s = 0; + from_offset = i * bufferWidth; + while ((fill = this.fillTable[s]).length > 0) { + from = from_offset + fill.from; + to = from_offset + fill.to; + for (t = 0; t < fill.length; t++) { + d = to + t; + buffer[d] = buffer[from]; + } + s++; + } + this.rows[i].dirty = true; + } + } + }; + + /** Shortcut to prepare and apply fill table */ + ZoomContext.prototype.fill = function () { + this.prepareFill(); + this.doFill(); + }; + + /** Render line using solid guessing + * + * @param row + */ + ZoomContext.prototype.renderRow = function (row) { + var buffer = this.image.newBuffer; + var bufferWidth = this.image.width; + var newPosition = row.newPosition; + var r = row.index; + var offset = r * bufferWidth; + var i; + var j; + var k; + var n; + var distl; + var distr; + var distu; + var distd; + var offsetu; + var offsetd; + var offsetl; + var offsetul; + var offsetur; + var offsetdl; + var offsetdr; + var rend = r - GUESS_RANGE; + var length; + var current; + if (rend < 0) { + rend = 0; + } + for (i = r - 1; i >= rend && this.rows[i].dirty; i--) {} + distu = r - i; + rend = r + GUESS_RANGE; + if (rend >= this.rows.length) { + rend = this.rows.length - 1; + } + for (j = r + 1; j < rend && this.rows[j].dirty; j++) {} + distd = j - r; + if ( + !USE_SOLIDGUESS || + i < 0 || + j >= this.rows.length || + this.rows[i].dirty || + this.rows[j].dirty + ) { + for (k = 0, length = this.columns.length; k < length; k++) { + current = this.columns[k]; + if (!this.columns[k].dirty) { + buffer[offset] = this.fractal.formula( + current.newPosition, + newPosition + ); + } + offset++; + } + } else { + distr = 0; + distl = Number.MAX_VALUE / 2; + offsetu = offset - distu * bufferWidth; + offsetd = offset + distd * bufferWidth; + for (k = 0, length = this.columns.length; k < length; k++) { + current = this.columns[k]; + if (!this.columns[k].dirty) { + if (distr <= 0) { + rend = k + GUESS_RANGE; + if (rend >= this.columns.length) { + rend = this.columns.length - 1; + } + for (j = k + 1; j < rend && this.columns[j].dirty; j++) { + distr = j - k; + } + if (j >= rend) { + distr = Number.MAX_VALUE / 2; + } + } + if (distr < Number.MAX_VALUE / 4 && distl < Number.MAX_VALUE / 4) { + offsetl = offset - distl; + offsetul = offsetu - distl; + offsetdl = offsetd - distl; + offsetur = offsetu + distr; + offsetdr = offsetd + distr; + n = buffer[offsetl]; + if ( + n == buffer[offsetu] && + n == buffer[offsetd] && + n == buffer[offsetul] && + n == buffer[offsetur] && + n == buffer[offsetdl] && + n == buffer[offsetdr] + ) { + buffer[offset] = n; + } else { + buffer[offset] = this.fractal.formula( + current.newPosition, + newPosition + ); + } + } else { + buffer[offset] = this.fractal.formula( + current.newPosition, + newPosition + ); + } + distl = 0; + } + offset++; + offsetu++; + offsetd++; + distr--; + distl++; + } + } + row.recalculate = false; + row.dirty = false; + }; + + /** Render column using solid guessing + * + * @param column + */ + ZoomContext.prototype.renderColumn = function (column) { + var buffer = this.image.newBuffer; + var bufferWidth = this.image.width; + var newPosition = column.newPosition; + var r = column.index; + var offset = r; + var rend = r - GUESS_RANGE; + var i; + var j; + var k; + var n; + var distl; + var distr; + var distu; + var distd; + var offsetl; + var offsetr; + var offsetu; + var offsetlu; + var offsetru; + var offsetld; + var offsetrd; + var sumu; + var sumd; + var length; + var current; + if (rend < 0) { + rend = 0; + } + for (i = r - 1; i >= rend && this.columns[i].dirty; i--) {} + distl = r - i; + rend = r + GUESS_RANGE; + if (rend >= this.columns.length) { + rend = this.columns.length - 1; + } + for (j = r + 1; j < rend && this.columns[j].dirty; j++) {} + distr = j - r; + if ( + !USE_SOLIDGUESS || + i < 0 || + j >= this.columns.length || + this.columns[i].dirty || + this.columns[j].dirty + ) { + for (k = 0, length = this.rows.length; k < length; k++) { + current = this.rows[k]; + if (!this.rows[k].dirty) { + buffer[offset] = this.fractal.formula( + newPosition, + current.newPosition + ); + } + offset += bufferWidth; + } + } else { + distd = 0; + distu = Number.MAX_VALUE / 2; + offsetl = offset - distl; + offsetr = offset + distr; + for (k = 0, length = this.rows.length; k < length; k++) { + current = this.rows[k]; + if (!this.rows[k].dirty) { + if (distd <= 0) { + rend = k + GUESS_RANGE; + if (rend >= this.rows.length) { + rend = this.rows.length - 1; + } + for (j = k + 1; j < rend && this.rows[j].dirty; j++) { + distd = j - k; + } + if (j >= rend) { + distd = Number.MAX_VALUE / 2; + } + } + if (distd < Number.MAX_VALUE / 4 && distu < Number.MAX_VALUE / 4) { + sumu = distu * bufferWidth; + sumd = distd * bufferWidth; + offsetu = offset - sumu; + offsetlu = offsetl - sumu; + offsetru = offsetr - sumu; + offsetld = offsetl + sumd; + offsetrd = offsetr + sumd; + n = buffer[offsetu]; + if ( + n == buffer[offsetl] && + n == buffer[offsetr] && + n == buffer[offsetlu] && + n == buffer[offsetru] && + n == buffer[offsetld] && + n == buffer[offsetrd] + ) { + buffer[offset] = n; + } else { + buffer[offset] = this.fractal.formula( + newPosition, + current.newPosition + ); + } + } else { + buffer[offset] = this.fractal.formula( + newPosition, + current.newPosition + ); + } + distu = 0; + } + offset += bufferWidth; + offsetl += bufferWidth; + offsetr += bufferWidth; + distd--; + distu++; + } + } + column.recalculate = false; + column.dirty = false; + }; + + /** Calculate whether we're taking too long to render the fractal to meet the idealPos FPS */ + ZoomContext.prototype.tooSlow = function () { + var newTime = new Date().getTime(), + minFPS = this.zooming ? this.minFPS : 10; + return 1000 / (newTime - this.startTime + this.fudgeFactor) < minFPS; + }; + + /** Prioritize calculation of lines between begin and end + * + * @param lines - rows or columns to prioritize + * @param begin - index of first line to prioritize + * @param end - index of last line to prioritize + */ + function calcPriority(lines, begin, end) { + var middle; + while (begin < end) { + middle = begin + ((end - begin) >> 1); + lines[middle].priority = + (lines[end].newPosition - lines[middle].newPosition) * + lines[middle].priority; + if (lines[middle].symRef !== -1) { + lines[middle].priority /= 2.0; + } + calcPriority(lines, begin, middle); + begin = middle + 1; + } + } + + /** Enqueue all the lines to be recalculated and set their priority + * + * @param lines - lines to enqueue for calculation + */ + ZoomContext.prototype.enqueueCalculations = function (lines) { + var i; + var j = 0; + for (i = 0; i < lines.length; i++) { + if (lines[i].recalculate) { + for (j = i; j < lines.length && lines[j].recalculate; j++) { + this.queue[this.queueLength++] = lines[j]; + } + if (j === lines.length) { + j -= 1; + } + calcPriority(lines, i, j); + i = j; + } + } + }; + + /** Sort calculation queue according to priority (using quicksort) + * + * @param queue + * @param l + * @param r + */ + function sortQueue(queue, l, r) { + var m = (queue[l].priority + queue[r].priority) / 2.0; + var tmp = null; + var i = l; + var j = r; + do { + while (queue[i].priority > m) { + i++; + } + while (queue[j].priority < m) { + j--; + } + if (i <= j) { + tmp = queue[i]; + queue[i] = queue[j]; + queue[j] = tmp; + i++; + j--; + } + } while (j >= i); + if (l < j) { + sortQueue(queue, l, j); + } + if (r > i) { + sortQueue(queue, i, r); + } + } + + /** Process the relocation table */ + ZoomContext.prototype.calculate = function () { + var i, newTime; + this.incomplete = false; + this.queueLength = 0; + this.enqueueCalculations(this.columns); + this.enqueueCalculations(this.rows); + if (this.queueLength > 0) { + if (this.queueLength > 1) { + sortQueue(this.queue, 0, this.queueLength - 1); + } + for (i = 0; i < this.queueLength; i++) { + if (this.queue[i].isRow) { + this.renderRow(this.queue[i]); + } else { + this.renderColumn(this.queue[i]); + } + if (!this.recalculate && this.tooSlow() && i < this.queueLength) { + this.incomplete = true; + this.fill(); + break; + } + } + } + }; + + /** Update newPosition array with newly calculated positions */ + ZoomContext.prototype.updatePosition = function () { + var k; + var len; + for (k = 0, len = this.columns.length; k < len; k++) { + this.columns[k].oldPosition = this.columns[k].newPosition; + } + for (k = 0, len = this.rows.length; k < len; k++) { + this.rows[k].oldPosition = this.rows[k].newPosition; + } + }; + + /** Calculate FPS achieved and determine if fudge factor needs adjustment for next frame */ + ZoomContext.prototype.updateFPS = function () { + var fps = 1000 / (new Date().getTime() - this.startTime); + if (fps < this.minFPS) { + this.fudgeFactor++; + } else if (fps > this.minFPS + 10 && this.fudgeFactor > 0) { + this.fudgeFactor--; + } + console.log(fps + " fps"); + }; + + /** Overall fractal drawing workflow, calls other functions */ + ZoomContext.prototype.drawFractal = function (recalculate) { + var area = this.convertArea(); + var symx = this.fractal.symmetry && this.fractal.symmetry.x; + var symy = this.fractal.symmetry && this.fractal.symmetry.y; + var stepx, stepy; + this.startTime = new Date().getTime(); + this.recalculate = recalculate; + if (recalculate || !USE_XAOS) { + stepx = this.initialize(this.columns, area.begin.x, area.end.x, false); + stepy = this.initialize(this.rows, area.begin.y, area.end.y, true); + } else { + stepx = this.approximate(this.columns, area.begin.x, area.end.x); + stepy = this.approximate(this.rows, area.begin.y, area.end.y); + } + if ( + USE_SYMMETRY && + typeof symy === "number" && + !(area.begin.y > symy || symy > area.end.y) + ) { + prepareSymmetry( + this.rows, + Math.floor((symy - area.begin.y) / stepy), + symy, + stepy + ); + } + if ( + USE_SYMMETRY && + typeof symx === "number" && + !(area.begin.x > symx || symx > area.end.x) + ) { + prepareSymmetry( + this.columns, + Math.floor((symx - area.begin.x) / stepx), + symx, + stepx + ); + } + this.image.swapBuffers(); + this.movePixels(); + this.calculate(); + if ( + (USE_SYMMETRY && typeof symx === "number") || + typeof symy === "number" + ) { + this.doSymmetry(); + } + this.image.paint(); + this.updatePosition(); + this.updateFPS(); + }; + + /** Adjust display region to zoom based on mouse buttons */ + ZoomContext.prototype.updateRegion = function (mouse) { + var MAXSTEP = 0.008 * 3; + var MUL = 0.3; + var area = this.convertArea(); + var x = + area.begin.x + mouse.x * ((area.end.x - area.begin.x) / this.image.width); + var y = + area.begin.y + + mouse.y * ((area.end.y - area.begin.y) / this.image.height); + var deltax = + (mouse.oldx - mouse.x) * ((area.end.x - area.begin.x) / this.image.width); + var deltay = + (mouse.oldy - mouse.y) * + ((area.end.y - area.begin.y) / this.image.height); + var step; + var mmul; + if (mouse.button[1] || (mouse.button[0] && mouse.button[2])) { + // Pan when middle or left+right buttons are pressed + step = 0; + } else if (mouse.button[0]) { + // Zoom in when left button is pressed + step = MAXSTEP * 2; + } else if (mouse.button[2]) { + // Zoom out when right button is pressed + step = -MAXSTEP * 2; + } else { + this.zooming = false; + return; + } + mmul = Math.pow(1 - step, MUL); + area.begin.x = x + (area.begin.x - x) * mmul; + area.end.x = x + (area.end.x - x) * mmul; + area.begin.y = y + (area.begin.y - y) * mmul; + area.end.y = y + (area.end.y - y) * mmul; + this.fractal.region.radius.x = area.end.x - area.begin.x; + this.fractal.region.radius.y = area.end.y - area.begin.y; + this.fractal.region.center.x = (area.begin.x + area.end.x) / 2; + this.fractal.region.center.y = + ((area.begin.y + area.end.y) / 2) * + (this.image.width / this.image.height); + this.zooming = true; + }; + + /** Attaches zoomer to specified canvas */ + return function (canvas, fractal) { + var image = new CanvasImage(canvas); + var zoomer = new ZoomContext(image, fractal); + var mouse = { x: 0, y: 0, button: [false, false, false] }; + + function doZoom() { + zoomer.updateRegion(mouse); + if (zoomer.zooming || zoomer.incomplete) { + requestAnimationFrame(doZoom); + zoomer.drawFractal(false); + } + } + + canvas.ontouchstart = function (e) { + if (e.touches.length < 3) { + var touch = e.touches[0]; + e.touches.length == 2 + ? (mouse.button[2] = true) + : (mouse.button[2] = false); + var mouseEvent = new MouseEvent("mousedown", { + clientX: touch.clientX, + clientY: touch.clientY, + }); + canvas.dispatchEvent(mouseEvent); + } + }; + + canvas.ontouchend = function (e) { + var mouseEvent = new MouseEvent("mouseup", {}); + canvas.dispatchEvent(mouseEvent); + }; + + canvas.ontouchmove = function (e) { + var touch = e.touches[0]; + var mouseEvent = new MouseEvent("mousemove", { + clientX: touch.clientX, + clientY: touch.clientY, + }); + canvas.dispatchEvent(mouseEvent); + }; + + canvas.onmousedown = function (e) { + mouse.button[e.button] = true; + mouse.x = e.offsetX || e.clientX - canvas.offsetLeft; + mouse.y = e.offsetY || e.clientY - canvas.offsetTop; + mouse.oldx = e.offsetX || e.clientX - canvas.offsetLeft; + mouse.oldy = e.offsetY || e.clientY - canvas.offsetTop; + doZoom(); + }; + + canvas.onmouseup = function (e) { + mouse.button[e.button] = false; + }; + + canvas.onmousemove = function (e) { + mouse.x = e.offsetX || e.clientX - canvas.offsetLeft; + mouse.y = e.offsetY || e.clientY - canvas.offsetTop; + }; + + canvas.oncontextmenu = function () { + return false; + }; + + canvas.onmouseout = function () { + mouse.button = [false, false, false]; + }; + + zoomer.drawFractal(true); + }; +})(); + +/** Create the default XaoS color palette */ +xaos.defaultPalette = function () { + var MAXENTRIES = 65536; + var segmentsize = 8; + var setsegments = Math.floor((MAXENTRIES + 3) / segmentsize); + var nsegments = Math.floor(255 / segmentsize); + var segments = [ + [0, 0, 0], + [120, 119, 238], + [24, 7, 25], + [197, 66, 28], + [29, 18, 11], + [135, 46, 71], + [24, 27, 13], + [241, 230, 128], + [17, 31, 24], + [240, 162, 139], + [11, 4, 30], + [106, 87, 189], + [29, 21, 14], + [12, 140, 118], + [10, 6, 29], + [50, 144, 77], + [22, 0, 24], + [148, 188, 243], + [4, 32, 7], + [231, 146, 14], + [10, 13, 20], + [184, 147, 68], + [13, 28, 3], + [169, 248, 152], + [4, 0, 34], + [62, 83, 48], + [7, 21, 22], + [152, 97, 184], + [8, 3, 12], + [247, 92, 235], + [31, 32, 16], + ]; + var i, y; + var r, g, b; + var rs, gs, bs; + var palette = []; + + for (i = 0; i < setsegments; i++) { + r = segments[i % nsegments][0]; + g = segments[i % nsegments][1]; + b = segments[i % nsegments][2]; + rs = (segments[((i + 1) % setsegments) % nsegments][0] - r) / segmentsize; + gs = (segments[((i + 1) % setsegments) % nsegments][1] - g) / segmentsize; + bs = (segments[((i + 1) % setsegments) % nsegments][2] - b) / segmentsize; + for (y = 0; y < segmentsize; y++) { + palette.push((255 << 24) | (b << 16) | (g << 8) | r); + r += rs; + g += gs; + b += bs; + } + } + return new Uint32Array(palette); +}; + +xaos.mandelbrot = { + symmetry: { x: null, y: 0 }, + region: { + center: { x: -0.75, y: 0.0 }, + radius: { x: 2.5, y: 2.5 }, + angle: 0, + }, + z0: { x: 0, y: 0 }, + maxiter: 512, + bailout: 4, + formula: function (cr, ci) { + var maxiter = this.maxiter, + bailout = this.bailout, + zr = this.z0.x, + zi = this.z0.y, + i = maxiter; + + while (i--) { + var zr2 = zr * zr; + var zi2 = zi * zi; + + if (zr2 + zi2 > bailout) { + return this.palette[(maxiter - i) % this.palette.length]; + } + + zi = ci + 2 * zr * zi; + zr = cr + zr2 - zi2; + } + + return this.palette[0]; + }, + palette: xaos.defaultPalette(), +}; + +xaos.zoom(document.getElementById("canvas"), xaos.mandelbrot); diff --git a/index/games/fractal/style.css b/index/games/fractal/style.css new file mode 100755 index 0000000..9ada16e --- /dev/null +++ b/index/games/fractal/style.css @@ -0,0 +1,67 @@ +#controls { + position: relative; + margin-bottom: 2.5em; +} + +#canvas { + width: 100%; + height: 100vh; + margin-bottom: 0.5em; + display: inline-block; + vertical-align: baseline; +} + +#fullScreenButton { + position: absolute; + height: 100vh; + width: 100%; + bottom: 3rem; + visibility: hidden; +} + +@media only screen and (max-width: 600px) { + #fullScreenButton { + visibility: visible; + opacity: 0; + } + + #saveCanvasButton { + visibility: hidden; + } +} + +#resetButton { + position: absolute; + left: 0em; +} + +#saveCanvasButton { + position: absolute; + right: 0.1em; + visibility: visible; +} + +.container { + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} + +@media (min-width: 768px) { + .container { + width: 750px; + } +} + +@media (min-width: 992px) { + .container { + width: 970px; + } +} + +@media (min-width: 1200px) { + .container { + width: 1170px; + } +} diff --git a/index/games/index.html b/index/games/index.html new file mode 100755 index 0000000..63f485e --- /dev/null +++ b/index/games/index.html @@ -0,0 +1,81 @@ + + + + + + + Games + + + + + + + +
+
+

+ Rock Paper Scissors 🪨📄✂️ +

+ + The first game I ever made! I wrote this when I first began learning + Javascript, to be specific I wrote the logic during that time. The + game was only playable through the terminal, now its fairly portable + and can be integrated into anything. + +
+ +
+ +
+

+ Eternal Space +

+ + Currently only playable on a pc, I haven't tried figuring out how to + scale down the game lol. I participated in the Opera GX + GameMaker + game jam and created this monstrosity. The game jam was alien themed, + however I never got that far. Before taking part in this game jam I + have never programmed an actual game nor have been in a game jam. I + learned how to program in GameMaker Language (basically Javascript) + during the event. + +
+ +
+ +
+

+ Fractal +

+ + Interactive Javascript real-time fractal renderer using XaoS.js. Works + best on a PC. + +
+ + + +
+ You have reached the end of the page. (ノ◕ヮ◕)ノ*:・゚✧ +
+
+ + diff --git a/index/games/rps/index.html b/index/games/rps/index.html new file mode 100755 index 0000000..06c3bd1 --- /dev/null +++ b/index/games/rps/index.html @@ -0,0 +1,51 @@ + + + + + + + Rock Paper Scissors + + + + + + + +
+
+
+

+

+
+ +
+ + + + +
+ +
+

+ +

+

+
+
+
+ You have reached the end of the page. (ノ◕ヮ◕)ノ*:・゚✧ +
+
+ + diff --git a/index/games/rps/script/script.js b/index/games/rps/script/script.js new file mode 100755 index 0000000..b555617 --- /dev/null +++ b/index/games/rps/script/script.js @@ -0,0 +1,93 @@ +let userChoice = ""; + +const getUserChoice = (userInput) => { + userChoice = userInput; +}; + +function getComputerChoice() { + let cpuChoice = Math.floor(Math.random() * 3); + if (cpuChoice === 0) { + return "rock"; + } else if (cpuChoice === 1) { + return "paper"; + } else if (cpuChoice === 2) { + return "scissors"; + } +} + +function determineWinner(userChoice, computerChoice) { + if (userChoice === computerChoice) { + return "Tie"; + } + if (userChoice === "rock") { + if (computerChoice === "paper") { + return "Computer"; + } else { + return "Player"; + } + } + if (userChoice === "paper") { + if (computerChoice === "scissors") { + return "Computer"; + } else { + return "Player"; + } + } + if (userChoice === "scissors") { + if (computerChoice === "rock") { + return "Computer"; + } else { + return "Player"; + } + } +} + +const score = { + player: 0, + cpu: 0, + ties: 0, + rounds: 0, +}; + +function playGame() { + var computerChoice = getComputerChoice(); + const winner = determineWinner(userChoice, computerChoice); + + score.rounds++; + switch (winner) { + case "Player": + score.player++; + break; + case "Computer": + score.cpu++; + break; + case "Tie": + score.ties++; + break; + } + + console.log("\nPlayer: " + userChoice); + console.log("CPU: " + computerChoice); + if (winner != "Tie") { + console.log("Winner: " + winner); + } else { + console.log("Tie game!"); + } + console.log(score); + + scorePlayer.textContent = `Player wins: ${score.player}` + " "; + scoreCPU.textContent = `Computer wins: ${score.cpu}`; + round.textContent = `Round ${score.rounds}`; + choicePlayer.textContent = `You: ${userChoice}`; + choiceCPU.textContent = `CPU: ${computerChoice}`; + if (winner != "Tie") { + gameWinner.textContent = "Winner: " + winner; + } else { + gameWinner.textContent = "Tie game!"; + } +} + +function play(input) { + getUserChoice(input); + playGame(); +} diff --git a/index/privaci-policy/index.html b/index/privaci-policy/index.html new file mode 100644 index 0000000..e713e9b --- /dev/null +++ b/index/privaci-policy/index.html @@ -0,0 +1,169 @@ + + + + + + + + Zásady ochrany osobních údaju + + + + + + + + +
+ +

+ +

Zásady ochrany osobních údajů

+ Naposledy aktualizováno: 28.4.2022 +

+ +

+ Pokud jste návštěvníkem našeho blogu, odběratelem novinek, + přispěvatelem do komentářů poskytujete nám své osobní údaje. My vaše + údaje zpracováváme a za jejich bezpečnost odpovídáme. Slibujeme, že + vaše
údaje dostatečně chráníme a podřizujeme se požadavkům + Nařízení o ochraně osobních údajů (GDPR). +

+ +

+ Neprodáváme žádný produkt, nejste tedy našimi zákazníky, ale + návštěvníky blogu. +

+ +

+ Správcem vašich osobních údajů je Lukáš (Lucka ani nekouká přes + rameno!)
+ Správcem osobních údajů je Lukáš Kaňka, který provozuje webové stránky + lukan.cz a lukan.cekuj.net. Lukáš vaše údaje spravuje a určuje, jak + dlouho budou osobní údaje zpracovávány, a za jakým účelem. Vybírá +
také další zpracovatele, které ke zpracování využíváme. +

+ +

+ Jaké údaje zpracováváme a proč?
+ Vaše osobní údaje zpracováváme především proto, abychom vám mohli + poskytovat co nejkvalitnější obsah. Jednotlivé důvody zpracování: +

+ +

+ Předávání osobních údajů třetím osobám.
+ Vaše údaje zpracovává správce Lukáš Kaňka, s využitím dalších dvou + zpracovatelů, společnosti Endora , jejichž zpracování spočívá v + uchovávání údajů na zabezpečených cloudových serverech. +

+ +

+ Abychom mohli měřit, jak se vám na našem blogu líbí, kde trávíte + nejvíce času a kam klikáte, používáme další poskytovatele služeb pro + určité zpracovatelské operace. Jsou to: +

+ +

TopList – pomocí měřícího kódu

+ +

+ Jak nás můžete kontaktovat
+ Ať už na nás máte jakoukoliv otázku nebo požadavek, můžete nás + kontaktovat ne e-mailové adrese: lukas.kanka@lukan.cz. +

+ +

+ Předávání vašich dat mimo Evropskou Unii
+ Vaše data zpracováváme výhradně v Evropské unii nebo v zemích, které + zajišťují odpovídající úroveň ochrany na základě rozhodnutí Evropské + komise. +

+ +

+ Zabezpečení a ochrana osobních údajů
+ Vaše data jsou u nás v bezpečí. Přijali jsme technická opatření, která + zajišťují zabezpečení osobních údajů šifrováním přenosu dat pomocí + HTTPS protokolu (ten zámeček, co je vedle naší URL adresy ;-)) a
+ zabezpečili vaše osobní údaje v souladu s čl. 32 GDPR. +

+ +

+ Vaše práva v souvislosti s ochranou osobních údajů: +

+ +

+ V souvislosti s ochranou osobních údajů máte řadu práv. Pokud budete + chtít některého z těchto práv využít, prosím, kontaktujte nás + prostřednictvím e-mailu: lukas.kanka@lukan.cz +

+ +

Máte právo na informace, které si právě teď čtete. 🙂

+ +

+ Díky právu na přístup nás můžete kdykoli vyzvat a my vám do 30 dnů + doložíme, jaké vaše osobní údaje zpracováváme a proč. Pokud se u vás + něco změní nebo shledáte své osobní údaje neaktuální nebo
+ neúplné, máte právo na doplnění a změnu osobních údajů. +

+ +

+ Právo na omezení zpracování můžete využít, pokud se domníváte, že + zpracováváme vaše nepřesné údaje, domníváte se, že provádíme + zpracování nezákonně, ale nechcete všechny údaje smazat nebo pokud + jste
+ vznesli námitku proti zpracování. Omezit můžete rozsah osobních údajů + nebo účelů zpracování. +

+ +

Právo na výmaz (být zapomenut)

+ +

+ Vaším dalším právem je právo na výmaz (být zapomenut). Nechceme na vás + zapomenout, ale pokud si to budete přát, máte na to právo. 😞 V + takovém případě vymažeme veškeré vaše osobní údaje ze svého
+ systému i ze systému všech dílčích zpracovatelů a záloh. Na zajištění + práva na výmaz potřebujeme 30 dní. +

+ +

Stížnost u Úřadu na ochranu osobních údajů

+ +

+ Pokud máte pocit, že s vašimi údaji nezacházíme v souladu se zákonem, + máte právo se se svou stížností kdykoli obrátit na Úřad pro ochranu + osobních údajů. Budeme moc rádi, pokud nejprve budete o tomto
+ podezření informovat nás, abychom s tím mohli něco udělat a případné + pochybení napravit. +

+ +

Mlčenlivost:

+

+ Jsme povinni zachovávat mlčenlivost o osobních údajích a o + bezpečnostních opatřeních, jejichž zveřejnění by ohrozilo zabezpečení + vašich osobních údajů. Tato mlčenlivost přitom trvá i po skončení
+ závazkových vztahů s námi. Bez vašeho souhlasu také vaše údaje žádné + jiné třetí straně nevydáme. +

+ +

Tyto Zásady ochrany osobních údajů nabývají účinnosti 28.4.2022

+ + + +
+ Copyright © Lukáš Kaňka 2024 +
+ +
+ + diff --git a/index/project/YourTravelAssistant/Readme.md b/index/project/YourTravelAssistant/Readme.md new file mode 100644 index 0000000..a15b983 --- /dev/null +++ b/index/project/YourTravelAssistant/Readme.md @@ -0,0 +1,3 @@ +# První povinný projekt v rámci Akademii Engeto - front-end developers + +K projektu připravuji zároveň i testy v frameworku Playwright pod tímto [odkazem](https://github.com/LukasKanka/YourTravelAssistant_Playwright.git). diff --git a/index/project/YourTravelAssistant/cestovatel.css b/index/project/YourTravelAssistant/cestovatel.css new file mode 100644 index 0000000..70d2925 --- /dev/null +++ b/index/project/YourTravelAssistant/cestovatel.css @@ -0,0 +1,554 @@ +:root { + --word-black: #000; + --word-white: #fff; + --link-one: #efa69d; + --link-two: #e9877b; + --background-one: #33292a; + --background-two: #644b4f; + --background-three: #333333; + --background-four: #f2f2f2; +} + +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: "Roboto", sans-serif; +} + +/* Navigace (horní menu) */ +nav { + padding: 10px; + background-color: var(--background-one); + font-size: 20px; +} +a { + text-decoration: none; + color: var(--word-white); +} + +nav ul { + list-style: none; + display: flex; + justify-content: space-between; + flex-grow: 1; +} + +.navigation { + width: 65%; + margin: 0 auto; +} + +.icon { + width: auto; + height: 22px; + display: none; + margin-left: auto; + margin-right: 12px; +} + +.icon img { + width: 100%; + height: 100%; +} + +@media (max-width: 768px) { + .navigation { + width: 90%; + margin: 0 auto; + } + + nav a { + display: none; + } + + .icon { + display: block; + } +} + +/* Hero - section */ +.hero-section { + height: 80vh; + background-image: url(images/scott-goodwill-y8Ngwq34_Ak-unsplash.jpg); + background-size: cover; + background-position: center; + background-repeat: no-repeat; +} + +.hero-text-wrapper { + position: relative; + width: 65%; + margin: 0 auto; + height: 100%; +} + +.hero-text { + color: var(--word-white); + position: absolute; + right: 0; + bottom: 50px; + font-size: 80px; + text-align: right; +} + +.h2-about { + font-weight: 700; +} + +@media (max-width: 768px) { + .hero-text-wrapper { + width: 90%; + margin: 0 auto; + } + .hero-text { + font-size: 35px; + height: 80px; + margin-bottom: 5px; + } +} + +/* About sekce */ + +.about-section { + margin: 45px 0; +} + +.about-section-wrapper { + width: 65%; + margin: 0 auto; + display: flex; + gap: 20px; +} + +.about-text { + flex: 1; +} + +.about-img { + flex: 1; +} +img { + width: 100%; + height: 100%; + object-fit: cover; +} + +@media (max-width: 768px) { + .about-section-wrapper { + flex-direction: column; + width: 90%; + margin: 0 auto; + } + + .about-text { + text-align: left; + } + + .about-img { + text-align: center; + } + + .about-text-p { + padding-top: 15px; + } +} + +/* What We Do */ + +.what-section { + background-color: var(--background-one); + color: var(--word-white); +} + +.what-section-wrapper { + width: 65%; + margin: 0 auto; +} +.what-text { + text-align: center; +} +.h2-what-we { + font-size: 38px; + text-align: center; + padding-top: 45px; + padding-bottom: 35px; +} + +.where-text { + text-align: center; +} +.icon-what-section { + margin-top: 45px; + padding: 45px; + list-style: none; + display: flex; + justify-content: space-between; + flex-grow: 1; +} + +.img-icons { + width: 100px; + height: 100px; + align-items: center; +} + +.icon-text { + text-align: center; + padding-top: 15px; + font-size: 25px; +} + +@media (max-width: 768px) { + .what-section-wrapper { + width: 90%; + margin: 0 auto; + } + + .icon-what-section { + flex-direction: column; + align-items: center; + text-align: center; + } + + .img-icons { + width: 80px; + height: 80px; + margin-top: 20px; + align-items: center; + } + + .icon-text { + padding-top: 0px; + } +} + +/* Our Trips */ + +.trips-section { + margin-top: 45px; + margin-bottom: 45px; +} +.trips-section-wrapper { + display: flex; + flex-wrap: wrap; + width: 65%; + margin: auto; + gap: 10px; +} + +.images-item { + height: 222px; + width: 32%; + flex-shrink: 1; + border-radius: 4px; +} + +.images-trips-1 { + background-image: url(images/simon-english-48nerZQCHgo-unsplash.jpg); + background-size: cover; + background-position: center; +} + +.images-trips-2 { + background-image: url(images/james-wheeler-ZOA-cqKuJAA-unsplash.jpg); + background-size: cover; + background-position: center; +} + +.images-trips-3 { + background-image: url(images/daniel-tseng-73lmMKhi2U8-unsplash.jpg); + background-size: cover; + background-position: center; +} + +.images-trips-4 { + background-image: url(images/holly-mandarich-UVyOfX3v0Ls-unsplash.jpg); + background-size: cover; + background-position: center; +} + +.text-trips { + background-color: var(--background-four); + color: var(--word-black); + display: flex; + justify-content: center; + align-items: center; + font-size: 32px; + font-weight: 700; +} + +.images-trips-5 { + background-image: url(images/patrick-szylar-45bM3XGqnDE-unsplash.jpg); + background-size: cover; + background-position: center; +} + +.images-trips-6 { + background-image: url(images/chung-yee-tsang-wqxCKM0R6R8-unsplash.jpg); + background-size: cover; + background-position: center; +} + +.images-trips-7 { + background-image: url(images/julian-bialowas-ilkTnuMunP8-unsplash.jpg); + background-size: cover; + background-position: center; +} + +.images-trips-8 { + background-image: url(images/matej-drha-rbDzMcJsBkY-unsplash.jpg); + background-size: cover; + background-position: center; +} + +@media (max-width: 768px) { + .trips-section-wrapper { + width: 90%; + margin: 0 auto; + } + + .images-item { + width: 333px; + height: 222px; + } + + .text-trips { + height: 80px; + } +} + +/* Where togo */ +.where-section { + background-color: var(--background-two); + color: var(--word-white); + display: flex; +} + +.where-section-wrapper { + width: 65%; + margin: 0 auto; + padding-top: 45px; + padding-bottom: 45px; + display: flex; +} + +.where-text { + display: flex; +} + +.h2-where { + flex: 1; + font-size: 25px; + width: 272px; + height: 114px; + text-align: left; +} + +.where-text-div { + flex: 1; + width: 572; + height: 201; + text-align: left; +} + +.contact-text { + margin-top: 20px; +} + +.contact-button { + margin-top: 35px; + background-color: var(--background-four); + width: 133px; + height: 43px; + border-radius: 4px; + text-align: center; + line-height: 43px; +} + +.contact-button-text { + font-size: 14px; + font-weight: 700; + font-family: Inter; + color: var(--word-black); + display: block; +} +.mobile { + display: none; +} + +@media (max-width: 768px) { + .where-section-wrapper { + width: 90%; + margin: 0 auto; + } + + .where-text { + flex-direction: column; + } + .desktop { + display: none; + } + + .mobile { + display: block; + font-size: 25px; + margin-bottom: 25px; + } +} + +/* Reviews section */ + +.reviews-section { + width: 65%; + margin: 0 auto; + margin-top: 45px; + margin-bottom: 45px; +} +.h2-reviews { + text-align: center; + padding-bottom: 20px; +} +.reviews-text { + width: 332px; + height: 159px; + text-align: center; + margin: auto; +} + +.reviews-card-wrapper { + display: flex; + align-items: center; + justify-content: space-evenly; + gap: 300px; +} + +.reviews-card { + width: 378.49px; + height: 346px; + text-align: center; +} + +.reviews-card-1 { + width: 378.49px; + height: 346px; + text-align: center; +} + +.reviews-card img { + width: 122.13px; + height: 111px; + border-radius: 50%; +} + +.reviews-card-1 img { + width: 122.13px; + height: 111px; + border-radius: 50%; +} + +.reviews-card-text { + margin-top: 20px; +} + +.reviews-name { + font-weight: 700; + padding-top: 50px; + height: 19px; + align-items: center; +} + +@media (max-width: 768px) { + .reviews-section { + width: 90%; + margin: 0 auto; + } + + .reviews-card-wrapper { + flex-direction: column; + width: 90%; + margin: 0 auto; + gap: 95px; + } + .reviews-card { + width: 324px; + } + + .reviews-card-1 { + width: 324px; + } + + .reviews-text { + width: 263px; + } + + .h2-reviews { + padding-top: 40px; + } + + .reviews-name { + padding-bottom: 40px; + } +} + +/* Photo gallery */ +.photo-gallery { + /* display: flex; */ + /* flex-wrap: wrap; */ +} +.photo-gallery-wrapper { + display: flex; + flex-wrap: wrap; +} + +.picture-img { + width: 100%; + height: auto; + display: block; + object-fit: cover; + max-width: 50%; +} + +@media (max-width: 768px) { + .photo-gallery-wrapper { + flex-direction: column; + margin-top: 100px; + } + .picture-img { + max-width: 100%; + height: 260px; + } +} + +/* Footer */ +.footer-wrapper { + background-color: var(--background-three); + padding: 45px; +} + +.footer-text { + text-align: center; +} +.footer-contact { + color: var(--link-two); + text-decoration: underline; + font-weight: 700; +} +.footer-text-p { + padding-top: 20px; + text-align: center; + color: var(--word-white); + font-weight: 700; +} + +@media (max-width: 768px) { + .footer-contact { + font-size: 12px; + } + .footer-text-p { + font-size: 10px; + } +} diff --git a/index/project/YourTravelAssistant/cestovatel.html b/index/project/YourTravelAssistant/cestovatel.html new file mode 100644 index 0000000..c1adf0b --- /dev/null +++ b/index/project/YourTravelAssistant/cestovatel.html @@ -0,0 +1,217 @@ + + + + + + + + + + + Your Travel Assistant + + +
+ + + + + +
+
+

Your
+ Travel
+ Assistant

+
+
+ + +
+
+
+
+

About Us

+

Leigh McAdam is a Calgary-based writer, photographer and social media + enthusiast with over + 48,000 + followers. Her blog: HikeBikeTravel is frequently cited as one of the top travel and outdoor + adventure blogs in Canada, and consistently receives over 135,000 monthly page views. She + shares + her enthusiasm for the outdoors as a brand ambassador for Sporting Life, and has worked on + campaigns for Travel Alberta, Expedia and Flight Hub. Leigh is the author of Discover + Canada: + 100 Inspiring Outdoor Adventures. Currently, she is co-authoring: 125 Nature Hot Spots in + Alberta (spring 2018). A true adventurer, Leigh will try anything once, except perhaps + bungee + jumping. +

+
+
# +
+
+
+ + +
+
+
+

What We Do

+

Opportunities for challenging hikes and pleasant strolls are scattered all + over this planet; you + just + need to know where to find them. We do. Kilimanjaro, Everest Base Camp, Patagonia, and the Inca + Trail are out there, waiting for you to walk all over them. We’re proud of our record of + successful + ascents (over 92% of our travellers make it to the top of Kili, depending on the route), but + it’s + our CEOs and local guides that make the journey itself as memorable as the summit. And if you’re + not + into big climbs, don’t sweat it; we’ve got loads of lower-impact walks and iconic treks you’ll + love, + too.

+
+ +
    +
  • #
    +

    Hiking

    + +
  • +
  • #
    +

    Cycling

    +
  • +
  • #
    +

    Surfing

    +
  • +
  • #
    +

    Car trips

    +
  • +
+
+
+ + +
+
+
+
+
+
+
Our Trips
+
+
+
+
+
+
+ + +
+
+
+ +
+

Where do you
want to go?

+

Where do you want to go?

+
+
+

+ You’ll find 21 detailed adventure guides, over a hundred practical travel tips, book reviews + on + anything outdoors related, packing lists on a range of outdoor activities including + kayaking, + backpacking and camping as well as honest hotel and B&B reviews. +

+

Contact us and we will help you!

+ +
+
+
+
+ + +
+

Reviews

+
+

Our amazing clients are the reason we exist, and their reactions to our + customized travel experiences + and personalized service keep us smiling all day long. Here is just a sampling of what they’ve said: +

+
+
+
+ # +
+ She has booked two major European trips for us in the past year and every aspect has met, and + in + most cases exceeded, our expectations. Best prices, best hotels, best itineraries, and best + cruises, she does it all. But the most important thing is she remembers the little things + that + we would do if we were making the plans ourselves. +
+ Bertie Norton +
+
+
+
+ # +
+ Leigh McAdam has been making my travel arrangements for about 20 years and there is no one + else I would trust to arrange my trips and tours. I've also had great fun on a few of the + group trips she has arranged - Peru & Machu Picchu and a 10-day cruise out of Venice and + diving. It's always an eclectic group of well traveled, interesting people. +
+ Frank Kinney +
+
+
+
+
+ + + + + +
+ +
+
+ +
+ + + + + + \ No newline at end of file diff --git a/index/project/YourTravelAssistant/icons/PngItem_1608357.png b/index/project/YourTravelAssistant/icons/PngItem_1608357.png new file mode 100644 index 0000000..f7dec9b Binary files /dev/null and b/index/project/YourTravelAssistant/icons/PngItem_1608357.png differ diff --git a/index/project/YourTravelAssistant/icons/car-white.png b/index/project/YourTravelAssistant/icons/car-white.png new file mode 100644 index 0000000..c6f325c Binary files /dev/null and b/index/project/YourTravelAssistant/icons/car-white.png differ diff --git a/index/project/YourTravelAssistant/icons/cycle-white.png b/index/project/YourTravelAssistant/icons/cycle-white.png new file mode 100644 index 0000000..6387aaa Binary files /dev/null and b/index/project/YourTravelAssistant/icons/cycle-white.png differ diff --git a/index/project/YourTravelAssistant/icons/hiking-white.png b/index/project/YourTravelAssistant/icons/hiking-white.png new file mode 100644 index 0000000..36c90f2 Binary files /dev/null and b/index/project/YourTravelAssistant/icons/hiking-white.png differ diff --git a/index/project/YourTravelAssistant/icons/water-white.png b/index/project/YourTravelAssistant/icons/water-white.png new file mode 100644 index 0000000..62ffeda Binary files /dev/null and b/index/project/YourTravelAssistant/icons/water-white.png differ diff --git a/index/project/YourTravelAssistant/images/alexey-fedenkov-BaCZYH9RLmQ-unsplash.jpg b/index/project/YourTravelAssistant/images/alexey-fedenkov-BaCZYH9RLmQ-unsplash.jpg new file mode 100644 index 0000000..5d0fcc9 Binary files /dev/null and b/index/project/YourTravelAssistant/images/alexey-fedenkov-BaCZYH9RLmQ-unsplash.jpg differ diff --git a/index/project/YourTravelAssistant/images/anneliese-phillips-uv4-vl3liKM-unsplash.jpg b/index/project/YourTravelAssistant/images/anneliese-phillips-uv4-vl3liKM-unsplash.jpg new file mode 100644 index 0000000..c0a2f3c Binary files /dev/null and b/index/project/YourTravelAssistant/images/anneliese-phillips-uv4-vl3liKM-unsplash.jpg differ diff --git a/index/project/YourTravelAssistant/images/chung-yee-tsang-wqxCKM0R6R8-unsplash.jpg b/index/project/YourTravelAssistant/images/chung-yee-tsang-wqxCKM0R6R8-unsplash.jpg new file mode 100644 index 0000000..b50e05d Binary files /dev/null and b/index/project/YourTravelAssistant/images/chung-yee-tsang-wqxCKM0R6R8-unsplash.jpg differ diff --git a/index/project/YourTravelAssistant/images/daniel-tseng-73lmMKhi2U8-unsplash.jpg b/index/project/YourTravelAssistant/images/daniel-tseng-73lmMKhi2U8-unsplash.jpg new file mode 100644 index 0000000..2187830 Binary files /dev/null and b/index/project/YourTravelAssistant/images/daniel-tseng-73lmMKhi2U8-unsplash.jpg differ diff --git a/index/project/YourTravelAssistant/images/holly-mandarich-UVyOfX3v0Ls-unsplash.jpg b/index/project/YourTravelAssistant/images/holly-mandarich-UVyOfX3v0Ls-unsplash.jpg new file mode 100644 index 0000000..7c6b25f Binary files /dev/null and b/index/project/YourTravelAssistant/images/holly-mandarich-UVyOfX3v0Ls-unsplash.jpg differ diff --git a/index/project/YourTravelAssistant/images/james-wheeler-ZOA-cqKuJAA-unsplash.jpg b/index/project/YourTravelAssistant/images/james-wheeler-ZOA-cqKuJAA-unsplash.jpg new file mode 100644 index 0000000..fb86588 Binary files /dev/null and b/index/project/YourTravelAssistant/images/james-wheeler-ZOA-cqKuJAA-unsplash.jpg differ diff --git a/index/project/YourTravelAssistant/images/jeffrey-keenan-pUhxoSapPFA-unsplash.jpg b/index/project/YourTravelAssistant/images/jeffrey-keenan-pUhxoSapPFA-unsplash.jpg new file mode 100644 index 0000000..2f11f0f Binary files /dev/null and b/index/project/YourTravelAssistant/images/jeffrey-keenan-pUhxoSapPFA-unsplash.jpg differ diff --git a/index/project/YourTravelAssistant/images/julian-bialowas-ilkTnuMunP8-unsplash.jpg b/index/project/YourTravelAssistant/images/julian-bialowas-ilkTnuMunP8-unsplash.jpg new file mode 100644 index 0000000..4507328 Binary files /dev/null and b/index/project/YourTravelAssistant/images/julian-bialowas-ilkTnuMunP8-unsplash.jpg differ diff --git a/index/project/YourTravelAssistant/images/kalen-emsley-kGSapVfg8Kw-unsplash.jpg b/index/project/YourTravelAssistant/images/kalen-emsley-kGSapVfg8Kw-unsplash.jpg new file mode 100644 index 0000000..81fc614 Binary files /dev/null and b/index/project/YourTravelAssistant/images/kalen-emsley-kGSapVfg8Kw-unsplash.jpg differ diff --git a/index/project/YourTravelAssistant/images/matej-drha-rbDzMcJsBkY-unsplash.jpg b/index/project/YourTravelAssistant/images/matej-drha-rbDzMcJsBkY-unsplash.jpg new file mode 100644 index 0000000..9ed51ea Binary files /dev/null and b/index/project/YourTravelAssistant/images/matej-drha-rbDzMcJsBkY-unsplash.jpg differ diff --git a/index/project/YourTravelAssistant/images/omer-salom-LoijtQXXNhs-unsplash.jpg b/index/project/YourTravelAssistant/images/omer-salom-LoijtQXXNhs-unsplash.jpg new file mode 100644 index 0000000..2ac3aa8 Binary files /dev/null and b/index/project/YourTravelAssistant/images/omer-salom-LoijtQXXNhs-unsplash.jpg differ diff --git a/index/project/YourTravelAssistant/images/patrick-szylar-45bM3XGqnDE-unsplash.jpg b/index/project/YourTravelAssistant/images/patrick-szylar-45bM3XGqnDE-unsplash.jpg new file mode 100644 index 0000000..d2c57ae Binary files /dev/null and b/index/project/YourTravelAssistant/images/patrick-szylar-45bM3XGqnDE-unsplash.jpg differ diff --git a/index/project/YourTravelAssistant/images/scott-goodwill-y8Ngwq34_Ak-unsplash.jpg b/index/project/YourTravelAssistant/images/scott-goodwill-y8Ngwq34_Ak-unsplash.jpg new file mode 100644 index 0000000..c688660 Binary files /dev/null and b/index/project/YourTravelAssistant/images/scott-goodwill-y8Ngwq34_Ak-unsplash.jpg differ diff --git a/index/project/YourTravelAssistant/images/simon-english-48nerZQCHgo-unsplash.jpg b/index/project/YourTravelAssistant/images/simon-english-48nerZQCHgo-unsplash.jpg new file mode 100644 index 0000000..6c009a8 Binary files /dev/null and b/index/project/YourTravelAssistant/images/simon-english-48nerZQCHgo-unsplash.jpg differ diff --git a/index/project/YourTravelAssistant/images/vincentiu-solomon-7MH4ped6_Mo-unsplash.jpg b/index/project/YourTravelAssistant/images/vincentiu-solomon-7MH4ped6_Mo-unsplash.jpg new file mode 100644 index 0000000..f436b0a Binary files /dev/null and b/index/project/YourTravelAssistant/images/vincentiu-solomon-7MH4ped6_Mo-unsplash.jpg differ diff --git a/index/project/index.html b/index/project/index.html new file mode 100755 index 0000000..330017d --- /dev/null +++ b/index/project/index.html @@ -0,0 +1,116 @@ + + + + + + + + Projekty + + + + + + + + + +
+ + + +
+ + + + +
+

+ Vítám tě na této stránce, která slouží jako mapa pro mé projekty. +

+

+ Zde najtete projekty věnující se k tvorbě webu a hlavně mou cestu Akademií Engeto. +

+

+ Všechny projekty jsou vytvořeny v HTML, CSS a strochou JavaScriptu. Ale určitě jsem přidám i další + projekty, které tvořím mimo Akademii.

+

+ Projekty které se netýkají tworby webu, najdete na mém GitHubu přes tento odkaz na Gitea. +

+

+ U každého projektu najdete popis a odkaz na něj. Buď na Gitea nebo na stránky, kde je projekt umístěn. +

+
+ +
+
+

Projekt 1: Tento Blog

+

+ Tento projekt je vytvořen mimo Akademii Engeto. Je to můj osobní blog, který postupně vylepšuji. + Tato stránka slouží čistě jako má prezentace.

+

+ Postupně jsem přidávám své znolosti z HTML, CSS a také se snažím aby web byl co nejlépe + responzivní. Tento projekt je nekončicí koloběh. +

+
+ +
+

Projekt 2: Životopis

+

+ Tento projekt je jako první úkol v Akademii.

+

Zadání bylo vytvořit jednoduchý životpis na procvičení základů HTML a CSS. Později jsem ještě pomocí + CSS nastavil v úkolu responsivní web pro mobilní zařízení.

+

+

Projekt Životopis najdete zde.

+
+
+

Projekt 3: Karta produktu

+

Karta produktu. Na tomto projektu jsme se naučily pozicování elementu a pojmy jako Margin a Padding. +

+

Projekt Karta produkdu najdete zde

+
+ +
+

Projekt 4: Nature and Culture

+

Tento projekt je zaměřen na responsivitu webu pro mobilní zařízení a také jsme použily porvé Flexbox. +

+

Projekt Nature and Culture najdete zde

+ +
+
+

Projekt 5: Your Travel Assistant

+

Tento projekt je vytvořen mimo Akademii Engeto. Jedná se o stránku pro cestovatele.

+

Zadání jsme měli jako na reálném projektu a grafické rozložení se dělalo dle Figmi. Tento projekt byl hodnocený a je jeden ze tří projektů k získání certifikátu v Akademii.

+

Projekt najdeš pod tímto odkazem. Od finální verze co jsem odevzdal se mírně liší, ještě před odevzdáním jsem vychytával poslední mouchy.

+
+
+
+ + + +
+ Copyright © Lukáš Kaňka 2024 +
+
+ + diff --git a/index/project/kartaProduktu/img/psi-hracka.png b/index/project/kartaProduktu/img/psi-hracka.png new file mode 100644 index 0000000..8a2bcd6 Binary files /dev/null and b/index/project/kartaProduktu/img/psi-hracka.png differ diff --git a/index/project/kartaProduktu/karta-produktu.html b/index/project/kartaProduktu/karta-produktu.html new file mode 100644 index 0000000..5865c79 --- /dev/null +++ b/index/project/kartaProduktu/karta-produktu.html @@ -0,0 +1,55 @@ + + + + + + + + + Karta produktu + + + + +
+ +
+ Jen u nás + -27% +
+ +
+ +
+ + +

M-Pets Hračka Holly vánoční sněhulák

+ + +

Hračka pro psy - pro střední a velká plemena, vydává zvuky, materiál polyester, bílá barva +

+ + +
+
Výměna nevhodného dárku za poukaz do 31.1.2024 nyní zdarma! Více informací klini na odkaz: Výměna + dárku. +
+ +
+ + +
+

149,-

+ 109,- + Do košíku +
+ + + Skladem > 5 ks + Doprava zdarma +
+ + + \ No newline at end of file diff --git a/index/project/kartaProduktu/style.karta.css b/index/project/kartaProduktu/style.karta.css new file mode 100644 index 0000000..55fe50f --- /dev/null +++ b/index/project/kartaProduktu/style.karta.css @@ -0,0 +1,147 @@ +:root { + --special-yellow: hsl(56, 94%, 49%); + --special-yellow-2: rgb(231, 231, 149); + --special-red-original: red; + --special-red: #db090d; + --special-black: #040303; + --special-white: #f7f7f7; + --special-green: rgb(0, 128, 0); + --special-agua: rgb(8, 126, 126); + --special-pink: palevioletred; +} +.product-card { + position: relative; + width: 450px; + background-color: var(--special-white); + padding: 16px; + font-family: "Franklin Gothic Medium", "Arial Narrow", Arial, sans-serif; + border: 6px solid var(--special-black); + + /* responzivita */ + width: calc(100% - 32px); + max-width: 800px; + margin: auto; +} + +.whell { + position: absolute; +} + +.product-only { + background-color: var(--special-yellow); + position: absolute; + border-radius: 50%; + width: 120px; + height: 80px; + left: 35px; + top: 60px; + text-align: center; + font-size: 25px; + color: var(--special-white); + font-weight: bold; + padding-top: 50px; +} + +.discount-badge { + background-color: var(--special-red); + position: absolute; + border-radius: 50%; + width: 120px; + height: 80px; + left: 35px; + top: 160px; + text-align: center; + font-size: 25px; + color: var(--special-white); + font-weight: bold; + padding-top: 50px; +} + +.product-image { + width: 95%; + height: 90%; +} + +h1 { + color: var(--special-agua); +} + +.button { + color: var(--special-red); + border-style: solid; + text-decoration: none; + padding-right: 6px; + padding-left: 6px; + border-radius: 6px; + background-color: var(--special-yellow-2); +} +.product-price-container { + padding: 8px; + background-color: var(--special-pink); + margin-bottom: 16px; + position: relative; + border-radius: 6px; + top: 15px; +} + +.product-price { + font-weight: bold; + font-size: 40px; + display: inline-block; + padding: 8px; + background-color: var(--special-red-original); + border-radius: 6px; +} + +.product-price-old { + font-size: 20px; + color: var(--special-white); + text-decoration: line-through; + width: 75px; + background-color: var(--special-yellow); + margin-top: 1px; + margin-bottom: 1px; + padding-left: 35px; + border-radius: 6px; + font-weight: bold; +} + +.shopping-button { + color: var(--special-black); + font-weight: bold; + font-size: 30px; + text-decoration: none; + position: absolute; + top: 30px; + right: 30px; + border-radius: 6px; + background-color: var(--special-yellow-2); + padding-left: 5px; + padding-right: 5px; + border-style: solid; +} + +.stock { + font-weight: bold; + color: var(--special-green); + font-size: 20px; + padding: 10px; +} + +.transport { + padding-left: 135px; + font-size: 20px; + font-weight: bold; +} + +.button-container { + margin-top: 10px; + /* margin-bottom: 15px; */ +} + +/* ˇMobily */ +@media screen and (max-width: 600px) { + body { + width: calc(100% - 16px); + } +} diff --git a/index/project/nature/images/PngItem_1608357.png b/index/project/nature/images/PngItem_1608357.png new file mode 100644 index 0000000..f7dec9b Binary files /dev/null and b/index/project/nature/images/PngItem_1608357.png differ diff --git a/index/project/nature/images/photo-1512419180521-2c5585bdf851.avif b/index/project/nature/images/photo-1512419180521-2c5585bdf851.avif new file mode 100644 index 0000000..efc2718 Binary files /dev/null and b/index/project/nature/images/photo-1512419180521-2c5585bdf851.avif differ diff --git a/index/project/nature/images/photo-1540503831458-3237544b2ce5.avif b/index/project/nature/images/photo-1540503831458-3237544b2ce5.avif new file mode 100644 index 0000000..f9d866f Binary files /dev/null and b/index/project/nature/images/photo-1540503831458-3237544b2ce5.avif differ diff --git a/index/project/nature/nature-and-culture.html b/index/project/nature/nature-and-culture.html new file mode 100644 index 0000000..d90603d --- /dev/null +++ b/index/project/nature/nature-and-culture.html @@ -0,0 +1,41 @@ + + + + + + + + Hero + + + + + + + +
+
+
Exploring Icelandic Villages
+
+

Nature and Culture Converge

+
+
+
+ + + + +
+ +
+ + + \ No newline at end of file diff --git a/index/project/nature/style-nature.css b/index/project/nature/style-nature.css new file mode 100644 index 0000000..1574f9a --- /dev/null +++ b/index/project/nature/style-nature.css @@ -0,0 +1,115 @@ +:root { + --my-white: #fff; + --my-pink: #f08d8f; +} + +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + margin: 16px 32px; +} + +.hero-section { + height: 70vh; + background-image: url(images/photo-1540503831458-3237544b2ce5.avif); + background-size: cover; + background-position: center; + background-repeat: no-repeat; + border-radius: 12px; + margin-bottom: 10px; + position: relative; +} + +.hero-text { + position: absolute; + left: 32px; + bottom: 16px; + color: var(--my-white); +} + +.hero-subtitle { + font-size: 20px; +} +.hero-title { + margin-top: 8px; +} + +.icon { + width: auto; + height: auto; + display: none; + padding: 14px; + margin-left: auto; + /* display: flex; */ +} +.icon img { + width: 100%; + height: 100%; + /* display: flex; */ + /* align-items: center; */ +} + +.image-container { + width: 50%; +} +.image-container img { + width: 100%; + height: 100%; + border-radius: 12px; +} +nav { + height: 55px; + background-color: var(--my-pink); + display: flex; + justify-content: space-evenly; + text-decoration: none; + margin-bottom: 10px; + border-radius: 12px; +} +nav a { + color: var(--my-white); + text-decoration: none; + font-size: 20px; + font-weight: bold; + list-style-type: none; +} + +ul { + display: flex; + list-style-type: none; + gap: 65px; + padding-top: 16px; + padding-bottom: 16px; +} + +/* Mobile - setting */ + +@media (max-width: 768px) { + body { + margin: 8px; + } + + .hero-subtitle { + font-size: 18px; + } + + .hero-title { + font-size: 14px; + } + + .icon { + display: block; + } + + .image-container { + width: 100%; + } + + nav a { + display: none; + } +} diff --git a/index/project/zivotopis/Folder.DotSettings.user b/index/project/zivotopis/Folder.DotSettings.user new file mode 100644 index 0000000..ef0428b --- /dev/null +++ b/index/project/zivotopis/Folder.DotSettings.user @@ -0,0 +1,2 @@ + + ThisComputer \ No newline at end of file diff --git a/index/project/zivotopis/README.md b/index/project/zivotopis/README.md new file mode 100644 index 0000000..bf7c00d --- /dev/null +++ b/index/project/zivotopis/README.md @@ -0,0 +1,3 @@ +# zivotopis_engeto + +První zadání pro nepovinný domácí úkol, vytvořit CV. diff --git a/index/project/zivotopis/image/1702045296079.jpeg b/index/project/zivotopis/image/1702045296079.jpeg new file mode 100644 index 0000000..c0b1c93 Binary files /dev/null and b/index/project/zivotopis/image/1702045296079.jpeg differ diff --git a/index/project/zivotopis/style-cv.css b/index/project/zivotopis/style-cv.css new file mode 100644 index 0000000..cd25230 --- /dev/null +++ b/index/project/zivotopis/style-cv.css @@ -0,0 +1,86 @@ +:root { + --my-black: black; + --my-beckground: #ded4d4; + max-width: 1200px; + margin: auto; +} + +body { + background-color: var(--my-beckground); + max-width: 1200px; + margin: auto; + margin-bottom: 25px; +} +@media screen and (max-width: 600px) { + body { + width: calc(100% - 16px); + } +} + +footer { + position: fixed; + bottom: 0; +} + +.tlacitko { + color: var(--my-black); +} + +td, +th { + border: 1px solid var(--my-black); + padding: 15px; +} + +.flexbox { + display: flex; + max-width: auto; + margin: auto; +} +.flexbox-content { + display: flex; + flex-direction: column; +} + +.menu { + margin-top: 25px; +} + +.content { + order: 2; + flex: 3; + padding: 55px; + margin-top: -45px; +} +.dot { + list-style-type: none; +} +.jobs, +.course, +.fun { + font-size: 20px; +} +.title { + text-align: center; + order: 1; +} + +@media screen and (max-width: 600px) { + .flexbox { + flex-direction: column; + } + + .menu { + order: 1; + text-align: center; + } + .dot-none { + list-style-type: none; + } + /* .content { + order: 3; + } */ + .title { + order: -1; + } +} diff --git a/index/project/zivotopis/zivotopis.html b/index/project/zivotopis/zivotopis.html new file mode 100644 index 0000000..f9da927 --- /dev/null +++ b/index/project/zivotopis/zivotopis.html @@ -0,0 +1,183 @@ + + + + + + + + + + + + Životopis + + + +
+ + + + +
+
+

ŽIVOTOPIS
LUKÁŠ KAŇKA

+
+ + +
+ +
+

O MNĚ

+
+

+ IT nadšenec s pozitivním přístupem k životu a vášní pro technologie. + Do světa IT jsem vstoupil jako Support, pak mě osud dovedl na pozici + Testera a v současné době měním svůj kariérní směr do Front-Endu. Kód + i programování mě lákalo už dlouho, baví mě zobrazení okamžitého + výsledku, který mi umožňuje zlepšení a zdokonalení kódu. Aktuálně se + vzdělávám ve Front-End Developer Akademii se zaměřením na znalosti + v JavaScript, HTML, CSS. Jako návazný krok bych své znalosti rád + prohluboval ve frameworcích React, Angular. +

+
+
+

PRACOVNÍ ZKUŠENOSTI

+
+
    +
  • + Tester softwaru +
  • +
  • Uniprog Solutions, a.s [ 15/08/2022 – 14/08/2023 ]
  • +
  • Město: Praha
  • +
  • Země: Česko
  • +
  • Manuální testování PowerBuilder aplikací.
  • +
  • Údržba a oprava automatizovaných testů Cucumber.
  • +
  • Manuální testování webových aplikací dle Test Case a dokumentace.
  • +
  • Komunikace napříč vývojovými týmy.
  • +
  • Technologie: MSSQL, Jira, PowerBuilder, GitLab.
  • +
+
    +
  • IT support
  • +
  • Comfort Finance Group CFG Živnostník [ 04/2022 – 07/2022 ]
  • +
  • Město: Praha
  • +
  • Země: Česko
  • +
  • Poskytování IT podpory uživatelům (SW, HW), onboarding nováčků, + evidence skladu vybavení, řešení nastalých technických problémů.
  • +
  • Reporting systémových chyb na adekvátní oddělení.
  • +
  • Práce v OS Ubuntu Linux.
  • +
  • Práce s nástroji jako Intergromat, Jira.
  • +
+
    +
  • Řidič dodávky
  • +
  • + Artglass Lighting Na plný úvazek [ 03/2016 – 04/2020 ]
    + Země: Česko
    + Řízení dodávky, komunikace se zákazníky, podpora prodeje. +
  • +
+
    +
  • Řidič nákladního vozu
  • +
  • + ČSAD Liberec Na plný úvazek [ 07/2006 – 08/2014 ] +
  • +
  • Řízení nákladních vozidel (MAN, DAF, Iveco, Renault). +
  • +
+
+
+

VZDĚLÁNÍ A ODBORNÁ PŘÍPRAVA

+
+
    +
  • Základy Testingu, SQL, Web Services
  • +
  • + Acamar [ 08/2020 ] +
  • +
  • Město: Praha
  • +
  • Země: Česko
  • +
+
    +
  • Úvod do Playwright
  • +
  • Tesena [ 04/2023 ]
  • +
  • Město: Praha
  • +
  • Země: Česko
  • +
+
+
+

ZÁJMY A KONÍČKY

+
+
    +
  • + Opensource, Linux, Sebevzdělávání v testingu a dalších technologiích, + Cyklistika +
  • +
  • + Na mi mo pracovních projektech mám základní zkušenosti se SW a + technologiemi jako: C#, .Net, NUnit, Selenium, Selenide,Cypress, + Playwrigt, Java, Linux Ubuntu a další distribuce, Docker, MacOS, + MangoDB, Windows, Obsidian.
    + Mimo jiné se ve volném čase účastním amatérských závodů na kole a rád + si zaběhám. +
  • +
+

DOBROVOLNICKÁ ČINNOST

+
+
    +
  • Maper Missing Maps
  • +
  • + Ve volném čase mapuji pro humanitární účely, v projektu + Missing Maps + pomocí OSM na platformě + Hot Tasking Manager. +
  • +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/index/projects/index.html b/index/projects/index.html new file mode 100755 index 0000000..b4fc044 --- /dev/null +++ b/index/projects/index.html @@ -0,0 +1,121 @@ + + + + + + + My Projects + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + +
ProjectDescriptionLink (local)
Dark New RomanA custom serif font based off of Times New Roman. + Download font (truetype 28.9 KiB) +
Number System Converter (web)Converts decimal numbers into other bases! + nsc-web +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
ProjectDescriptionLink (external)
Firefox black & red triangle themeA red and black theme for firefox tabs. + https://addons.mozilla.org/en-US/firefox/addon/black-red-triangle-theme/ +
RGB Progress BarMakes progress bars cycle through different RGB colors. + https://addons.mozilla.org/addon/rgb-progress-bar/ +
+ +
+
+ + + + + + + + + + + + + +
Github contributionDescriptionRepository linkLanguage
+ + + +
+ You have reached the end of the page. (ノ◕ヮ◕)ノ*:・゚✧ +
+
+ + diff --git a/index/projects/nsc-web/index.html b/index/projects/nsc-web/index.html new file mode 100755 index 0000000..70c1f43 --- /dev/null +++ b/index/projects/nsc-web/index.html @@ -0,0 +1,84 @@ + + + + + + + Number System Converter + + + + + + + + + +
+
+

Enter a decimal number to convert and a base.

+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+ You have reached the end of the page. (ノ◕ヮ◕)ノ*:・゚✧ +
+
+ + diff --git a/index/projects/nsc-web/script/script.js b/index/projects/nsc-web/script/script.js new file mode 100755 index 0000000..d05d4a8 --- /dev/null +++ b/index/projects/nsc-web/script/script.js @@ -0,0 +1,19 @@ +numberSystemConverter(); +function numberSystemConverter() { + let num = document.getElementById("number").value; + let base = document.getElementById("base").value; + let new_base = document.getElementById("new-base").value; + + base = parseInt(base); + new_base = parseInt(new_base); + + try { + let dec_num = parseInt(num, base); + let new_num = dec_num.toString(new_base); + + document.getElementById("converted").value = new_num; + console.log(`BASE ${base}: ${num} ==> BASE ${new_base}: ${new_num}`); + } catch (RangeError) { + console.log(`One or more bases is not in the range of 2 to 36.`); + } +} diff --git a/index/projects/script/script.js b/index/projects/script/script.js new file mode 100755 index 0000000..861a71e --- /dev/null +++ b/index/projects/script/script.js @@ -0,0 +1,38 @@ +requestUserRepos(); + +function requestUserRepos() { + const xhr = new XMLHttpRequest(); + const url = `https://api.github.com/users/array-in-a-matrix/repos`; + xhr.open("GET", url, true); + + xhr.onload = function () { + const data = JSON.parse(this.response); + let root = document.getElementById("userRepo"); + while (root.firstChild) { + root.removeChild(root.firstChild); + } + let tbody = document.getElementById("userRepo"); + for (let i in data) { + let tr = document.createElement("tr"); + tr.classList.add("list-group-item"); + + function removeNull(disc) { + if (disc === null) { + const disc = "-"; + return disc; + } else { + return data[i].description; + } + } + + tr.innerHTML = ` + ${data[i].name} + ${removeNull(data[i].description)} + ${data[i].html_url} + ${data[i].language} + `; + tbody.appendChild(tr); + } + }; + xhr.send(); +} diff --git a/index/repository/index.html b/index/repository/index.html new file mode 100644 index 0000000..d537309 --- /dev/null +++ b/index/repository/index.html @@ -0,0 +1,44 @@ + + + + + + + Repositáře + + + + + + + +
+ + + +
+ + diff --git a/index/socials/index.html b/index/socials/index.html new file mode 100755 index 0000000..a18b020 --- /dev/null +++ b/index/socials/index.html @@ -0,0 +1,73 @@ + + + + + + + Socials + + + + + + + +
+ + +
+ +
+ + diff --git a/logo/logo.png b/logo/logo.png new file mode 100644 index 0000000..2e56d82 Binary files /dev/null and b/logo/logo.png differ diff --git a/package.json b/package.json new file mode 100644 index 0000000..969c078 --- /dev/null +++ b/package.json @@ -0,0 +1,17 @@ +{ + "lint-staged": { + "**/*": "prettier --write --ignore-unknown" + }, + "devDependencies": { + "eslint-config-prettier": "^8.10.0", + "husky": "^8.0.3", + "lint-staged": "^13.3.0", + "prettier": "2.8.4" + }, + "dependencies": { + "eslint": "^8.54.0" + }, + "scripts": { + "prepare": "husky install" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..434c812 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,1336 @@ +lockfileVersion: "6.0" + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +dependencies: + eslint: + specifier: ^8.54.0 + version: 8.54.0 + +devDependencies: + eslint-config-prettier: + specifier: ^8.10.0 + version: 8.10.0(eslint@8.54.0) + husky: + specifier: ^8.0.3 + version: 8.0.3 + lint-staged: + specifier: ^13.3.0 + version: 13.3.0 + prettier: + specifier: 2.8.4 + version: 2.8.4 + +packages: + /@aashutoshrathi/word-wrap@1.2.6: + resolution: + { + integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==, + } + engines: { node: ">=0.10.0" } + + /@eslint-community/eslint-utils@4.4.0(eslint@8.54.0): + resolution: + { + integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.54.0 + eslint-visitor-keys: 3.4.3 + + /@eslint-community/regexpp@4.10.0: + resolution: + { + integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==, + } + engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } + + /@eslint/eslintrc@2.1.3: + resolution: + { + integrity: sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.6.1 + globals: 13.23.0 + ignore: 5.3.0 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + /@eslint/js@8.54.0: + resolution: + { + integrity: sha512-ut5V+D+fOoWPgGGNj83GGjnntO39xDy6DWxO0wb7Jp3DcMX0TfIqdzHF85VTQkerdyGmuuMD9AKAo5KiNlf/AQ==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + + /@humanwhocodes/config-array@0.11.13: + resolution: + { + integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==, + } + engines: { node: ">=10.10.0" } + dependencies: + "@humanwhocodes/object-schema": 2.0.1 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + /@humanwhocodes/module-importer@1.0.1: + resolution: + { + integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==, + } + engines: { node: ">=12.22" } + + /@humanwhocodes/object-schema@2.0.1: + resolution: + { + integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==, + } + + /@nodelib/fs.scandir@2.1.5: + resolution: + { + integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==, + } + engines: { node: ">= 8" } + dependencies: + "@nodelib/fs.stat": 2.0.5 + run-parallel: 1.2.0 + + /@nodelib/fs.stat@2.0.5: + resolution: + { + integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==, + } + engines: { node: ">= 8" } + + /@nodelib/fs.walk@1.2.8: + resolution: + { + integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==, + } + engines: { node: ">= 8" } + dependencies: + "@nodelib/fs.scandir": 2.1.5 + fastq: 1.15.0 + + /@ungap/structured-clone@1.2.0: + resolution: + { + integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==, + } + + /acorn-jsx@5.3.2(acorn@8.11.2): + resolution: + { + integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==, + } + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.11.2 + + /acorn@8.11.2: + resolution: + { + integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==, + } + engines: { node: ">=0.4.0" } + hasBin: true + + /ajv@6.12.6: + resolution: + { + integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==, + } + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + /ansi-escapes@5.0.0: + resolution: + { + integrity: sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==, + } + engines: { node: ">=12" } + dependencies: + type-fest: 1.4.0 + dev: true + + /ansi-regex@5.0.1: + resolution: + { + integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, + } + engines: { node: ">=8" } + + /ansi-regex@6.0.1: + resolution: + { + integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==, + } + engines: { node: ">=12" } + dev: true + + /ansi-styles@4.3.0: + resolution: + { + integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, + } + engines: { node: ">=8" } + dependencies: + color-convert: 2.0.1 + + /ansi-styles@6.2.1: + resolution: + { + integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==, + } + engines: { node: ">=12" } + dev: true + + /argparse@2.0.1: + resolution: + { + integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==, + } + + /balanced-match@1.0.2: + resolution: + { + integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, + } + + /brace-expansion@1.1.11: + resolution: + { + integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==, + } + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + /braces@3.0.2: + resolution: + { + integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==, + } + engines: { node: ">=8" } + dependencies: + fill-range: 7.0.1 + dev: true + + /callsites@3.1.0: + resolution: + { + integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==, + } + engines: { node: ">=6" } + + /chalk@4.1.2: + resolution: + { + integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==, + } + engines: { node: ">=10" } + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + /chalk@5.3.0: + resolution: + { + integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==, + } + engines: { node: ^12.17.0 || ^14.13 || >=16.0.0 } + dev: true + + /cli-cursor@4.0.0: + resolution: + { + integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + dependencies: + restore-cursor: 4.0.0 + dev: true + + /cli-truncate@3.1.0: + resolution: + { + integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + dependencies: + slice-ansi: 5.0.0 + string-width: 5.1.2 + dev: true + + /color-convert@2.0.1: + resolution: + { + integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, + } + engines: { node: ">=7.0.0" } + dependencies: + color-name: 1.1.4 + + /color-name@1.1.4: + resolution: + { + integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, + } + + /colorette@2.0.20: + resolution: + { + integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==, + } + dev: true + + /commander@11.0.0: + resolution: + { + integrity: sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==, + } + engines: { node: ">=16" } + dev: true + + /concat-map@0.0.1: + resolution: + { + integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, + } + + /cross-spawn@7.0.3: + resolution: + { + integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==, + } + engines: { node: ">= 8" } + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + /debug@4.3.4: + resolution: + { + integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==, + } + engines: { node: ">=6.0" } + peerDependencies: + supports-color: "*" + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + + /deep-is@0.1.4: + resolution: + { + integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==, + } + + /doctrine@3.0.0: + resolution: + { + integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==, + } + engines: { node: ">=6.0.0" } + dependencies: + esutils: 2.0.3 + + /eastasianwidth@0.2.0: + resolution: + { + integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==, + } + dev: true + + /emoji-regex@9.2.2: + resolution: + { + integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==, + } + dev: true + + /escape-string-regexp@4.0.0: + resolution: + { + integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==, + } + engines: { node: ">=10" } + + /eslint-config-prettier@8.10.0(eslint@8.54.0): + resolution: + { + integrity: sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==, + } + hasBin: true + peerDependencies: + eslint: ">=7.0.0" + dependencies: + eslint: 8.54.0 + dev: true + + /eslint-scope@7.2.2: + resolution: + { + integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + /eslint-visitor-keys@3.4.3: + resolution: + { + integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + + /eslint@8.54.0: + resolution: + { + integrity: sha512-NY0DfAkM8BIZDVl6PgSa1ttZbx3xHgJzSNJKYcQglem6CppHyMhRIQkBVSSMaSRnLhig3jsDbEzOjwCVt4AmmA==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + hasBin: true + dependencies: + "@eslint-community/eslint-utils": 4.4.0(eslint@8.54.0) + "@eslint-community/regexpp": 4.10.0 + "@eslint/eslintrc": 2.1.3 + "@eslint/js": 8.54.0 + "@humanwhocodes/config-array": 0.11.13 + "@humanwhocodes/module-importer": 1.0.1 + "@nodelib/fs.walk": 1.2.8 + "@ungap/structured-clone": 1.2.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.23.0 + graphemer: 1.4.0 + ignore: 5.3.0 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.3 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + + /espree@9.6.1: + resolution: + { + integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + dependencies: + acorn: 8.11.2 + acorn-jsx: 5.3.2(acorn@8.11.2) + eslint-visitor-keys: 3.4.3 + + /esquery@1.5.0: + resolution: + { + integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==, + } + engines: { node: ">=0.10" } + dependencies: + estraverse: 5.3.0 + + /esrecurse@4.3.0: + resolution: + { + integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==, + } + engines: { node: ">=4.0" } + dependencies: + estraverse: 5.3.0 + + /estraverse@5.3.0: + resolution: + { + integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==, + } + engines: { node: ">=4.0" } + + /esutils@2.0.3: + resolution: + { + integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==, + } + engines: { node: ">=0.10.0" } + + /eventemitter3@5.0.1: + resolution: + { + integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==, + } + dev: true + + /execa@7.2.0: + resolution: + { + integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==, + } + engines: { node: ^14.18.0 || ^16.14.0 || >=18.0.0 } + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 4.3.1 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.1.0 + onetime: 6.0.0 + signal-exit: 3.0.7 + strip-final-newline: 3.0.0 + dev: true + + /fast-deep-equal@3.1.3: + resolution: + { + integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==, + } + + /fast-json-stable-stringify@2.1.0: + resolution: + { + integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==, + } + + /fast-levenshtein@2.0.6: + resolution: + { + integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==, + } + + /fastq@1.15.0: + resolution: + { + integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==, + } + dependencies: + reusify: 1.0.4 + + /file-entry-cache@6.0.1: + resolution: + { + integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==, + } + engines: { node: ^10.12.0 || >=12.0.0 } + dependencies: + flat-cache: 3.2.0 + + /fill-range@7.0.1: + resolution: + { + integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==, + } + engines: { node: ">=8" } + dependencies: + to-regex-range: 5.0.1 + dev: true + + /find-up@5.0.0: + resolution: + { + integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==, + } + engines: { node: ">=10" } + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + /flat-cache@3.2.0: + resolution: + { + integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==, + } + engines: { node: ^10.12.0 || >=12.0.0 } + dependencies: + flatted: 3.2.9 + keyv: 4.5.4 + rimraf: 3.0.2 + + /flatted@3.2.9: + resolution: + { + integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==, + } + + /fs.realpath@1.0.0: + resolution: + { + integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==, + } + + /get-stream@6.0.1: + resolution: + { + integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==, + } + engines: { node: ">=10" } + dev: true + + /glob-parent@6.0.2: + resolution: + { + integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==, + } + engines: { node: ">=10.13.0" } + dependencies: + is-glob: 4.0.3 + + /glob@7.2.3: + resolution: + { + integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==, + } + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + /globals@13.23.0: + resolution: + { + integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==, + } + engines: { node: ">=8" } + dependencies: + type-fest: 0.20.2 + + /graphemer@1.4.0: + resolution: + { + integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==, + } + + /has-flag@4.0.0: + resolution: + { + integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, + } + engines: { node: ">=8" } + + /human-signals@4.3.1: + resolution: + { + integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==, + } + engines: { node: ">=14.18.0" } + dev: true + + /husky@8.0.3: + resolution: + { + integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==, + } + engines: { node: ">=14" } + hasBin: true + dev: true + + /ignore@5.3.0: + resolution: + { + integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==, + } + engines: { node: ">= 4" } + + /import-fresh@3.3.0: + resolution: + { + integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==, + } + engines: { node: ">=6" } + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + /imurmurhash@0.1.4: + resolution: + { + integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==, + } + engines: { node: ">=0.8.19" } + + /inflight@1.0.6: + resolution: + { + integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==, + } + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + /inherits@2.0.4: + resolution: + { + integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, + } + + /is-extglob@2.1.1: + resolution: + { + integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, + } + engines: { node: ">=0.10.0" } + + /is-fullwidth-code-point@4.0.0: + resolution: + { + integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==, + } + engines: { node: ">=12" } + dev: true + + /is-glob@4.0.3: + resolution: + { + integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, + } + engines: { node: ">=0.10.0" } + dependencies: + is-extglob: 2.1.1 + + /is-number@7.0.0: + resolution: + { + integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, + } + engines: { node: ">=0.12.0" } + dev: true + + /is-path-inside@3.0.3: + resolution: + { + integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==, + } + engines: { node: ">=8" } + + /is-stream@3.0.0: + resolution: + { + integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + dev: true + + /isexe@2.0.0: + resolution: + { + integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, + } + + /js-yaml@4.1.0: + resolution: + { + integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==, + } + hasBin: true + dependencies: + argparse: 2.0.1 + + /json-buffer@3.0.1: + resolution: + { + integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==, + } + + /json-schema-traverse@0.4.1: + resolution: + { + integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==, + } + + /json-stable-stringify-without-jsonify@1.0.1: + resolution: + { + integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==, + } + + /keyv@4.5.4: + resolution: + { + integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==, + } + dependencies: + json-buffer: 3.0.1 + + /levn@0.4.1: + resolution: + { + integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==, + } + engines: { node: ">= 0.8.0" } + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + /lilconfig@2.1.0: + resolution: + { + integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==, + } + engines: { node: ">=10" } + dev: true + + /lint-staged@13.3.0: + resolution: + { + integrity: sha512-mPRtrYnipYYv1FEE134ufbWpeggNTo+O/UPzngoaKzbzHAthvR55am+8GfHTnqNRQVRRrYQLGW9ZyUoD7DsBHQ==, + } + engines: { node: ^16.14.0 || >=18.0.0 } + hasBin: true + dependencies: + chalk: 5.3.0 + commander: 11.0.0 + debug: 4.3.4 + execa: 7.2.0 + lilconfig: 2.1.0 + listr2: 6.6.1 + micromatch: 4.0.5 + pidtree: 0.6.0 + string-argv: 0.3.2 + yaml: 2.3.1 + transitivePeerDependencies: + - enquirer + - supports-color + dev: true + + /listr2@6.6.1: + resolution: + { + integrity: sha512-+rAXGHh0fkEWdXBmX+L6mmfmXmXvDGEKzkjxO+8mP3+nI/r/CWznVBvsibXdxda9Zz0OW2e2ikphN3OwCT/jSg==, + } + engines: { node: ">=16.0.0" } + peerDependencies: + enquirer: ">= 2.3.0 < 3" + peerDependenciesMeta: + enquirer: + optional: true + dependencies: + cli-truncate: 3.1.0 + colorette: 2.0.20 + eventemitter3: 5.0.1 + log-update: 5.0.1 + rfdc: 1.3.0 + wrap-ansi: 8.1.0 + dev: true + + /locate-path@6.0.0: + resolution: + { + integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==, + } + engines: { node: ">=10" } + dependencies: + p-locate: 5.0.0 + + /lodash.merge@4.6.2: + resolution: + { + integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==, + } + + /log-update@5.0.1: + resolution: + { + integrity: sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + dependencies: + ansi-escapes: 5.0.0 + cli-cursor: 4.0.0 + slice-ansi: 5.0.0 + strip-ansi: 7.1.0 + wrap-ansi: 8.1.0 + dev: true + + /merge-stream@2.0.0: + resolution: + { + integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==, + } + dev: true + + /micromatch@4.0.5: + resolution: + { + integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==, + } + engines: { node: ">=8.6" } + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: true + + /mimic-fn@2.1.0: + resolution: + { + integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==, + } + engines: { node: ">=6" } + dev: true + + /mimic-fn@4.0.0: + resolution: + { + integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==, + } + engines: { node: ">=12" } + dev: true + + /minimatch@3.1.2: + resolution: + { + integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==, + } + dependencies: + brace-expansion: 1.1.11 + + /ms@2.1.2: + resolution: + { + integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==, + } + + /natural-compare@1.4.0: + resolution: + { + integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==, + } + + /npm-run-path@5.1.0: + resolution: + { + integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + dependencies: + path-key: 4.0.0 + dev: true + + /once@1.4.0: + resolution: + { + integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, + } + dependencies: + wrappy: 1.0.2 + + /onetime@5.1.2: + resolution: + { + integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==, + } + engines: { node: ">=6" } + dependencies: + mimic-fn: 2.1.0 + dev: true + + /onetime@6.0.0: + resolution: + { + integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==, + } + engines: { node: ">=12" } + dependencies: + mimic-fn: 4.0.0 + dev: true + + /optionator@0.9.3: + resolution: + { + integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==, + } + engines: { node: ">= 0.8.0" } + dependencies: + "@aashutoshrathi/word-wrap": 1.2.6 + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + + /p-limit@3.1.0: + resolution: + { + integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==, + } + engines: { node: ">=10" } + dependencies: + yocto-queue: 0.1.0 + + /p-locate@5.0.0: + resolution: + { + integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==, + } + engines: { node: ">=10" } + dependencies: + p-limit: 3.1.0 + + /parent-module@1.0.1: + resolution: + { + integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==, + } + engines: { node: ">=6" } + dependencies: + callsites: 3.1.0 + + /path-exists@4.0.0: + resolution: + { + integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==, + } + engines: { node: ">=8" } + + /path-is-absolute@1.0.1: + resolution: + { + integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==, + } + engines: { node: ">=0.10.0" } + + /path-key@3.1.1: + resolution: + { + integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==, + } + engines: { node: ">=8" } + + /path-key@4.0.0: + resolution: + { + integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==, + } + engines: { node: ">=12" } + dev: true + + /picomatch@2.3.1: + resolution: + { + integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, + } + engines: { node: ">=8.6" } + dev: true + + /pidtree@0.6.0: + resolution: + { + integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==, + } + engines: { node: ">=0.10" } + hasBin: true + dev: true + + /prelude-ls@1.2.1: + resolution: + { + integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==, + } + engines: { node: ">= 0.8.0" } + + /prettier@2.8.4: + resolution: + { + integrity: sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==, + } + engines: { node: ">=10.13.0" } + hasBin: true + dev: true + + /punycode@2.3.1: + resolution: + { + integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==, + } + engines: { node: ">=6" } + + /queue-microtask@1.2.3: + resolution: + { + integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, + } + + /resolve-from@4.0.0: + resolution: + { + integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==, + } + engines: { node: ">=4" } + + /restore-cursor@4.0.0: + resolution: + { + integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + dev: true + + /reusify@1.0.4: + resolution: + { + integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==, + } + engines: { iojs: ">=1.0.0", node: ">=0.10.0" } + + /rfdc@1.3.0: + resolution: + { + integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==, + } + dev: true + + /rimraf@3.0.2: + resolution: + { + integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==, + } + hasBin: true + dependencies: + glob: 7.2.3 + + /run-parallel@1.2.0: + resolution: + { + integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==, + } + dependencies: + queue-microtask: 1.2.3 + + /shebang-command@2.0.0: + resolution: + { + integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==, + } + engines: { node: ">=8" } + dependencies: + shebang-regex: 3.0.0 + + /shebang-regex@3.0.0: + resolution: + { + integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==, + } + engines: { node: ">=8" } + + /signal-exit@3.0.7: + resolution: + { + integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==, + } + dev: true + + /slice-ansi@5.0.0: + resolution: + { + integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==, + } + engines: { node: ">=12" } + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 4.0.0 + dev: true + + /string-argv@0.3.2: + resolution: + { + integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==, + } + engines: { node: ">=0.6.19" } + dev: true + + /string-width@5.1.2: + resolution: + { + integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==, + } + engines: { node: ">=12" } + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + dev: true + + /strip-ansi@6.0.1: + resolution: + { + integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, + } + engines: { node: ">=8" } + dependencies: + ansi-regex: 5.0.1 + + /strip-ansi@7.1.0: + resolution: + { + integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==, + } + engines: { node: ">=12" } + dependencies: + ansi-regex: 6.0.1 + dev: true + + /strip-final-newline@3.0.0: + resolution: + { + integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==, + } + engines: { node: ">=12" } + dev: true + + /strip-json-comments@3.1.1: + resolution: + { + integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==, + } + engines: { node: ">=8" } + + /supports-color@7.2.0: + resolution: + { + integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==, + } + engines: { node: ">=8" } + dependencies: + has-flag: 4.0.0 + + /text-table@0.2.0: + resolution: + { + integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==, + } + + /to-regex-range@5.0.1: + resolution: + { + integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, + } + engines: { node: ">=8.0" } + dependencies: + is-number: 7.0.0 + dev: true + + /type-check@0.4.0: + resolution: + { + integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==, + } + engines: { node: ">= 0.8.0" } + dependencies: + prelude-ls: 1.2.1 + + /type-fest@0.20.2: + resolution: + { + integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==, + } + engines: { node: ">=10" } + + /type-fest@1.4.0: + resolution: + { + integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==, + } + engines: { node: ">=10" } + dev: true + + /uri-js@4.4.1: + resolution: + { + integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==, + } + dependencies: + punycode: 2.3.1 + + /which@2.0.2: + resolution: + { + integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==, + } + engines: { node: ">= 8" } + hasBin: true + dependencies: + isexe: 2.0.0 + + /wrap-ansi@8.1.0: + resolution: + { + integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==, + } + engines: { node: ">=12" } + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + dev: true + + /wrappy@1.0.2: + resolution: + { + integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, + } + + /yaml@2.3.1: + resolution: + { + integrity: sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==, + } + engines: { node: ">= 14" } + dev: true + + /yocto-queue@0.1.0: + resolution: + { + integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==, + } + engines: { node: ">=10" } diff --git a/style/alt.index.html b/style/alt.index.html new file mode 100755 index 0000000..de771aa --- /dev/null +++ b/style/alt.index.html @@ -0,0 +1,27 @@ + + + + + + + Array in a Matrix + + + + + + +
+ + +
+ + diff --git a/style/alt.style.css b/style/alt.style.css new file mode 100755 index 0000000..ae55ffe --- /dev/null +++ b/style/alt.style.css @@ -0,0 +1,315 @@ +:root { + --primary: #fff; + --secondary: rgba(0, 0, 0, 0.5); + --tertiary: #151b74; + --transparent: transparent; +} + +/* Animations */ +@-webkit-keyframes bg-scrolling-reverse { + 100% { + background-position: 50px 50px; + } +} + +@-moz-keyframes bg-scrolling-reverse { + 100% { + background-position: 50px 50px; + } +} + +@-o-keyframes bg-scrolling-reverse { + 100% { + background-position: 50px 50px; + } +} + +@keyframes bg-scrolling-reverse { + 100% { + background-position: 50px 50px; + } +} + +@-webkit-keyframes bg-scrolling { + 0% { + background-position: 50px 50px; + } +} + +@-moz-keyframes bg-scrolling { + 0% { + background-position: 50px 50px; + } +} + +@-o-keyframes bg-scrolling { + 0% { + background-position: 50px 50px; + } +} + +@keyframes bg-scrolling { + 0% { + background-position: 50px 50px; + } +} + +/* Main styles */ +body { + margin-top: 13.5rem; + color: var(--primary); + font-family: Utopia, "Liberation Serif"; + text-align: center; + /* img size is 50x50 */ + background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAABbmlDQ1BpY2MAACiRdZE7SwNBFIW/RCWikRRaBLHYQsVCJSiIpcbCJkiICr6aZPMSNuuyu0HEVrCxCFiINr4K/4G2gq2CICiCiI1/wFcjYb2TBBJEZ5m9H2fmXGbOgD9m6AWnOQIF07UT01FtYXFJC7wSIEwnw/iSumNNxuMx/h1f9/hUvRtSvf7f9+doT2ccHXytwmO6ZbvCE8KxdddSvCPcpeeTaeEj4UFbDih8rfRUlV8U56r8odieS0yBX/XUcg2camA9bxeEB4R7C0ZRr51H3SSYMednpXbL7MEhwTRRNFIUWcXAZUiqKZn97YtUfDOsiUeXv8UGtjhy5MU7KGpRumakZkXPyGewoXL/naeTHR2pdg9GoeXZ8977ILAL5ZLnfR97XvkEmp7g0qz71ySn8U/RS3Wt9xBCW3B+VddSe3CxDeFHK2knK1KTTH82C29n0LEInbfQtlzNqrbO6QPMbcoT3cD+AfTL/tDKD92VZ/plHO89AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAuElEQVRoBe3awQ2CQABEUbUEbJEEi5ISpQVETuY38LPkk5gwp9mdx9H7srz2dX3fpul5G/XZts959H2e5/14G/Z3nv+QGPYC/+M/Rv2ceO4uwkXsnIgtwP5EuIidE7EF2J8IF7FzIrYA+xPhInZOxBZgfyJcxM6J2ALsT4SL2DkRW4D9iXAROydiC7A/ES5i50RsAfYnwkXsnIgtwP5EuIidE7EF2J8IF7FzIrYA+y8j8rvYJf6v9QVf2KG69fWg3gAAAABJRU5ErkJggg==") + repeat 0 0; + -webkit-animation: bg-scrolling-reverse 0.92s infinite; + /* Safari 4+ */ + -moz-animation: bg-scrolling-reverse 0.92s infinite; + /* Fx 5+ */ + -o-animation: bg-scrolling-reverse 0.92s infinite; + /* Opera 12+ */ + animation: bg-scrolling-reverse 0.92s infinite; + /* IE 10+ */ + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -o-animation-timing-function: linear; + animation-timing-function: linear; +} + +.larger-name { + font-size: larger; +} + +.smaller-name { + font-size: smaller; +} + +.main-content { + font-family: "Montserrat", sans-serif; +} + +.project-name { + color: --primary; + font-family: Utopia, "Liberation Serif"; +} + +@media screen and (min-width: 64em) { + .project-name { + font-size: 8rem; + } + + .main-content { + font-size: 1.5rem; + } +} + +@media screen and (min-width: 42em) and (max-width: 64em) { + .project-name { + font-size: 4rem; + } + + .main-content { + font-size: 1.25rem; + } +} + +@media screen and (max-width: 42em) { + .project-name { + font-size: 2rem; + } + + .main-content { + font-size: 1rem; + } +} + +a { + background-color: var(--transparent); +} + +a:active, +a:hover { + outline: 0; +} + +a { + color: var(--tertiary); + text-decoration: none; +} + +a:hover { + text-decoration: underline; +} + +.btn { + display: inline-block; + margin-bottom: 1rem; + color: var(--primary); + background-color: var(--secondary); + border-color: rgba(255, 255, 255, 0.2); + border-style: solid; + border-width: 1px; + border-radius: 0.3rem; + transition: color 0.2s, background-color 0.2s, border-color 0.2s; +} + +.btn:hover { + color: rgba(255, 255, 255, 0.8); + text-decoration: none; + background-color: rgba(255, 255, 255, 0.2); + border-color: rgba(255, 255, 255, 0.3); +} + +.btn + .btn { + margin-left: 1rem; +} + +@media screen and (min-width: 64em) { + .btn { + padding: 0.75rem 1rem; + } +} + +@media screen and (min-width: 42em) and (max-width: 64em) { + .btn { + padding: 0.6rem 0.9rem; + font-size: 0.9rem; + } +} + +@media screen and (max-width: 42em) { + .btn { + display: block; + width: 100%; + padding: 0.75rem; + font-size: 0.9rem; + } + + .btn + .btn { + margin-top: 1rem; + margin-left: 0; + } +} + +* { + box-sizing: border-box; +} + +button, +input, +optgroup, +select, +textarea { + color: inherit; + font: inherit; + margin: 0; +} + +button { + overflow: visible; +} + +button, +select { + text-transform: none; +} + +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; + cursor: pointer; +} + +button[disabled], +html input[disabled] { + cursor: default; +} + +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; +} + +.dropdown { + position: relative; + display: inline-block; +} + +.dropdown-content { + display: none; + position: relative; +} + +.dropdown:hover .dropdown-content { + display: block; +} + +.project-tagline { + margin-bottom: 2rem; + font-weight: normal; + opacity: 0.7; + font-family: "Montserrat", sans-serif; +} + +@media screen and (min-width: 64em) { + .project-tagline { + font-size: 1.25rem; + } +} + +@media screen and (min-width: 42em) and (max-width: 64em) { + .project-tagline { + font-size: 1.15rem; + } +} + +@media screen and (max-width: 42em) { + .project-tagline { + font-size: 1rem; + } +} + +footer, +site-footer { + font-family: "Montserrat", sans-serif; + font-size: small; + display: block; +} + +@media screen and (min-width: 64em) { + .site-footer { + font-size: 1rem; + } +} + +@media screen and (min-width: 42em) and (max-width: 64em) { + .site-footer { + font-size: 1rem; + } +} + +@media screen and (max-width: 42em) { + .site-footer { + font-size: 0.9rem; + } +} + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} diff --git a/style/style.css b/style/style.css new file mode 100755 index 0000000..11d5c7e --- /dev/null +++ b/style/style.css @@ -0,0 +1,744 @@ +/*! normalize.css v3.0.2 | MIT License | git.io/normalize */ +@import url("https://fonts.googleapis.com/css?family=Open+Sans:400,700&display=swap"); + +html { + font-family: "Montserrat", sans-serif; + -ms-text-size-adjust: 100%; + -webkit-text-size-adjust: 100%; +} + +body { + margin: 0; +} + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +menu, +nav, +section, +summary { + display: block; +} + +audio, +canvas, +progress, +video { + display: inline-block; + vertical-align: baseline; +} + +audio:not([controls]) { + display: none; + height: 0; +} + +[hidden], +template { + display: none; +} + +a { + background-color: transparent; +} + +a:active, +a:hover { + outline: 0; +} + +abbr[title] { + border-bottom: 1px dotted; +} + +b, +strong { + font-weight: bold; +} + +dfn { + font-style: italic; +} + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +mark { + background: #ff0; + color: #000; +} + +small { + font-size: 80%; +} + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +img { + border: 0; +} + +svg:not(:root) { + overflow: hidden; +} + +figure { + margin: 1em 40px; +} + +hr { + box-sizing: content-box; + height: 0; +} + +pre { + overflow: auto; +} + +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; +} + +button, +input, +optgroup, +select, +textarea { + color: inherit; + font: inherit; + margin: 0; +} + +button { + overflow: visible; +} + +button, +select { + text-transform: none; +} + +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; + cursor: pointer; +} + +button[disabled], +html input[disabled] { + cursor: default; +} + +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; +} + +input { + line-height: normal; +} + +input[type="checkbox"], +input[type="radio"] { + box-sizing: border-box; + padding: 0; +} + +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +input[type="search"] { + -webkit-appearance: textfield; + box-sizing: content-box; +} + +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} + +legend { + border: 0; + padding: 0; +} + +textarea { + overflow: auto; +} + +optgroup { + font-weight: bold; +} + +table { + border-collapse: collapse; + border-spacing: 0; +} + +td, +th { + padding: 0; +} + +* { + box-sizing: border-box; +} + +body { + padding: 0; + margin: 0; + font-family: "Montserrat", sans-serif; + font-size: 16px; + line-height: 1.5; + color: #606c71; +} + +#skip-to-content { + height: 1px; + width: 1px; + position: absolute; + overflow: hidden; + top: -10px; +} + +#skip-to-content:focus { + position: fixed; + top: 10px; + left: 10px; + height: auto; + width: auto; + background: #e19447; + outline: thick solid #e19447; +} + +a { + color: #1e6bb8; + text-decoration: none; +} + +a:hover { + text-decoration: underline; +} + +.btn { + display: inline-block; + margin-bottom: 1rem; + color: rgba(255, 255, 255, 0.7); + background-color: rgba(255, 255, 255, 0.08); + border-color: rgba(255, 255, 255, 0.2); + border-style: solid; + border-width: 1px; + border-radius: 0.3rem; + transition: color 0.2s, background-color 0.2s, border-color 0.2s; +} + +.btn:hover { + color: rgba(255, 255, 255, 0.8); + text-decoration: none; + background-color: rgba(255, 255, 255, 0.2); + border-color: rgba(255, 255, 255, 0.3); +} + +.btn + .btn { + margin-left: 1rem; +} + +@media screen and (min-width: 64em) { + .btn { + padding: 0.75rem 1rem; + } +} + +@media screen and (min-width: 42em) and (max-width: 64em) { + .btn { + padding: 0.6rem 0.9rem; + font-size: 0.9rem; + } +} + +@media screen and (max-width: 42em) { + .btn { + display: block; + width: 100%; + padding: 0.75rem; + font-size: 0.9rem; + } + + .btn + .btn { + margin-top: 1rem; + margin-left: 0; + } +} + +.page-header { + color: #fff; + text-align: center; +} + +@-webkit-keyframes bg-scrolling-reverse { + 100% { + background-position: 50px 50px; + } +} + +@-moz-keyframes bg-scrolling-reverse { + 100% { + background-position: 50px 50px; + } +} + +@-o-keyframes bg-scrolling-reverse { + 100% { + background-position: 50px 50px; + } +} + +@keyframes bg-scrolling-reverse { + 100% { + background-position: 50px 50px; + } +} + +@-webkit-keyframes bg-scrolling { + 0% { + background-position: 50px 50px; + } +} + +@-moz-keyframes bg-scrolling { + 0% { + background-position: 50px 50px; + } +} + +@-o-keyframes bg-scrolling { + 0% { + background-position: 50px 50px; + } +} + +@keyframes bg-scrolling { + 0% { + background-position: 50px 50px; + } +} + +body { + background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAABbmlDQ1BpY2MAACiRdZE7SwNBFIW/RCWikRRaBLHYQsVCJSiIpcbCJkiICr6aZPMSNuuyu0HEVrCxCFiINr4K/4G2gq2CICiCiI1/wFcjYb2TBBJEZ5m9H2fmXGbOgD9m6AWnOQIF07UT01FtYXFJC7wSIEwnw/iSumNNxuMx/h1f9/hUvRtSvf7f9+doT2ccHXytwmO6ZbvCE8KxdddSvCPcpeeTaeEj4UFbDih8rfRUlV8U56r8odieS0yBX/XUcg2camA9bxeEB4R7C0ZRr51H3SSYMednpXbL7MEhwTRRNFIUWcXAZUiqKZn97YtUfDOsiUeXv8UGtjhy5MU7KGpRumakZkXPyGewoXL/naeTHR2pdg9GoeXZ8977ILAL5ZLnfR97XvkEmp7g0qz71ySn8U/RS3Wt9xBCW3B+VddSe3CxDeFHK2knK1KTTH82C29n0LEInbfQtlzNqrbO6QPMbcoT3cD+AfTL/tDKD92VZ/plHO89AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAuElEQVRoBe3awQ2CQABEUbUEbJEEi5ISpQVETuY38LPkk5gwp9mdx9H7srz2dX3fpul5G/XZts959H2e5/14G/Z3nv+QGPYC/+M/Rv2ceO4uwkXsnIgtwP5EuIidE7EF2J8IF7FzIrYA+xPhInZOxBZgfyJcxM6J2ALsT4SL2DkRW4D9iXAROydiC7A/ES5i50RsAfYnwkXsnIgtwP5EuIidE7EF2J8IF7FzIrYA+y8j8rvYJf6v9QVf2KG69fWg3gAAAABJRU5ErkJggg==") + repeat 0 0; + -webkit-animation: bg-scrolling-reverse 0.92s infinite; + /* Safari 4+ */ + -moz-animation: bg-scrolling-reverse 0.92s infinite; + /* Fx 5+ */ + -o-animation: bg-scrolling-reverse 0.92s infinite; + /* Opera 12+ */ + animation: bg-scrolling-reverse 0.92s infinite; + /* IE 10+ */ + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -o-animation-timing-function: linear; + animation-timing-function: linear; +} + +@media screen and (min-width: 64em) { + .page-header { + padding: 5rem 6rem; + } +} + +@media screen and (min-width: 42em) and (max-width: 64em) { + .page-header { + padding: 3rem 4rem; + } +} + +@media screen and (max-width: 42em) { + .page-header { + padding: 2rem 1rem; + } +} + +.project-name { + margin-top: 0; + margin-bottom: 0.1rem; +} + +@media screen and (min-width: 64em) { + .project-name { + font-size: 3.25rem; + } +} + +@media screen and (min-width: 42em) and (max-width: 64em) { + .project-name { + font-size: 2.25rem; + } +} + +@media screen and (max-width: 42em) { + .project-name { + font-size: 1.75rem; + } +} + +.project-tagline { + margin-bottom: 2rem; + font-weight: normal; + opacity: 0.7; +} + +@media screen and (min-width: 64em) { + .project-tagline { + font-size: 1.25rem; + } +} + +@media screen and (min-width: 42em) and (max-width: 64em) { + .project-tagline { + font-size: 1.15rem; + } +} + +@media screen and (max-width: 42em) { + .project-tagline { + font-size: 1rem; + } +} + +.main-content { + word-wrap: break-word; + background-color: #fff; + background-color: rgba(250, 250, 250, 0.712); +} + +.main-content :first-child { + margin-top: 0; +} + +@media screen and (min-width: 64em) { + .main-content { + max-width: 64rem; + padding: 2rem 6rem; + margin: 0 auto; + font-size: 1.1rem; + } +} + +@media screen and (min-width: 42em) and (max-width: 64em) { + .main-content { + padding: 2rem 4rem; + font-size: 1.1rem; + } +} + +@media screen and (max-width: 42em) { + .main-content { + padding: 2rem 1rem; + font-size: 1rem; + } +} + +.main-content kbd { + background-color: #fafbfc; + border: 1px solid #c6cbd1; + border-bottom-color: #959da5; + border-radius: 3px; + box-shadow: inset 0 -1px 0 #959da5; + color: #444d56; + display: inline-block; + font-size: 11px; + line-height: 10px; + padding: 3px 5px; + vertical-align: middle; +} + +.main-content img { + max-width: 100%; +} + +.main-content h1, +.main-content h2, +.main-content h3, +.main-content h4, +.main-content h5, +.main-content h6 { + margin-top: 2rem; + margin-bottom: 1rem; + font-weight: normal; + color: #000; +} + +.main-content p { + margin-bottom: 1em; +} + +.main-content code { + padding: 2px 4px; + font-family: "Montserrat", sans-serif; + font-size: 0.9rem; + color: #567482; + background-color: #f3f6fa; + border-radius: 0.3rem; +} + +.main-content pre { + padding: 0.8rem; + margin-top: 0; + margin-bottom: 1rem; + font: 1rem Consolas, "Liberation Mono", Menlo, Courier, monospace; + color: #567482; + word-wrap: normal; + background-color: #f3f6fa; + border: solid 1px #dce6f0; + border-radius: 0.3rem; +} + +.main-content pre > code { + padding: 0; + margin: 0; + font-size: 0.9rem; + color: #567482; + word-break: normal; + white-space: pre; + background: transparent; + border: 0; +} + +.main-content .highlight { + margin-bottom: 1rem; +} + +.main-content .highlight pre { + margin-bottom: 0; + word-break: normal; +} + +.main-content .highlight pre, +.main-content pre { + padding: 0.8rem; + overflow: auto; + font-size: 0.9rem; + line-height: 1.45; + border-radius: 0.3rem; + -webkit-overflow-scrolling: touch; +} + +.main-content pre code, +.main-content pre tt { + display: inline; + max-width: initial; + padding: 0; + margin: 0; + overflow: initial; + line-height: inherit; + word-wrap: normal; + background-color: transparent; + border: 0; +} + +.main-content pre code:before, +.main-content pre code:after, +.main-content pre tt:before, +.main-content pre tt:after { + content: normal; +} + +.main-content ul, +.main-content ol { + margin-top: 0; +} + +.main-content blockquote { + padding: 0 1rem; + margin-left: 0; + color: #819198; + border-left: 0.3rem solid #dce6f0; +} + +.main-content blockquote > :first-child { + margin-top: 0; +} + +.main-content blockquote > :last-child { + margin-bottom: 0; +} + +.main-content table { + display: block; + width: 100%; + overflow: auto; + word-break: normal; + word-break: keep-all; + -webkit-overflow-scrolling: touch; +} + +.main-content table th { + font-weight: bold; +} + +.main-content table th, +.main-content table td { + padding: 0.5rem 1rem; + border: 1px solid #e9ebec; +} + +.main-content dl { + padding: 0; +} + +.main-content dl dt { + padding: 0; + margin-top: 1rem; + font-size: 1rem; + font-weight: bold; +} + +.main-content dl dd { + padding: 0; + margin-bottom: 1rem; +} + +.main-content hr { + height: 2px; + padding: 0; + margin: 1rem 0; + background-color: #dce6f0; + border: 0; +} + +.site-footer { + padding-top: 2rem; + margin-top: 2rem; + border-top: solid 1px #eff0f1; +} + +@media screen and (min-width: 64em) { + .site-footer { + font-size: 1rem; + } +} + +@media screen and (min-width: 42em) and (max-width: 64em) { + .site-footer { + font-size: 1rem; + } +} + +@media screen and (max-width: 42em) { + .site-footer { + font-size: 0.9rem; + } +} + +.gameButton { + font-size: 400%; + text-align: center; + background-color: rgba(0, 0, 0, 0.08); +} + +.game { + text-align: center; +} + +:target:not(main) { + animation: highlight 1s ease; + transform: translateX(20px); +} + +@keyframes highlight { + 0% { + border-left-color: yellow; + } + + 100% { + border-left-color: rgba(255, 255, 255, 0); + } +} + +:target:not(main) { + border-left: 40px solid rgba(255, 255, 255, 0); + padding: 0px; + transition: all 0.5s ease; + padding-right: 50px; + margin-left: -20px; +} + +.zoom { + transition: transform 0.2s; + margin: 0 auto; +} + +.zoom:hover { + transform: scale(1.5); +} + +.center { + text-align: center; +} + +.grid { + display: flex; + flex-wrap: wrap; + justify-content: space-evenly; + margin: auto; + gap: 4%; +} + +.grid-item { + margin: 4% 0; + width: 15rem; + height: 22rem; + text-align: center; +} + +.grid-item div { + height: 50%; +} + +.grid-item img { + width: 100%; + height: 100%; + object-fit: contain; +} + +.grid-item-banner { + width: 88px; +}