feat: add title and end params for countdown
This commit is contained in:
commit
dd2a962264
6 changed files with 128 additions and 0 deletions
21
LICENSE
Normal file
21
LICENSE
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2024 sup39
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
5
README.md
Normal file
5
README.md
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
# Countdown
|
||||||
|
Countdown web page for sup39
|
||||||
|
|
||||||
|
## Example
|
||||||
|
https://app.sup39.dev/countdown/?title=TITLE&end=2024-12-31%2012:07
|
44
index.html
Normal file
44
index.html
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Countdown | sup39</title>
|
||||||
|
<meta name="description" content="Countdown web page for sup39">
|
||||||
|
<meta name="author" content="sup39">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<link rel="stylesheet" type="text/css" href="https://res.sup39.dev/index.css">
|
||||||
|
<style>
|
||||||
|
main {
|
||||||
|
width: fit-content;
|
||||||
|
}
|
||||||
|
#title {
|
||||||
|
margin-inline-end: 0em;
|
||||||
|
}
|
||||||
|
#ct-root {
|
||||||
|
text-align: end;
|
||||||
|
}
|
||||||
|
#ct-root span[id] {
|
||||||
|
font-size: 1.5em;
|
||||||
|
color: #2ee5b8;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<script src="./index.js"></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<main>
|
||||||
|
<div id="title"></div>
|
||||||
|
<div id="ct-root">
|
||||||
|
<span id="ct-sign"></span>
|
||||||
|
<span id="ct-d">0</span>
|
||||||
|
<span>d</span>
|
||||||
|
<span id="ct-h">00</span>
|
||||||
|
<span>h</span>
|
||||||
|
<span id="ct-m">00</span>
|
||||||
|
<span>m</span>
|
||||||
|
<span id="ct-s">00</span>
|
||||||
|
<span>s</span>
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
<footer>Source code: <a href="https://forgejo.sup39.dev/sup39/countdown">supGit/sup39/countdown</a></footer>
|
||||||
|
</body>
|
||||||
|
</html>
|
43
index.js
Normal file
43
index.js
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
// Copyright (c) 2024 sup39
|
||||||
|
|
||||||
|
document.addEventListener('DOMContentLoaded', () => {
|
||||||
|
const params = new URLSearchParams(window.location.search);
|
||||||
|
const end = +new Date(params.get('end') ?? +new Date());
|
||||||
|
console.log(params.get('end'));
|
||||||
|
|
||||||
|
/** @param {string} selector */
|
||||||
|
const queryKnownSelector = selector =>
|
||||||
|
/**@type{HTMLElement}*/(document.querySelector(selector));
|
||||||
|
|
||||||
|
const title = params.get('title');
|
||||||
|
if (title != null) {
|
||||||
|
queryKnownSelector('#title').textContent = title;
|
||||||
|
}
|
||||||
|
|
||||||
|
const units = [
|
||||||
|
{max: 60, digit: 2, element: queryKnownSelector('#ct-s')},
|
||||||
|
{max: 60, digit: 2, element: queryKnownSelector('#ct-m')},
|
||||||
|
{max: 24, digit: 2, element: queryKnownSelector('#ct-h')},
|
||||||
|
{max: Infinity, digit: 0, element: queryKnownSelector('#ct-d')},
|
||||||
|
];
|
||||||
|
const elmSign = queryKnownSelector('#ct-sign');
|
||||||
|
let t0 = 0;
|
||||||
|
function render() {
|
||||||
|
const t = (end - +new Date()) / 1000 | 0;
|
||||||
|
if (t !== t0) {
|
||||||
|
let val = t;
|
||||||
|
const isMinus = val < 0;
|
||||||
|
if (isMinus) val = -val;
|
||||||
|
elmSign.textContent = isMinus ? '-' : '';
|
||||||
|
for (const {max, digit, element} of units) {
|
||||||
|
element.textContent = String(val % max).padStart(digit, '0');
|
||||||
|
val = val / max | 0;
|
||||||
|
}
|
||||||
|
// next
|
||||||
|
t0 = t;
|
||||||
|
}
|
||||||
|
requestAnimationFrame(render);
|
||||||
|
}
|
||||||
|
render();
|
||||||
|
});
|
7
jsconfig.json
Normal file
7
jsconfig.json
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"lib": ["dom", "es2017"],
|
||||||
|
"checkJs": true,
|
||||||
|
"strict": true
|
||||||
|
}
|
||||||
|
}
|
8
package.json
Normal file
8
package.json
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
{
|
||||||
|
"name": "@sup39/countdown",
|
||||||
|
"version": "0.1.0",
|
||||||
|
"description": "Countdown web page for sup39",
|
||||||
|
"author": "sup39 <dev@sup39.dev>",
|
||||||
|
"license": "MIT",
|
||||||
|
"private": true
|
||||||
|
}
|
Loading…
Reference in a new issue