app: html version almost done

This commit is contained in:
k
2024-09-10 09:39:06 +02:00
parent e206b40468
commit 5edb8111a2
40 changed files with 5900 additions and 1919 deletions
+1
View File
@@ -0,0 +1 @@
/ignore
-48
View File
@@ -1,48 +0,0 @@
merge = async (c1, c2) => {
function sleep(ms) {
return new Promise((resolve) => {
setTimeout(resolve, ms);
});
}
async function hexToOklch(c) {
hex.value = c;
hex.dispatchEvent(new Event("change"));
await sleep(1);
console.log(oklch.value);
const s = oklch.value.slice(6, -1).split(" ");
let [lightness, chroma, hue] = s;
lightness = Number(lightness.slice(0, -1));
chroma = Number(chroma);
hue = Number(hue);
return [lightness, chroma, hue];
}
function average(a, b) {
return (a + b) / 2;
}
const [lightness1, chroma1, hue1] = await hexToOklch(c1);
console.log(lightness1, chroma1, hue1);
const [lightness2, chroma2, hue2] = await hexToOklch(c2);
console.log(lightness2, chroma2, hue2);
const lightness = average(lightness1, lightness2);
const chroma = average(chroma1, chroma2);
const hue = average(hue1, hue2);
oklch.value = `oklch(${lightness}% ${chroma} ${hue})`;
console.log(oklch.value);
oklch.dispatchEvent(new Event("change"));
await sleep(10);
console.log(hex.value);
};
+1193 -123
View File
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -5,5 +5,5 @@
"target": "ESNext",
"module": "ESNext"
},
"exclude": ["assets", "libraries"]
"exclude": ["assets", "libraries", "ignore"]
}
+3
View File
@@ -0,0 +1,3 @@
URL + Version:
https://unpkg.com/browse/lightweight-charts@4.2.0/
File diff suppressed because one or more lines are too long
+241
View File
@@ -0,0 +1,241 @@
declare module "lean-qr" {
interface ImageDataLike {
readonly data: Uint8ClampedArray;
}
interface Context2DLike<DataT extends ImageDataLike> {
createImageData(width: number, height: number): DataT;
putImageData(data: DataT, x: number, y: number): void;
}
interface CanvasLike<DataT extends ImageDataLike> {
width: number;
height: number;
getContext(type: "2d"): Context2DLike<DataT> | null;
}
export type RGBA = readonly [number, number, number, number?];
export interface Bitmap1D {
push(value: number, bits: number): void;
}
export interface StringOptions {
on?: string;
off?: string;
lf?: string;
padX?: number;
padY?: number;
}
export interface ImageDataOptions {
on?: RGBA;
off?: RGBA;
padX?: number;
padY?: number;
}
export interface Bitmap2D {
readonly size: number;
get(x: number, y: number): boolean;
toString(options?: Readonly<StringOptions>): string;
toImageData<DataT extends ImageDataLike>(
context: Context2DLike<DataT>,
options?: Readonly<ImageDataOptions>,
): DataT;
toDataURL(
options?: Readonly<
ImageDataOptions & {
type?: `image/${string}`;
scale?: number;
}
>,
): string;
toCanvas(
canvas: CanvasLike<ImageDataLike>,
options?: Readonly<ImageDataOptions>,
): void;
}
export type Mask = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7;
export type Mode = (data: Bitmap1D, version: number) => void;
export interface ModeFactory {
(value: string): Mode;
test(string: string): boolean;
est(value: string, version: number): number;
eci?: number;
}
interface ModeAutoOptions {
modes?: ReadonlyArray<ModeFactory>;
}
export const mode: Readonly<{
auto(value: string, options?: Readonly<ModeAutoOptions>): Mode;
multi(...modes: ReadonlyArray<Mode>): Mode;
eci(id: number): Mode;
numeric: ModeFactory;
alphaNumeric: ModeFactory;
bytes(data: Uint8Array | ReadonlyArray<number>): Mode;
ascii: ModeFactory;
iso8859_1: ModeFactory;
shift_jis: ModeFactory;
utf8: ModeFactory;
}>;
type Correction = number & { readonly _: unique symbol };
export const correction: Readonly<{
min: Correction;
L: Correction;
M: Correction;
Q: Correction;
H: Correction;
max: Correction;
}>;
export interface GenerateOptions extends ModeAutoOptions {
minCorrectionLevel?: Correction;
maxCorrectionLevel?: Correction;
minVersion?: number;
maxVersion?: number;
mask?: null | Mask;
trailer?: number;
}
export type GenerateFn = (
data: Mode | string,
options?: Readonly<GenerateOptions>,
) => Bitmap2D;
interface Generate extends GenerateFn {
with(...modes: ReadonlyArray<ModeFactory>): GenerateFn;
}
export const generate: Generate;
}
declare module "lean-qr/extras/svg" {
import type { Bitmap2D } from "lean-qr";
export interface SVGOptions {
on?: string;
off?: string;
padX?: number;
padY?: number;
width?: number | null;
height?: number | null;
scale?: number;
}
export const toSvgPath: (code: Bitmap2D) => string;
export const toSvg: (
code: Bitmap2D,
target: Document | SVGElement,
options?: Readonly<SVGOptions>,
) => SVGElement;
export const toSvgSource: (
code: Bitmap2D,
options?: Readonly<SVGOptions & { xmlDeclaration?: boolean }>,
) => string;
export type toSvgDataURLFn = (
code: Bitmap2D,
options?: Readonly<SVGOptions>,
) => string;
export const toSvgDataURL: toSvgDataURLFn;
}
declare module "lean-qr/extras/node_export" {
import type { RGBA, Bitmap2D } from "lean-qr";
export interface PNGOptions {
on?: RGBA;
off?: RGBA;
padX?: number;
padY?: number;
scale?: number;
}
export const toPngBuffer: (
code: Bitmap2D,
options?: Readonly<PNGOptions>,
) => Uint8Array;
export const toPngDataURL: (
code: Bitmap2D,
options?: Readonly<PNGOptions>,
) => string;
}
declare module "lean-qr/extras/react" {
import type { ImageDataOptions, GenerateOptions, GenerateFn } from "lean-qr";
import type { SVGOptions, toSvgDataURLFn } from "lean-qr/extras/svg";
export interface AsyncFramework<T> {
createElement: (
type: "canvas",
props: {
ref: any;
style: { imageRendering: "pixelated" };
className: string;
},
) => T;
useRef<T>(initialValue: T | null): { readonly current: T | null };
useEffect(fn: () => void | (() => void), deps: unknown[]): void;
}
interface QRComponentProps {
content: string;
className?: string;
}
export interface AsyncQRComponentProps
extends ImageDataOptions,
GenerateOptions,
QRComponentProps {}
export type AsyncQRComponent<T> = (
props: Readonly<AsyncQRComponentProps>,
) => T;
export const makeAsyncComponent: <T>(
framework: Readonly<AsyncFramework<T>>,
generate: GenerateFn,
defaultProps?: Readonly<Partial<AsyncQRComponentProps>>,
) => AsyncQRComponent<T>;
export interface SyncFramework<T> {
createElement: (
type: "img",
props: {
src: string;
style: { imageRendering: "pixelated" };
className: string;
},
) => T;
useMemo<T>(fn: () => T, deps: unknown[]): T;
}
export interface SyncQRComponentProps
extends SVGOptions,
GenerateOptions,
QRComponentProps {}
export type SyncQRComponent<T> = (props: Readonly<SyncQRComponentProps>) => T;
export const makeSyncComponent: <T>(
framework: Readonly<SyncFramework<T>>,
generate: GenerateFn,
toSvgDataURL: toSvgDataURLFn,
defaultProps?: Readonly<Partial<SyncQRComponentProps>>,
) => SyncQRComponent<T>;
}
declare module "lean-qr/extras/errors" {
export const readError: (error: unknown) => string;
}
@@ -0,0 +1,2 @@
TradingView Lightweight Charts™
Copyright (с) 2023 TradingView, Inc. https://www.tradingview.com/
@@ -0,0 +1,6 @@
URL:
https://github.com/leeoniya/ufuzzy/tree/main/dist
Head:
- SHA: 6bb27a8d8c41e4be5458844afc5c89f6c2399512
- Date: Feb 21, 2024
File diff suppressed because one or more lines are too long
@@ -0,0 +1,5 @@
Compiled version of: https://github.com/solidjs/signals
Head:
- SHA: 4d75d3f84ce22b560988f3b27a5065c0fd2e69a8
- Date: Apr 17, 2024
File diff suppressed because it is too large Load Diff
+10
View File
@@ -0,0 +1,10 @@
/**
* See https://dev.to/modderme123/super-charging-fine-grained-reactive-performance-47ph
* State clean corresponds to a node where all the sources are fully up to date
* State check corresponds to a node where some sources (including grandparents) may have changed
* State dirty corresponds to a node where the direct parents of a node has changed
*/
export declare const STATE_CLEAN = 0;
export declare const STATE_CHECK = 1;
export declare const STATE_DIRTY = 2;
export declare const STATE_DISPOSED = 3;
+143
View File
@@ -0,0 +1,143 @@
/**
* Nodes for constructing a graph of reactive values and reactive computations.
*
* - The graph is acyclic.
* - The user inputs new values into the graph by calling .write() on one more computation nodes.
* - The user retrieves computed results from the graph by calling .read() on one or more computation nodes.
* - The library is responsible for running any necessary computations so that .read() is up to date
* with all prior .write() calls anywhere in the graph.
* - We call the input nodes 'roots' and the output nodes 'leaves' of the graph here.
* - Changes flow from roots to leaves. It would be effective but inefficient to immediately
* propagate all changes from a root through the graph to descendant leaves. Instead, we defer
* change most change propagation computation until a leaf is accessed. This allows us to
* coalesce computations and skip altogether recalculating unused sections of the graph.
* - Each computation node tracks its sources and its observers (observers are other
* elements that have this node as a source). Source and observer links are updated automatically
* as observer computations re-evaluate and call get() on their sources.
* - Each node stores a cache state (clean/check/dirty) to support the change propagation algorithm:
*
* In general, execution proceeds in three passes:
*
* 1. write() propagates changes down the graph to the leaves
* direct children are marked as dirty and their deeper descendants marked as check
* (no computations are evaluated)
* 2. read() requests that parent nodes updateIfNecessary(), which proceeds recursively up the tree
* to decide whether the node is clean (parents unchanged) or dirty (parents changed)
* 3. updateIfNecessary() evaluates the computation if the node is dirty (the computations are
* executed in root to leaf order)
*/
import { type Flags } from './flags';
import { Owner } from './owner';
export interface SignalOptions<T> {
name?: string;
equals?: ((prev: T, next: T) => boolean) | false;
}
export interface MemoOptions<T> extends SignalOptions<T> {
initial?: T;
}
interface SourceType {
_observers: ObserverType[] | null;
_updateIfNecessary: () => void;
_stateFlags: Flags;
}
interface ObserverType {
_sources: SourceType[] | null;
_notify: (state: number) => void;
_handlerMask: Flags;
_notifyFlags: (mask: Flags, newFlags: Flags) => void;
}
/**
* Returns the current observer.
*/
export declare function getObserver(): ObserverType | null;
export declare const UNCHANGED: unique symbol;
export type UNCHANGED = typeof UNCHANGED;
export declare class Computation<T = any> extends Owner implements SourceType, ObserverType {
_sources: SourceType[] | null;
_observers: ObserverType[] | null;
_value: T | undefined;
_compute: null | (() => T);
_name: string | undefined;
_equals: false | ((a: T, b: T) => boolean);
/** Whether the computation is an error or has ancestors that are unresolved */
_stateFlags: number;
/** Which flags raised by sources are handled, vs. being passed through. */
_handlerMask: number;
_error: Computation<boolean> | null;
_loading: Computation<boolean> | null;
constructor(initialValue: T | undefined, compute: null | (() => T), options?: MemoOptions<T>);
_read(): T;
/**
* Return the current value of this computation
* Automatically re-executes the surrounding computation when the value changes
*/
read(): T;
/**
* Return the current value of this computation
* Automatically re-executes the surrounding computation when the value changes
*
* If the computation has any unresolved ancestors, this function waits for the value to resolve
* before continuing
*/
wait(): T;
/**
* Return true if the computation is the value is dependent on an unresolved promise
* Triggers re-execution of the computation when the loading state changes
*
* This is useful especially when effects want to re-execute when a computation's
* loading state changes
*/
loading(): boolean;
/**
* Return true if the computation is the computation threw an error
* Triggers re-execution of the computation when the error state changes
*/
error(): boolean;
/** Update the computation with a new value. */
write(value: T | ((currentValue: T) => T) | UNCHANGED, flags?: number, raw?: boolean): T;
/**
* Set the current node's state, and recursively mark all of this node's observers as STATE_CHECK
*/
_notify(state: number): void;
/**
* Notify the computation that one of its sources has changed flags.
*
* @param mask A bitmask for which flag(s) were changed.
* @param newFlags The source's new flags, masked to just the changed ones.
*/
_notifyFlags(mask: Flags, newFlags: Flags): void;
_setError(error: unknown): void;
/**
* This is the core part of the reactivity system, which makes sure that the values are updated
* before they are read. We've also adapted it to return the loading state of the computation,
* so that we can propagate that to the computation's observers.
*
* This function will ensure that the value and states we read from the computation are up to date
*/
_updateIfNecessary(): void;
/**
* Remove ourselves from the owner graph and the computation graph
*/
_disposeNode(): void;
}
/**
* Reruns a computation's _compute function, producing a new value and keeping track of dependencies.
*
* It handles the updating of sources and observers, disposal of previous executions,
* and error handling if the _compute function throws. It also sets the node as loading
* if it reads any parents that are currently loading.
*/
export declare function update<T>(node: Computation<T>): void;
export declare function isEqual<T>(a: T, b: T): boolean;
/**
* Returns the current value stored inside the given compute function without triggering any
* dependencies. Use `untrack` if you want to also disable owner tracking.
*/
export declare function untrack<T>(fn: () => T): T;
/**
* A convenient wrapper that calls `compute` with the `owner` and `observer` and is guaranteed
* to reset the global context after the computation is finished even if an error is thrown.
*/
export declare function compute<T>(owner: Owner | null, compute: (val: T) => T, observer: Computation<T>): T;
export declare function compute<T>(owner: Owner | null, compute: (val: undefined) => T, observer: null): T;
export {};
+25
View File
@@ -0,0 +1,25 @@
import { Computation, type MemoOptions } from './core';
/**
* By default, changes are batched on the microtask queue which is an async process. You can flush
* the queue synchronously to get the latest updates by calling `flushSync()`.
*/
export declare function flushSync(): void;
/**
* Effects are the leaf nodes of our reactive graph. When their sources change, they are
* automatically added to the queue of effects to re-execute, which will cause them to fetch their
* sources and recompute
*/
export declare class Effect<T = any> extends Computation<T> {
constructor(initialValue: T, compute: () => T, options?: MemoOptions<T>);
_notify(state: number): void;
write(value: T): T;
_setError(error: unknown): void;
}
export declare class RenderEffect<T = any> extends Computation<T> {
effect: (val: T) => void;
modified: boolean;
constructor(initialValue: T, compute: () => T, effect: (val: T) => void, options?: MemoOptions<T>);
_notify(state: number): void;
write(value: T): T;
_setError(error: unknown): void;
}
+11
View File
@@ -0,0 +1,11 @@
export declare class NotReadyError extends Error {
}
export declare class NoOwnerError extends Error {
constructor();
}
export declare class ContextNotFoundError extends Error {
constructor();
}
export interface ErrorHandler {
(error: unknown): void;
}
+8
View File
@@ -0,0 +1,8 @@
export type Flags = number;
export declare const ERROR_OFFSET = 0;
export declare const ERROR_BIT: number;
export declare const ERROR: unique symbol;
export declare const LOADING_OFFSET = 1;
export declare const LOADING_BIT: number;
export declare const LOADING: unique symbol;
export declare const DEFAULT_FLAGS: number;
+8
View File
@@ -0,0 +1,8 @@
export { ContextNotFoundError, NoOwnerError, NotReadyError, type ErrorHandler, } from './error';
export { Owner, createContext, getContext, setContext, hasContext, getOwner, setOwner, onCleanup, type Context, type ContextRecord, type Disposable, } from './owner';
export { Computation, compute, getObserver, isEqual, untrack, type MemoOptions, type SignalOptions, } from './core';
export { flushSync, Effect, RenderEffect } from './effect';
export { indexArray, mapArray, type Maybe } from './map';
export { createSelector, type SelectorOptions, type SelectorSignal, } from './selector';
export * from './signals';
export * from './store';
+26
View File
@@ -0,0 +1,26 @@
import type { Accessor } from './signals';
export type Maybe<T> = T | void | null | undefined | false;
/**
* Reactive map helper that caches each item by index to reduce unnecessary mapping on updates.
* It only runs the mapping function once per item and adds/removes as needed. In a non-keyed map
* like this the index is fixed but value can change (opposite of a keyed map).
*
* Prefer `mapArray` when referential checks are required.
*
* @see {@link https://github.com/solidjs/x-reactivity#indexarray}
*/
export declare function indexArray<Item, MappedItem>(list: Accessor<Maybe<readonly Item[]>>, map: (value: Accessor<Item>, index: number) => MappedItem, options?: {
name?: string;
}): Accessor<MappedItem[]>;
/**
* Reactive map helper that caches each list item by reference to reduce unnecessary mapping on
* updates. It only runs the mapping function once per item and then moves or removes it as needed.
* In a keyed map like this the value is fixed but the index changes (opposite of non-keyed map).
*
* Prefer `indexArray` when working with primitives to avoid unnecessary re-renders.
*
* @see {@link https://github.com/solidjs/x-reactivity#maparray}
*/
export declare function mapArray<Item, MappedItem>(list: Accessor<Maybe<readonly Item[]>>, map: (value: Item, index: Accessor<number>) => MappedItem, options?: {
name?: string;
}): Accessor<MappedItem[]>;
+88
View File
@@ -0,0 +1,88 @@
/**
* Owner tracking is used to enable nested tracking scopes with automatic cleanup.
* We also use owners to also keep track of which error handling context we are in.
*
* If you write the following
*
* const a = createOwner(() => {
* const b = createOwner(() => {});
*
* const c = createOwner(() => {
* const d = createOwner(() => {});
* });
*
* const e = createOwner(() => {});
* });
*
* The owner tree will look like this:
*
* a
* /|\
* b-c-e
* |
* d
*
* Following the _nextSibling pointers of each owner will first give you its children, and then its siblings (in reverse).
* a -> e -> c -> d -> b
*
* Note that the owner tree is largely orthogonal to the reactivity tree, and is much closer to the component tree.
*/
import { type ErrorHandler } from './error';
export type ContextRecord = Record<string | symbol, unknown>;
export interface Disposable {
(): void;
}
/**
* Returns the currently executing parent owner.
*/
export declare function getOwner(): Owner | null;
export declare function setOwner(owner: Owner | null): Owner | null;
export declare class Owner {
_parent: Owner | null;
_nextSibling: Owner | null;
_prevSibling: Owner | null;
_state: number;
_disposal: Disposable | Disposable[] | null;
_context: ContextRecord;
_handlers: ErrorHandler[] | null;
constructor(signal?: boolean);
append(child: Owner): void;
dispose(this: Owner, self?: boolean): void;
_disposeNode(): void;
emptyDisposal(): void;
handleError(error: unknown): void;
}
export interface Context<T> {
readonly id: symbol;
readonly defaultValue: T | undefined;
}
/**
* Context provides a form of dependency injection. It is used to save from needing to pass
* data as props through intermediate components. This function creates a new context object
* that can be used with `getContext` and `setContext`.
*
* A default value can be provided here which will be used when a specific value is not provided
* via a `setContext` call.
*/
export declare function createContext<T>(defaultValue?: T, description?: string): Context<T>;
/**
* Attempts to get a context value for the given key.
*
* @throws `NoOwnerError` if there's no owner at the time of call.
* @throws `ContextNotFoundError` if a context value has not been set yet.
*/
export declare function getContext<T>(context: Context<T>, owner?: Owner | null): T;
/**
* Attempts to set a context value on the parent scope with the given key.
*
* @throws `NoOwnerError` if there's no owner at the time of call.
*/
export declare function setContext<T>(context: Context<T>, value?: T, owner?: Owner | null): void;
/**
* Whether the given context is currently defined.
*/
export declare function hasContext(context: Context<any>, owner?: Owner | null): boolean;
/**
* Runs the given function when the parent owner computation is being disposed.
*/
export declare function onCleanup(disposable: Disposable): void;
+15
View File
@@ -0,0 +1,15 @@
import type { Accessor } from './signals';
export interface SelectorSignal<T> {
(key: T): Boolean;
}
export interface SelectorOptions<Key, Value> {
name?: string;
equals?: (key: Key, value: Value | undefined) => boolean;
}
/**
* Creates a signal that observes the given `source` and returns a new signal who only notifies
* observers when entering or exiting a specified key.
*
* @see {@link https://github.com/solidjs/x-reactivity#createselector}
*/
export declare function createSelector<Source, Key = Source>(source: Accessor<Source>, options?: SelectorOptions<Key, Source>): SelectorSignal<Key>;
+55
View File
@@ -0,0 +1,55 @@
import type { MemoOptions, SignalOptions } from './core';
import { Owner } from './owner';
export interface Accessor<T> {
(): T;
}
export interface Setter<T> {
(value: T | SetValue<T>): T;
}
export interface SetValue<T> {
(currentValue: T): T;
}
export type Signal<T> = [read: Accessor<T>, write: Setter<T>];
/**
* Wraps the given value into a signal. The signal will return the current value when invoked
* `fn()`, and provide a simple write API via `write()`. The value can now be observed
* when used inside other computations created with `computed` and `effect`.
*/
export declare function createSignal<T>(initialValue: T, options?: SignalOptions<T>): Signal<T>;
export declare function createAsync<T>(fn: () => Promise<T>, initial?: T, options?: SignalOptions<T>): Accessor<T>;
/**
* Creates a new computation whose value is computed and returned by the given function. The given
* compute function is _only_ re-run when one of it's dependencies are updated. Dependencies are
* are all signals that are read during execution.
*/
export declare function createMemo<T>(compute: () => T, initialValue?: T, options?: MemoOptions<T>): Accessor<T>;
/**
* Invokes the given function each time any of the signals that are read inside are updated
* (i.e., their value changes). The effect is immediately invoked on initialization.
*/
export declare function createEffect<T>(effect: () => T, initialValue?: T, options?: {
name?: string;
}): void;
/**
* Invokes the given function each time any of the signals that are read inside are updated
* (i.e., their value changes). The effect is immediately invoked on initialization.
*/
export declare function createRenderEffect<T>(compute: () => T, effect: (v: T) => T, initialValue?: T, options?: {
name?: string;
}): void;
/**
* Creates a computation root which is given a `dispose()` function to dispose of all inner
* computations.
*/
export declare function createRoot<T>(init: ((dispose: () => void) => T) | (() => T)): T;
/**
* Runs the given function in the given owner so that error handling and cleanups continue to work.
*
* Warning: Usually there are simpler ways of modeling a problem that avoid using this function
*/
export declare function runWithOwner<T>(owner: Owner | null, run: () => T): T | undefined;
/**
* Runs the given function when an error is thrown in a child owner. If the error is thrown again
* inside the error handler, it will trigger the next available parent owner handler.
*/
export declare function catchError<T>(fn: () => T, handler: (error: unknown) => void): void;
+22
View File
@@ -0,0 +1,22 @@
export type Store<T> = Readonly<T>;
export type StoreSetter<T> = (fn: (state: T) => void) => void;
export type StoreNode = Record<PropertyKey, any>;
export declare namespace SolidStore {
interface Unwrappable {
}
}
export type NotWrappable = string | number | bigint | symbol | boolean | Function | null | undefined | SolidStore.Unwrappable[keyof SolidStore.Unwrappable];
export declare function isWrappable<T>(obj: T | NotWrappable): obj is T;
/**
* Returns the underlying data in the store without a proxy.
* @param item store proxy object
* @example
* ```js
* const initial = {z...};
* const [state, setState] = createStore(initial);
* initial === state; // => false
* initial === unwrap(state); // => true
* ```
*/
export declare function unwrap<T>(item: T, set?: Set<unknown>): T;
export declare function createStore<T extends object = {}>(store: T | Store<T>): [get: Store<T>, set: StoreSetter<T>];
+1
View File
@@ -0,0 +1 @@
export declare function isUndefined(value: any): value is undefined;
+3
View File
@@ -0,0 +1,3 @@
URL + Version:
https://unpkg.com/browse/lean-qr@2.3.4/
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "Satonomics",
"short_name": "Satonomics",
"name": "kibō",
"short_name": "kibō",
"description": "A better, FOSS, Bitcoin-only, self-hostable Glassnode",
"start_url": "/",
"display": "standalone",
+2833 -908
View File
File diff suppressed because it is too large Load Diff
-715
View File
@@ -1,715 +0,0 @@
/*
* Variables
*/
:root {
--default-font-family: "Satoshi";
--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);
--font-size-2xs: 0.625rem; /* 10px */
--line-height-2xs: 1rem; /* 16px */
--font-size-xs: 0.75rem; /* 12px */
--line-height-xs: 1rem; /* 16px */
--font-size-sm: 0.875rem; /* 14px */
--line-height-sm: 1.25rem; /* 20px */
--font-size-base: 1rem /* 16px */;
--line-height-base: 1.5rem /* 24px */;
--font-size-lg: 1.125rem /* 18px */;
--line-height-lg: 1.75rem /* 28px */;
--font-weight-medium: 500;
}
/* 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);
}
/*
* ---
* Base Tailwind
* ---
*/
*,
::after,
::before,
::backdrop,
::file-selector-button {
box-sizing: border-box;
margin: 0;
padding: 0;
border: 0 solid;
}
html,
:host {
line-height: 1.5;
-webkit-text-size-adjust: 100%;
tab-size: 4;
font-family: var(--default-font-family), ui-sans-serif, system-ui, sans-serif,
"Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
font-feature-settings: var(--default-font-feature-settings, normal);
font-variation-settings: var(--default-font-variation-settings, normal);
-webkit-tap-highlight-color: transparent;
}
body {
line-height: inherit;
}
hr {
height: 0;
color: inherit;
border-top-width: 1px;
}
abbr:where([title]) {
-webkit-text-decoration: underline dotted;
text-decoration: underline dotted;
}
h1,
h2,
h3,
h4,
h5,
h6 {
font-size: inherit;
font-weight: inherit;
}
a {
color: inherit;
-webkit-text-decoration: inherit;
text-decoration: inherit;
}
b,
strong {
font-weight: bolder;
}
code,
kbd,
samp,
pre {
font-family: var(
--default-mono-font-family,
ui-monospace,
SFMono-Regular,
Menlo,
Monaco,
Consolas,
"Liberation Mono",
"Courier New",
monospace
);
font-feature-settings: var(--default-mono-font-feature-settings, normal);
font-variation-settings: var(--default-mono-font-variation-settings, normal);
font-size: 1em;
}
small {
font-size: 80%;
}
sub,
sup {
font-size: 75%;
line-height: 0;
position: relative;
vertical-align: baseline;
}
sub {
bottom: -0.25em;
}
sup {
top: -0.5em;
}
table {
text-indent: 0;
border-color: inherit;
border-collapse: collapse;
}
button,
input,
optgroup,
select,
textarea,
::file-selector-button {
font: inherit;
font-feature-settings: inherit;
font-variation-settings: inherit;
letter-spacing: inherit;
color: inherit;
background: transparent;
}
input:where(:not([type="button"], [type="reset"], [type="submit"])),
select,
textarea {
border: 1px solid;
}
button,
input:where([type="button"], [type="reset"], [type="submit"]),
::file-selector-button {
appearance: button;
}
:-moz-focusring {
outline: auto;
}
:-moz-ui-invalid {
box-shadow: none;
}
progress {
vertical-align: baseline;
}
::-webkit-inner-spin-button,
::-webkit-outer-spin-button {
height: auto;
}
::-webkit-search-decoration {
-webkit-appearance: none;
}
summary {
display: list-item;
}
ol,
ul,
menu {
list-style: none;
}
textarea {
resize: vertical;
}
::placeholder {
opacity: 1;
color: color-mix(in srgb, currentColor 50%, transparent);
}
:disabled {
cursor: default;
}
img,
svg,
video,
canvas,
audio,
iframe,
embed,
object {
display: block;
vertical-align: middle;
}
img,
video {
max-width: 100%;
height: auto;
}
[hidden] {
display: none !important;
}
/*
* ---
* Custom
* ---
*/
/**
* @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: "Satoshi";
src: url("./fonts/Satoshi.var.woff2") format("woff2");
font-weight: 100 900;
font-display: block;
font-style: normal;
}
@font-face {
font-family: "Satoshi Chart";
src: url("./fonts/Satoshi.var.woff2") format("woff2");
font-weight: 600 900;
font-display: block;
font-style: normal;
}
html {
background-color: var(--background-color);
color: var(--color);
scrollbar-color: var(--off-color) var(--background-color); /* Foreground, Background */
scrollbar-width: thin;
}
body {
font-size: var(--font-size-sm);
line-height: var(--line-height-sm);
}
a:hover {
color: var(--color);
}
button {
cursor: pointer;
background-color: var(--background-color);
}
hr {
width: 100%;
}
::marker {
color: var(--border-color);
}
button:hover,
button:hover .off,
nav > fieldset > label:hover,
summary:hover,
li:hover > label > span,
summary:hover::marker,
strong,
mark {
color: var(--orange);
}
* {
border-color: var(--border-color) !important;
border-style: solid !important;
}
*::selection {
color: var(--white);
background-color: var(--orange);
}
a {
display: inline-flex;
color: var(--color);
}
a:hover {
text-decoration-color: var(--orange);
text-decoration-line: underline;
text-decoration-style: wavy;
}
a:active,
button:active,
nav > fieldset > label:active {
transform: scaleX(0.95) scaleY(0.9);
}
nav > button,
nav > a,
p > a:has(svg),
nav > fieldset > label {
padding: 1rem;
}
svg {
width: 20px;
height: 20px;
color: var(--off-color);
fill: currentColor;
}
a:hover > svg,
button:hover > svg,
nav > fieldset > label:hover > svg,
label:has(input:checked) > svg {
color: currentColor;
}
button:disabled {
color: var(--off-color);
}
mark {
background-color: transparent;
padding: 0;
}
/* Hide scrollbar for Chrome, Safari and Opera */
.no-scrollbar::-webkit-scrollbar {
display: none;
}
/* Hide scrollbar for IE, Edge and Firefox */
.no-scrollbar {
-ms-overflow-style: none; /* IE and Edge */
scrollbar-width: none; /* Firefox */
}
section {
flex: 1 1 0%;
overflow-x: hidden;
overflow-y: auto;
padding: 1.5rem /* 24px */;
height: 100%;
}
section:not(#selected-frame) {
padding-bottom: 21vh;
}
section > * + * {
margin-top: 1.5rem; /* 24px */
}
fieldset label {
position: relative;
}
fieldset label span.absolute {
text-align: center;
position: absolute;
bottom: 0;
margin-bottom: -0.5rem;
font-size: var(--font-size-2xs);
line-height: var(--line-height-2xs);
overflow: visible;
left: 0;
right: 0;
color: var(--off-color);
}
@media (min-width: 768px) {
.md\:hidden {
display: none !important;
}
}
input {
border: 0;
width: 100%;
}
input:focus-visible {
outline: none;
}
input::placeholder {
color: var(--off-color);
}
.sr-only,
input[type="radio"] {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border-width: 0;
}
h1,
h2,
h3 {
font-weight: 700;
font-size: var(--font-size-lg);
line-height: var(--line-height-lg);
}
h4 {
font-size: var(--font-size-base);
line-height: var(--line-height-base);
font-weight: 500;
}
@media (min-width: 768px) {
h1,
h2,
h3 {
font-size: 1.25rem /* 20px */;
}
}
p {
margin-top: 1rem;
}
section > header {
display: flex;
padding-top: 0.25rem /* 4px */;
white-space: nowrap;
overflow-x: auto;
padding-bottom: 1.5rem;
margin-bottom: -1.5rem;
padding-left: 1.5rem;
margin-left: -1.5rem;
padding-right: 1.5rem;
margin-right: -1.5rem;
}
header > div {
flex: 1 1 0%;
}
section > header small {
font-size: var(--font-size-base);
line-height: var(--line-height-base);
}
section:not(#settings-frame) > footer {
position: absolute;
bottom: 0;
right: 0;
display: flex;
padding: 1.5rem /* 24px */;
z-index: 10;
}
section:not(#settings-frame) > footer > * + * {
margin-left: 1rem /* 16px */;
}
section:not(#settings-frame) > footer > button {
box-shadow: 0 0 1rem 0.5rem var(--background-color);
border-radius: 9999px;
border-width: 1px;
padding: 0.75rem /* 12px */;
}
.field {
display: flex;
align-items: center;
font-size: var(--font-size-sm);
line-height: var(--line-height-sm);
}
.field > * + * {
margin-left: 1.5rem;
}
.field > div > * + * {
margin-left: 1rem !important;
}
.field label {
padding: 0.5rem;
margin: -0.5rem;
}
.field > div {
display: flex;
}
.tree {
font-weight: var(--font-weight-medium);
font-size: var(--font-size-sm);
line-height: var(--line-height-sm);
}
summary {
list-style: none;
display: flex;
align-items: center;
cursor: pointer;
}
label:has(input[type="radio"]) {
cursor: pointer;
display: flex;
flex-direction: column;
user-select: none;
font-weight: var(--font-weight-medium);
color: var(--off-color);
}
label:has(input[type="radio"]:checked) {
color: var(--color);
}
label:has(input[type="radio"]) > span.main {
display: flex;
align-items: center;
}
label:has(input[type="radio"]) > *:not(input[type="radio"]) {
width: 100%;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
label:has(input[type="radio"]) > *:not(input[type="radio"]) + * {
margin-top: -0.5rem /* -8px */;
}
label:has(input[type="radio"]) .emoji {
line-height: 0.9;
filter: grayscale(100%) brightness(60%) contrast(150%);
font-size: 1.0625rem;
}
label:has(input[type="radio"]:checked) .emoji,
label:has(input[type="radio"]):hover .emoji {
filter: sepia(90%) saturate(420%) hue-rotate(320deg) brightness(80%);
}
.tree label:has(input[type="radio"]),
.list label:has(input[type="radio"]) {
color: var(--color);
}
label:has(input[type="radio"]):hover,
label:has(input[type="radio"]):hover *,
.tree label:has(input[type="radio"]:checked),
.tree label:has(input[type="radio"]:checked) *,
.list label:has(input[type="radio"]:checked),
.list label:has(input[type="radio"]:checked) * {
color: var(--orange) !important;
}
summary:hover * {
color: var(--orange) !important;
}
summary::marker,
summary::-webkit-details-marker {
display: none;
}
span.name {
margin: 0.375rem /* 6px */;
flex: 1 1 0%;
width: 100%;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.tree .marker {
color: var(--border-color);
font-size: var(--font-size-xs);
line-height: var(--line-height-xs);
z-index: 10;
margin-left: -5px;
margin-bottom: 0.0625rem;
}
.main .new {
width: 0.375rem /* 6px */;
height: 0.375rem /* 6px */;
border-radius: 9999px;
background-color: var(--orange);
}
.tree li {
display: block;
position: relative;
padding-left: 12px;
border-left: 1px;
}
.tree li:last-child {
border-color: transparent !important;
}
.tree li::before {
content: "";
display: block;
position: absolute;
top: -12px;
left: -1px;
width: 9px;
height: 1.75rem;
border-color: var(--border-color);
border-width: 0 0 1px 1px;
border-radius: 0px 0px 0px 4px;
}
.tree summary > small {
margin-top: 0.125rem;
}
.list > * + * {
margin-top: 0.25rem;
}
/*
* History heading
*/
:root {
--history-heading-margin: calc(-1.5rem - 1px);
}
.list h4 {
position: sticky;
top: var(--history-heading-margin);
z-index: 10;
background-color: var(--background-color);
padding: 1rem;
padding-left: 0;
border-top-width: 1px;
border-bottom-width: 1px;
margin-bottom: 1rem;
margin-top: 2rem;
}
.list h4:first-child {
margin-top: var(--history-heading-margin);
}
small {
color: var(--off-color);
font-size: var(--font-size-xs);
line-height: var(--line-height-xs);
}
#leaderboard {
margin-top: 1rem;
color: var(--off-color);
margin-left: 1.375rem;
list-style-type: decimal;
font-size: var(--font-size-xs);
line-height: var(--line-height-xs);
}
#leaderboard ::marker {
color: var(--off-color);
}
#leaderboard a {
font-size: var(--font-size-sm);
line-height: var(--line-height-sm);
}
#leaderboard span {
color: var(--orange);
}
+3 -2
View File
@@ -3,7 +3,8 @@
"checkJs": true,
"strict": true,
"target": "ESNext",
"module": "ESNext"
"module": "ESNext",
"outDir": "/tmp/kibo"
},
"exclude": ["assets", "libraries"]
"exclude": ["assets", "libraries", "ignore"]
}
+73 -27
View File
@@ -1,5 +1,6 @@
type Scale = "date" | "height";
import { Accessor, Setter } from "../libraries/solid-signals/types/signals";
import {
DeepPartial,
BaselineStyleOptions,
@@ -10,33 +11,54 @@ import {
Time,
SingleValueData,
CandlestickData,
SeriesType,
IChartApi,
ISeriesApi,
} from "../libraries/lightweight-charts/types";
import { DatePath, HeightPath } from "./paths";
type Signal<T> = Accessor<T> & { set: Setter<T> };
type TimeRange = Range<Time | number>;
type DatasetPath<S extends Scale> = S extends "date" ? DatePath : HeightPath;
type AnyDatasetPath = import("./paths").DatePath | import("./paths").HeightPath;
type Color = string;
type Color = () => string;
type SeriesConfig = {
interface BaselineSpecificSeriesBlueprint {
type: "Baseline";
color?: Color;
options?: DeepPartial<BaselineStyleOptions & SeriesOptionsCommon>;
}
interface CandlestickSpecificSeriesBlueprint {
type: "Candlestick";
color?: undefined;
options?: DeepPartial<CandlestickStyleOptions & SeriesOptionsCommon>;
}
interface LineSpecificSeriesBlueprint {
type?: "Line";
color: Color;
options?: DeepPartial<LineStyleOptions & SeriesOptionsCommon>;
}
type AnySpecificSeriesBlueprint =
| BaselineSpecificSeriesBlueprint
| CandlestickSpecificSeriesBlueprint
| LineSpecificSeriesBlueprint;
type SpecificSeriesBlueprintWithChart<A extends AnySpecificSeriesBlueprint> = {
chart: IChartApi;
} & Omit<A, "type">;
type SeriesBlueprint = {
datasetPath: AnyDatasetPath;
title: string;
defaultVisible?: boolean;
} & (
| {
color?: Color;
seriesType: "Based";
options?: DeepPartial<BaselineStyleOptions & SeriesOptionsCommon>;
}
| {
seriesType: "Candlestick";
options?: DeepPartial<CandlestickStyleOptions & SeriesOptionsCommon>;
}
| {
seriesType?: "Line";
options?: DeepPartial<LineStyleOptions & SeriesOptionsCommon>;
}
);
defaultActive?: boolean;
} & AnySpecificSeriesBlueprint;
type Unit =
| "US Dollars"
@@ -55,19 +77,19 @@ type Unit =
| "Dollars / (PetaHash / Second)"
| "";
interface PresetParams {
top?: SeriesConfig[];
bottom?: SeriesConfig[];
interface PresetBlueprint {
top?: SeriesBlueprint[];
bottom?: SeriesBlueprint[];
}
type PartialPreset = {
interface PartialPreset extends PresetBlueprint {
scale: Scale;
icon: string;
name: string;
unit: Unit;
title: string;
description: string;
} & PresetParams;
}
interface PartialPresetFolder {
name: string;
@@ -107,13 +129,13 @@ interface OHLC {
interface ResourceDataset<
S extends Scale,
Type extends OHLC | number = number
Type extends OHLC | number = number,
> {
scale: S;
url: string;
fetch: (id: number) => void;
fetchedJSONs: FetchedResult<S, Type>[];
drop: VoidFunction;
// drop: VoidFunction;
}
type ValuedCandlestickData = CandlestickData & Valued;
@@ -125,7 +147,7 @@ interface FetchedResult<
SingleValueData | ValuedCandlestickData
> = DatasetValue<
Type extends number ? SingleValueData : ValuedCandlestickData
>
>,
> {
at: Date | null;
json: Signal<FetchedJSON<S, Type> | null>;
@@ -155,7 +177,7 @@ interface FetchedChunk {
type FetchedDataset<
S extends Scale,
Type extends number | OHLC
Type extends number | OHLC,
> = S extends "date" ? FetchedDateDataset<Type> : FetchedHeightDataset<Type>;
interface Versioned {
@@ -169,3 +191,27 @@ interface FetchedDateDataset<Type> extends Versioned {
interface FetchedHeightDataset<Type> extends Versioned {
map: Type[];
}
type PriceSeriesType = "Candlestick" | "Line";
interface Series {
id: string;
title: string;
chunks: Array<Accessor<ISeriesApi<SeriesType> | undefined>>;
color: Color | Color[];
disabled: Accessor<boolean>;
active: Signal<boolean>;
visible: Accessor<boolean>;
dataset: ResourceDataset<Scale, number>;
}
interface Marker {
weight: number;
time: Time;
value: number;
seriesChunk: ISeriesApi<any>;
}
interface Weighted {
weight: number;
}
@@ -155,16 +155,16 @@ export function Chart({
createEffect(on([exactRange, dark], debouncedSetMinMaxMarkers));
if (chartIndex === 0) {
const datasetPath: AnyDatasetPath = `${scale}-to-price`;
const dataset = datasets.getOrImport(scale, datasetPath);
// Don't trigger reactivity by design
activeDatasets().push(dataset);
const title = "Price";
function createPriceSeries(seriesType: PriceSeriesType) {
const datasetPath: AnyDatasetPath = `${scale}-to-price`;
const dataset = datasets.getOrImport(scale, datasetPath);
// Don't trigger reactivity by design
activeDatasets().push(dataset);
const title = "Price";
let seriesConfig: SeriesConfig;
if (seriesType === "Candlestick") {
@@ -1,5 +1,4 @@
import { dateToString, getNumberOfDaysBetweenTwoDates } from "../utils/date";
import { createLineSeries } from "./line";
export const GENESIS_DAY = "2009-01-03";
+3 -3
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -2,7 +2,7 @@
<svg viewBox="0 0 750 180" xmlns="http://www.w3.org/2000/svg">
<defs/>
<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"/>
<ellipse style="fill: #f26610;" 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: #ffffe3;"/>
</g>
<g>

Before

Width:  |  Height:  |  Size: 5.6 KiB

After

Width:  |  Height:  |  Size: 5.6 KiB

+1 -1
View File
@@ -2,7 +2,7 @@
<svg viewBox="0 0 750 180" xmlns="http://www.w3.org/2000/svg">
<defs/>
<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"/>
<ellipse style="fill: #f26610;" 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: #ffffe3;"/>
</g>
<g>

Before

Width:  |  Height:  |  Size: 5.6 KiB

After

Width:  |  Height:  |  Size: 5.6 KiB

+1 -1
View File
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<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 style="fill: #f26610;" cx="12" cy="12" rx="12" ry="12"/>
<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;"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

-4
View File
@@ -1,4 +0,0 @@
maintainers:
- npub1jagmm3x39lmwfnrtvxcs9ac7g300y3dusv9lgzhk2e4x5frpxlrqa73v44
relays:
- '?'
+93 -72
View File
@@ -107,9 +107,9 @@ dependencies = [
[[package]]
name = "anstyle"
version = "1.0.7"
version = "1.0.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "038dfcf04a5feb68e9c60b21c9625a54c2c0616e79b72b0fd87075a056ae1d1b"
checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1"
[[package]]
name = "anstyle-parse"
@@ -126,7 +126,7 @@ version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ad186efb764318d35165f1758e7dcef3b10628e26d41a44bc5550652e6804391"
dependencies = [
"windows-sys 0.52.0",
"windows-sys",
]
[[package]]
@@ -136,7 +136,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "61a38449feb7068f52bb06c12759005cf459ee52bb4adc1d5a7c4322d716fb19"
dependencies = [
"anstyle",
"windows-sys 0.52.0",
"windows-sys",
]
[[package]]
@@ -472,14 +472,14 @@ dependencies = [
"num-traits",
"serde",
"wasm-bindgen",
"windows-targets 0.52.4",
"windows-targets 0.52.6",
]
[[package]]
name = "clap"
version = "4.5.13"
version = "4.5.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0fbb260a053428790f3de475e304ff84cdbc4face759ea7a3e64c1edd938a7fc"
checksum = "ed6719fffa43d0d87e5fd8caeab59be1554fb028cd30edc88fc4369b17971019"
dependencies = [
"clap_builder",
"clap_derive",
@@ -487,9 +487,9 @@ dependencies = [
[[package]]
name = "clap_builder"
version = "4.5.13"
version = "4.5.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "64b17d7ea74e9f833c7dbf2cbe4fb12ff26783eda4782a8975b72f895c9b4d99"
checksum = "216aec2b177652e3846684cbfe25c9964d18ec45234f0f5da5157b207ed1aab6"
dependencies = [
"anstream",
"anstyle",
@@ -722,7 +722,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245"
dependencies = [
"libc",
"windows-sys 0.52.0",
"windows-sys",
]
[[package]]
@@ -1125,7 +1125,7 @@ checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b"
dependencies = [
"hermit-abi",
"libc",
"windows-sys 0.52.0",
"windows-sys",
]
[[package]]
@@ -1241,7 +1241,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c73f5c649995a115e1a0220b35e4df0a1294500477f97a91d0660fb5abeb574a"
dependencies = [
"libc",
"windows-sys 0.52.0",
"windows-sys",
]
[[package]]
@@ -1279,7 +1279,7 @@ dependencies = [
"hermit-abi",
"libc",
"wasi",
"windows-sys 0.52.0",
"windows-sys",
]
[[package]]
@@ -1645,9 +1645,9 @@ checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f"
[[package]]
name = "reqwest"
version = "0.12.5"
version = "0.12.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c7d6d2a27d57148378eb5e111173f4276ad26340ecc5c49a4a2152167a2d6a37"
checksum = "f8f4955649ef5c38cc7f9e8aa41761d48fb9677197daea9984dc54f56aad5e63"
dependencies = [
"base64 0.22.0",
"bytes",
@@ -1684,7 +1684,7 @@ dependencies = [
"wasm-bindgen",
"wasm-bindgen-futures",
"web-sys",
"winreg",
"windows-registry",
]
[[package]]
@@ -1708,7 +1708,7 @@ dependencies = [
"libc",
"spin",
"untrusted",
"windows-sys 0.52.0",
"windows-sys",
]
[[package]]
@@ -1727,7 +1727,7 @@ dependencies = [
"errno",
"libc",
"linux-raw-sys",
"windows-sys 0.52.0",
"windows-sys",
]
[[package]]
@@ -1809,7 +1809,7 @@ version = "0.1.23"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534"
dependencies = [
"windows-sys 0.52.0",
"windows-sys",
]
[[package]]
@@ -1864,18 +1864,18 @@ dependencies = [
[[package]]
name = "serde"
version = "1.0.204"
version = "1.0.209"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bc76f558e0cbb2a839d37354c575f1dc3fdc6546b5be373ba43d95f231bf7c12"
checksum = "99fce0ffe7310761ca6bf9faf5115afbc19688edd00171d81b1bb1b116c63e09"
dependencies = [
"serde_derive",
]
[[package]]
name = "serde_derive"
version = "1.0.204"
version = "1.0.209"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e0cd7e117be63d3c3678776753929474f3b04a43a080c744d6b0ae2a8c28e222"
checksum = "a5831b979fd7b5439637af1752d535ff49f4860c0f341d1baeb6faf0f4242170"
dependencies = [
"proc-macro2",
"quote",
@@ -1884,9 +1884,9 @@ dependencies = [
[[package]]
name = "serde_json"
version = "1.0.122"
version = "1.0.127"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "784b6203951c57ff748476b126ccb5e8e2959a5c19e5c617ab1956be3dbc68da"
checksum = "8043c06d9f82bd7271361ed64f415fe5e12a77fdb52e573e7f06a516dea329ad"
dependencies = [
"itoa",
"memchr",
@@ -1983,7 +1983,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "05ffd9c0a93b7543e062e759284fcf5f5e3b098501104bfbdde4d404db792871"
dependencies = [
"libc",
"windows-sys 0.52.0",
"windows-sys",
]
[[package]]
@@ -2043,23 +2043,26 @@ name = "sync_wrapper"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394"
dependencies = [
"futures-core",
]
[[package]]
name = "system-configuration"
version = "0.5.1"
version = "0.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7"
checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b"
dependencies = [
"bitflags 1.3.2",
"bitflags 2.6.0",
"core-foundation",
"system-configuration-sys",
]
[[package]]
name = "system-configuration-sys"
version = "0.5.0"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9"
checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4"
dependencies = [
"core-foundation-sys",
"libc",
@@ -2074,7 +2077,7 @@ dependencies = [
"cfg-if",
"fastrand",
"rustix",
"windows-sys 0.52.0",
"windows-sys",
]
[[package]]
@@ -2137,7 +2140,7 @@ dependencies = [
"signal-hook-registry",
"socket2",
"tokio-macros",
"windows-sys 0.52.0",
"windows-sys",
]
[[package]]
@@ -2509,16 +2512,37 @@ version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
dependencies = [
"windows-targets 0.52.4",
"windows-targets 0.52.6",
]
[[package]]
name = "windows-sys"
version = "0.48.0"
name = "windows-registry"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0"
dependencies = [
"windows-targets 0.48.5",
"windows-result",
"windows-strings",
"windows-targets 0.52.6",
]
[[package]]
name = "windows-result"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e"
dependencies = [
"windows-targets 0.52.6",
]
[[package]]
name = "windows-strings"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10"
dependencies = [
"windows-result",
"windows-targets 0.52.6",
]
[[package]]
@@ -2527,7 +2551,7 @@ version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
dependencies = [
"windows-targets 0.52.4",
"windows-targets 0.52.6",
]
[[package]]
@@ -2547,17 +2571,18 @@ dependencies = [
[[package]]
name = "windows-targets"
version = "0.52.4"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7dd37b7e5ab9018759f893a1952c9420d060016fc19a472b4bb20d1bdd694d1b"
checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
dependencies = [
"windows_aarch64_gnullvm 0.52.4",
"windows_aarch64_msvc 0.52.4",
"windows_i686_gnu 0.52.4",
"windows_i686_msvc 0.52.4",
"windows_x86_64_gnu 0.52.4",
"windows_x86_64_gnullvm 0.52.4",
"windows_x86_64_msvc 0.52.4",
"windows_aarch64_gnullvm 0.52.6",
"windows_aarch64_msvc 0.52.6",
"windows_i686_gnu 0.52.6",
"windows_i686_gnullvm",
"windows_i686_msvc 0.52.6",
"windows_x86_64_gnu 0.52.6",
"windows_x86_64_gnullvm 0.52.6",
"windows_x86_64_msvc 0.52.6",
]
[[package]]
@@ -2568,9 +2593,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
[[package]]
name = "windows_aarch64_gnullvm"
version = "0.52.4"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bcf46cf4c365c6f2d1cc93ce535f2c8b244591df96ceee75d8e83deb70a9cac9"
checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
[[package]]
name = "windows_aarch64_msvc"
@@ -2580,9 +2605,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
[[package]]
name = "windows_aarch64_msvc"
version = "0.52.4"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "da9f259dd3bcf6990b55bffd094c4f7235817ba4ceebde8e6d11cd0c5633b675"
checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
[[package]]
name = "windows_i686_gnu"
@@ -2592,9 +2617,15 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
[[package]]
name = "windows_i686_gnu"
version = "0.52.4"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b474d8268f99e0995f25b9f095bc7434632601028cf86590aea5c8a5cb7801d3"
checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
[[package]]
name = "windows_i686_gnullvm"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
[[package]]
name = "windows_i686_msvc"
@@ -2604,9 +2635,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
[[package]]
name = "windows_i686_msvc"
version = "0.52.4"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1515e9a29e5bed743cb4415a9ecf5dfca648ce85ee42e15873c3cd8610ff8e02"
checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
[[package]]
name = "windows_x86_64_gnu"
@@ -2616,9 +2647,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
[[package]]
name = "windows_x86_64_gnu"
version = "0.52.4"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5eee091590e89cc02ad514ffe3ead9eb6b660aedca2183455434b93546371a03"
checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
[[package]]
name = "windows_x86_64_gnullvm"
@@ -2628,9 +2659,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
[[package]]
name = "windows_x86_64_gnullvm"
version = "0.52.4"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "77ca79f2451b49fa9e2af39f0747fe999fcda4f5e241b2898624dca97a1f2177"
checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
[[package]]
name = "windows_x86_64_msvc"
@@ -2640,9 +2671,9 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
[[package]]
name = "windows_x86_64_msvc"
version = "0.52.4"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8"
checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
[[package]]
name = "winnow"
@@ -2653,16 +2684,6 @@ dependencies = [
"memchr",
]
[[package]]
name = "winreg"
version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5"
dependencies = [
"cfg-if",
"windows-sys 0.48.0",
]
[[package]]
name = "zerocopy"
version = "0.6.6"