general: snapshot

This commit is contained in:
k
2024-08-26 01:23:48 +02:00
parent 6ebd9320db
commit e206b40468
73 changed files with 34076 additions and 1237 deletions
+3 -6
View File
@@ -1,8 +1,8 @@
<!doctype html>
<html lang="en">
<html lang="en" data-theme="dark">
<head>
<meta charset="utf-8" />
<title>Satonomics</title>
<title>kibō</title>
<meta
name="description"
content="A better, FOSS, Bitcoin-only, self-hostable Glassnode"
@@ -362,10 +362,7 @@
media="(prefers-color-scheme: dark) and (device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)"
/>
</head>
<body
class="text-high-contrast overflow-hidden bg-white dark:bg-black"
style="font-size: 15px; line-height: 22px"
>
<body>
<noscript>You need to enable JavaScript to run this app.</noscript>
<div id="root"></div>
+8 -8
View File
@@ -1,7 +1,7 @@
{
"name": "satonomics",
"description": "A better, FOSS, Bitcoin-only, self-hostable Glassnode",
"version": "0.3.0",
"version": "0.4.0",
"license": "MIT",
"type": "module",
"scripts": {
@@ -13,7 +13,7 @@
"prod": "$npm_execpath run build && vite preview --host",
"pages-prod": "pnpm build && pnpm wrangler pages deploy ./dist",
"pages-dev": "pnpm build && pnpm wrangler pages deploy --branch dev ./dist",
"assets": "pnpm pwa-asset-generator ./public/logo/white.svg ./public/assets --index ./index.html --manifest ./public/manifest.webmanifest --icon-only --favicon --background \"linear-gradient(to right bottom, rgb(249, 115, 22), rgb(154, 52, 18))\" --padding \"min(15vh, 15vw)\" --path-override \"/assets\" && pnpm pwa-asset-generator ./public/logo/white.svg ./public/assets --index ./index.html --splash-only --background \"linear-gradient(to right bottom, rgb(249, 115, 22), rgb(154, 52, 18))\" --padding \"min(33vh, 33vw)\" --path-override \"/assets\" && pnpm pwa-asset-generator ./public/logo/white.svg ./public/assets --index ./index.html --splash-only --dark-mode --background \"#0c0a09\" --padding \"min(33vh, 33vw)\" --path-override \"/assets\""
"assets": "pnpm pwa-asset-generator ../assets/logo-icon.svg ./public/assets --index ./index.html --manifest ./public/manifest.webmanifest --icon-only --favicon --background #ffffe3 --padding \"min(15vh, 15vw)\" --path-override \"/assets\" && pnpm pwa-asset-generator ../assets/logo-icon.svg ./public/assets --index ./index.html --splash-only --background #10100e --padding \"min(33vh, 33vw)\" --path-override \"/assets\" && pnpm pwa-asset-generator ../assets/logo-icon.svg ./public/assets --index ./index.html --splash-only --dark-mode --background #10100e --padding \"min(33vh, 33vw)\" --path-override \"/assets\""
},
"dependencies": {
"@leeoniya/ufuzzy": "^1.0.14",
@@ -22,26 +22,26 @@
"@solid-primitives/resize-observer": "^2.0.26",
"lean-qr": "^2.3.4",
"lightweight-charts": "^4.2.0",
"solid-js": "^1.8.19"
"solid-js": "^1.8.21"
},
"devDependencies": {
"@ianvs/prettier-plugin-sort-imports": "^4.3.1",
"@iconify-json/tabler": "^1.1.119",
"@iconify-json/tabler": "^1.1.120",
"@tailwindcss/container-queries": "^0.1.1",
"autoprefixer": "^10.4.20",
"postcss": "^8.4.41",
"prettier": "^3.3.3",
"prettier-plugin-tailwindcss": "^0.6.5",
"prettier-plugin-tailwindcss": "^0.6.6",
"pwa-asset-generator": "^6.3.1",
"rollup-plugin-visualizer": "^5.12.0",
"tailwindcss": "^3.4.8",
"tailwindcss": "^3.4.10",
"typescript": "^5.5.4",
"unplugin-auto-import": "^0.18.2",
"unplugin-icons": "^0.19.2",
"vite": "^5.4.0",
"vite": "^5.4.1",
"vite-plugin-pwa": "^0.20.1",
"vite-plugin-solid": "^2.10.2",
"workbox-window": "^7.1.0",
"wrangler": "^3.69.1"
"wrangler": "^3.71.0"
}
}
+167 -119
View File
@@ -10,13 +10,13 @@ dependencies:
version: 1.0.14
'@solid-primitives/event-listener':
specifier: ^2.3.3
version: 2.3.3(solid-js@1.8.19)
version: 2.3.3(solid-js@1.8.21)
'@solid-primitives/intersection-observer':
specifier: ^2.1.6
version: 2.1.6(solid-js@1.8.19)
version: 2.1.6(solid-js@1.8.21)
'@solid-primitives/resize-observer':
specifier: ^2.0.26
version: 2.0.26(solid-js@1.8.19)
version: 2.0.26(solid-js@1.8.21)
lean-qr:
specifier: ^2.3.4
version: 2.3.4
@@ -24,19 +24,19 @@ dependencies:
specifier: ^4.2.0
version: 4.2.0
solid-js:
specifier: ^1.8.19
version: 1.8.19
specifier: ^1.8.21
version: 1.8.21
devDependencies:
'@ianvs/prettier-plugin-sort-imports':
specifier: ^4.3.1
version: 4.3.1(prettier@3.3.3)
'@iconify-json/tabler':
specifier: ^1.1.119
version: 1.1.119
specifier: ^1.1.120
version: 1.1.120
'@tailwindcss/container-queries':
specifier: ^0.1.1
version: 0.1.1(tailwindcss@3.4.8)
version: 0.1.1(tailwindcss@3.4.10)
autoprefixer:
specifier: ^10.4.20
version: 10.4.20(postcss@8.4.41)
@@ -47,8 +47,8 @@ devDependencies:
specifier: ^3.3.3
version: 3.3.3
prettier-plugin-tailwindcss:
specifier: ^0.6.5
version: 0.6.5(@ianvs/prettier-plugin-sort-imports@4.3.1)(prettier@3.3.3)
specifier: ^0.6.6
version: 0.6.6(@ianvs/prettier-plugin-sort-imports@4.3.1)(prettier@3.3.3)
pwa-asset-generator:
specifier: ^6.3.1
version: 6.3.1
@@ -56,8 +56,8 @@ devDependencies:
specifier: ^5.12.0
version: 5.12.0(rollup@2.79.1)
tailwindcss:
specifier: ^3.4.8
version: 3.4.8
specifier: ^3.4.10
version: 3.4.10
typescript:
specifier: ^5.5.4
version: 5.5.4
@@ -68,20 +68,20 @@ devDependencies:
specifier: ^0.19.2
version: 0.19.2
vite:
specifier: ^5.4.0
version: 5.4.0
specifier: ^5.4.1
version: 5.4.1
vite-plugin-pwa:
specifier: ^0.20.1
version: 0.20.1(vite@5.4.0)(workbox-build@7.1.1)(workbox-window@7.1.0)
version: 0.20.1(vite@5.4.1)(workbox-build@7.1.1)(workbox-window@7.1.0)
vite-plugin-solid:
specifier: ^2.10.2
version: 2.10.2(solid-js@1.8.19)(vite@5.4.0)
version: 2.10.2(solid-js@1.8.21)(vite@5.4.1)
workbox-window:
specifier: ^7.1.0
version: 7.1.0
wrangler:
specifier: ^3.69.1
version: 3.69.1
specifier: ^3.71.0
version: 3.71.0
packages:
@@ -105,8 +105,8 @@ packages:
find-up: 5.0.0
dev: true
/@antfu/install-pkg@0.3.3:
resolution: {integrity: sha512-nHHsk3NXQ6xkCfiRRC8Nfrg8pU5kkr3P3Y9s9dKqiuRmBD0Yap7fymNDjGFKeWhZQHqqbCS5CfeMy9wtExM24w==}
/@antfu/install-pkg@0.3.5:
resolution: {integrity: sha512-HwIACY0IzrM7FGafMbWZOqEDBSfCwPcylu+GacaRcxJm4Yvvuh3Dy2vZwqdJAzXponc6aLO9FaH4l75pq8/ZSA==}
dependencies:
'@jsdevtools/ez-spawn': 3.0.4
dev: true
@@ -1378,8 +1378,8 @@ packages:
mime: 3.0.0
dev: true
/@cloudflare/workerd-darwin-64@1.20240725.0:
resolution: {integrity: sha512-KpE7eycdZ9ON+tKBuTyqZh8SdFWHGrh2Ru9LcbpeFwb7O9gDQv9ceSdoV/T598qlT0a0yVKM62R6xa5ec0UOWA==}
/@cloudflare/workerd-darwin-64@1.20240806.0:
resolution: {integrity: sha512-FqcVBBCO//I39K5F+HqE/v+UkqY1UrRnS653Jv+XsNNH9TpX5fTs7VCKG4kDSnmxlAaKttyIN5sMEt7lpuNExQ==}
engines: {node: '>=16'}
cpu: [x64]
os: [darwin]
@@ -1387,8 +1387,8 @@ packages:
dev: true
optional: true
/@cloudflare/workerd-darwin-arm64@1.20240725.0:
resolution: {integrity: sha512-/UQlI04FdXLpPlDzzsWGz8TuKrMZKLowTo+8PkxgEiWIaBhE4DIDM5bwj3jM4Bs8yOLiL2ovQNpld5CnAKqA8g==}
/@cloudflare/workerd-darwin-arm64@1.20240806.0:
resolution: {integrity: sha512-8c3KvmzYp/wg+82KHSOzDetJK+pThH4MTrU1OsjmsR2cUfedm5dk5Lah9/0Ld68+6A0umFACi4W2xJHs/RoBpA==}
engines: {node: '>=16'}
cpu: [arm64]
os: [darwin]
@@ -1396,8 +1396,8 @@ packages:
dev: true
optional: true
/@cloudflare/workerd-linux-64@1.20240725.0:
resolution: {integrity: sha512-Z5t12qYLvHz0b3ZRBBm2HQ93RiHrAnjFfdhtjMcgJypAGkiWpOCEn2xar/WqDhMfqnk0sa8aYiYAbMAlP1WN6w==}
/@cloudflare/workerd-linux-64@1.20240806.0:
resolution: {integrity: sha512-/149Bpxw4e2p5QqnBc06g0mx+4sZYh9j0doilnt0wk/uqYkLp0DdXGMQVRB74sBLg2UD3wW8amn1w3KyFhK2tQ==}
engines: {node: '>=16'}
cpu: [x64]
os: [linux]
@@ -1405,8 +1405,8 @@ packages:
dev: true
optional: true
/@cloudflare/workerd-linux-arm64@1.20240725.0:
resolution: {integrity: sha512-j9gYXLOwOyNehLMzP7KxQ+Y6/nxcL9i6LTDJC6RChoaxLRbm0Y/9Otu+hfyzeNeRpt31ip6vqXZ1QQk6ygzI8A==}
/@cloudflare/workerd-linux-arm64@1.20240806.0:
resolution: {integrity: sha512-lacDWY3S1rKL/xT6iMtTQJEKmTTKrBavPczInEuBFXElmrS6IwVjZwv8hhVm32piyNt/AuFu9BYoJALi9D85/g==}
engines: {node: '>=16'}
cpu: [arm64]
os: [linux]
@@ -1414,8 +1414,8 @@ packages:
dev: true
optional: true
/@cloudflare/workerd-windows-64@1.20240725.0:
resolution: {integrity: sha512-fkrJLWNN6rrPjZ0eKJx328NVMo4BsainKxAfqaPMEd6uRwjOM8uN8V4sSLsXXP8GQMAx6hAG2hU86givS4GItg==}
/@cloudflare/workerd-windows-64@1.20240806.0:
resolution: {integrity: sha512-hC6JEfTSQK6//Lg+D54TLVn1ceTPY+fv4MXqDZIYlPP53iN+dL8Xd0utn2SG57UYdlL5FRAhm/EWHcATZg1RgA==}
engines: {node: '>=16'}
cpu: [x64]
os: [win32]
@@ -1882,8 +1882,8 @@ packages:
- supports-color
dev: true
/@iconify-json/tabler@1.1.119:
resolution: {integrity: sha512-UdbEO3WGcEg022GKTT2mR1mN8oUjSGrBccWbhH8sSqVAAzDmMR+6yERloiQtVN0/yHRwqQY9RIdtrzmDFR6n0g==}
/@iconify-json/tabler@1.1.120:
resolution: {integrity: sha512-G9of3jPsYUfFkdaeqfILQF3xkCuZeitqJDjMkqmzjfJcWzl7JW/PoPJRby28dIUHTyO6eLqOlKhFP4/EQCg44Q==}
dependencies:
'@iconify/types': 2.0.0
dev: true
@@ -2067,7 +2067,7 @@ packages:
rollup: 2.79.1
serialize-javascript: 6.0.2
smob: 1.5.0
terser: 5.31.4
terser: 5.31.6
dev: true
/@rollup/pluginutils@3.1.0(rollup@2.79.1):
@@ -2225,60 +2225,60 @@ packages:
dev: true
optional: true
/@solid-primitives/event-listener@2.3.3(solid-js@1.8.19):
/@solid-primitives/event-listener@2.3.3(solid-js@1.8.21):
resolution: {integrity: sha512-DAJbl+F0wrFW2xmcV8dKMBhk9QLVLuBSW+TR4JmIfTaObxd13PuL7nqaXnaYKDWOYa6otB00qcCUIGbuIhSUgQ==}
peerDependencies:
solid-js: ^1.6.12
dependencies:
'@solid-primitives/utils': 6.2.3(solid-js@1.8.19)
solid-js: 1.8.19
'@solid-primitives/utils': 6.2.3(solid-js@1.8.21)
solid-js: 1.8.21
dev: false
/@solid-primitives/intersection-observer@2.1.6(solid-js@1.8.19):
/@solid-primitives/intersection-observer@2.1.6(solid-js@1.8.21):
resolution: {integrity: sha512-SeiCmN/R46Z+o9+5HhIQzSor0DqVPyo4ROLQMvCI8AsGZl/5nHlWzHTTbWPeukVUXTgb04wfC3DUo9IzF/XloA==}
peerDependencies:
solid-js: ^1.6.12
dependencies:
'@solid-primitives/utils': 6.2.3(solid-js@1.8.19)
solid-js: 1.8.19
'@solid-primitives/utils': 6.2.3(solid-js@1.8.21)
solid-js: 1.8.21
dev: false
/@solid-primitives/resize-observer@2.0.26(solid-js@1.8.19):
/@solid-primitives/resize-observer@2.0.26(solid-js@1.8.21):
resolution: {integrity: sha512-KbPhwal6ML9OHeUTZszBbt6PYSMj89d4wVCLxlvDYL4U0+p+xlCEaqz6v9dkCwm/0Lb+Wed7W5T1dQZCP3JUUw==}
peerDependencies:
solid-js: ^1.6.12
dependencies:
'@solid-primitives/event-listener': 2.3.3(solid-js@1.8.19)
'@solid-primitives/rootless': 1.4.5(solid-js@1.8.19)
'@solid-primitives/static-store': 0.0.8(solid-js@1.8.19)
'@solid-primitives/utils': 6.2.3(solid-js@1.8.19)
solid-js: 1.8.19
'@solid-primitives/event-listener': 2.3.3(solid-js@1.8.21)
'@solid-primitives/rootless': 1.4.5(solid-js@1.8.21)
'@solid-primitives/static-store': 0.0.8(solid-js@1.8.21)
'@solid-primitives/utils': 6.2.3(solid-js@1.8.21)
solid-js: 1.8.21
dev: false
/@solid-primitives/rootless@1.4.5(solid-js@1.8.19):
/@solid-primitives/rootless@1.4.5(solid-js@1.8.21):
resolution: {integrity: sha512-GFJE9GC3ojx0aUKqAUZmQPyU8fOVMtnVNrkdk2yS4kd17WqVSpXpoTmo9CnOwA+PG7FTzdIkogvfLQSLs4lrww==}
peerDependencies:
solid-js: ^1.6.12
dependencies:
'@solid-primitives/utils': 6.2.3(solid-js@1.8.19)
solid-js: 1.8.19
'@solid-primitives/utils': 6.2.3(solid-js@1.8.21)
solid-js: 1.8.21
dev: false
/@solid-primitives/static-store@0.0.8(solid-js@1.8.19):
/@solid-primitives/static-store@0.0.8(solid-js@1.8.21):
resolution: {integrity: sha512-ZecE4BqY0oBk0YG00nzaAWO5Mjcny8Fc06CdbXadH9T9lzq/9GefqcSe/5AtdXqjvY/DtJ5C6CkcjPZO0o/eqg==}
peerDependencies:
solid-js: ^1.6.12
dependencies:
'@solid-primitives/utils': 6.2.3(solid-js@1.8.19)
solid-js: 1.8.19
'@solid-primitives/utils': 6.2.3(solid-js@1.8.21)
solid-js: 1.8.21
dev: false
/@solid-primitives/utils@6.2.3(solid-js@1.8.19):
/@solid-primitives/utils@6.2.3(solid-js@1.8.21):
resolution: {integrity: sha512-CqAwKb2T5Vi72+rhebSsqNZ9o67buYRdEJrIFzRXz3U59QqezuuxPsyzTSVCacwS5Pf109VRsgCJQoxKRoECZQ==}
peerDependencies:
solid-js: ^1.6.12
dependencies:
solid-js: 1.8.19
solid-js: 1.8.21
dev: false
/@surma/rollup-plugin-off-main-thread@2.2.3:
@@ -2290,12 +2290,12 @@ packages:
string.prototype.matchall: 4.0.11
dev: true
/@tailwindcss/container-queries@0.1.1(tailwindcss@3.4.8):
/@tailwindcss/container-queries@0.1.1(tailwindcss@3.4.10):
resolution: {integrity: sha512-p18dswChx6WnTSaJCSGx6lTmrGzNNvm2FtXmiO6AuA1V4U5REyoqwmT6kgAsIMdjo07QdAfYXHJ4hnMtfHzWgA==}
peerDependencies:
tailwindcss: '>=3.2.0'
dependencies:
tailwindcss: 3.4.8
tailwindcss: 3.4.10
dev: true
/@types/babel__core@7.20.5:
@@ -2342,13 +2342,13 @@ packages:
/@types/node-forge@1.3.11:
resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==}
dependencies:
'@types/node': 22.1.0
'@types/node': 22.3.0
dev: true
/@types/node@22.1.0:
resolution: {integrity: sha512-AOmuRF0R2/5j1knA3c6G3HOk523Ga+l+ZXltX8SF1+5oqcXijjfTd8fY3XRZqSihEu9XhtQnKYLmkFaoxgsJHw==}
/@types/node@22.3.0:
resolution: {integrity: sha512-nrWpWVaDZuaVc5X84xJ0vNrLvomM205oQyLsRt7OHNZbSHslcWsvgFR7O7hire2ZonjLrWBbedmotmIlJDVd6g==}
dependencies:
undici-types: 6.13.0
undici-types: 6.18.2
dev: true
/@types/normalize-package-data@2.4.4:
@@ -2367,7 +2367,7 @@ packages:
resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==}
requiresBuild: true
dependencies:
'@types/node': 22.1.0
'@types/node': 22.3.0
dev: true
optional: true
@@ -2630,7 +2630,7 @@ packages:
hasBin: true
dependencies:
caniuse-lite: 1.0.30001651
electron-to-chromium: 1.5.5
electron-to-chromium: 1.5.8
node-releases: 2.0.18
update-browserslist-db: 1.1.0(browserslist@4.23.3)
dev: true
@@ -2730,17 +2730,21 @@ packages:
domutils: 3.1.0
dev: true
/cheerio@1.0.0-rc.12:
resolution: {integrity: sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==}
engines: {node: '>= 6'}
/cheerio@1.0.0:
resolution: {integrity: sha512-quS9HgjQpdaXOvsZz82Oz7uxtXiy6UIsIQcpBj7HRw2M63Skasm9qlDocAM7jNuaxdhpPU7c4kJN+gA5MCu4ww==}
engines: {node: '>=18.17'}
dependencies:
cheerio-select: 2.1.0
dom-serializer: 2.0.0
domhandler: 5.0.3
domutils: 3.1.0
htmlparser2: 8.0.2
encoding-sniffer: 0.2.0
htmlparser2: 9.1.0
parse5: 7.1.2
parse5-htmlparser2-tree-adapter: 7.0.0
parse5-parser-stream: 7.1.2
undici: 6.19.7
whatwg-mimetype: 4.0.0
dev: true
/chokidar@3.6.0:
@@ -2767,7 +2771,7 @@ packages:
engines: {node: '>=12.13.0'}
hasBin: true
dependencies:
'@types/node': 22.1.0
'@types/node': 22.3.0
escape-string-regexp: 4.0.0
is-wsl: 2.2.0
lighthouse-logger: 1.4.2
@@ -3096,8 +3100,8 @@ packages:
jake: 10.9.2
dev: true
/electron-to-chromium@1.5.5:
resolution: {integrity: sha512-QR7/A7ZkMS8tZuoftC/jfqNkZLQO779SSW3YuZHP4eXpj3EffGLFcB/Xu9AAZQzLccTiCV+EmUo3ha4mQ9wnlA==}
/electron-to-chromium@1.5.8:
resolution: {integrity: sha512-4Nx0gP2tPNBLTrFxBMHpkQbtn2hidPVr/+/FTtcCiBYTucqc70zRyVZiOLj17Ui3wTO7SQ1/N+hkHYzJjBzt6A==}
dev: true
/emoji-regex@8.0.0:
@@ -3108,6 +3112,13 @@ packages:
resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
dev: true
/encoding-sniffer@0.2.0:
resolution: {integrity: sha512-ju7Wq1kg04I3HtiYIOrUrdfdDvkyO9s5XM8QAj/bN61Yo/Vb4vgJxy5vi4Yxk01gWHbrofpPtpxM8bKger9jhg==}
dependencies:
iconv-lite: 0.6.3
whatwg-encoding: 3.1.1
dev: true
/end-of-stream@1.4.4:
resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==}
dependencies:
@@ -3693,8 +3704,8 @@ packages:
resolution: {integrity: sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==}
dev: true
/htmlparser2@8.0.2:
resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==}
/htmlparser2@9.1.0:
resolution: {integrity: sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==}
dependencies:
domelementtype: 2.3.0
domhandler: 5.0.3
@@ -3717,6 +3728,13 @@ packages:
engines: {node: '>=10.17.0'}
dev: true
/iconv-lite@0.6.3:
resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
engines: {node: '>=0.10.0'}
dependencies:
safer-buffer: 2.1.2
dev: true
/idb@7.1.1:
resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==}
dev: true
@@ -4262,8 +4280,8 @@ packages:
engines: {node: '>=4'}
dev: true
/miniflare@3.20240725.0:
resolution: {integrity: sha512-n9NTLI8J9Xt0Cls6dRpqoIPkVFnxD9gMnU/qDkDX9diKfN16HyxpAdA5mto/hKuRpjW19TxnTMcxBo90vZXemw==}
/miniflare@3.20240806.0:
resolution: {integrity: sha512-jDsXBJOLUVpIQXHsluX3xV0piDxXolTCsxdje2Ex2LTC9PsSoBIkMwvCmnCxe9wpJJCq8rb0UMyeEn3KOF3LOw==}
engines: {node: '>=16.13'}
hasBin: true
dependencies:
@@ -4275,7 +4293,7 @@ packages:
glob-to-regexp: 0.4.1
stoppable: 1.1.0
undici: 5.28.4
workerd: 1.20240725.0
workerd: 1.20240806.0
ws: 8.18.0
youch: 3.3.3
zod: 3.23.8
@@ -4547,6 +4565,12 @@ packages:
parse5: 7.1.2
dev: true
/parse5-parser-stream@7.1.2:
resolution: {integrity: sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==}
dependencies:
parse5: 7.1.2
dev: true
/parse5@7.1.2:
resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==}
dependencies:
@@ -4682,11 +4706,11 @@ packages:
postcss: ^8.2.14
dependencies:
postcss: 8.4.41
postcss-selector-parser: 6.1.1
postcss-selector-parser: 6.1.2
dev: true
/postcss-selector-parser@6.1.1:
resolution: {integrity: sha512-b4dlw/9V8A71rLIDsSwVmak9z2DuBUB7CA1/wSdelNEzqsjoSPeADTWNO09lpH49Diy3/JIZ2bSPB1dI3LJCHg==}
/postcss-selector-parser@6.1.2:
resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==}
engines: {node: '>=4'}
dependencies:
cssesc: 3.0.0
@@ -4706,8 +4730,8 @@ packages:
source-map-js: 1.2.0
dev: true
/prettier-plugin-tailwindcss@0.6.5(@ianvs/prettier-plugin-sort-imports@4.3.1)(prettier@3.3.3):
resolution: {integrity: sha512-axfeOArc/RiGHjOIy9HytehlC0ZLeMaqY09mm8YCkMzznKiDkwFzOpBvtuhuv3xG5qB73+Mj7OCe2j/L1ryfuQ==}
/prettier-plugin-tailwindcss@0.6.6(@ianvs/prettier-plugin-sort-imports@4.3.1)(prettier@3.3.3):
resolution: {integrity: sha512-OPva5S7WAsPLEsOuOWXATi13QrCKACCiIonFgIR6V4lYv4QLp++UXVhZSzRbZxXGimkQtQT86CC6fQqTOybGng==}
engines: {node: '>=14.21.3'}
peerDependencies:
'@ianvs/prettier-plugin-sort-imports': '*'
@@ -4721,6 +4745,7 @@ packages:
prettier-plugin-import-sort: '*'
prettier-plugin-jsdoc: '*'
prettier-plugin-marko: '*'
prettier-plugin-multiline-arrays: '*'
prettier-plugin-organize-attributes: '*'
prettier-plugin-organize-imports: '*'
prettier-plugin-sort-imports: '*'
@@ -4747,6 +4772,8 @@ packages:
optional: true
prettier-plugin-marko:
optional: true
prettier-plugin-multiline-arrays:
optional: true
prettier-plugin-organize-attributes:
optional: true
prettier-plugin-organize-imports:
@@ -4845,7 +4872,7 @@ packages:
hasBin: true
dependencies:
chalk: 4.1.2
cheerio: 1.0.0-rc.12
cheerio: 1.0.0
chrome-launcher: 0.15.2
find-process: 1.4.7
lodash.isequal: 4.5.0
@@ -5115,6 +5142,10 @@ packages:
is-regex: 1.1.4
dev: true
/safer-buffer@2.1.2:
resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
dev: true
/scule@1.3.0:
resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==}
dev: true
@@ -5223,14 +5254,14 @@ packages:
resolution: {integrity: sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==}
dev: true
/solid-js@1.8.19:
resolution: {integrity: sha512-h8z/TvTQYsf894LM9Iau/ZW2iAKrCzAWDwjPhMcXnonmW1OIIihc28wp82b1wwei1p81fH5+gnfNOe8RzLbDRQ==}
/solid-js@1.8.21:
resolution: {integrity: sha512-FHUGdoo7GVa1BTpGh/4UtwIISde0vSXoqNB6KFpHiTgkIY959tmCJ7NYQAWDfScBfnpoMGZR8lFz0DiwW/gFlw==}
dependencies:
csstype: 3.1.3
seroval: 1.1.1
seroval-plugins: 1.1.1(seroval@1.1.1)
/solid-refresh@0.6.3(solid-js@1.8.19):
/solid-refresh@0.6.3(solid-js@1.8.21):
resolution: {integrity: sha512-F3aPsX6hVw9ttm5LYlth8Q15x6MlI/J3Dn+o3EQyRTtTxidepSTwAYdozt01/YA+7ObcciagGEyXIopGZzQtbA==}
peerDependencies:
solid-js: ^1.3
@@ -5238,7 +5269,7 @@ packages:
'@babel/generator': 7.25.0
'@babel/helper-module-imports': 7.24.7
'@babel/types': 7.25.2
solid-js: 1.8.19
solid-js: 1.8.21
transitivePeerDependencies:
- supports-color
dev: true
@@ -5464,8 +5495,8 @@ packages:
engines: {node: '>= 0.4'}
dev: true
/tailwindcss@3.4.8:
resolution: {integrity: sha512-GkP17r9GQkxgZ9FKHJQEnjJuKBcbFhMFzKu5slmN6NjlCuFnYJMQ8N4AZ6VrUyiRXlDtPKHkesuQ/MS913Nvdg==}
/tailwindcss@3.4.10:
resolution: {integrity: sha512-KWZkVPm7yJRhdu4SRSl9d4AK2wM3a50UsvgHZO7xY77NQr2V+fIrEuoDGQcbvswWvFGbS2f6e+jC/6WJm1Dl0w==}
engines: {node: '>=14.0.0'}
hasBin: true
dependencies:
@@ -5488,7 +5519,7 @@ packages:
postcss-js: 4.0.1(postcss@8.4.41)
postcss-load-config: 4.0.2(postcss@8.4.41)
postcss-nested: 6.2.0(postcss@8.4.41)
postcss-selector-parser: 6.1.1
postcss-selector-parser: 6.1.2
resolve: 1.22.8
sucrase: 3.35.0
transitivePeerDependencies:
@@ -5530,8 +5561,8 @@ packages:
unique-string: 2.0.0
dev: true
/terser@5.31.4:
resolution: {integrity: sha512-3OU03GgblDgu0g+sdnsVzhBPxnjV+WJuMmocN1qBBZDQ3ia7jZQSAkePeKbPlYAejGXUTYe1CmSaUeV51mvaIw==}
/terser@5.31.6:
resolution: {integrity: sha512-PQ4DAriWzKj+qgehQ7LK5bQqCFNMmlhjR2PFFLuqGCpuCAauxemVBWwWOxo3UIwWQx8+Pr61Df++r76wDmkQBg==}
engines: {node: '>=10'}
hasBin: true
dependencies:
@@ -5696,8 +5727,8 @@ packages:
through: 2.3.8
dev: true
/undici-types@6.13.0:
resolution: {integrity: sha512-xtFJHudx8S2DSoujjMd1WeWvn7KKWFRESZTMeL1RptAYERu29D6jphMjjY+vn96jvN3kVPDNxU/E13VTaXj6jg==}
/undici-types@6.18.2:
resolution: {integrity: sha512-5ruQbENj95yDYJNS3TvcaxPMshV7aizdv/hWYjGIKoANWKjhWNBsr2YEuYZKodQulB1b8l7ILOuDQep3afowQQ==}
dev: true
/undici@5.28.4:
@@ -5707,6 +5738,11 @@ packages:
'@fastify/busboy': 2.1.1
dev: true
/undici@6.19.7:
resolution: {integrity: sha512-HR3W/bMGPSr90i8AAp2C4DM3wChFdJPLrWYpIS++LxS8K+W535qftjt+4MyjNYHeWabMj1nvtmLIi7l++iq91A==}
engines: {node: '>=18.17'}
dev: true
/unenv-nightly@1.10.0-1717606461.a117952:
resolution: {integrity: sha512-u3TfBX02WzbHTpaEfWEKwDijDSFAHcgXkayUZ+MVDrjhLFvgAJzFGTSTmwlEhwWi2exyRQey23ah9wELMM6etg==}
dependencies:
@@ -5756,7 +5792,7 @@ packages:
pkg-types: 1.1.3
scule: 1.3.0
strip-literal: 2.1.0
unplugin: 1.12.1
unplugin: 1.12.2
transitivePeerDependencies:
- rollup
dev: true
@@ -5792,7 +5828,7 @@ packages:
magic-string: 0.30.11
minimatch: 9.0.5
unimport: 3.10.0(rollup@2.79.1)
unplugin: 1.12.1
unplugin: 1.12.2
transitivePeerDependencies:
- rollup
dev: true
@@ -5817,19 +5853,19 @@ packages:
vue-template-es2015-compiler:
optional: true
dependencies:
'@antfu/install-pkg': 0.3.3
'@antfu/install-pkg': 0.3.5
'@antfu/utils': 0.7.10
'@iconify/utils': 2.1.30
debug: 4.3.6
kolorist: 1.8.0
local-pkg: 0.5.0
unplugin: 1.12.1
unplugin: 1.12.2
transitivePeerDependencies:
- supports-color
dev: true
/unplugin@1.12.1:
resolution: {integrity: sha512-aXEH9c5qi3uYZHo0niUtxDlT9ylG/luMW/dZslSCkbtC31wCyFkmM0kyoBBh+Grhn7CL+/kvKLfN61/EdxPxMQ==}
/unplugin@1.12.2:
resolution: {integrity: sha512-bEqQxeC7rxtxPZ3M5V4Djcc4lQqKPgGe3mAWZvxcSmX5jhGxll19NliaRzQSQPrk4xJZSGniK3puLWpRuZN7VQ==}
engines: {node: '>=14.0.0'}
dependencies:
acorn: 8.12.1
@@ -5869,7 +5905,7 @@ packages:
spdx-expression-parse: 3.0.1
dev: true
/vite-plugin-pwa@0.20.1(vite@5.4.0)(workbox-build@7.1.1)(workbox-window@7.1.0):
/vite-plugin-pwa@0.20.1(vite@5.4.1)(workbox-build@7.1.1)(workbox-window@7.1.0):
resolution: {integrity: sha512-M6Pk4b18i5ryrhKgiIF8Zud0HGphYiCbEfLsCdlvmwn/CEnS6noVwfIDG/+3V7r6yxpPV/gLiKw+rIlCCiCCoQ==}
engines: {node: '>=16.0.0'}
peerDependencies:
@@ -5884,14 +5920,14 @@ packages:
debug: 4.3.6
pretty-bytes: 6.1.1
tinyglobby: 0.2.2
vite: 5.4.0
vite: 5.4.1
workbox-build: 7.1.1
workbox-window: 7.1.0
transitivePeerDependencies:
- supports-color
dev: true
/vite-plugin-solid@2.10.2(solid-js@1.8.19)(vite@5.4.0):
/vite-plugin-solid@2.10.2(solid-js@1.8.21)(vite@5.4.1):
resolution: {integrity: sha512-AOEtwMe2baBSXMXdo+BUwECC8IFHcKS6WQV/1NEd+Q7vHPap5fmIhLcAzr+DUJ04/KHx/1UBU0l1/GWP+rMAPQ==}
peerDependencies:
'@testing-library/jest-dom': ^5.16.6 || ^5.17.0 || ^6.*
@@ -5905,16 +5941,16 @@ packages:
'@types/babel__core': 7.20.5
babel-preset-solid: 1.8.19(@babel/core@7.25.2)
merge-anything: 5.1.7
solid-js: 1.8.19
solid-refresh: 0.6.3(solid-js@1.8.19)
vite: 5.4.0
vitefu: 0.2.5(vite@5.4.0)
solid-js: 1.8.21
solid-refresh: 0.6.3(solid-js@1.8.21)
vite: 5.4.1
vitefu: 0.2.5(vite@5.4.1)
transitivePeerDependencies:
- supports-color
dev: true
/vite@5.4.0:
resolution: {integrity: sha512-5xokfMX0PIiwCMCMb9ZJcMyh5wbBun0zUzKib+L65vAZ8GY9ePZMXxFrHbr/Kyll2+LSCY7xtERPpxkBDKngwg==}
/vite@5.4.1:
resolution: {integrity: sha512-1oE6yuNXssjrZdblI9AfBbHCC41nnyoVoEZxQnID6yvQZAFBzxxkqoFLtHUMkYunL8hwOLEjgTuxpkRxvba3kA==}
engines: {node: ^18.0.0 || >=20.0.0}
hasBin: true
peerDependencies:
@@ -5951,7 +5987,7 @@ packages:
fsevents: 2.3.3
dev: true
/vitefu@0.2.5(vite@5.4.0):
/vitefu@0.2.5(vite@5.4.1):
resolution: {integrity: sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==}
peerDependencies:
vite: ^3.0.0 || ^4.0.0 || ^5.0.0
@@ -5959,7 +5995,7 @@ packages:
vite:
optional: true
dependencies:
vite: 5.4.0
vite: 5.4.1
dev: true
/webidl-conversions@3.0.1:
@@ -5979,6 +6015,18 @@ packages:
resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==}
dev: true
/whatwg-encoding@3.1.1:
resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==}
engines: {node: '>=18'}
dependencies:
iconv-lite: 0.6.3
dev: true
/whatwg-mimetype@4.0.0:
resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==}
engines: {node: '>=18'}
dev: true
/whatwg-url@5.0.0:
resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==}
dependencies:
@@ -6169,25 +6217,25 @@ packages:
workbox-core: 7.1.0
dev: true
/workerd@1.20240725.0:
resolution: {integrity: sha512-VZwgejRcHsQ9FEPtc7v25ebINLAR+stL3q1hC1xByE+quskdoWpTXHkZwZ3IdSgvm9vPVbCbJw9p5mGnDByW2A==}
/workerd@1.20240806.0:
resolution: {integrity: sha512-yyNtyzTMgVY0sgYijHBONqZFVXsOFGj2jDjS8MF/RbO2ZdGROvs4Hkc/9QnmqFWahE0STxXeJ1yW1yVotdF0UQ==}
engines: {node: '>=16'}
hasBin: true
requiresBuild: true
optionalDependencies:
'@cloudflare/workerd-darwin-64': 1.20240725.0
'@cloudflare/workerd-darwin-arm64': 1.20240725.0
'@cloudflare/workerd-linux-64': 1.20240725.0
'@cloudflare/workerd-linux-arm64': 1.20240725.0
'@cloudflare/workerd-windows-64': 1.20240725.0
'@cloudflare/workerd-darwin-64': 1.20240806.0
'@cloudflare/workerd-darwin-arm64': 1.20240806.0
'@cloudflare/workerd-linux-64': 1.20240806.0
'@cloudflare/workerd-linux-arm64': 1.20240806.0
'@cloudflare/workerd-windows-64': 1.20240806.0
dev: true
/wrangler@3.69.1:
resolution: {integrity: sha512-lqgPsaxIP564OJE6f7RIS/iLy+WaY0EN89p2g83nkrPN6PjuC6vB3eC7jgeVZO1ntWjD0X+mEU5ggbERHr899w==}
/wrangler@3.71.0:
resolution: {integrity: sha512-WHWBmU2z0p1hRtSIIP5HEeoR+6aNpuZR82HMXAwpfeiyijjfkMyt/TUs8gvIOKC3x3+ETQQIdVeX2al5KtrIxQ==}
engines: {node: '>=16.17.0'}
hasBin: true
peerDependencies:
'@cloudflare/workers-types': ^4.20240725.0
'@cloudflare/workers-types': ^4.20240806.0
peerDependenciesMeta:
'@cloudflare/workers-types':
optional: true
@@ -6200,7 +6248,7 @@ packages:
chokidar: 3.6.0
date-fns: 3.6.0
esbuild: 0.17.19
miniflare: 3.20240725.0
miniflare: 3.20240806.0
nanoid: 3.3.7
path-to-regexp: 6.2.2
resolve: 1.22.8
@@ -6208,7 +6256,7 @@ packages:
selfsigned: 2.4.1
source-map: 0.6.1
unenv: /unenv-nightly@1.10.0-1717606461.a117952
workerd: 1.20240725.0
workerd: 1.20240806.0
xxhash-wasm: 1.0.2
optionalDependencies:
fsevents: 2.3.3
Binary file not shown.
+1 -1
View File
@@ -34,4 +34,4 @@
"purpose": "maskable"
}
]
}
}
+12 -22
View File
@@ -12,9 +12,7 @@ import {
import { readBooleanURLParam, writeURLParam } from "../scripts/utils/urlParams";
import { webSockets } from "../scripts/ws";
import { classPropToString } from "../solid/classes";
import { Background } from "./background";
import { ChartFrame } from "./frames/chart";
import { FavoritesFrame } from "./frames/favorites";
import { FoldersFrame } from "./frames/folders";
import { HistoryFrame } from "./frames/history";
import { SettingsFrame } from "./frames/settings";
@@ -160,14 +158,8 @@ export function App() {
return (
<>
<Background
focused={tabFocused}
mode={userConfig.settings.background.mode}
opacity={userConfig.settings.background.opacity}
/>
<div
class="relative h-dvh selection:bg-orange-800"
class="relative h-dvh"
style={{
"user-select": resizingBarStart() !== undefined ? "none" : undefined,
}}
@@ -197,22 +189,22 @@ export function App() {
<Update />
<div class="flex size-full flex-col md:flex-row md:p-3 md:short:p-0">
<div class="flex size-full flex-col md:flex-row">
<Show when={!windowSizeIsAtLeastMedium() || !fullscreen()}>
<div
class={classPropToString([
standalone && "border-t md:border-t-0",
"border-lighter flex h-full flex-col overflow-hidden bg-gradient-to-b from-orange-300/15 to-orange-400/15 dark:from-orange-500/10 dark:to-orange-950/10 md:flex-row md:rounded-2xl md:border md:shadow-md md:short:hidden",
"flex h-full flex-col overflow-hidden md:flex-row md:shadow-md md:short:hidden",
])}
>
<div class="border-lighter hidden flex-col gap-2 border-r bg-orange-300/30 p-3 backdrop-blur-sm dark:bg-black/30 md:flex">
<div class="hidden flex-col gap-2 border-r px-3 py-4 backdrop-blur-sm md:flex">
<StripDesktop
selected={selectedFrame}
setSelected={_selectedFrame.set}
/>
</div>
<div
class="flex h-full min-h-0"
class="relative flex h-full min-h-0"
style={{
...(windowSizeIsAtLeastMedium()
? {
@@ -235,10 +227,6 @@ export function App() {
</Show>
<FoldersFrame presets={presets} selectedFrame={selectedFrame} />
<FavoritesFrame
presets={presets}
selectedFrame={selectedFrame}
/>
<SearchFrame presets={presets} selectedFrame={selectedFrame} />
<HistoryFrame presets={presets} selectedFrame={selectedFrame} />
<SettingsFrame
@@ -247,12 +235,14 @@ export function App() {
backgroundMode={userConfig.settings.background.mode}
backgroundOpacity={userConfig.settings.background.opacity}
/>
<div class="absolute bottom-0 left-0 right-0 z-10 h-6 w-full bg-gradient-to-b from-transparent to-[var(--background-color)]" />
</div>
<div
class={classPropToString([
standalone && "pb-6",
"border-lighter flex justify-between gap-3 border-t bg-black/30 p-2 backdrop-blur-sm sm:justify-around md:hidden short:hidden",
"flex justify-between gap-3 border-t p-2 sm:justify-around md:hidden short:hidden",
])}
>
<StripMobile
@@ -263,9 +253,9 @@ export function App() {
</div>
</Show>
<Show when={!fullscreen()}>
{/* <Show when={!fullscreen()}>
<div
class="mx-[3px] my-8 hidden w-[6px] cursor-col-resize items-center justify-center rounded-full bg-orange-900 opacity-0 hover:opacity-50 dark:bg-orange-100 md:block short:hidden"
class="mx-[3px] my-8 hidden w-[6px] cursor-col-resize items-center justify-center rounded-full opacity-0 hover:opacity-50 md:block short:hidden"
onMouseDown={(event) => {
if (resizingBarStart() === undefined) {
resizingBarStart.set(event.clientX);
@@ -282,10 +272,10 @@ export function App() {
barWidth.set(0);
}}
/>
</Show>
</Show> */}
<Show when={windowSizeIsAtLeastMedium()}>
<div class="flex min-w-0 flex-1">
<div class="flex min-w-0 flex-1 border-l">
<ChartFrame
standalone={true}
presets={presets}
+18 -12
View File
@@ -1,4 +1,4 @@
import { phone, touchScreen } from "/src/env";
import { touchScreen } from "/src/env";
import { createRWS } from "/src/solid/rws";
const texts = [
@@ -46,8 +46,9 @@ const texts = [
"cypherpunk",
"we like the coin",
"money for enemies",
"trustless money",
"sustainable money",
"trustless",
"sustainable",
"discriminationless",
];
export function Background({
@@ -91,12 +92,17 @@ export function Background({
<Line mode={mode} focused={focused} />
<Line mode={mode} focused={focused} />
<Line mode={mode} focused={focused} />
<Line mode={mode} focused={focused} />
<Line mode={mode} focused={focused} />
<Line mode={mode} focused={focused} />
<Line mode={mode} focused={focused} />
<Line mode={mode} focused={focused} />
</div>
</div>
<div class="absolute h-full w-full opacity-10 mix-blend-multiply">
{/* <div class="absolute h-full w-full opacity-15 mix-blend-multiply">
<Noise />
</div>
<div class="absolute h-full w-full opacity-10 mix-blend-hard-light">
</div> */}
<div class="absolute h-full w-full opacity-15 mix-blend-hard-light">
<Noise />
</div>
</>
@@ -110,7 +116,7 @@ function Line({
mode: SL<"Scroll" | "Static">;
focused: Accessor<boolean>;
}) {
const shuffled = shuffle(texts).slice(0, 10);
const shuffled = shuffle(texts).slice(0, 21);
const joined = shuffled.join(". ");
return (
@@ -144,14 +150,14 @@ function TextWrapper({
// Bug in Safari iOS, not sure where else, works perfectly on Mac OS though
if (!touchScreen) {
onMount(() => {
seconds.set(Math.round(p()!.clientWidth / 20));
seconds.set(Math.round(p()!.clientWidth / 15));
});
}
return (
<p
ref={p.set}
class="inline-block px-2 text-[5dvh] font-black uppercase leading-none"
class="inline-block px-2 text-[4dvh] font-black uppercase leading-none"
style={{
...(wasOnceOn()
? {
@@ -184,15 +190,15 @@ function Noise() {
return (
<svg
class="size-full"
viewBox="0 0 200 200"
viewBox="0 0 210 210"
preserveAspectRatio="none"
xmlns="http://www.w3.org/2000/svg"
>
<filter id="noiseFilter">
<feTurbulence
type="fractalNoise"
baseFrequency="3"
numOctaves="3"
baseFrequency="4"
numOctaves="6"
stitchTiles="stitch"
/>
</filter>
+5 -8
View File
@@ -19,13 +19,10 @@ export function Box({
return (
<div
class={classPropToString([
"p-2",
absolute
? [
"absolute inset-x-0",
absolute === "top"
? "top-0"
: "pointer-events-none bottom-0 bg-gradient-to-b from-transparent to-orange-100 dark:to-black",
absolute === "top" ? "top-0" : "pointer-events-none bottom-0",
]
: "relative",
classes,
@@ -33,11 +30,11 @@ export function Box({
>
<div
class={classPropToString([
"border-lighter pointer-events-auto relative overflow-hidden rounded-xl border shadow-md",
dark
? "bg-white/40 backdrop-blur-sm dark:bg-orange-100/5"
: "bg-white/60 backdrop-blur-md dark:bg-orange-200/10",
"pointer-events-auto relative overflow-hidden rounded-full border shadow-md",
])}
style={{
"background-color": "var(--background-color)",
}}
>
<div
class={classPropToString([
@@ -332,30 +332,27 @@ export function Chart({
<div
style={{
height: isLastDrawn() ? "100%" : "calc(100% - 62px)",
"margin-bottom": isLastDrawn() ? "" : "-2px",
}}
class={classPropToString([
isDrawn()
? ["max-h-full", !isLastDrawn() ? "border-b" : "mb-[-2px]"]
? [
"max-h-full",
// isLastDrawn() ? "mb-[-2px]"
]
: "max-h-0",
"border-lighter relative h-full min-h-0 w-full cursor-crosshair",
"relative h-full min-h-0 w-full cursor-crosshair",
])}
>
<div ref={div.set} class="size-full" />
<Show when={isDrawn()}>
<div class="text-low-contrast absolute left-0 top-0 px-2 py-1.5 text-xs">
{chartIndex === 0
? ("US Dollars" satisfies Unit)
: presetAccessor().unit}
</div>
<div
style={{
bottom: `${isLastDrawn() ? 32 : 0}px`,
right: `77px`,
}}
class="text-low-contrast absolute z-10 px-3 py-0.5"
>
<div class="pointer-events-none absolute left-0 top-0 z-10 flex items-center space-x-2 px-6 text-xs">
<span>
{chartIndex === 0
? ("US Dollars" satisfies Unit)
: presetAccessor().unit}
</span>
<span class="off"></span>
<RadioGroup size="xs" title={chartPriceModeKey} sl={chartPriceMode} />
</div>
</Show>
@@ -21,7 +21,7 @@ export function Legend({
let toggle = false;
return (
<Scrollable classes="items-center gap-1 p-1.5">
<Scrollable classes="items-center gap-7">
<For each={legendList()}>
{(legend) => {
createEffect(() => {
@@ -83,77 +83,81 @@ export function Legend({
return (
<Show when={!legend.disabled()}>
<button
onMouseEnter={() => legend.visible() && hovered.set(legend)}
onMouseLeave={() => hovered.set(undefined)}
onTouchStart={() => legend.visible() && hovered.set(legend)}
onTouchEnd={() => hovered.set(undefined)}
onClick={() => {
const currentClickTime = new Date().getTime();
<div class="flex flex-none items-center space-x-1.5">
<button
title="Click to toggle, double click to focus"
onMouseEnter={() => legend.visible() && hovered.set(legend)}
onMouseLeave={() => hovered.set(undefined)}
onTouchStart={() => legend.visible() && hovered.set(legend)}
onTouchEnd={() => hovered.set(undefined)}
onClick={() => {
const currentClickTime = new Date().getTime();
if (currentClickTime - previousClickTime > 300) {
legend.visible.set((visible) => !visible);
} else {
legendList().forEach((_legend) => {
if (_legend.title != legend.title) {
_legend.visible.set(toggle);
}
});
if (currentClickTime - previousClickTime > 300) {
legend.visible.set((visible) => !visible);
} else {
legendList().forEach((_legend) => {
if (_legend.title != legend.title) {
_legend.visible.set(toggle);
}
});
legend.visible.set(true);
legend.visible.set(true);
toggle = !toggle;
}
previousClickTime = currentClickTime;
if (legend.visible()) {
hovered.set(legend);
} else {
hovered.set(undefined);
}
}}
class="flex flex-none items-center space-x-1.5 rounded-full py-1.5 pl-2 pr-2.5 hover:bg-orange-800/20 active:scale-[0.975] dark:hover:bg-orange-200/20"
>
<span
class="flex size-4 flex-col overflow-hidden rounded-full"
style={{
opacity: legend.visible() ? 1 : 0.5,
}}
>
<For
each={
Array.isArray(legend.color)
? legend.color.map((c) => c(dark))
: [legend.color(dark)]
toggle = !toggle;
}
previousClickTime = currentClickTime;
if (legend.visible()) {
hovered.set(legend);
} else {
hovered.set(undefined);
}
>
{(color) => (
<span
class="w-full flex-1"
style={{
"background-color": color,
}}
/>
)}
</For>
</span>
<span
class="text-high-contrast decoration-high-contrast decoration-wavy decoration-[1.5px]"
style={{
"text-decoration-line": !legend.visible()
? "line-through"
: undefined,
"--tw-text-opacity": legend.visible() ? 1 : 0.5,
}}
class="flex flex-none items-center space-x-1.5 active:scale-[0.975]"
>
{legend.title}
</span>
<span
class="flex size-3 flex-col overflow-hidden rounded-full"
style={{
opacity: legend.visible() ? 1 : 0.5,
}}
>
<For
each={
Array.isArray(legend.color)
? legend.color.map((c) => c(dark))
: [legend.color(dark)]
}
>
{(color) => (
<span
class="w-full flex-1"
style={{
"background-color": color,
}}
/>
)}
</For>
</span>
<span
class="text-sm font-medium decoration-wavy decoration-[1.5px]"
style={{
"text-decoration-line": !legend.visible()
? "line-through"
: undefined,
"text-decoration-color": "var(--color)",
color: !legend.visible() ? "var(--off-color)" : undefined,
}}
>
{legend.title}
</span>
</button>
<Show when={legend.dataset.url}>
{(url) => (
<a
title="Dataset"
class="border-superlight -my-0.5 !-mr-1 inline-flex size-6 flex-col overflow-hidden rounded-full border bg-white bg-opacity-5 p-1 pl-0.5 hover:bg-opacity-50 dark:bg-orange-200 dark:bg-opacity-5 dark:hover:bg-opacity-25"
class="inline-flex size-4 flex-col overflow-hidden active:scale-[0.975]"
onClick={(event) => {
event.stopPropagation();
}}
@@ -168,7 +172,7 @@ export function Legend({
</a>
)}
</Show>
</button>
</div>
</Show>
);
}}
@@ -61,7 +61,7 @@ export function TimeScale({
onCleanup(() => clearInterval(interval));
return (
<Box dark padded={false} spaced={false} classes="short:hidden">
<Box padded={false} spaced={false} classes="short:hidden text-sm">
<div class="flex items-center p-1.5">
<Button
square
@@ -73,14 +73,23 @@ export function TimeScale({
>
<Show
when={scrollDirection() === LEFT}
fallback={<IconTablerPlayerTrackPrevFilled />}
fallback={
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 16 16"
fill="currentColor"
class="size-5"
>
<path d="M8.5 4.75a.75.75 0 0 0-1.107-.66l-6 3.25a.75.75 0 0 0 0 1.32l6 3.25a.75.75 0 0 0 1.107-.66V8.988l5.393 2.921A.75.75 0 0 0 15 11.25v-6.5a.75.75 0 0 0-1.107-.66L8.5 7.013V4.75Z" />
</svg>
}
>
<IconTablerPlayerPauseFilled />
<IconTablerPlayerPauseFilled class="size-5" />
</Show>
</Button>
</div>
<div class="border-lighter border-l" />
<Scrollable classes="p-1.5 space-x-2">
<div class="mr-2 border-l" />
<Scrollable classes="space-x-2">
<Switch>
<Match when={scale() === "date"}>
<Button
@@ -235,7 +244,7 @@ export function TimeScale({
</Match>
</Switch>
</Scrollable>
<div class="border-lighter border-l" />
<div class="ml-2 border-l" />
<div class="flex items-center p-1.5">
<Button
square
@@ -247,9 +256,18 @@ export function TimeScale({
>
<Show
when={scrollDirection() === RIGHT}
fallback={<IconTablerPlayerTrackNextFilled />}
fallback={
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 16 16"
fill="currentColor"
class="size-5"
>
<path d="M2.53 3.956A1 1 0 0 0 1 4.804v6.392a1 1 0 0 0 1.53.848l5.113-3.196c.16-.1.279-.233.357-.383v2.73a1 1 0 0 0 1.53.849l5.113-3.196a1 1 0 0 0 0-1.696L9.53 3.956A1 1 0 0 0 8 4.804v2.731a.992.992 0 0 0-.357-.383L2.53 3.956Z" />
</svg>
}
>
<IconTablerPlayerPauseFilled />
<IconTablerPlayerPauseFilled class="size-5" />
</Show>
</Button>
</div>
@@ -273,11 +291,8 @@ function Button({
<button
class={classPropToString([
minWidth && "min-w-20",
square ? "p-2" : "px-2 py-1.5",
disabled?.()
? "text-low-contrast"
: "hover:bg-orange-50/20 active:scale-95",
"flex-shrink-0 flex-grow whitespace-nowrap rounded-lg",
!disabled?.() && "active:scale-95",
"flex-shrink-0 flex-grow whitespace-nowrap p-1.5 font-medium",
])}
onClick={onClick}
disabled={disabled?.()}
@@ -1,14 +1,14 @@
export function Title({ presets }: { presets: Presets }) {
return (
<div
class="flex flex-1 items-center overflow-y-auto p-1.5"
class="flex-0 -mx-6 -mb-4 flex items-center overflow-x-auto px-6 pb-4 pt-1"
style={{
"scrollbar-width": "thin",
}}
>
<div class="flex-1 -space-y-1 whitespace-nowrap px-1 md:mt-0.5 md:-space-y-1.5">
<h3 class="text-xs opacity-50">{`/ ${[...presets.selected().path.map(({ name }) => name), presets.selected().name].join(" / ")}`}</h3>
<div class="flex-1 whitespace-nowrap">
<h1 class="text-lg font-bold md:text-xl">{presets.selected().title}</h1>
<h3 class="off">{`/ ${[...presets.selected().path.map(({ name }) => name), presets.selected().name].join(" / ")}`}</h3>
</div>
</div>
);
+20 -36
View File
@@ -42,53 +42,37 @@ export function ChartFrame({
return (
<div
class={classPropToString([
standalone &&
"border-lighter rounded-2xl border bg-gradient-to-b from-white/15 to-white/30 to-80% shadow-md dark:from-orange-100/5 dark:to-black/10",
"flex size-full min-h-0 flex-1 flex-col overflow-hidden",
"frame flex size-full min-h-0 flex-1 flex-col",
])}
style={{
display: (hide ? hide() : false) ? "none" : undefined,
}}
>
<Box
flex={false}
dark
padded={false}
spaced={false}
classes="short:hidden"
>
<Title presets={presets} />
<Title presets={presets} />
<div class="border-lighter border-t" />
<div class="border-t" />
<div class="flex">
<Legend
legend={legend}
scale={scale}
activeIds={activeIds}
dark={dark}
/>
<Legend legend={legend} scale={scale} activeIds={activeIds} dark={dark} />
<div class="border-lighter border-l" />
<Actions presets={presets} qrcode={qrcode} fullscreen={fullscreen} />
<div class="!mt-4 flex min-h-0 flex-1 flex-col">
<div class="relative -ml-6 -mr-8 flex min-h-0 flex-1 flex-col pb-2">
<div class="pointer-events-none absolute inset-x-0 top-0 z-10 h-6 w-full flex-none bg-gradient-to-t from-transparent to-[var(--background-color)]" />
<Show when={wasIdle()}>
<Charts
firstChartSetter={firstChart.set}
datasets={datasets}
legendSetter={legend.set}
preset={presets.selected}
dark={dark}
activeIds={activeIds}
/>
</Show>
<div class="pointer-events-none absolute bottom-9 right-0 z-10 h-6 w-[80px] flex-none bg-gradient-to-b from-transparent to-[var(--background-color)]" />
<div class="pointer-events-none absolute inset-y-0 left-0 z-10 h-full w-6 flex-none bg-gradient-to-r from-[var(--background-color)] from-5% to-transparent" />
</div>
</Box>
<div class="-mr-2 -mt-2 flex min-h-0 flex-1 flex-col">
<Show when={wasIdle()}>
<Charts
firstChartSetter={firstChart.set}
datasets={datasets}
legendSetter={legend.set}
preset={presets.selected}
dark={dark}
activeIds={activeIds}
/>
</Show>
<TimeScale firstChart={firstChart} scale={scale} />
</div>
<TimeScale firstChart={firstChart} scale={scale} />
</div>
);
}
-73
View File
@@ -1,73 +0,0 @@
import { Box } from "./box";
import { Button, ButtonRandomChart } from "./button";
import { Header } from "./header";
import { Line } from "./line";
import { Number } from "./number";
export function FavoritesFrame({
presets,
selectedFrame,
}: {
presets: Presets;
selectedFrame: Accessor<FrameName>;
}) {
return (
<div
class="relative flex-1 overflow-y-auto overflow-x-hidden"
style={{
display: selectedFrame() !== "Favorites" ? "none" : undefined,
}}
>
<div class="flex max-h-full min-h-0 flex-1 flex-col gap-4 p-4">
<Header title="Favorites">
<Number number={() => presets.favorites().length} /> presets marked as
favorites.
</Header>
<div class="border-lighter -mx-4 border-t" />
<div
class="space-y-0.5 py-1"
// style={{
// display: !presets.favorites().length ? "none" : undefined,
// }}
>
<Show
when={presets.favorites().length}
fallback={
<p>
It seems like you couldn't find any interesting chart for your
favorites ! You might want to try to{" "}
<ButtonRandomChart presets={presets} />
</p>
}
>
<For each={presets.favorites()}>
{(preset) => (
<Line
id={`favorite-${preset.id}`}
name={preset.title}
onClick={() => presets.select(preset)}
active={() => presets.selected() === preset}
header={`/ ${[...preset.path.map(({ name }) => name), preset.name].join(" / ")}`}
/>
)}
</For>
</Show>
</div>
<div class="h-[25dvh] flex-none" />
</div>
<Box absolute="bottom">
<Button onClick={() => presets.selected().isFavorite.set((b) => !b)}>
<span>
{presets.selected().isFavorite()
? "Remove from favorites"
: "Add to favorites"}
</span>
</Button>
</Box>
</div>
);
}
@@ -21,11 +21,11 @@ export function File({
}) {
const tail = createMemo(() =>
favorite() ? (
<span class="rounded-full bg-yellow-950 p-1">
<IconTablerStarFilled class="size-3 text-amber-500" />
</span>
) : !visited() ? (
<span class="mx-1.5 rounded-full bg-orange-500/50 p-1 text-transparent" />
// <span class="p-1">
<IconTablerStarFilled class="orange size-3" />
) : // </span>
!visited() ? (
<span class="ml-1.5 rounded-full bg-orange-500 p-[3px] text-transparent" />
) : undefined,
);
@@ -41,7 +41,3 @@ export function File({
/>
);
}
function randomDegree(min = 0, max = 360) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
@@ -26,12 +26,9 @@ export function Folder({
name={name}
icon={icon}
onClick={onClick}
classes={() => (open() ? "opacity-60" : "")}
tail={() => (
<Show when={!open()}>
<span class="rounded-full bg-orange-50/10 px-2 py-0.5 text-xs text-neutral-400">
{children}
</span>
<span class="off rounded-full py-0.5 pl-2 text-xs">{children}</span>
</Show>
)}
></Line>
@@ -10,6 +10,7 @@ export function Tree({
selectPreset,
path = [],
favorites,
filter,
}: {
tree: PresetTree;
selected: Accessor<Preset>;
@@ -19,6 +20,7 @@ export function Tree({
visible?: Accessor<boolean>;
path?: FilePath;
favorites: Accessor<Preset[]>;
filter: (preset: Preset) => boolean;
}) {
return (
<Show when={visible?.() || !visible}>
@@ -33,25 +35,27 @@ export function Tree({
if (!("tree" in thing)) {
return (
<File
id={thing.id}
name={thing.name}
active={active}
depth={depth}
icon={thing.icon || IconTablerFile}
favorite={favorite}
visited={visited}
onClick={() => {
const selectedId = selected().id;
<Show when={filter(thing)}>
<File
id={thing.id}
name={thing.name}
active={active}
depth={depth}
icon={thing.icon || IconTablerFile}
favorite={favorite}
visited={visited}
onClick={() => {
const selectedId = selected().id;
if (selectedId === thing.id) {
return;
}
if (selectedId === thing.id) {
return;
}
// Has been filled in createPresets
selectPreset(thing as Preset);
}}
/>
// Has been filled in createPresets
selectPreset(thing as Preset);
}}
/>
</Show>
);
}
@@ -59,39 +63,42 @@ export function Tree({
openedFolders().has(thing.id),
);
const childCount = countChildren(thing);
const childCount = countChildren(thing, filter);
return (
<div>
<Folder
id={thing.id}
name={thing.name}
depth={depth}
open={childrenVisible}
children={childCount}
onClick={() => {
openedFolders.set((s) => {
if (childrenVisible()) {
s.delete(thing.id);
} else {
s.add(thing.id);
}
<Show when={childCount}>
<div>
<Folder
id={thing.id}
name={thing.name}
depth={depth}
open={childrenVisible}
children={childCount}
onClick={() => {
openedFolders.set((s) => {
if (childrenVisible()) {
s.delete(thing.id);
} else {
s.add(thing.id);
}
return s;
});
}}
/>
<Tree
tree={thing.tree}
selected={selected}
depth={depth + 1}
openedFolders={openedFolders}
visible={childrenVisible}
path={[...path, { name: thing.name, id: thing.id }]}
selectPreset={selectPreset}
favorites={favorites}
/>
</div>
return s;
});
}}
/>
<Tree
tree={thing.tree}
selected={selected}
depth={depth + 1}
openedFolders={openedFolders}
visible={childrenVisible}
path={[...path, { name: thing.name, id: thing.id }]}
selectPreset={selectPreset}
favorites={favorites}
filter={filter}
/>
</div>
</Show>
);
}}
</For>
@@ -100,14 +107,17 @@ export function Tree({
);
}
function countChildren(folder: PresetFolder) {
function countChildren(
folder: PresetFolder,
isOkay: (preset: Preset) => boolean,
) {
let count = 0;
function _countChildren(tree: PartialPresetTree) {
tree.forEach((anyPreset) => {
if ("tree" in anyPreset) {
_countChildren(anyPreset.tree);
} else {
} else if (isOkay(anyPreset as Preset)) {
count += 1;
}
});
+48 -18
View File
@@ -1,12 +1,11 @@
import { scrollIntoView } from "/src/scripts/utils/scroll";
import { createSL } from "/src/scripts/utils/selectableList/static";
import { sleep } from "/src/scripts/utils/sleep";
import { tick } from "/src/scripts/utils/tick";
import { createRWS } from "/src/solid/rws";
import { Box } from "../box";
import { Button } from "../button";
import { Header } from "../header";
import { Number } from "../number";
import { RadioGroup } from "../settings";
import { Tree } from "./components/tree";
export function FoldersFrame({
@@ -22,6 +21,11 @@ export function FoldersFrame({
goToSelected(presets);
});
const filter = createSL(["Any", "Favorites", "New"] as const, {
defaultIndex: 0,
selectedIndex: 0,
});
return (
<div
class="relative flex size-full flex-1 flex-col"
@@ -29,14 +33,17 @@ export function FoldersFrame({
display: selectedFrame() !== "Folders" ? "none" : undefined,
}}
>
<div class="flex-1 overflow-y-auto overflow-x-hidden">
<div class="flex max-h-full min-h-0 flex-1 flex-col gap-4 p-4">
<Header title="Folders">
<Number number={() => presets.list.length} /> charts organized in a
tree like structure.
</Header>
<div class="frame">
<Header title="Folders">Organized in a tree like structure</Header>
<div class="border-lighter -mx-4 border-t" />
<div class="border-lighter my-2 border-t" />
<div class="space-y-3">
<div class="flex items-baseline space-x-6">
<span class="text-sm">Filter</span>
<span class="flex-1 self-center border-b" />
<RadioGroup size="sm" title="Filter" sl={filter} />
</div>
<Tree
tree={presets.tree}
@@ -44,14 +51,28 @@ export function FoldersFrame({
selected={presets.selected}
selectPreset={presets.select}
favorites={presets.favorites}
filter={(preset) => {
switch (filter.selected()) {
case "Any":
return true;
case "Favorites":
return preset.isFavorite();
case "New":
return !preset.visited();
}
}}
/>
<div class="h-[50dvh] flex-none" />
</div>
<div class="h-[50dvh] flex-none" />
</div>
<Box absolute="bottom">
<Button
<div class="absolute bottom-0 right-0 flex space-x-4 p-6">
<button
class="rounded-full border bg-[var(--background-color)] p-3 active:scale-95"
style={{
"box-shadow": "0 0 10px 5px var(--background-color)",
}}
onClick={() => {
presets.openedFolders.set((s) => {
s.clear();
@@ -63,10 +84,19 @@ export function FoldersFrame({
scrollIntoView(div());
}}
>
Close all folders
</Button>
<Button onClick={() => goToSelected(presets)}>Go to selected</Button>
</Box>
<IconTablerRestore class="size-5" />
</button>
<button
class="rounded-full border bg-[var(--background-color)] p-3 active:scale-95"
style={{
"box-shadow": "0 0 10px 5px var(--background-color)",
}}
onClick={() => goToSelected(presets)}
>
<IconTablerClick class="size-5" />
</button>
</div>
</div>
);
}
+2 -2
View File
@@ -1,8 +1,8 @@
export function Header({ title, children }: { title: string } & ParentProps) {
return (
<div>
<div class="pt-1">
<h3 class="text-lg font-bold md:text-xl">{title}</h3>
<p class="text-orange-950/60 dark:text-orange-100/75">{children}</p>
<p class="off">{children}</p>
</div>
);
}
+47 -33
View File
@@ -14,12 +14,12 @@ export function HistoryFrame({
}) {
return (
<div
class="flex-1 overflow-y-auto overflow-x-hidden"
class="frame"
style={{
display: selectedFrame() !== "History" ? "none" : undefined,
}}
>
<div class="flex max-h-full min-h-0 flex-1 flex-col p-4">
<div class="flex max-h-full min-h-0 flex-1 flex-col">
<Header title="History">List of previously visited charts.</Header>
<div class="space-y-0.5 pt-4">
@@ -43,41 +43,55 @@ export function HistoryFrame({
<Show
when={
index() === 0 ||
presets.history()[index()].date.toJSON().split("T")[0] !==
presets
.history()
[index()].date.toLocaleString()
.split(",")[0] !==
presets
.history()
[index() - 1].date.toJSON()
.split("T")[0]
[index() - 1].date.toLocaleString()
.split(",")[0]
}
>
<div class="sticky top-[calc(-0.5rem-1px)] z-10 -mx-4 py-2">
<div class="border-lighter border-y bg-[#F4EAE3] p-2 dark:bg-[rgb(25,15,15)]">
<p class="ml-2">
<Switch fallback={date.toLocaleDateString()}>
<Match
when={
new Date().toJSON().split("T")[0] ===
date.toJSON().split("T")[0]
}
>
Today
</Match>
<Match
when={
run(() => {
const d = new Date();
d.setDate(d.getDate() - 1);
return d;
})
.toJSON()
.split("T")[0] === date.toJSON().split("T")[0]
}
>
Yesterday
</Match>
</Switch>
</p>
</div>
<div class="sticky top-[calc(-2.0rem-1px)] z-10 py-2">
<p
class="border-y pb-2 pt-7"
style={{
background: "var(--background-color)",
}}
>
<Switch
fallback={date.toLocaleDateString(undefined, {
weekday: "long",
year: "numeric",
month: "long",
day: "numeric",
})}
>
<Match
when={
new Date().toLocaleString().split(",")[0] ===
date.toLocaleString().split(",")[0]
}
>
Today
</Match>
<Match
when={
run(() => {
const d = new Date();
d.setUTCDate(d.getUTCDate() - 1);
return d;
})
.toLocaleString()
.split(",")[0] ===
date.toLocaleString().split(",")[0]
}
>
Yesterday
</Match>
</Switch>
</p>
</div>
</Show>
<Line
+5 -8
View File
@@ -31,10 +31,8 @@ export function Line({
<button
id={id}
class={classPropToString([
active?.()
? "bg-orange-500/30 backdrop-blur-sm hover:bg-orange-500/50"
: "hover:bg-orange-500/15",
"relative -mx-2 flex w-[calc(100%+1rem)] items-center whitespace-nowrap rounded-lg px-2 hover:backdrop-blur-sm",
active?.() && "orange",
"relative -mx-2 flex w-[calc(100%+1rem)] items-center whitespace-nowrap rounded-lg px-2 text-sm font-medium hover:text-[var(--orange)]",
classes?.(),
])}
ref={ref.set}
@@ -45,7 +43,7 @@ export function Line({
title={name}
>
<For each={new Array(depth)}>
{() => <span class="border-lighter ml-1 h-8 w-3 flex-none border-l" />}
{() => <span class="ml-1 h-8 w-3 flex-none border-l" />}
</For>
<Show when={icon}>
{(icon) => (
@@ -61,17 +59,16 @@ export function Line({
</Show>
<span
class={classPropToString([
!icon && "px-1",
"inline-flex w-full flex-col -space-y-1 truncate py-1 text-left",
])}
>
<Show when={header}>
<span class="truncate text-xs opacity-50" innerHTML={header} />
<span class="off truncate text-xs" innerHTML={header} />
</Show>
<span class="space-x-1 truncate">
<span innerHTML={name} />
<Show when={nameRest.length}>
<span innerHTML={" - " + nameRest.join(" - ")} class="opacity-50" />
<span innerHTML={" " + nameRest.join(" ")} class="off" />
</Show>
</span>
</span>
+1 -3
View File
@@ -1,7 +1,5 @@
export function Number({ number }: { number: () => number }) {
return (
<span class="font-medium text-orange-400/75">
{number().toLocaleString("en-us")}
</span>
<span class="orange font-medium">{number().toLocaleString("en-us")}</span>
);
}
+12 -9
View File
@@ -50,14 +50,13 @@ export function Scrollable({
createEffect(on(children, checkScrollable));
return (
<div class="relative min-w-0 flex-1">
<div class="relative flex min-w-0 flex-grow-0 items-center">
<For
each={[
{
showArrow: showLeftArrow,
side: "left-0",
order: "",
buttonPadding: "pl-2",
iconPadding: "pr-0.5",
scrollMultiplier: -1,
chevronIcon: IconTablerChevronLeft,
@@ -67,7 +66,6 @@ export function Scrollable({
showArrow: showRightArrow,
side: "right-0",
order: "order-2",
buttonPadding: "pr-2",
iconPadding: "pl-0.5",
scrollMultiplier: 1,
chevronIcon: IconTablerChevronRight,
@@ -87,9 +85,11 @@ export function Scrollable({
<div
class={[
obj.order,
obj.buttonPadding,
"pointer-events-auto flex h-full items-center bg-stone-100/75 dark:bg-stone-900/75",
"pointer-events-auto flex h-full items-center",
].join(" ")}
style={{
"background-color": "var(--background-color)",
}}
>
<button
onClick={() => {
@@ -102,7 +102,10 @@ export function Scrollable({
behavior: "smooth",
});
}}
class="border-light rounded-full border bg-stone-100 p-0.5 shadow transition hover:scale-110 active:scale-100 dark:bg-stone-900"
class="rounded-full border p-0.5 transition hover:scale-110 active:scale-100"
style={{
"background-color": "var(--background-color)",
}}
>
<Dynamic
component={obj.chevronIcon}
@@ -112,10 +115,10 @@ export function Scrollable({
</div>
</Show>
<div
class={[
class={classPropToString([
obj.gradientDirection,
"h-full w-8 from-stone-100/75 to-transparent dark:from-stone-900/75",
].join(" ")}
"h-full w-8 from-[var(--background-color)] to-transparent",
])}
/>
</div>
</Show>
+6 -6
View File
@@ -124,13 +124,13 @@ export function SearchFrame({
return (
<div
class="relative flex size-full flex-1 flex-col"
class="frame relative flex size-full flex-1 flex-col"
style={{
display: selectedFrame() !== "Search" ? "none" : undefined,
}}
>
<div class="flex-1 space-y-1 overflow-y-auto p-4 pt-16">
<p class="py-2 text-orange-100/75">
<div class="flex-1 space-y-1 overflow-y-auto pt-16">
<p class="py-1.5 text-orange-100/75">
<Show
when={search()}
fallback={
@@ -149,7 +149,7 @@ export function SearchFrame({
</p>
<Show when={search()}>
<div class="border-lighter -mx-4 border-t" />
<div class="border-lighter border-t" />
<div
class="py-1"
@@ -176,9 +176,9 @@ export function SearchFrame({
</Show>
</div>
<Box absolute="top" padded={false}>
<Box absolute="top" padded={false} classes="mx-6">
<div
class="relative flex w-full cursor-text items-center space-x-0.5 px-3 py-2 hover:bg-orange-200/5"
class="relative flex w-full cursor-text items-center space-x-0.5 px-3 py-1.5"
onClick={() => inputRef()?.focus()}
>
<IconTablerSearch />
+244 -214
View File
@@ -21,204 +21,192 @@ export function SettingsFrame({
}) {
return (
<div
class="flex-1 overflow-y-auto overflow-x-hidden"
class="frame"
style={{
display: selectedFrame() !== "Settings" ? "none" : undefined,
}}
>
<div class="space-y-4 p-4">
<Header title="Settings">And other stuff</Header>
{/* <div class=""> */}
<Header title="Settings">And other stuff</Header>
<div class="border-lighter -mx-4 border-t" />
<div class="border-lighter border-t" />
<div class="space-y-4">
<Title>General</Title>
<div class="space-y-4">
<Title>General</Title>
<FieldRadioGroup
title="Theme"
ariaTitle="App's theme"
description="Options for the app's theme"
sl={appTheme}
/>
</div>
<div class="border-lighter -mx-4 border-t" />
<div class="space-y-4">
<Title>Background</Title>
<FieldRadioGroup
title="Mode"
ariaTitle="Background mode"
description="Options for how the background in displayed"
sl={backgroundMode}
/>
<FieldRadioGroup
title="Opacity"
ariaTitle="Background mode"
description="Options for the opacity of the text in the background"
sl={backgroundOpacity}
/>
</div>
<hr class="border-lighter -mx-4 border-t" />
<div class="space-y-4">
<Title>Donations</Title>
<p>
A <strong>massive thank you</strong> to everybody who sent their
hard earned sats. This project, by being completely free, is very
dependent and only founded by the goodwill of fellow itcoiners.
</p>
<p>Top 10 Leaderboard:</p>
<ol class="list-inside list-decimal">
<For
each={[
{
name: "_Checkɱate",
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://x.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: 10_110,
},
]
.sort((a, b) =>
b.amount !== a.amount
? b.amount - a.amount
: a.name.localeCompare(b.name),
)
.slice(0, 10)}
>
{({ name, url, amount }) => (
<li>
<a href={url} target="_blank">
{name}
</a>{" "}
- {amount.toLocaleString("en-us")} sats
</li>
)}
</For>
</ol>
</div>
<Show when={!standalone && safariOnly && (macOS || ipad || iphone)}>
<hr class="border-lighter -mx-4 border-t" />
<div class="space-y-4">
<Title>Install</Title>
<p>
<Show when={macOS}>
This app can be installed by clicking on the "File" tab on the
menu bar and then on "Add to dock".
</Show>
<Show when={iphone || ipad}>
This app can be installed by tapping on the "Share" button tab
of Safari and then on "Add to Home Screen".
</Show>
</p>
</div>
</Show>
<FieldRadioGroup
title="Theme"
ariaTitle="App's theme"
description="Options for the app's theme"
sl={appTheme}
/>
</div>
<hr class="border-lighter -mx-4 border-t" />
<hr class="border-lighter border-t" />
<div class="space-y-4">
<Title>Donations</Title>
<p>
A massive thank you to everybody who sent their hard earned sats. This
project, by being completely free, is very dependent and only founded
by the goodwill of fellow itcoiners.
</p>
<p>Top 21 Leaderboard:</p>
<ol class="off ml-8 list-decimal">
<For
each={[
{
name: "_Checkɱate",
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://x.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: 10_110,
},
{
name: "SoundMoney=Prosperity4ALL",
url: "https://x.com/SoundmoneyP",
amount: 420_000,
},
]
.sort((a, b) =>
b.amount !== a.amount
? b.amount - a.amount
: a.name.localeCompare(b.name),
)
.slice(0, 21)}
>
{({ name, url, amount }) => (
<li class="text-sm">
<a href={url} target="_blank" class="text-base">
{name}
</a>{" "}
{" "}
<span class="orange text-sm">
{amount.toLocaleString("en-us")} sats
</span>
</li>
)}
</For>
</ol>
</div>
<Show when={!standalone && safariOnly && (macOS || ipad || iphone)}>
<hr class="border-lighter border-t" />
<div class="space-y-4">
<Title>Install</Title>
<p>
<Show when={macOS}>
This app can be installed by clicking on the "File" tab on the
menu bar and then on "Add to dock".
</Show>
<Show when={iphone || ipad}>
This app can be installed by tapping on the "Share" button tab of
Safari and then on "Add to Home Screen".
</Show>
</p>
</div>
</Show>
{/* </div> */}
<hr class="border-lighter border-t" />
<div class="pt-4 md:hidden">
<div class="flex items-center justify-center gap-8 py-1">
@@ -229,32 +217,73 @@ export function SettingsFrame({
</div>
</div>
<p class="p-4 text-center">
<span class="opacity-50">Charts are displayed via </span>{" "}
<p class="off p-4 text-center">
<span>Charts are displayed via </span>{" "}
<a href="https://www.tradingview.com" target="_blank">
Trading View
</a>
<span class="opacity-50">'s</span>{" "}
<span>'s</span>{" "}
<a
href="https://www.tradingview.com/lightweight-charts/"
target="_blank"
>
Lightweight Charts
</a>{" "}
<span class="opacity-50">library</span>
<span>library</span>
</p>
<hr class="border-lighter -mx-4 border-t" />
<hr class="border-t" />
<p class="pb-[10vh] pt-4 text-center">
<span class="opacity-50">Version:</span>{" "}
<a
href="https://github.com/satonomics-org/satonomics/blob/main/CHANGELOG.md"
target="_blank"
>
{version}
</a>
</p>
<footer class="pt-4">
<p class="flex justify-center">
<svg
class="w-28"
viewBox="0 0 750 180"
xmlns="http://www.w3.org/2000/svg"
>
<g transform="matrix(7.5, 0, 0, 7.5, -2046.71228, -1592.744873)">
<ellipse
style="fill: #f97316;"
cx="284.895"
cy="224.366"
rx="12"
ry="12"
/>
<path
d="M 285.769 221.936 L 285.769 221.168 C 284.999 220.175 284.482 219 284.292 217.745 C 284.234 217.375 283.772 217.231 283.532 217.518 C 282.954 218.199 282.5 218.998 282.194 219.883 C 283.129 220.931 284.381 221.65 285.769 221.936 Z M 288.832 219.115 C 287.624 219.115 286.646 220.097 286.646 221.305 L 286.646 222.929 C 283.79 222.76 281.369 221.002 280.274 218.508 C 280.124 218.166 279.641 218.146 279.48 218.483 C 279.026 219.443 278.771 220.515 278.771 221.646 C 278.771 223.583 279.703 225.391 281.098 226.73 C 281.457 227.077 281.81 227.364 282.161 227.627 L 278.226 228.611 C 277.933 228.684 277.802 229.024 277.967 229.278 C 278.442 230.014 279.618 231.261 282.156 231.365 C 282.375 231.373 282.593 231.294 282.759 231.149 L 284.543 229.615 L 286.646 229.615 C 289.062 229.615 291.02 227.659 291.02 225.242 L 291.02 220.865 L 291.895 219.115 L 288.832 219.115 Z M 288.832 221.757 C 288.592 221.757 288.353 221.541 288.353 221.301 C 288.353 221.061 288.592 220.849 288.832 220.849 C 289.072 220.849 289.294 221.069 289.294 221.309 C 289.294 221.549 289.072 221.757 288.832 221.757 Z"
style="fill: rgb(255, 255, 255);"
/>
<path
d="M 290.285 219.064 C 290.545 218.803 290.363 218.355 289.994 218.355 L 288.365 218.355 C 287.925 218.355 287.503 218.528 287.191 218.84 L 285.678 220.352 C 285.388 220.233 285.085 220.145 284.774 220.088 C 283.348 219.827 281.823 220.246 280.72 221.349 C 279.828 222.239 279.385 223.404 279.385 224.574 C 279.385 225.946 278.269 227.061 276.897 227.061 C 276.86 227.961 277.374 228.794 278.2 229.159 C 279.024 229.529 279.985 229.35 280.628 228.719 L 281.993 227.355 L 284.41 229.773 C 284.795 230.158 285.33 230.378 285.877 230.378 L 291.652 230.378 C 291.988 230.378 292.287 230.18 292.415 229.868 C 292.544 229.557 292.474 229.2 292.237 228.96 L 291.773 228.495 C 291.702 228.425 291.628 228.363 291.549 228.305 L 292.482 228.305 C 292.851 228.305 293.034 227.857 292.772 227.596 L 292.308 227.132 C 291.997 226.821 291.573 226.647 291.135 226.647 L 288.091 226.647 L 290.164 225.818 L 289.82 225.473 C 289.509 225.162 289.087 224.988 288.646 224.988 L 286.432 224.988 L 287.677 224.159 L 287.333 223.815 C 287.022 223.503 286.598 223.329 286.16 223.329 L 286.018 223.329 L 290.285 219.064 Z M 279.798 227.89 C 279.798 228.119 279.613 228.305 279.385 228.305 C 279.157 228.305 278.971 228.119 278.971 227.89 C 278.971 227.662 279.157 227.477 279.385 227.477 C 279.613 227.477 279.798 227.662 279.798 227.89 Z M 286.706 228.305 L 289.89 228.305 C 290.223 228.305 290.538 228.438 290.769 228.67 L 291.648 229.549 L 285.873 229.549 C 285.546 229.549 285.231 229.417 284.998 229.183 L 282.581 226.767 L 283.531 225.818 L 285.533 227.82 C 285.844 228.132 286.267 228.305 286.706 228.305 Z"
style="fill: rgb(255, 255, 255); visibility: hidden; transform-box: fill-box; transform-origin: 50% 50%;"
transform="matrix(-1, 0, 0, -1, 0.000002, 0.000002)"
/>
</g>
<g>
<path
d="M 278.049 146.789 L 278.049 127.527 L 287.141 117.972 L 304.4 146.789 L 331.83 146.789 L 303.784 100.251 L 332.755 69.739 L 303.013 69.739 L 278.049 97.477 L 278.049 30.598 L 254.318 30.598 L 254.318 146.789 L 278.049 146.789 Z M 354.169 57.719 C 361.565 57.719 367.575 51.709 367.575 44.158 C 367.575 36.608 361.565 30.752 354.169 30.752 C 346.618 30.752 340.608 36.608 340.608 44.158 C 340.608 51.709 346.618 57.719 354.169 57.719 Z M 342.457 146.789 L 366.188 146.789 L 366.188 69.739 L 342.457 69.739 L 342.457 146.789 Z M 406.407 146.789 L 407.64 136.927 C 411.801 144.015 421.047 148.792 431.834 148.792 C 453.716 148.792 468.972 132.92 468.972 109.035 C 468.972 83.916 455.257 67.119 433.683 67.119 C 422.588 67.119 412.417 71.742 407.794 78.677 L 407.794 30.598 L 384.063 30.598 L 384.063 146.789 L 406.407 146.789 Z M 407.948 107.802 C 407.948 96.244 415.653 88.539 426.749 88.539 C 437.998 88.539 445.087 96.398 445.087 107.802 C 445.087 119.205 437.998 127.064 426.749 127.064 C 415.653 127.064 407.948 119.359 407.948 107.802 Z M 498.713 56.332 L 543.402 56.332 L 543.402 40.306 L 498.713 40.306 L 498.713 56.332 Z M 478.526 108.11 C 478.526 132.458 496.402 148.638 521.058 148.638 C 545.56 148.638 563.435 132.458 563.435 108.11 C 563.435 83.762 545.56 67.428 521.058 67.428 C 496.402 67.428 478.526 83.762 478.526 108.11 Z M 502.412 107.956 C 502.412 96.398 509.963 88.693 521.058 88.693 C 531.999 88.693 539.55 96.398 539.55 107.956 C 539.55 119.667 531.999 127.372 521.058 127.372 C 509.963 127.372 502.412 119.667 502.412 107.956 Z"
style="fill: var(--color);"
/>
<path
d="M 589.19 97.802 L 589.19 106.23 L 610.948 106.23 C 605.1 112.938 597.446 119.044 587.986 124.376 L 593.404 131.514 C 597.532 128.934 601.488 126.268 605.186 123.43 L 605.186 146.048 L 614.13 146.048 L 614.13 123.43 L 626.944 123.43 L 626.944 149.402 L 635.974 149.402 L 635.974 123.43 L 649.82 123.43 L 649.82 134.008 C 649.82 136.072 649.046 137.104 647.498 137.104 L 640.36 136.674 L 642.768 145.188 L 650.422 145.188 C 655.926 145.188 658.678 142.092 658.678 135.986 L 658.678 115.174 L 635.974 115.174 L 635.974 108.638 L 626.944 108.638 L 626.944 115.174 L 614.388 115.174 C 617.054 112.336 619.548 109.326 621.784 106.23 L 665.128 106.23 L 665.128 97.802 L 626.858 97.802 C 627.89 95.824 628.836 93.76 629.696 91.61 L 620.838 90.492 C 619.806 92.9 618.516 95.394 617.14 97.802 L 589.19 97.802 Z M 648.1 68.734 C 642.338 72.088 636.232 75.098 629.868 77.678 C 621.612 75.012 612.926 72.518 603.896 70.282 L 599.252 77.248 C 605.272 78.624 611.206 80.258 617.226 82.15 C 610.088 84.386 602.606 86.106 594.78 87.482 L 599.596 95.308 C 612.324 92.04 622.472 89.116 630.04 86.364 C 638.124 89.116 646.122 92.298 654.034 95.824 L 658.936 88.428 C 653.26 86.02 647.412 83.698 641.392 81.548 C 646.208 79.226 651.11 76.56 655.926 73.55 L 648.1 68.734 Z M 675.438 77.85 L 675.438 85.848 L 682.404 85.848 L 682.404 98.92 C 682.404 101.5 681.114 103.22 678.62 104.166 L 680.684 110.874 C 692.036 108.896 701.926 106.66 710.182 104.08 L 708.634 96.426 C 703.474 98.146 697.454 99.608 690.574 100.984 L 690.574 85.848 L 712.332 85.848 L 712.332 77.85 L 698.916 77.85 C 698.4 74.668 697.884 71.744 697.368 69.164 L 688.338 70.712 C 688.94 72.862 689.542 75.27 690.144 77.85 L 675.438 77.85 Z M 724.028 89.632 L 739.25 89.632 L 739.25 93.502 L 723.856 93.502 C 723.942 92.47 724.028 91.352 724.028 90.32 L 724.028 89.632 Z M 739.25 83.096 L 724.028 83.096 L 724.028 79.226 L 739.25 79.226 L 739.25 83.096 Z M 722.652 100.038 L 739.25 100.038 L 739.25 100.898 C 739.25 103.048 738.218 104.166 736.24 104.166 C 733.918 104.166 731.424 103.994 728.758 103.822 L 730.822 111.562 L 738.734 111.562 C 744.582 111.562 747.506 108.982 747.506 103.908 L 747.506 72.002 L 715.6 72.002 L 715.6 90.922 C 715.428 97.286 713.192 102.532 708.892 106.746 L 715.342 112.594 C 718.782 109.068 721.276 104.854 722.652 100.038 Z M 708.462 121.452 L 708.462 126.784 L 683.608 126.784 L 683.608 134.352 L 708.462 134.352 L 708.462 139.598 L 675.524 139.598 L 675.524 147.51 L 750 147.51 L 750 139.598 L 717.062 139.598 L 717.062 134.352 L 742.174 134.352 L 742.174 126.784 L 717.062 126.784 L 717.062 121.452 L 746.216 121.452 L 746.216 113.712 L 679.308 113.712 L 679.308 121.452 L 708.462 121.452 Z"
style="fill: var(--off-color)"
/>
</g>
</svg>
</p>
<p class="off pt-3 text-center text-xs uppercase">
formerly <b> satonomics</b>
</p>
<p class="off pb-[21vh] pt-6 text-center">
<span>Version:</span>{" "}
<a
href="https://github.com/satonomics-org/satonomics/blob/main/CHANGELOG.md"
target="_blank"
>
{version}
</a>
</p>
</footer>
</div>
);
}
@@ -303,24 +332,25 @@ export function RadioGroup<
return (
<div
class={classPropToString([
size === "xs" && "gap-0.5 rounded-md border p-0.5 text-xs",
size === "sm" && "gap-1 rounded-md border p-1 text-sm",
(!size || size === "base") && "gap-1.5 rounded-lg border p-1.5",
"border-superlight -mx-2 mt-2 flex bg-stone-400/30 backdrop-blur-[2px] dark:bg-stone-950/75",
size === "xs" && "space-x-2 text-xs",
size === "sm" && "space-x-4 text-sm",
(!size || size === "base") && "space-x-6 text-sm",
"pointer-events-auto flex cursor-default",
])}
>
<For each={sl.list()}>
{(value) => (
<label
class={classPropToString([
size === "xs" && "rounded px-1.5 py-0",
size === "sm" && "rounded px-2 py-1",
(!size || size === "base") && "rounded-md px-3 py-1.5",
value === sl.selected()
? "border-lighter bg-orange-50/75 shadow dark:bg-orange-200/10"
: "border-transparent",
"flex flex-1 cursor-pointer select-none items-center justify-center border font-medium hover:bg-orange-50 focus:outline-none active:scale-95 active:bg-orange-50 dark:hover:bg-orange-200/20 dark:active:bg-orange-200/10",
size === "xs" && "rounded",
size === "sm" && "rounded",
(!size || size === "base") && "rounded-md",
"flex flex-1 cursor-pointer select-none items-center justify-center font-medium focus:outline-none active:scale-95",
])}
style={{
color:
value === sl.selected() ? "var(--color)" : "var(--off-color)",
}}
>
<input
type="radio"
@@ -1,35 +1,18 @@
export function AnchorLogo() {
return (
<a
class="inline-flex justify-center rounded-lg bg-gradient-to-br from-orange-300 to-orange-600 p-4 text-orange-50 shadow dark:from-orange-500 dark:to-orange-800 dark:text-orange-50"
href="https://app.satonomics.xyz"
title="Reload"
>
<svg
class="-m-1.5 size-7"
width="100%"
height="100%"
viewBox="0 0 24 24"
version="1.1"
xmlns="http://www.w3.org/2000/svg"
style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;"
fill="currentColor"
>
<g transform="matrix(1.14102,0,0,2.63158,-0.849652,5.12904)">
<rect x="4.25" y="3.751" width="14.023" height="1.52" />
</g>
<g transform="matrix(1.14102,0,0,2.63158,-0.849652,0.129039)">
<rect x="4.25" y="3.751" width="14.023" height="1.52" />
</g>
<g transform="matrix(1.14102,0,0,2.63158,-0.849652,-4.87096)">
<rect x="4.25" y="3.751" width="14.023" height="1.52" />
</g>
<g transform="matrix(0.285256,0,0,2.63158,8.78759,-9.87096)">
<rect x="4.25" y="3.751" width="14.023" height="1.52" />
</g>
<g transform="matrix(0.285256,0,0,2.63158,8.78759,10.129)">
<rect x="4.25" y="3.751" width="14.023" height="1.52" />
</g>
<a href="https://app.satonomics.xyz" class="p-2" title="Reload">
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<ellipse
style="fill: #f97316;"
cx="12"
cy="12"
rx="12"
ry="12"
></ellipse>
<path
d="M 12.874 9.57 L 12.874 8.802 C 12.104 7.809 11.587 6.634 11.397 5.379 C 11.339 5.009 10.877 4.865 10.637 5.152 C 10.059 5.833 9.605 6.632 9.299 7.517 C 10.234 8.565 11.486 9.284 12.874 9.57 Z M 15.937 6.749 C 14.729 6.749 13.751 7.731 13.751 8.939 L 13.751 10.563 C 10.895 10.394 8.474 8.636 7.379 6.142 C 7.229 5.8 6.746 5.78 6.585 6.117 C 6.131 7.077 5.876 8.149 5.876 9.28 C 5.876 11.217 6.808 13.025 8.203 14.364 C 8.562 14.711 8.915 14.998 9.266 15.261 L 5.331 16.245 C 5.038 16.318 4.907 16.658 5.072 16.912 C 5.547 17.648 6.723 18.895 9.261 18.999 C 9.48 19.007 9.698 18.928 9.864 18.783 L 11.648 17.249 L 13.751 17.249 C 16.167 17.249 18.125 15.293 18.125 12.876 L 18.125 8.499 L 19 6.749 L 15.937 6.749 Z M 15.937 9.391 C 15.697 9.391 15.458 9.175 15.458 8.935 C 15.458 8.695 15.697 8.483 15.937 8.483 C 16.177 8.483 16.399 8.703 16.399 8.943 C 16.399 9.183 16.177 9.391 15.937 9.391 Z"
style="fill: #ffffe3;"
></path>
</svg>
</a>
);
@@ -1,24 +0,0 @@
import { Button } from "./button";
export function ButtonFavorites({
selected,
setSelected,
}: {
selected: Accessor<FrameName>;
setSelected: Setter<FrameName>;
}) {
const frameName: FrameName = "Favorites";
return (
<Button
title={frameName}
selected={() => selected() === frameName}
onClick={() => {
setSelected(frameName);
}}
icon={() =>
selected() === frameName ? IconTablerStarFilled : IconTablerStar
}
/>
);
}
@@ -16,42 +16,12 @@ export function ButtonFolders({
onClick={() => {
setSelected(frameName);
}}
icon={() =>
selected() === frameName
? (props: { class?: string }) => (
<svg
width="20"
height="20"
viewBox="0 0 20 20"
fill="none"
xmlns="http://www.w3.org/2000/svg"
class={props.class}
>
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M6.22892 18C4.9566 18 3.93098 18 3.1244 17.8935C2.28697 17.7828 1.58187 17.5461 1.02187 16.9958C0.461866 16.4455 0.221 15.7526 0.108411 14.9296C-3.31178e-05 14.137 -1.7645e-05 13.1291 1.54211e-06 11.8788L1.04302e-06 6.29541C-2.62958e-05 5.47395 -4.90919e-05 4.78896 0.0743487 4.24516C0.152876 3.67118 0.325617 3.15297 0.74937 2.73655C1.17312 2.32012 1.70045 2.15037 2.28453 2.0732C2.8379 2.00009 3.53494 2.00011 4.37086 2.00013L5.92614 2.00007C6.57086 1.99946 7.08108 1.99899 7.55104 2.18869C8.021 2.37838 8.38357 2.73117 8.84172 3.17694L9.06221 3.39116C9.20357 3.52844 9.28285 3.60481 9.34651 3.65795C9.37487 3.68162 9.39161 3.69332 9.40051 3.699C9.40473 3.70169 9.40712 3.70298 9.40801 3.70345L9.40914 3.70399L9.41033 3.70438C9.41129 3.70466 9.41392 3.7054 9.41885 3.7064C9.42924 3.70851 9.44952 3.71175 9.48662 3.7145C9.5699 3.72068 9.68092 3.72113 9.87966 3.72113L13.0938 3.72111C13.6755 3.72097 14.072 3.72087 14.4167 3.78961C15.7901 4.06347 16.8634 5.11825 17.1421 6.46785C17.2021 6.75842 17.2105 7.08647 17.2116 7.53472C17.4034 7.54922 17.5834 7.56801 17.7514 7.59237C18.5137 7.70289 19.1943 7.94917 19.6331 8.57761C20.0718 9.20605 20.0607 9.91868 19.8913 10.6574C19.7278 11.3702 19.3805 12.2552 18.9553 13.3384L18.6619 14.0857C18.3405 14.9047 18.0787 15.5717 17.8049 16.0905C17.5191 16.6321 17.1912 17.0712 16.7057 17.3985C16.2202 17.7258 15.6854 17.8685 15.0682 17.9356C14.4771 18 13.7497 18 12.8565 18L6.22892 18ZM5.81464 3.37155C6.62543 3.37155 6.83809 3.3835 7.02081 3.45726C7.20352 3.53101 7.36333 3.6694 7.94003 4.22946L8.08126 4.36662L8.1337 4.41774C8.34688 4.62596 8.57694 4.85067 8.8789 4.97256C9.18087 5.09444 9.50523 5.09353 9.8058 5.09268L9.87966 5.09254H13.0114C13.7067 5.09254 13.9504 5.096 14.1392 5.13363C14.9632 5.29795 15.6072 5.93081 15.7744 6.74058C15.805 6.88885 15.8134 7.07165 15.8155 7.48813C15.5174 7.48575 15.2019 7.48576 14.8692 7.48577H7.25506C6.70131 7.48575 6.23171 7.48573 5.84482 7.52626C5.43306 7.56939 5.05328 7.66313 4.69832 7.88868C4.34336 8.11422 4.10052 8.41609 3.89152 8.76739C3.69515 9.09748 3.50247 9.51829 3.27524 10.0146L2.3991 11.9279C2.00422 12.7902 1.66601 13.5287 1.435 14.1586C1.39636 13.5526 1.39555 12.7992 1.39555 11.8286V6.34295C1.39555 5.46158 1.39703 4.86953 1.45745 4.4279C1.51517 4.006 1.61493 3.82543 1.73617 3.70628C1.85741 3.58714 2.04116 3.48911 2.47049 3.43238C2.91989 3.37301 3.52235 3.37155 4.41924 3.37155H5.81464Z"
fill="currentColor"
></path>
</svg>
)
: (props: { class?: string }) => (
<svg
width="20"
height="20"
viewBox="0 0 20 20"
fill="none"
xmlns="http://www.w3.org/2000/svg"
class={props.class}
>
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M7.59655 2.20712C7.10136 1.9989 6.56115 1.99943 5.9023 2.00007L4.40479 2.00015C3.57853 2.00013 2.88271 2.0001 2.32874 2.07318C1.74135 2.15066 1.20072 2.32242 0.764844 2.75008C0.328798 3.1779 0.153514 3.70882 0.0744639 4.28569C-4.74114e-05 4.82945 -2.52828e-05 5.51233 9.81743e-07 6.32281V11.8675C-1.65965e-05 13.1029 -3.08677e-05 14.1058 0.108284 14.8963C0.221156 15.72 0.464085 16.4241 1.03541 16.9846C1.60656 17.545 2.32369 17.7831 3.16265 17.8938C3.96804 18 4.99002 18 6.2493 18H13.7507C15.01 18 16.032 18 16.8374 17.8938C17.6763 17.7831 18.3934 17.545 18.9646 16.9846C19.5359 16.4241 19.7788 15.72 19.8917 14.8963C20 14.1058 20 13.1029 20 11.8676V9.94525C20 8.70992 20 7.70702 19.8917 6.91657C19.7788 6.09287 19.5359 5.38878 18.9646 4.82823C18.3934 4.26785 17.6763 4.02972 16.8374 3.91905C16.0319 3.81281 15.0099 3.81283 13.7506 3.81285L9.91202 3.81285C9.70527 3.81285 9.59336 3.81232 9.51046 3.80596C9.47861 3.80352 9.461 3.80081 9.45249 3.79919C9.44546 3.79427 9.43137 3.78367 9.40771 3.76281C9.34589 3.70835 9.26838 3.62926 9.12578 3.48235L8.91813 3.26831C8.46421 2.79975 8.09187 2.4154 7.59655 2.20712ZM2.53158 3.55817C2.97217 3.50005 3.5649 3.49846 4.45741 3.49846H5.77707C6.19724 3.49846 6.45952 3.50169 6.63994 3.51453C6.81907 3.52729 6.91262 3.54925 6.99675 3.58462C7.08084 3.61998 7.16148 3.67125 7.29433 3.78964C7.42818 3.90891 7.6114 4.09298 7.90119 4.39152L8.02253 4.51653L8.07907 4.57502C8.29018 4.79381 8.5293 5.04163 8.85233 5.17747C9.17524 5.31324 9.52282 5.31222 9.82983 5.31132L9.91202 5.31115H13.6951C15.023 5.31115 15.9424 5.31274 16.6345 5.40404C17.3048 5.49246 17.6468 5.6525 17.8873 5.88854C18.1277 6.12441 18.2906 6.45944 18.3807 7.11653C18.4737 7.79534 18.4753 8.69706 18.4753 10.0001V11.8128C18.4753 13.1158 18.4737 14.0175 18.3807 14.6963C18.2906 15.3534 18.1277 15.6884 17.8873 15.9243C17.6468 16.1603 17.3048 16.3204 16.6345 16.4088C15.9424 16.5001 15.023 16.5017 13.6951 16.5017H6.30494C4.97698 16.5017 4.05764 16.5001 3.36549 16.4088C2.69519 16.3204 2.35324 16.1603 2.11266 15.9243C1.87226 15.6884 1.70936 15.3534 1.61932 14.6963C1.5263 14.0175 1.52468 13.1158 1.52468 11.8128V6.37469C1.52468 5.49891 1.5263 4.91765 1.5855 4.48566C1.64172 4.07541 1.73696 3.91355 1.8421 3.81039C1.94741 3.70706 2.11288 3.6134 2.53158 3.55817Z"
fill="currentColor"
></path>
</svg>
)
icon={() => () => <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M6.22892 18C4.9566 18 3.93098 18 3.1244 17.8935C2.28697 17.7828 1.58187 17.5461 1.02187 16.9958C0.461866 16.4455 0.221 15.7526 0.108411 14.9296C-3.31178e-05 14.137 -1.7645e-05 13.1291 1.54211e-06 11.8788L1.04302e-06 6.29541C-2.62958e-05 5.47395 -4.90919e-05 4.78896 0.0743487 4.24516C0.152876 3.67118 0.325617 3.15297 0.74937 2.73655C1.17312 2.32012 1.70045 2.15037 2.28453 2.0732C2.8379 2.00009 3.53494 2.00011 4.37086 2.00013L5.92614 2.00007C6.57086 1.99946 7.08108 1.99899 7.55104 2.18869C8.021 2.37838 8.38357 2.73117 8.84172 3.17694L9.06221 3.39116C9.20357 3.52844 9.28285 3.60481 9.34651 3.65795C9.37487 3.68162 9.39161 3.69332 9.40051 3.699C9.40473 3.70169 9.40712 3.70298 9.40801 3.70345L9.40914 3.70399L9.41033 3.70438C9.41129 3.70466 9.41392 3.7054 9.41885 3.7064C9.42924 3.70851 9.44952 3.71175 9.48662 3.7145C9.5699 3.72068 9.68092 3.72113 9.87966 3.72113L13.0938 3.72111C13.6755 3.72097 14.072 3.72087 14.4167 3.78961C15.7901 4.06347 16.8634 5.11825 17.1421 6.46785C17.2021 6.75842 17.2105 7.08647 17.2116 7.53472C17.4034 7.54922 17.5834 7.56801 17.7514 7.59237C18.5137 7.70289 19.1943 7.94917 19.6331 8.57761C20.0718 9.20605 20.0607 9.91868 19.8913 10.6574C19.7278 11.3702 19.3805 12.2552 18.9553 13.3384L18.6619 14.0857C18.3405 14.9047 18.0787 15.5717 17.8049 16.0905C17.5191 16.6321 17.1912 17.0712 16.7057 17.3985C16.2202 17.7258 15.6854 17.8685 15.0682 17.9356C14.4771 18 13.7497 18 12.8565 18L6.22892 18ZM5.81464 3.37155C6.62543 3.37155 6.83809 3.3835 7.02081 3.45726C7.20352 3.53101 7.36333 3.6694 7.94003 4.22946L8.08126 4.36662L8.1337 4.41774C8.34688 4.62596 8.57694 4.85067 8.8789 4.97256C9.18087 5.09444 9.50523 5.09353 9.8058 5.09268L9.87966 5.09254H13.0114C13.7067 5.09254 13.9504 5.096 14.1392 5.13363C14.9632 5.29795 15.6072 5.93081 15.7744 6.74058C15.805 6.88885 15.8134 7.07165 15.8155 7.48813C15.5174 7.48575 15.2019 7.48576 14.8692 7.48577H7.25506C6.70131 7.48575 6.23171 7.48573 5.84482 7.52626C5.43306 7.56939 5.05328 7.66313 4.69832 7.88868C4.34336 8.11422 4.10052 8.41609 3.89152 8.76739C3.69515 9.09748 3.50247 9.51829 3.27524 10.0146L2.3991 11.9279C2.00422 12.7902 1.66601 13.5287 1.435 14.1586C1.39636 13.5526 1.39555 12.7992 1.39555 11.8286V6.34295C1.39555 5.46158 1.39703 4.86953 1.45745 4.4279C1.51517 4.006 1.61493 3.82543 1.73617 3.70628C1.85741 3.58714 2.04116 3.48911 2.47049 3.43238C2.91989 3.37301 3.52235 3.37155 4.41924 3.37155H5.81464Z" fill="currentColor"></path>
</svg>
}
/>
);
@@ -16,7 +16,13 @@ export function ButtonHistory({
onClick={() => {
setSelected(frameName);
}}
icon={() => IconTablerHistory}
icon={() => () => (
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" class="size-5">
<path fill-rule="evenodd" d="M5.75 2a.75.75 0 0 1 .75.75V4h7V2.75a.75.75 0 0 1 1.5 0V4h.25A2.75 2.75 0 0 1 18 6.75v8.5A2.75 2.75 0 0 1 15.25 18H4.75A2.75 2.75 0 0 1 2 15.25v-8.5A2.75 2.75 0 0 1 4.75 4H5V2.75A.75.75 0 0 1 5.75 2Zm-1 5.5c-.69 0-1.25.56-1.25 1.25v6.5c0 .69.56 1.25 1.25 1.25h10.5c.69 0 1.25-.56 1.25-1.25v-6.5c0-.69-.56-1.25-1.25-1.25H4.75Z" clip-rule="evenodd" />
</svg>
)}
/>
);
}
@@ -17,7 +17,10 @@ export function ButtonSearch({
setSelected(frameName);
}}
icon={() =>
selected() === frameName ? IconTablerZoomFilled : IconTablerSearch
() => <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" class="size-5">
<path fill-rule="evenodd" d="M9 3.5a5.5 5.5 0 1 0 0 11 5.5 5.5 0 0 0 0-11ZM2 9a7 7 0 1 1 12.452 4.391l3.328 3.329a.75.75 0 1 1-1.06 1.06l-3.329-3.328A7 7 0 0 1 2 9Z" clip-rule="evenodd" />
</svg>
}
/>
);
File diff suppressed because one or more lines are too long
@@ -1,5 +1,3 @@
import { classPropToString } from "/src/solid/classes";
export function Clickable({
selected,
onClick,
@@ -17,14 +15,7 @@ export function Clickable({
return (
<Dynamic
component={onClick ? "button" : href ? "a" : "span"}
class={classPropToString([
!href
? selected?.()
? "bg-orange-800/10 dark:bg-orange-200/10"
: "text-orange-900/50 dark:text-orange-100/50"
: "text-opacity-70 dark:text-opacity-70",
"inline-flex select-none rounded-lg p-3.5 hover:bg-orange-800/10 hover:text-orange-600 hover:opacity-100 active:scale-90 dark:hover:bg-orange-200/10 dark:hover:text-orange-400",
])}
class="inline-flex select-none p-4 active:scale-90"
title={title}
onClick={onClick}
href={href}
-3
View File
@@ -4,7 +4,6 @@ import { AnchorGit } from "./components/anchorGit";
import { AnchorLogo } from "./components/anchorLogo";
import { AnchorNostr } from "./components/anchorNostr";
import { ButtonChart } from "./components/buttonChart";
import { ButtonFavorites } from "./components/buttonFavorites";
import { ButtonFolders } from "./components/buttonFolders";
import { ButtonHistory } from "./components/buttonHistory";
import { ButtonSearch } from "./components/buttonSearch";
@@ -22,7 +21,6 @@ export function StripDesktop({
<AnchorLogo />
<ButtonFolders selected={selected} setSelected={setSelected} />
<ButtonFavorites selected={selected} setSelected={setSelected} />
<ButtonSearch selected={selected} setSelected={setSelected} />
<ButtonHistory selected={selected} setSelected={setSelected} />
@@ -50,7 +48,6 @@ export function StripMobile({
<>
<ButtonChart selected={selected} setSelected={setSelected} />
<ButtonFolders selected={selected} setSelected={setSelected} />
<ButtonFavorites selected={selected} setSelected={setSelected} />
<ButtonSearch selected={selected} setSelected={setSelected} />
<ButtonHistory selected={selected} setSelected={setSelected} />
<ButtonSettings selected={selected} setSelected={setSelected} />
+1
View File
@@ -9,6 +9,7 @@ export const touchScreen =
export const requestIdleCallbackPossible = "requestIdleCallback" in window;
console.log(navigator.userAgent);
export const macOS = navigator.userAgent.toLowerCase().includes("mac os");
export const iphone = navigator.userAgent.toLowerCase().includes("iphone");
+13 -12
View File
@@ -22,9 +22,8 @@ export function createChart({
const options: DeepPartialChartOptions = {
autoSize: true,
layout: {
fontFamily: "Lexend",
fontFamily: "Satoshi Chart",
background: { color: "transparent" },
fontSize: 14,
attributionLogo: false,
},
grid: {
@@ -64,7 +63,7 @@ export function createChart({
chart.priceScale("right").applyOptions({
scaleMargins: {
top: 0.075,
bottom: 0.075,
bottom: 0.05,
},
minimumWidth: 78,
});
@@ -72,27 +71,29 @@ export function createChart({
createEffect(() => {
const { white } = colors;
const textColor = white(dark);
const borderColor = dark() ? "#332F24" : "#F1E4E0";
const color = white(dark);
// const borderColor = dark() ? "#332F24" : "#F1E4E0";
chart.applyOptions({
layout: {
textColor,
textColor: "#666666",
},
rightPriceScale: {
borderColor,
borderVisible: false,
// borderColor,
},
timeScale: {
borderColor,
borderVisible: false,
// borderColor,
},
crosshair: {
horzLine: {
color: textColor,
labelBackgroundColor: textColor,
color: color,
labelBackgroundColor: color,
},
vertLine: {
color: textColor,
labelBackgroundColor: textColor,
color: color,
labelBackgroundColor: color,
},
},
});
+2 -1
View File
@@ -41,6 +41,8 @@ type FilePath = {
name: string;
}[];
type PartialPresetTree = (PartialPreset | PartialPresetFolder)[];
interface PartialPresetFolder {
name: string;
tree: PartialPresetTree;
@@ -51,7 +53,6 @@ interface PresetFolder extends PartialPresetFolder {
tree: PresetTree;
}
type PartialPresetTree = (PartialPreset | PartialPresetFolder)[];
type PresetTree = (Preset | PresetFolder)[];
type PresetsHistory = { date: Date; preset: Preset }[];
+4 -4
View File
@@ -23,19 +23,19 @@ export function createUserConfig({ dark }: { dark: RWS<boolean> }) {
[
{
text: "Strong",
value: 0.0444,
value: 0.035,
},
{
text: "Normal",
value: 0.0333,
value: 0.03,
},
{
text: "Light",
value: 0.0222,
value: 0.025,
},
{
text: "Subtle",
value: 0.0111,
value: 0.02,
},
] as const,
{
-63
View File
@@ -59,30 +59,18 @@ function darkOrange(dark: Accessor<boolean>) {
function amber(dark: Accessor<boolean>) {
return dark() ? amberTailwind[500] : amberTailwind[600];
}
function darkAmber(dark: Accessor<boolean>) {
return dark() ? amberTailwind[900] : amberTailwind[100];
}
function yellow(dark: Accessor<boolean>) {
return dark() ? yellowTailwind[500] : yellowTailwind[600];
}
function darkYellow(dark: Accessor<boolean>) {
return dark() ? yellowTailwind[500] : yellowTailwind[600];
}
function lime(dark: Accessor<boolean>) {
return dark() ? limeTailwind[500] : limeTailwind[600];
}
function darkLime(dark: Accessor<boolean>) {
return dark() ? limeTailwind[900] : limeTailwind[100];
}
function green(dark: Accessor<boolean>) {
return dark() ? greenTailwind[500] : greenTailwind[600];
}
function darkGreen(dark: Accessor<boolean>) {
return dark() ? greenTailwind[900] : greenTailwind[100];
}
function lightEmerald(dark: Accessor<boolean>) {
return dark() ? emeraldTailwind[300] : emeraldTailwind[800];
}
function emerald(dark: Accessor<boolean>) {
return dark() ? emeraldTailwind[500] : emeraldTailwind[600];
}
@@ -92,57 +80,30 @@ function darkEmerald(dark: Accessor<boolean>) {
function teal(dark: Accessor<boolean>) {
return dark() ? tealTailwind[500] : tealTailwind[600];
}
function darkTeal(dark: Accessor<boolean>) {
return dark() ? tealTailwind[900] : tealTailwind[100];
}
function cyan(dark: Accessor<boolean>) {
return dark() ? cyanTailwind[500] : cyanTailwind[600];
}
function darkCyan(dark: Accessor<boolean>) {
return dark() ? cyanTailwind[900] : cyanTailwind[100];
}
function sky(dark: Accessor<boolean>) {
return dark() ? skyTailwind[500] : skyTailwind[600];
}
function darkSky(dark: Accessor<boolean>) {
return dark() ? skyTailwind[900] : skyTailwind[100];
}
function blue(dark: Accessor<boolean>) {
return dark() ? blueTailwind[500] : blueTailwind[600];
}
function darkBlue(dark: Accessor<boolean>) {
return dark() ? blueTailwind[900] : blueTailwind[100];
}
function indigo(dark: Accessor<boolean>) {
return dark() ? indigoTailwind[500] : indigoTailwind[600];
}
function darkIndigo(dark: Accessor<boolean>) {
return dark() ? indigoTailwind[900] : indigoTailwind[100];
}
function violet(dark: Accessor<boolean>) {
return dark() ? violetTailwind[500] : violetTailwind[600];
}
function darkViolet(dark: Accessor<boolean>) {
return dark() ? violetTailwind[900] : violetTailwind[100];
}
function purple(dark: Accessor<boolean>) {
return dark() ? purpleTailwind[500] : purpleTailwind[600];
}
function darkPurple(dark: Accessor<boolean>) {
return dark() ? purpleTailwind[900] : purpleTailwind[100];
}
function fuchsia(dark: Accessor<boolean>) {
return dark() ? fuchsiaTailwind[500] : fuchsiaTailwind[600];
}
function darkFuchsia(dark: Accessor<boolean>) {
return dark() ? fuchsiaTailwind[900] : fuchsiaTailwind[100];
}
function pink(dark: Accessor<boolean>) {
return dark() ? pinkTailwind[500] : pinkTailwind[600];
}
function darkPink(dark: Accessor<boolean>) {
return dark() ? pinkTailwind[900] : pinkTailwind[100];
}
function rose(dark: Accessor<boolean>) {
return dark() ? roseTailwind[500] : roseTailwind[600];
}
@@ -165,30 +126,6 @@ function black(dark: Accessor<boolean>) {
return dark() ? "#000000" : "#ffffff";
}
export const convertCandleToCandleColor = (
candle: { close: number; open: number },
inverse?: boolean,
) =>
(candle.close || 1) > (candle.open || 0)
? !inverse
? green
: red
: !inverse
? red
: green;
export const convertCandleToVolumeColor = (
candle: { close: number; open: number },
inverse?: boolean,
) =>
(candle.close || 1) > (candle.open || 0)
? !inverse
? darkGreen
: darkRed
: !inverse
? darkRed
: darkGreen;
export const colors = {
white,
black,
+133 -38
View File
@@ -4,39 +4,149 @@
@tailwind utilities;
/**
* @license
*
* Font Family: Satoshi
* Designed by: Deni Anggara
* URL: https://www.fontshare.com/fonts/satoshi
* © 2024 Indian Type Foundry
*
* This is a variable font
* You can control variable axes as shown below:
* font-variation-settings: wght 900.0;
*
* available axes: 'wght' (range from 300.0 to 900.0)
*/
@font-face {
font-family: "Lexend";
font-display: "auto";
src: url("/fonts/Lexend.var.woff2") format("woff2");
font-family: "Satoshi";
src: url("/fonts/Satoshi.var.woff2") format("woff2");
font-weight: 100 900;
font-optical-sizing: auto;
font-display: swap;
font-style: normal;
}
@keyframes marquee {
from {
transform: translateX(0);
}
to {
transform: translateX(-50%);
}
@font-face {
font-family: "Satoshi Chart";
src: url("/fonts/Satoshi.var.woff2") format("woff2");
font-weight: 600 900;
font-display: swap;
font-style: normal;
}
:root {
/* --default-font-family: "Lexend";
--default-font-feature-settings: "normal";
--default-font-variation-settings: "normal"; */
--white: #ffffe3;
--black: #10100e;
--lighter-gray: #e8e8e8;
--light-gray: #c0c0ab;
--dark-gray: #666660;
--darker-gray: #30302b;
--orange: #f97315;
--background-color: var(--white);
--color: var(--black);
--off-color: var(--light-gray);
--border-color: var(--lighter-gray);
}
/* https://dev.to/ananyaneogi/create-a-dark-light-mode-switch-with-css-variables-34l8 */
/* https://www.typescriptlang.org/docs/handbook/jsdoc-supported-types.html#link */
[data-theme="dark"] {
--background-color: var(--black);
--color: var(--white);
--off-color: var(--dark-gray);
--border-color: var(--darker-gray);
}
html {
/* Foreground, Background */
scrollbar-color: #ffffff66 #00000066;
background-color: var(--background-color);
color: var(--color);
scrollbar-color: #ffffff66 #00000066; /* Foreground, Background */
scrollbar-width: thin;
}
a:hover {
color: var(--color);
}
button:hover {
color: var(--orange);
}
* {
border-color: var(--border-color);
}
*::selection {
color: var(--white);
background-color: var(--orange);
}
.orange {
color: var(--orange);
}
a {
@apply text-orange-700 hover:underline dark:text-orange-300;
color: var(--color);
}
a:hover {
text-decoration-line: underline;
}
.off {
color: var(--off-color);
}
button:hover .off {
color: var(--orange);
}
::marker {
color: var(--off-color);
}
a svg {
color: var(--off-color);
}
button svg {
color: var(--off-color);
}
/* button {
transition-property: color, background-color, border-color,
text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter,
backdrop-filter;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
transition-duration: 150ms;
} */
button:hover svg {
color: currentColor;
}
button:disabled {
color: var(--off-color);
}
a:hover svg {
color: currentColor;
}
mark {
@apply bg-transparent p-0 text-orange-600 dark:text-orange-400;
color: var(--orange);
background-color: transparent;
padding: 0;
/* @apply bg-transparent p-0 text-orange-600 dark:text-orange-400; */
}
strong {
@apply text-orange-600 dark:text-orange-400;
color: var(--orange);
}
/* Hide scrollbar for Chrome, Safari and Opera */
@@ -50,26 +160,11 @@ strong {
scrollbar-width: none; /* Firefox */
}
.border-light {
@apply border-orange-800/25 dark:border-orange-200/25;
}
.border-lighter {
@apply border-orange-800/[0.125] dark:border-orange-200/[0.125];
}
.border-superlight {
@apply border-orange-800/5 dark:border-orange-200/[0.0625];
}
.text-high-contrast {
@apply text-orange-950 dark:text-orange-50;
}
.text-low-contrast {
@apply text-orange-950/50 dark:text-orange-50/50;
}
.decoration-high-contrast {
@apply decoration-orange-950 dark:decoration-orange-50;
.frame {
@apply space-y-6;
flex: 1 1 0%;
overflow-x: hidden;
overflow-y: auto;
padding: 1.5rem /* 24px */;
position: relative;
}
+2
View File
@@ -57,6 +57,7 @@ declare global {
const IconTablerChevronLeft: typeof import('~icons/tabler/chevron-left.jsx')['default']
const IconTablerChevronRight: typeof import('~icons/tabler/chevron-right.jsx')['default']
const IconTablerCircles: typeof import('~icons/tabler/circles.jsx')['default']
const IconTablerClick: typeof import('~icons/tabler/click.jsx')['default']
const IconTablerCoffin: typeof import('~icons/tabler/coffin.jsx')['default']
const IconTablerCog: (typeof import("~icons/tabler/cog.jsx"))["default"]
const IconTablerCoin: typeof import('~icons/tabler/coin.jsx')['default']
@@ -209,6 +210,7 @@ declare global {
const IconTablerReceiptTax: typeof import('~icons/tabler/receipt-tax.jsx')['default']
const IconTablerRefreshAlert: typeof import('~icons/tabler/refresh-alert.jsx')['default']
const IconTablerReset: (typeof import("~icons/tabler/reset.jsx"))["default"]
const IconTablerRestore: typeof import('~icons/tabler/restore.jsx')['default']
const IconTablerRibbonHealth: typeof import('~icons/tabler/ribbon-health.jsx')['default']
const IconTablerRipple: typeof import('~icons/tabler/ripple.jsx')['default']
const IconTablerRocket: typeof import('~icons/tabler/rocket.jsx')['default']
+3 -3
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -11,7 +11,7 @@ export default {
theme: {
extend: {
fontFamily: {
sans: ["Lexend", ...defaultTheme.fontFamily.sans],
sans: ["Satoshi", ...defaultTheme.fontFamily.sans],
},
screens: {
"2xl": "1600px",