global: snapshot

This commit is contained in:
k
2024-09-13 22:59:20 +02:00
parent deffaef2b5
commit bf2034b80c
18 changed files with 5154 additions and 645 deletions

View File

@@ -1,4 +1,4 @@
<!doctype html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
@@ -11,22 +11,14 @@
name="viewport"
content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"
/>
<meta
name="theme-color"
content="#fffaf6"
media="(prefers-color-scheme: light)"
/>
<meta
name="theme-color"
content="#110f0e"
media="(prefers-color-scheme: dark)"
/>
<link rel="manifest" href="/manifest.webmanifest" />
<meta name="mobile-web-app-capable" content="yes" />
<!-- Styles -->
<style>
/* Tailwind base */
*,
::after,
::before,
@@ -271,7 +263,6 @@
--line-height-xl: 1.75rem; /* 28px */
--font-weight-base: 450;
--font-weight-medium: 575;
--font-weight-bold: 700;
--transform-scale-active: scaleX(0.95) scaleY(0.9);
@@ -365,11 +356,14 @@
@media (min-width: 768px) {
flex-direction: row;
html[data-display="standalone"] & {
border-top: 1px;
}
}
}
button {
font-weight: var(--font-weight-medium);
cursor: pointer;
background-color: var(--background-color);
@@ -444,7 +438,6 @@
h4 {
font-size: var(--font-size-base);
line-height: var(--line-height-base);
font-weight: var(--font-weight-medium);
}
header {
@@ -517,7 +510,6 @@
flex-direction: column;
user-select: none;
-webkit-user-select: none;
font-weight: var(--font-weight-medium);
color: var(--off-color);
position: relative;
@@ -539,9 +531,7 @@
}
> span.emoji {
line-height: 0.9;
filter: grayscale(100%) brightness(60%) contrast(150%);
font-size: 1.0625rem;
}
> svg.favorite {
@@ -582,7 +572,7 @@
color: var(--off-color);
font-size: var(--font-size-2xs);
line-height: var(--line-height-2xs);
overflow: visible;
overflow: visible !important;
}
> *:not(input[type="radio"]):not(svg) {
@@ -645,10 +635,14 @@
order: 999;
overflow-y: auto;
html[data-display="standalone"] & {
padding-bottom: 1.5rem /* 24px */;
}
@media (min-width: 768px) {
border-width: 0px 1px 0px 0px;
order: 0;
padding: 1rem 0.75rem 1.375rem 0.75rem;
padding: 1rem 0.75rem 1.375rem 0.75rem !important;
}
&,
@@ -767,68 +761,101 @@
.tree {
user-select: none;
-webkit-user-select: none;
font-weight: var(--font-weight-medium);
font-size: var(--font-size-sm);
line-height: var(--line-height-sm);
summary {
list-style: none;
display: flex;
align-items: center;
cursor: pointer;
ul {
overflow: hidden;
&::marker,
&::-webkit-details-marker {
display: none;
}
&:hover,
&[data-highlight] {
* {
color: var(--orange) !important;
}
}
/* &:hover * {
color: var(--orange) !important;
} */
> span.marker {
color: var(--border-color);
font-size: var(--font-size-xs);
line-height: var(--line-height-xs);
z-index: 10;
margin-left: -5px;
margin-bottom: 0.0625rem;
}
> small {
margin-top: 0.125rem;
margin-right: 2.5px;
}
}
li {
display: block;
position: relative;
padding-left: 12px;
border-left: 1px;
&:not(:has(~ li:not([hidden]))) {
border-color: transparent !important;
}
&::before {
content: "";
li {
display: block;
position: absolute;
top: -12px;
left: -1px;
width: 9px;
height: 1.75rem;
border-color: var(--border-color);
border-width: 0 0 1px 1px;
border-radius: 0px 0px 0px 4px;
position: relative;
padding-left: 12px;
border-left: 1px;
&:has(input:checked) {
&::before {
border-color: var(--orange) !important;
}
> details > summary > span.marker {
color: var(--orange) !important;
}
}
&:not(:has(~ li:not([hidden]))) {
border-color: transparent !important;
}
&::before {
content: "";
display: block;
position: absolute;
top: -12px;
left: -1px;
width: 9px;
height: 1.75rem;
border-color: var(--border-color);
border-width: 0 0 1px 1px;
border-radius: 0px 0px 0px 4px;
}
&:has(input:checked) {
> details > summary::after {
border-color: var(--orange) !important;
}
}
&:has(~ li input:checked) {
border-color: var(--orange) !important;
&::before {
z-index: -10;
}
}
> details > summary {
list-style: none;
display: flex;
align-items: center;
cursor: pointer;
position: relative;
&::marker,
&::-webkit-details-marker {
display: none;
}
&:hover {
color: var(--orange);
}
details[open] > & {
&::after {
content: "";
display: block;
position: absolute;
bottom: 0;
height: 12px;
border-color: var(--border-color);
border-width: 0 0 0px 1px;
}
}
> span.marker {
color: var(--border-color);
font-size: var(--font-size-xs);
line-height: var(--line-height-xs);
z-index: 10;
margin-left: -5px;
margin-bottom: 0.0625rem;
}
> small {
margin-top: 0.125rem;
margin-right: 2.5px;
}
}
}
}
}
@@ -876,7 +903,6 @@
}
.sats {
font-weight: 500;
color: var(--orange);
}
}
@@ -916,8 +942,8 @@
display: flex;
align-items: center;
gap: 1.5rem;
margin: 0 -1.5rem;
padding: 0 1.5rem;
margin: -0.75rem -1.5rem;
padding: 0.75rem 1.5rem;
overflow-x: auto;
> div {
@@ -976,12 +1002,6 @@
min-height: 0;
z-index: 20;
> .shadow-bottom {
bottom: 1.75rem;
width: 80px;
left: auto;
}
> .chart-wrapper {
height: 100%;
position: relative;
@@ -1103,8 +1123,14 @@
right: 0;
z-index: 10;
pointer-events: none;
#chart-list > & {
bottom: 1.75rem;
width: 80px;
left: auto;
}
}
.shadow-left:not(:has(~ #selected-frame[hidden])) {
.shadow-left {
position: absolute;
background-image: linear-gradient(
to left,
@@ -1118,7 +1144,7 @@
z-index: 30;
pointer-events: none;
}
.shadow-right:not(:has(~ #selected-frame[hidden])) {
.shadow-right {
position: absolute;
background-image: linear-gradient(
to right,
@@ -1131,6 +1157,10 @@
bottom: 0;
z-index: 10;
pointer-events: none;
&:not(:has(~ #selected-frame:not([hidden]))) {
display: none;
}
}
@media (min-width: 768px) {
@@ -1144,42 +1174,38 @@
<script>
// @ts-check
// Keep in sync with js files
/** @typedef {'system' | 'dark' | 'light'} SettingsTheme */
/**
* @import { SettingsTheme } from "./types/self"
*/
const settingsThemeLocalStorageKey = "settings-theme";
let theme = /** @type {SettingsTheme} */ (
localStorage.getItem(settingsThemeLocalStorageKey) || "system"
const theme = /** @type {SettingsTheme} */ (
localStorage.getItem(settingsThemeLocalStorageKey)
);
if (theme !== "dark" && theme !== "light" && theme !== "system") {
theme = "system";
}
const preferredColorSchemeMatchMedia = window.matchMedia(
"(prefers-color-scheme: dark)",
"(prefers-color-scheme: dark)"
);
function updateDataTheme() {
localStorage.setItem(settingsThemeLocalStorageKey, theme);
if (
theme === "dark" ||
((!theme || theme === "system") &&
preferredColorSchemeMatchMedia.matches)
) {
window.document.documentElement.dataset.theme = "dark";
} else {
window.document.documentElement.dataset.theme = undefined;
}
if (
theme === "dark" ||
(theme !== "light" && preferredColorSchemeMatchMedia.matches)
) {
window.document.documentElement.dataset.theme = "dark";
} else {
delete window.document.documentElement.dataset.theme;
}
updateDataTheme();
const backgroundColor = getComputedStyle(
window.document.documentElement
).getPropertyValue("--background-color");
const meta = window.document.createElement("meta");
meta.name = "theme-color";
meta.content = backgroundColor;
window.document.getElementsByTagName("head")[0].appendChild(meta);
preferredColorSchemeMatchMedia.addEventListener("change", () => {
if (theme === "system") {
updateDataTheme();
}
});
if ("standalone" in window.navigator && !!window.navigator.standalone) {
window.document.documentElement.dataset.display = "standalone";
}
</script>
<!-- Icons -->
@@ -1583,7 +1609,7 @@
for="folders-filter-all"
title="Chart"
>
<span class="absolute" id="folders-filter-all-count">0</span>
<span class="absolute" id="folders-filter-all-count"></span>
<input
type="radio"
name="folders-filter"
@@ -1597,9 +1623,10 @@
for="folders-filter-favorites"
title="Chart"
>
<span class="absolute" id="folders-filter-favorites-count"
>0</span
>
<span
class="absolute"
id="folders-filter-favorites-count"
></span>
<input
type="radio"
name="folders-filter"
@@ -1613,7 +1640,7 @@
for="folders-filter-new"
title="Chart"
>
<span class="absolute" id="folders-filter-new-count">0</span>
<span class="absolute" id="folders-filter-new-count"></span>
<input
type="radio"
name="folders-filter"
@@ -1682,7 +1709,7 @@
<hr />
<h4>General</h4>
<fieldset>
<div class="field">
<div class="field" id="settings-theme-field">
<legend>Theme</legend>
<hr />
<div>
@@ -1695,7 +1722,6 @@
name="settings-theme"
id="settings-theme-system-input"
value="system"
onchange="theme = 'system'; updateDataTheme();"
/>
System
</label>
@@ -1708,7 +1734,6 @@
name="settings-theme"
id="settings-theme-dark-input"
value="dark"
onchange="theme = 'dark'; updateDataTheme();"
/>
Dark
</label>
@@ -1721,33 +1746,10 @@
name="settings-theme"
id="settings-theme-light-input"
value="light"
onchange="theme = 'light'; updateDataTheme();"
/>
Light
</label>
</div>
<script>
switch (/** @type {SettingsTheme} */ (theme)) {
case "light": {
window.document
.getElementById("settings-theme-light-input")
?.click();
break;
}
case "dark": {
window.document
.getElementById("settings-theme-dark-input")
?.click();
break;
}
case "system": {
window.document
.getElementById("settings-theme-system-input")
?.click();
break;
}
}
</script>
</div>
<small>Options for the application's color scheme</small>
</fieldset>
@@ -1765,194 +1767,7 @@
<ol id="leaderboard"></ol>
<small>And everybody else !</small>
<script>
const leaderboard = window.document.getElementById("leaderboard");
if (!leaderboard) throw "Leaderboard should exist by now";
const donations = [
{
name: "_Checkɱate",
// url: "https://xcancel.com/_Checkmatey_",
url: "https://primal.net/p/npub1qh5sal68c8swet6ut0w5evjmj6vnw29x3k967h7atn45unzjyeyq6ceh9r",
amount: 500_000,
},
{
name: "avvi |",
url: "https://primal.net/p/npub1md2q6fexrtmd5hx9gw2p5640vg662sjlpxyz3tdmu4j4g8hhkm6scn6hx3",
amount: 5_000,
},
{
name: "mutatrum",
url: "https://primal.net/p/npub1hklphk7fkfdgmzwclkhshcdqmnvr0wkfdy04j7yjjqa9lhvxuflsa23u2k",
amount: 5_000,
},
{
name: "Gunnar",
url: "https://primal.net/p/npub1rx9wg2d5lhah45xst3580sajcld44m0ll9u5dqhu2t74p6xwufaqwghtd4",
amount: 1_000,
},
{
name: "Blokchain Boog",
url: "https://xcancel.com/BlokchainB",
amount: 1_500 + 1590,
},
{
name: "Josh",
url: "https://primal.net/p/npub1pc57ls4rad5kvsp733suhzl2d4u9y7h4upt952a2pucnalc59teq33dmza",
amount: 1_000,
},
{
name: "Alp",
url: "https://primal.net/p/npub175nul9cvufswwsnpy99lvyhg7ad9nkccxhkhusznxfkr7e0zxthql9g6w0",
amount: 1_000,
},
{
name: "Ulysses",
url: "https://primal.net/p/npub1n7n3dssm90hfsfjtamwh2grpzwjlvd2yffae9pqgg99583lxdypsnn9gtv",
amount: 1_000,
},
{
name: "btcschellingpt",
url: "https://primal.net/p/npub1nvfgglea9zlcs58tcqlc6j26rt50ngkgdk7699wfq4txrx37aqcsz4e7zd",
amount: 1_000 + 1_000,
},
{
name: "Coinatra",
url: "https://primal.net/p/npub1eut9kcejweegwp9waq3a4g03pvprdzkzvjjvl8fvj2a2wlx030eswzfna8",
amount: 1_000,
},
{
name: "Printer Go Brrrr",
url: "https://primal.net/p/npub1l5pxvjzhw77h86tu0sml2gxg8jpwxch7fsj6d05n7vuqpq75v34syk4q0n",
amount: 1_000,
},
{
name: "b81776c32d7b",
url: "https://primal.net/p/npub1hqthdsed0wpg57sqsc5mtyqxxgrh3s7493ja5h49v23v2nhhds4qk4w0kz",
amount: 17_509,
},
{
name: "DerGigi",
url: "https://primal.net/p/npub1dergggklka99wwrs92yz8wdjs952h2ux2ha2ed598ngwu9w7a6fsh9xzpc",
amount: 6001,
},
{
name: "Adarnit",
url: "https://primal.net/p/npub17armdveqy42uhuuuwjc5m2dgjkz7t7epgvwpuccqw8jusm8m0g4sn86n3s",
amount: 17_726,
},
{
name: "Auburn Citadel",
url: "https://primal.net/p/npub1730y5k2s9u82w9snx3hl37r8gpsrmqetc2y3xyx9h65yfpf28rtq0y635y",
amount: 17_471,
},
{
name: "anon",
amount: 210_000,
},
{
name: "Daniel ∞/21M",
url: "https://twitter.com/DanielAngelovBG",
amount: 21_000,
},
{
name: "Ivo",
url: "https://primal.net/p/npub1mnwjn40hr042rsmzu64rsnwsw07uegg4tjkv620c94p6e797wkvq3qeujc",
amount: 5_000,
},
{
name: "lassdas",
url: "https://primal.net/p/npub1gmhctt2hmjqz8ay2x8h5f8fl3h4fpfcezwqneal3usu3u65qca4s8094ea",
amount: 210_000,
},
{
name: "anon",
amount: 21_000,
},
{
name: "xplbzx",
url: "https://primal.net/p/npub1e0f808a350rxrhppu4zylzljt3arfpvrrpqdg6ft78xy6u49kq5slf0g92",
amount: 12_110,
},
{
name: "SoundMoney=Prosperity4ALL",
url: "https://xcancel.com/SoundmoneyP",
amount: 420_000,
},
{
name: "Johan",
url: "https://primal.net/p/npub1a4sd4cprrucfkvkfq9zs99ur4xe7lxw3uhhgvuzx6nqxhnpa2yyqlsa26u",
amount: 500_000,
},
{
name: "highperfocused",
url: "https://primal.net/p/npub1fq8vrf63vsrqjrwqgtwlvauqauc0yme6se8g8dqhcpf6tfs3equqntmzut",
amount: 4620,
},
{
name: "ClearMined",
url: "https://primal.net/p/npub1dj8zwktp3eyktfhs5mjlw8v0v2838xlquxr7ddsanayhcw98fcks8ddrq9",
amount: 300_000,
},
];
donations.sort((a, b) =>
b.amount !== a.amount
? b.amount - a.amount
: a.name.localeCompare(b.name),
);
donations.slice(0, 21).forEach(({ name, url, amount }) => {
const li = window.document.createElement("li");
leaderboard.append(li);
const a = window.document.createElement("a");
a.href = url || "";
a.target = "_blank";
a.rel = "noopener noreferrer";
a.innerHTML = name;
li.append(a);
li.append(" — ");
const small = window.document.createElement("small");
small.classList.add("sats");
small.innerHTML = `${amount.toLocaleString("en-us")} sats`;
li.append(small);
});
</script>
<script>
const standalone =
"standalone" in window.navigator && !!window.navigator.standalone;
const userAgent = navigator.userAgent.toLowerCase();
const isChrome = userAgent.includes("chrome");
const safari = userAgent.includes("safari");
const safariOnly = safari && !isChrome;
const macOS = userAgent.includes("mac os");
const iphone = userAgent.includes("iphone");
const ipad = userAgent.includes("ipad");
if (!standalone && safariOnly && (macOS || ipad || iphone)) {
const frame = window.document.getElementById("settings-frame");
if (!frame) throw "Settings frame should exist by now";
const hr = window.document.createElement("hr");
frame.append(hr);
const heading = window.document.createElement("h4");
heading.innerHTML = "Install";
frame.append(heading);
const p = window.document.createElement("p");
frame.append(p);
if (macOS) {
p.innerHTML = `This app can be installed by clicking on the <strong>File</strong> tab on the menu bar and then on <strong>Add to dock</strong>.`;
} else {
p.innerHTML = `This app can be installed by tapping on the <strong>Share</strong> button tab of Safari and then on <strong>Add to Home Screen</strong>.`;
}
}
</script>
<p id="settings-install-instructions" hidden></p>
<hr class="md:hidden" />
@@ -1965,43 +1780,10 @@
"
class="md:hidden"
></p>
<script>
const anchorApi = /** @type {HTMLAnchorElement | undefined} */ (
window.document.getElementById("anchor-api")?.cloneNode(true)
);
const anchorGit = /** @type {HTMLAnchorElement | undefined} */ (
window.document.getElementById("anchor-git")?.cloneNode(true)
);
const anchorNostr = /** @type {HTMLAnchorElement | undefined} */ (
window.document.getElementById("anchor-nostr")?.cloneNode(true)
);
const anchorGeyser = /** @type {HTMLAnchorElement | undefined} */ (
window.document.getElementById("anchor-geyser")?.cloneNode(true)
);
if (!anchorApi || !anchorGit || !anchorNostr || !anchorGeyser)
throw "Anchors should exist by now";
anchorApi.id = "";
anchorGit.id = "";
anchorNostr.id = "";
anchorGeyser.id = "";
const nav = window.document.getElementById("settings-nav");
if (!nav) throw "Should exist by now";
nav.append(anchorApi);
nav.append(anchorGit);
nav.append(anchorNostr);
nav.append(anchorGeyser);
</script>
<hr />
<p style="color: var(--off-color); padding: 1rem; text-align: center">
<p style="color: var(--off-color); text-align: center">
<span>Charts are displayed via </span>
<a
href="https://www.tradingview.com"
@@ -2067,7 +1849,7 @@
style="
text-transform: uppercase;
display: block;
font-weight: 400;
font-weight: var(--font-weight-base);
font-size: var(--font-size-2xs);
line-height: var(--line-height-2xs);
"