app: add random chart button

This commit is contained in:
k
2024-07-15 08:54:55 +02:00
parent fbbb0920c5
commit 91f2427b44
7 changed files with 185 additions and 120 deletions
+2 -2
View File
@@ -25,12 +25,12 @@
"solid-js": "^1.8.18" "solid-js": "^1.8.18"
}, },
"devDependencies": { "devDependencies": {
"@ianvs/prettier-plugin-sort-imports": "^4.3.0", "@ianvs/prettier-plugin-sort-imports": "^4.3.1",
"@iconify-json/tabler": "^1.1.117", "@iconify-json/tabler": "^1.1.117",
"@tailwindcss/container-queries": "^0.1.1", "@tailwindcss/container-queries": "^0.1.1",
"autoprefixer": "^10.4.19", "autoprefixer": "^10.4.19",
"postcss": "^8.4.39", "postcss": "^8.4.39",
"prettier": "^3.3.2", "prettier": "^3.3.3",
"prettier-plugin-tailwindcss": "^0.6.5", "prettier-plugin-tailwindcss": "^0.6.5",
"pwa-asset-generator": "^6.3.1", "pwa-asset-generator": "^6.3.1",
"rollup-plugin-visualizer": "^5.12.0", "rollup-plugin-visualizer": "^5.12.0",
+42 -44
View File
@@ -29,8 +29,8 @@ dependencies:
devDependencies: devDependencies:
'@ianvs/prettier-plugin-sort-imports': '@ianvs/prettier-plugin-sort-imports':
specifier: ^4.3.0 specifier: ^4.3.1
version: 4.3.0(prettier@3.3.2) version: 4.3.1(prettier@3.3.3)
'@iconify-json/tabler': '@iconify-json/tabler':
specifier: ^1.1.117 specifier: ^1.1.117
version: 1.1.117 version: 1.1.117
@@ -44,11 +44,11 @@ devDependencies:
specifier: ^8.4.39 specifier: ^8.4.39
version: 8.4.39 version: 8.4.39
prettier: prettier:
specifier: ^3.3.2 specifier: ^3.3.3
version: 3.3.2 version: 3.3.3
prettier-plugin-tailwindcss: prettier-plugin-tailwindcss:
specifier: ^0.6.5 specifier: ^0.6.5
version: 0.6.5(@ianvs/prettier-plugin-sort-imports@4.3.0)(prettier@3.3.2) version: 0.6.5(@ianvs/prettier-plugin-sort-imports@4.3.1)(prettier@3.3.3)
pwa-asset-generator: pwa-asset-generator:
specifier: ^6.3.1 specifier: ^6.3.1
version: 6.3.1 version: 6.3.1
@@ -115,13 +115,13 @@ packages:
resolution: {integrity: sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==} resolution: {integrity: sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==}
dev: true dev: true
/@apideck/better-ajv-errors@0.3.6(ajv@8.16.0): /@apideck/better-ajv-errors@0.3.6(ajv@8.17.1):
resolution: {integrity: sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==} resolution: {integrity: sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==}
engines: {node: '>=10'} engines: {node: '>=10'}
peerDependencies: peerDependencies:
ajv: '>=8' ajv: '>=8'
dependencies: dependencies:
ajv: 8.16.0 ajv: 8.17.1
json-schema: 0.4.0 json-schema: 0.4.0
jsonpointer: 5.0.1 jsonpointer: 5.0.1
leven: 3.1.0 leven: 3.1.0
@@ -1867,8 +1867,8 @@ packages:
engines: {node: '>=14'} engines: {node: '>=14'}
dev: true dev: true
/@ianvs/prettier-plugin-sort-imports@4.3.0(prettier@3.3.2): /@ianvs/prettier-plugin-sort-imports@4.3.1(prettier@3.3.3):
resolution: {integrity: sha512-OOMtUcO4J3LoL63dOKAe7bn+lSRRPeit2DqNHpx+wvBp3Grejo2PMaK4Mp1mwy8pnat64ccSgk/lBZbsAdLErw==} resolution: {integrity: sha512-ZHwbyjkANZOjaBm3ZosADD2OUYGFzQGxfy67HmGZU94mHqe7g1LCMA7YYKB1Cq+UTPCBqlAYapY0KXAjKEw8Sg==}
peerDependencies: peerDependencies:
'@vue/compiler-sfc': 2.7.x || 3.x '@vue/compiler-sfc': 2.7.x || 3.x
prettier: 2 || 3 prettier: 2 || 3
@@ -1881,7 +1881,7 @@ packages:
'@babel/parser': 7.24.8 '@babel/parser': 7.24.8
'@babel/traverse': 7.24.8 '@babel/traverse': 7.24.8
'@babel/types': 7.24.8 '@babel/types': 7.24.8
prettier: 3.3.2 prettier: 3.3.3
semver: 7.6.2 semver: 7.6.2
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@@ -2403,13 +2403,13 @@ packages:
- supports-color - supports-color
dev: true dev: true
/ajv@8.16.0: /ajv@8.17.1:
resolution: {integrity: sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==} resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==}
dependencies: dependencies:
fast-deep-equal: 3.1.3 fast-deep-equal: 3.1.3
fast-uri: 3.0.1
json-schema-traverse: 1.0.0 json-schema-traverse: 1.0.0
require-from-string: 2.0.2 require-from-string: 2.0.2
uri-js: 4.4.1
dev: true dev: true
/ansi-regex@5.0.1: /ansi-regex@5.0.1:
@@ -2507,7 +2507,7 @@ packages:
postcss: ^8.1.0 postcss: ^8.1.0
dependencies: dependencies:
browserslist: 4.23.2 browserslist: 4.23.2
caniuse-lite: 1.0.30001641 caniuse-lite: 1.0.30001642
fraction.js: 4.3.7 fraction.js: 4.3.7
normalize-range: 0.1.2 normalize-range: 0.1.2
picocolors: 1.0.1 picocolors: 1.0.1
@@ -2634,8 +2634,8 @@ packages:
engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
hasBin: true hasBin: true
dependencies: dependencies:
caniuse-lite: 1.0.30001641 caniuse-lite: 1.0.30001642
electron-to-chromium: 1.4.825 electron-to-chromium: 1.4.827
node-releases: 2.0.14 node-releases: 2.0.14
update-browserslist-db: 1.1.0(browserslist@4.23.2) update-browserslist-db: 1.1.0(browserslist@4.23.2)
dev: true dev: true
@@ -2694,8 +2694,8 @@ packages:
engines: {node: '>=6'} engines: {node: '>=6'}
dev: true dev: true
/caniuse-lite@1.0.30001641: /caniuse-lite@1.0.30001642:
resolution: {integrity: sha512-Phv5thgl67bHYo1TtMY/MurjkHhV4EDaCosezRXgZ8jzA/Ub+wjxAvbGvjoFENStinwi5kCyOYV3mi5tOGykwA==} resolution: {integrity: sha512-3XQ0DoRgLijXJErLSl+bLnJ+Et4KqV1PY6JJBGAFlsNsz31zeAIncyeZfLCabHK/jtSh+671RM9YMldxjUPZtA==}
dev: true dev: true
/capnp-ts@0.7.0: /capnp-ts@0.7.0:
@@ -3101,8 +3101,8 @@ packages:
jake: 10.9.1 jake: 10.9.1
dev: true dev: true
/electron-to-chromium@1.4.825: /electron-to-chromium@1.4.827:
resolution: {integrity: sha512-OCcF+LwdgFGcsYPYC5keEEFC2XT0gBhrYbeGzHCx7i9qRFbzO/AqTmc/C/1xNhJj+JA7rzlN7mpBuStshh96Cg==} resolution: {integrity: sha512-VY+J0e4SFcNfQy19MEoMdaIcZLmDCprqvBtkii1WTCTQHpRvf5N8+3kTYCgL/PcntvwQvmMJWTuDPsq+IlhWKQ==}
dev: true dev: true
/emoji-regex@8.0.0: /emoji-regex@8.0.0:
@@ -3387,6 +3387,10 @@ packages:
resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
dev: true dev: true
/fast-uri@3.0.1:
resolution: {integrity: sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==}
dev: true
/fastq@1.17.1: /fastq@1.17.1:
resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==}
dependencies: dependencies:
@@ -4667,11 +4671,11 @@ packages:
postcss: ^8.2.14 postcss: ^8.2.14
dependencies: dependencies:
postcss: 8.4.39 postcss: 8.4.39
postcss-selector-parser: 6.1.0 postcss-selector-parser: 6.1.1
dev: true dev: true
/postcss-selector-parser@6.1.0: /postcss-selector-parser@6.1.1:
resolution: {integrity: sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==} resolution: {integrity: sha512-b4dlw/9V8A71rLIDsSwVmak9z2DuBUB7CA1/wSdelNEzqsjoSPeADTWNO09lpH49Diy3/JIZ2bSPB1dI3LJCHg==}
engines: {node: '>=4'} engines: {node: '>=4'}
dependencies: dependencies:
cssesc: 3.0.0 cssesc: 3.0.0
@@ -4691,7 +4695,7 @@ packages:
source-map-js: 1.2.0 source-map-js: 1.2.0
dev: true dev: true
/prettier-plugin-tailwindcss@0.6.5(@ianvs/prettier-plugin-sort-imports@4.3.0)(prettier@3.3.2): /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==} resolution: {integrity: sha512-axfeOArc/RiGHjOIy9HytehlC0ZLeMaqY09mm8YCkMzznKiDkwFzOpBvtuhuv3xG5qB73+Mj7OCe2j/L1ryfuQ==}
engines: {node: '>=14.21.3'} engines: {node: '>=14.21.3'}
peerDependencies: peerDependencies:
@@ -4743,12 +4747,12 @@ packages:
prettier-plugin-svelte: prettier-plugin-svelte:
optional: true optional: true
dependencies: dependencies:
'@ianvs/prettier-plugin-sort-imports': 4.3.0(prettier@3.3.2) '@ianvs/prettier-plugin-sort-imports': 4.3.1(prettier@3.3.3)
prettier: 3.3.2 prettier: 3.3.3
dev: true dev: true
/prettier@3.3.2: /prettier@3.3.3:
resolution: {integrity: sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==} resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==}
engines: {node: '>=14'} engines: {node: '>=14'}
hasBin: true hasBin: true
dev: true dev: true
@@ -5134,16 +5138,16 @@ packages:
randombytes: 2.1.0 randombytes: 2.1.0
dev: true dev: true
/seroval-plugins@1.0.7(seroval@1.0.7): /seroval-plugins@1.1.0(seroval@1.1.0):
resolution: {integrity: sha512-GO7TkWvodGp6buMEX9p7tNyIkbwlyuAWbI6G9Ec5bhcm7mQdu3JOK1IXbEUwb3FVzSc363GraG/wLW23NSavIw==} resolution: {integrity: sha512-KtcJg590L3X3dd7ixs6am4UGVcV69TyjYhHtanIdQJq4dy2OceWXmmvWrYx7oFDNe+LNdxdWd0I5BQXuV5fBhA==}
engines: {node: '>=10'} engines: {node: '>=10'}
peerDependencies: peerDependencies:
seroval: ^1.0 seroval: ^1.0
dependencies: dependencies:
seroval: 1.0.7 seroval: 1.1.0
/seroval@1.0.7: /seroval@1.1.0:
resolution: {integrity: sha512-n6ZMQX5q0Vn19Zq7CIKNIo7E75gPkGCFUEqDpa8jgwpYr/vScjqnQ6H09t1uIiZ0ZSK0ypEGvrYK2bhBGWsGdw==} resolution: {integrity: sha512-74Wpe+hhPx4V8NFe00I2Fu9gTJopKoH5vE7nCqFzVgKOXV8AnN23T58K79QLYQotzGpH93UZ+UN2Y11j9huZJg==}
engines: {node: '>=10'} engines: {node: '>=10'}
/set-function-length@1.2.2: /set-function-length@1.2.2:
@@ -5212,8 +5216,8 @@ packages:
resolution: {integrity: sha512-cpkxDPvO/AuKBugVv6xKFd1C9VC0XZMu4VtF56IlHoux8HgyW44uqNSWbozMnVcpIzHIhS3vVXPAVZYM26jpWw==} resolution: {integrity: sha512-cpkxDPvO/AuKBugVv6xKFd1C9VC0XZMu4VtF56IlHoux8HgyW44uqNSWbozMnVcpIzHIhS3vVXPAVZYM26jpWw==}
dependencies: dependencies:
csstype: 3.1.3 csstype: 3.1.3
seroval: 1.0.7 seroval: 1.1.0
seroval-plugins: 1.0.7(seroval@1.0.7) seroval-plugins: 1.1.0(seroval@1.1.0)
/solid-refresh@0.6.3(solid-js@1.8.18): /solid-refresh@0.6.3(solid-js@1.8.18):
resolution: {integrity: sha512-F3aPsX6hVw9ttm5LYlth8Q15x6MlI/J3Dn+o3EQyRTtTxidepSTwAYdozt01/YA+7ObcciagGEyXIopGZzQtbA==} resolution: {integrity: sha512-F3aPsX6hVw9ttm5LYlth8Q15x6MlI/J3Dn+o3EQyRTtTxidepSTwAYdozt01/YA+7ObcciagGEyXIopGZzQtbA==}
@@ -5473,7 +5477,7 @@ packages:
postcss-js: 4.0.1(postcss@8.4.39) postcss-js: 4.0.1(postcss@8.4.39)
postcss-load-config: 4.0.2(postcss@8.4.39) postcss-load-config: 4.0.2(postcss@8.4.39)
postcss-nested: 6.0.1(postcss@8.4.39) postcss-nested: 6.0.1(postcss@8.4.39)
postcss-selector-parser: 6.1.0 postcss-selector-parser: 6.1.1
resolve: 1.22.8 resolve: 1.22.8
sucrase: 3.35.0 sucrase: 3.35.0
transitivePeerDependencies: transitivePeerDependencies:
@@ -5831,12 +5835,6 @@ packages:
picocolors: 1.0.1 picocolors: 1.0.1
dev: true dev: true
/uri-js@4.4.1:
resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
dependencies:
punycode: 2.3.1
dev: true
/util-deprecate@1.0.2: /util-deprecate@1.0.2:
resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
dev: true dev: true
@@ -6020,7 +6018,7 @@ packages:
resolution: {integrity: sha512-WdkVdC70VMpf5NBCtNbiwdSZeKVuhTEd5PV3mAwpTQCGAB5XbOny1P9egEgNdetv4srAMmMKjvBk4RD58LpooA==} resolution: {integrity: sha512-WdkVdC70VMpf5NBCtNbiwdSZeKVuhTEd5PV3mAwpTQCGAB5XbOny1P9egEgNdetv4srAMmMKjvBk4RD58LpooA==}
engines: {node: '>=16.0.0'} engines: {node: '>=16.0.0'}
dependencies: dependencies:
'@apideck/better-ajv-errors': 0.3.6(ajv@8.16.0) '@apideck/better-ajv-errors': 0.3.6(ajv@8.17.1)
'@babel/core': 7.24.8 '@babel/core': 7.24.8
'@babel/preset-env': 7.24.8(@babel/core@7.24.8) '@babel/preset-env': 7.24.8(@babel/core@7.24.8)
'@babel/runtime': 7.24.8 '@babel/runtime': 7.24.8
@@ -6029,7 +6027,7 @@ packages:
'@rollup/plugin-replace': 2.4.2(rollup@2.79.1) '@rollup/plugin-replace': 2.4.2(rollup@2.79.1)
'@rollup/plugin-terser': 0.4.4(rollup@2.79.1) '@rollup/plugin-terser': 0.4.4(rollup@2.79.1)
'@surma/rollup-plugin-off-main-thread': 2.2.3 '@surma/rollup-plugin-off-main-thread': 2.2.3
ajv: 8.16.0 ajv: 8.17.1
common-tags: 1.8.2 common-tags: 1.8.2
fast-json-stable-stringify: 2.1.0 fast-json-stable-stringify: 2.1.0
fs-extra: 9.1.0 fs-extra: 9.1.0
+18
View File
@@ -1,3 +1,5 @@
import { random } from "/src/scripts/utils/math/random";
export function Button({ export function Button({
onClick, onClick,
children, children,
@@ -11,3 +13,19 @@ export function Button({
</button> </button>
); );
} }
export function ButtonRandomChart({ presets }: { presets: Presets }) {
return (
<button
class="inline-flex rounded-md bg-orange-700 bg-opacity-80 px-1.5 py-0.5 font-medium hover:bg-opacity-100 active:scale-95"
onClick={() => {
const randomPreset = random(presets.list);
if (randomPreset) {
presets.select(randomPreset);
}
}}
>
Open a random chart
</button>
);
}
+38 -15
View File
@@ -1,3 +1,5 @@
import { Box } from "./box";
import { Button, ButtonRandomChart } from "./button";
import { Header } from "./header"; import { Header } from "./header";
import { Line } from "./line"; import { Line } from "./line";
import { Number } from "./number"; import { Number } from "./number";
@@ -11,7 +13,7 @@ export function FavoritesFrame({
}) { }) {
return ( return (
<div <div
class="flex-1 overflow-y-auto overflow-x-hidden" class="relative flex-1 overflow-y-auto overflow-x-hidden"
style={{ style={{
display: selectedFrame() !== "Favorites" ? "none" : undefined, display: selectedFrame() !== "Favorites" ? "none" : undefined,
}} }}
@@ -26,25 +28,46 @@ export function FavoritesFrame({
<div <div
class="space-y-0.5 py-1" class="space-y-0.5 py-1"
style={{ // style={{
display: !presets.favorites().length ? "none" : undefined, // display: !presets.favorites().length ? "none" : undefined,
}} // }}
> >
<For each={presets.favorites()}> <Show
{(preset) => ( when={presets.favorites().length}
<Line fallback={
id={`favorite-${preset.id}`} <p>
name={preset.title} It seems like you couldn't find any interesting chart for your
onClick={() => presets.select(preset)} favorites ! You might want to try to{" "}
active={() => presets.selected() === preset} <ButtonRandomChart presets={presets} />
header={`/ ${[...preset.path.map(({ name }) => name), preset.name].join(" / ")}`} </p>
/> }
)} >
</For> <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>
<div class="h-[25dvh] flex-none" /> <div class="h-[25dvh] flex-none" />
</div> </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> </div>
); );
} }
+68 -54
View File
@@ -1,5 +1,6 @@
import { run } from "/src/scripts/utils/run"; import { run } from "/src/scripts/utils/run";
import { ButtonRandomChart } from "./button";
import { Header } from "./header"; import { Header } from "./header";
import { Line } from "./line"; import { Line } from "./line";
@@ -20,62 +21,75 @@ export function HistoryFrame({
<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 p-4">
<Header title="History">List of previously visited charts.</Header> <Header title="History">List of previously visited charts.</Header>
<div <div class="space-y-0.5 pt-4">
class="space-y-0.5 pt-4" <Show
style={{ when={presets.history().length}
display: !presets.history().length ? "none" : undefined, fallback={
}}
>
<For each={presets.history()}>
{({ preset, date }, index) => (
<> <>
<Show <div class="border-lighter -mx-4 border-t" />
when={
index() === 0 || <p>
presets.history()[index()].date.toJSON().split("T")[0] !== You somehow haven't visited by yourself a single chart.
presets.history()[index() - 1].date.toJSON().split("T")[0] Impressive ! You might want to try to{" "}
} <ButtonRandomChart presets={presets} />
> </p>
<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>
</Show>
<Line
id={`history-${preset.id}`}
name={preset.title}
onClick={() => presets.select(preset)}
active={() => presets.selected() === preset}
header={date.toLocaleTimeString()}
/>
</> </>
)} }
</For> >
<For each={presets.history()}>
{({ preset, date }, index) => (
<>
<Show
when={
index() === 0 ||
presets.history()[index()].date.toJSON().split("T")[0] !==
presets
.history()
[index() - 1].date.toJSON()
.split("T")[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>
</Show>
<Line
id={`history-${preset.id}`}
name={preset.title}
onClick={() => presets.select(preset)}
active={() => presets.selected() === preset}
header={date.toLocaleTimeString()}
/>
</>
)}
</For>
</Show>
</div> </div>
<div class="h-[25dvh] flex-none" /> <div class="h-[25dvh] flex-none" />
+12 -4
View File
@@ -6,7 +6,7 @@ import { createRWS } from "/src/solid/rws";
import { INPUT_PRESET_SEARCH_ID } from "../.."; import { INPUT_PRESET_SEARCH_ID } from "../..";
import { Box } from "./box"; import { Box } from "./box";
import { Button } from "./button"; import { Button, ButtonRandomChart } from "./button";
import { Line } from "./line"; import { Line } from "./line";
const PER_PAGE = 100; const PER_PAGE = 100;
@@ -131,7 +131,15 @@ export function SearchFrame({
> >
<div class="flex-1 space-y-1 overflow-y-auto p-4 pt-16"> <div class="flex-1 space-y-1 overflow-y-auto p-4 pt-16">
<p class="py-2 text-orange-100/75"> <p class="py-2 text-orange-100/75">
<Show when={search()} fallback={"Write in the top bar to search."}> <Show
when={search()}
fallback={
<p>
If you can't think of anything, you might want to try to{" "}
<ButtonRandomChart presets={presets} />
</p>
}
>
Found{" "} Found{" "}
<span class="font-medium text-orange-400/75"> <span class="font-medium text-orange-400/75">
{resultCount().toLocaleString("en-us")} {resultCount().toLocaleString("en-us")}
@@ -178,7 +186,7 @@ export function SearchFrame({
id={INPUT_PRESET_SEARCH_ID} id={INPUT_PRESET_SEARCH_ID}
ref={inputRef.set} ref={inputRef.set}
class="w-full bg-transparent p-1 caret-orange-500 placeholder:text-orange-200/50 focus:outline-none" class="w-full bg-transparent p-1 caret-orange-500 placeholder:text-orange-200/50 focus:outline-none"
placeholder="Search by name or path" placeholder="Search by name or path - / to focus"
value={search()} value={search()}
onFocus={initHaystackIfNeeded} onFocus={initHaystackIfNeeded}
onInput={(event) => search.set(event.target.value)} onInput={(event) => search.set(event.target.value)}
@@ -196,7 +204,7 @@ export function SearchFrame({
inputRef()?.focus(); inputRef()?.focus();
}} }}
> >
Clear search Reset search
</Button> </Button>
</Box> </Box>
</div> </div>
+5 -1
View File
@@ -151,6 +151,10 @@ export function SettingsFrame({
url: "https://primal.net/p/npub1730y5k2s9u82w9snx3hl37r8gpsrmqetc2y3xyx9h65yfpf28rtq0y635y", url: "https://primal.net/p/npub1730y5k2s9u82w9snx3hl37r8gpsrmqetc2y3xyx9h65yfpf28rtq0y635y",
amount: 17_471, amount: 17_471,
}, },
{
name: "Anon",
amount: 210_000,
},
] ]
.sort((a, b) => .sort((a, b) =>
b.amount !== a.amount b.amount !== a.amount
@@ -159,7 +163,7 @@ export function SettingsFrame({
) )
.slice(0, 10)} .slice(0, 10)}
> >
{({ name, url, amount }, index) => ( {({ name, url, amount }) => (
<li> <li>
<a href={url} target="_blank"> <a href={url} target="_blank">
{name} {name}