kripke: add stats

This commit is contained in:
2025-09-24 20:22:19 +09:00
parent 4895dd2863
commit 3edaed9327
9 changed files with 842 additions and 186 deletions

View File

@@ -20,6 +20,9 @@
"@sveltejs/enhanced-img": "0.4.4",
"@sveltejs/kit": "2.20.7",
"@sveltejs/vite-plugin-svelte": "6.2.0",
"@types/d3-array": "^3",
"@types/d3-scale": "^4",
"@types/d3-shape": "^3",
"@types/prismjs": "1.26.5",
"autoprefixer": "10.4.20",
"bits-ui": "1.3.3",
@@ -49,10 +52,13 @@
"@fontsource/zen-kaku-gothic-new": "5.2.5",
"@icons-pack/svelte-simple-icons": "6.4.0",
"@tailwindcss/typography": "0.5.16",
"d3-scale": "4.0.2",
"deepmerge": "4.3.1",
"layerchart": "1.0.12",
"lucide-svelte": "0.475.0",
"svelte-persisted-store": "0.12.0",
"sveltekit-rate-limiter": "0.7.0",
"tailwind-merge": "3.0.2"
"tailwind-merge": "3.0.2",
"zod": "4.1.11"
}
}

View File

@@ -23,7 +23,7 @@ export const buttonVariants = tv({
link: "text-primary underline-offset-4 hover:underline",
},
size: {
default: "h-9 px-4 py-2",
default: "h-9 px-4 py-2 pb-2.5",
sm: "h-8 rounded-md px-3 text-xs",
lg: "h-10 rounded-md px-8",
icon: "h-9 w-9",

View File

@@ -1,16 +1,7 @@
<script lang="ts">
import { Button } from "$lib/components/ui/button";
import * as Dialog from "$lib/components/ui/dialog";
import { type Formula, isomorphic, validWorlds } from "@cannorin/kripke";
import LuRotateCw from "lucide-svelte/icons/rotate-cw";
import LuX from "lucide-svelte/icons/x";
import { onMount } from "svelte";
import FrameInput from "./components/frame-input.svelte";
import Game, { type GameStatus } from "./components/game.svelte";
import Rules from "./components/rules.svelte";
import Share from "./components/share.svelte";
import Template from "./components/template.svelte";
import { daily } from "./lib/store";
import { getFrameBySeed, getTimeUntilNextGame } from "./lib/system";
@@ -20,14 +11,9 @@ const { id, frame } = getFrameBySeed(seed);
const guess = (frameId: number) => isomorphic[frameId] === id;
const check = (formula: Formula) => validWorlds(frame, formula).length;
const getAnswer = () => id;
const getSeed = () => seed;
const relationSize = frame.relations.size;
let status: GameStatus = $state("playing");
let dialogOpen = $state(false);
$effect(() => {
if (status !== "playing") dialogOpen = true;
});
let timeUntilNextGame = $state(getTimeUntilNextGame());
onMount(() => {
const interval = setInterval(() => {
@@ -39,71 +25,31 @@ onMount(() => {
});
</script>
<main class="flex flex-col min-h-screen max-w-full items-center gap-12 lg:gap-16 py-8">
<h1 class="font-display text-6xl">KRiPkE</h1>
{#snippet title()}
<h2 class="text-sm">
<span class="font-bold">Daily Challenge: </span>
{timeUntilNextGame.hours}:{timeUntilNextGame.minutes}:{timeUntilNextGame.seconds} until the next game.
</h2>
{/snippet}
<div class="flex flex-col md:flex-row-reverse gap-x-20 gap-y-8">
<section class="flex flex-col gap-2">
<h2 class="text-sm">
<span class="font-bold">Daily Challenge: </span>
{timeUntilNextGame.hours}:{timeUntilNextGame.minutes}:{timeUntilNextGame.seconds} until the next game.
</h2>
<Game
bind:moves={$daily.moves} bind:status relationSize={relationSize}
guess={guess} check={check} getAnswer={getAnswer}
onShare={() => { dialogOpen = true; }} />
</section>
{#snippet description()}
<h2>Daily Challenge!</h2>
<ul>
<li>The answer of the game changes every day.</li>
<li>The progress of the game persists until the next day ({timeUntilNextGame.hours}:{timeUntilNextGame.minutes}:{timeUntilNextGame.seconds} from now).</li>
<li>You can also play <a href="/kripke/random">Random Challenge</a>.</li>
</ul>
{/snippet}
<section class="w-[300px] prose prose-sm">
<h2>Daily Challenge!</h2>
<ul>
<li>The answer of the game changes every day.</li>
<li>The progress of the game persists until the next day ({timeUntilNextGame.hours}:{timeUntilNextGame.minutes}:{timeUntilNextGame.seconds} from now).</li>
<li>You can also play <a href="/kripke/random">Random Challenge</a>.</li>
</ul>
<Rules relationSize={relationSize} />
</section>
</div>
</main>
{#if status !== "playing"}
{#await getAnswer() then answerId}
<Dialog.Root bind:open={dialogOpen}>
<Dialog.Content class="animate-fade-in">
<Dialog.Header>
<Dialog.Title>
{#if status === "win"}
YOU WIN!
{:else if status === "lose"}
YOU LOSE!
{/if}
</Dialog.Title>
<Dialog.Description>
The answer was:
</Dialog.Description>
</Dialog.Header>
<div class="flex flex-col items-center w-fit rounded bg-background mx-auto">
<span class="text-xs text-muted self-start px-2 py-1">id: {answerId}, seed: <a class="text-primary underline font-medium" href="/kripke/random/{seed}">{seed}</a></span>
<FrameInput class="pb-6" disabled width={250} height={250} frame={frame} />
</div>
<Dialog.Footer>
<div class="flex flex-col md:flex-row gap-2 w-full justify-end">
<Share date={$daily.date} moves={$daily.moves} status={status} />
<Button
href="/kripke/random">
<LuRotateCw class="w-4 h-4 mt-[2px]" /> Play Random Challenge
</Button>
<Button
variant="foreground"
onclick={() => (dialogOpen = false)}>
<LuX class="w-4 h-4 mt-[2px]" /> Close
</Button>
</div>
</Dialog.Footer>
</Dialog.Content>
</Dialog.Root>
{/await}
{/if}
<Template
bind:moves={$daily.moves}
relationSize={relationSize}
guess={guess}
check={check}
getAnswer={getAnswer}
getSeed={getSeed}
getShareProps={(moves, status) => ({ moves, status, date: $daily.date })}
title={title}
description={description}
newGame={{ href: "/kripke/random", text: "Play Random Challenge" }}
/>

View File

@@ -0,0 +1,63 @@
<script lang="ts">
import { scaleLog } from "d3-scale";
import { Area, AreaChart, Axis, Labels, Points, Svg } from "layerchart";
export type Props = {
playerData: number[];
};
let { playerData }: Props = $props();
const data = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10].map((i) => ({
move: i,
player: playerData[i] ?? 1,
}));
</script>
<AreaChart
data={data}
x="move"
series={[
{
key: "player",
label: "You",
color: "rgb(var(--primary))"
},
]}
seriesLayout="overlap"
yScale={scaleLog()}
yDomain={[1, 1000]}
renderContext="svg">
<Svg>
<Axis
placement="left"
tickLength={10}
grid={{ ["class"]: "stroke-muted", style: "stroke-dasharray: 2" }}
ticks={[1,10,100,1000]}
class="fill-foreground" />
<Axis
placement="bottom"
tickLength={10}
class="fill-foreground" />
<Area
y1={(d) => d.player}
fill={"rgb(var(--primary))"}
fillOpacity={0.3}
line={{ class: "stroke-2", stroke: "rgb(var(--primary))" }}
/>
<Points
y={(d) => d.player}
r={9}
class="fill-primary"
/>
<Labels
y={(d) => d.player}
placement="center"
offset={-1.1}
format={(x) => x}
class="text-[10px] fill-background font-bold"
/>
</Svg>
</AreaChart>

View File

@@ -5,15 +5,12 @@ import SiMisskey from "@icons-pack/svelte-simple-icons/icons/SiMisskey";
import SiX from "@icons-pack/svelte-simple-icons/icons/SiX";
import type { GameStatus, Move } from "./game.svelte";
let {
date,
moves,
status,
seed,
}: { moves: Move[]; status: GameStatus } & (
export type ShareProps = { moves: Move[]; status: GameStatus } & (
| { date: string; seed?: undefined }
| { seed: number; date?: undefined }
) = $props();
);
let { date, moves, status, seed }: ShareProps = $props();
const numberEmojis = ["0⃣", "1⃣", "2⃣", "3⃣", "4⃣"];

View File

@@ -0,0 +1,172 @@
<script lang="ts">
import { Button } from "$lib/components/ui/button";
import * as Dialog from "$lib/components/ui/dialog";
import {
type Formula,
getFrame,
nontrivials,
tryParse,
validWorlds,
} from "@cannorin/kripke";
import Game, { type GameStatus, type Move } from "./game.svelte";
import LuRotateCw from "lucide-svelte/icons/rotate-cw";
import LuX from "lucide-svelte/icons/x";
import type { Snippet } from "svelte";
import Chart from "./chart.svelte";
import FrameInput from "./frame-input.svelte";
import Rules from "./rules.svelte";
import Share, { type ShareProps } from "./share.svelte";
export type Props = {
status?: GameStatus;
moves?: Move[];
relationSize: number;
guess: (frameId: number) => boolean | Promise<boolean>;
check: (formula: Formula) => number | Promise<number>;
getAnswer: () => number | Promise<number>;
getSeed?: () => number | Promise<number>;
getShareProps: (
moves: Move[],
status: GameStatus,
) => ShareProps | Promise<ShareProps>;
title: Snippet;
description: Snippet;
newGame: { href: string; text: string };
};
let {
status = $bindable<GameStatus>("playing"),
moves = $bindable<Move[]>([]),
relationSize,
guess,
check,
getAnswer,
getSeed,
getShareProps,
title,
description,
newGame,
}: Props = $props();
let dialogOpen = $state(false);
$effect(() => {
if (status !== "playing") dialogOpen = true;
});
function evaluate() {
let frames = nontrivials
.map((id) => ({ id, frame: getFrame(id) }))
.filter((f) => f.frame.relations.size === relationSize);
if (frames.length === 0) return undefined;
const res: number[] = [frames.length];
for (const move of moves) {
if (move.type === "guess") {
frames = frames.filter((f) => f.id !== move.frameId);
}
if (move.type === "check") {
if (move.valid < 0 || move.valid > 4) return undefined;
const formula = tryParse(move.formulaStr);
if (!formula) return undefined;
frames = frames.filter(
(f) => validWorlds(f.frame, formula).length === move.valid,
);
}
if (frames.length === 0) return undefined;
res.push(frames.length);
}
return res;
}
</script>
<main class="flex flex-col min-h-screen max-w-full items-center gap-12 lg:gap-16 py-8">
<h1 class="font-display text-6xl">KRiPkE</h1>
<div class="flex flex-col md:flex-row-reverse gap-x-20 gap-y-8">
<section class="flex flex-col gap-2">
{@render title()}
<Game
bind:moves bind:status relationSize={relationSize}
guess={guess} check={check} getAnswer={getAnswer}
onShare={() => { dialogOpen = true; }}/>
</section>
<section class="w-[300px] prose prose-sm">
{@render description()}
<Rules relationSize={relationSize} />
</section>
</div>
</main>
{#if status !== "playing"}
{#await getAnswer() then answerId}
{#await getShareProps(moves, status) then shareProps}
{@const answerFrame = getFrame(answerId)}
{@const playerData = evaluate()}
<Dialog.Root bind:open={dialogOpen}>
<Dialog.Content class="animate-fade-in">
<Dialog.Header>
<Dialog.Title>
{#if status === "win"}
YOU WIN!
{:else if status === "lose"}
YOU LOSE!
{/if}
</Dialog.Title>
<Dialog.Description>
The answer was:
</Dialog.Description>
</Dialog.Header>
<div class="flex flex-col items-center w-full bg-background mx-auto">
<div class="w-fit">
<span class="text-xs text-muted self-start px-2 py-1">
{#if getSeed}
{#await getSeed() then seed}
id: {answerId}, seed: <a class="text-primary underline font-medium" href="/kripke/random/{seed}">{seed}</a>
{/await}
{:else}
id: {answerId}
{/if}
</span>
<FrameInput disabled width={250} height={250} frame={answerFrame} />
</div>
<div class="w-full h-[125px] md:h-[200px] px-2 flex flex-col">
<span class="text-xs pb-2">
Statistics (frames left / moves)
</span>
{#if playerData}
<Chart playerData={playerData} />
{:else}
<div class="flex flex-col items-center justify-center">
Invalid play data
</div>
{/if}
</div>
</div>
<Dialog.Footer>
<div class="flex flex-col md:flex-row gap-2 w-full justify-end">
<Share {...shareProps} />
<Button
data-sveltekit-reload
href={newGame.href}>
<LuRotateCw class="w-4 h-4 mt-[2px]" /> {newGame.text}
</Button>
<Button
variant="foreground"
onclick={() => (dialogOpen = false)}>
<LuX class="w-4 h-4 mt-[2px]" /> Close
</Button>
</div>
</Dialog.Footer>
</Dialog.Content>
</Dialog.Root>
{/await}
{/await}
{/if}

View File

@@ -1,14 +1,6 @@
<script lang="ts">
import { Button } from "$lib/components/ui/button";
import * as Dialog from "$lib/components/ui/dialog";
import { type Formula, isomorphic, validWorlds } from "@cannorin/kripke";
import LuRotateCw from "lucide-svelte/icons/rotate-cw";
import LuX from "lucide-svelte/icons/x";
import FrameInput from "../../components/frame-input.svelte";
import Game, { type GameStatus, type Move } from "../../components/game.svelte";
import Rules from "../../components/rules.svelte";
import Share from "../../components/share.svelte";
import Template from "../../components/template.svelte";
import { getFrameBySeed } from "../../lib/system";
let { data } = $props();
@@ -17,88 +9,39 @@ const { id, frame } = getFrameBySeed(seed);
const guess = (frameId: number) => isomorphic[frameId] === id;
const check = (formula: Formula) => validWorlds(frame, formula).length;
const getAnswer = () => id;
const getSeed = () => seed;
const relationSize = frame.relations.size;
let moves: Move[] = $state([]);
let status: GameStatus = $state("playing");
let dialogOpen = $state(false);
$effect(() => {
if (status !== "playing") dialogOpen = true;
});
</script>
{#snippet seedNumber()}
<a class="text-primary font-medium underline" href={`/kripke/random/${seed}`}>{seed}</a>
{/snippet}
<main class="flex flex-col min-h-screen max-w-full items-center gap-12 lg:gap-16 py-8">
<h1 class="font-display text-6xl">KRiPkE</h1>
{#snippet title()}
<h2 class="text-sm">
<span class="font-bold">Random Challenge</span>
<span>(seed: {@render seedNumber()})</span>
</h2>
{/snippet}
<div class="flex flex-col md:flex-row-reverse gap-x-20 gap-y-8">
<section class="flex flex-col gap-2">
<h2 class="text-sm">
<span class="font-bold">Random Challenge</span>
<span>(seed: {@render seedNumber()})</span>
</h2>
<Game
bind:moves bind:status relationSize={relationSize}
guess={guess} check={check} getAnswer={getAnswer}
onShare={() => { dialogOpen = true; }}/>
</section>
{#snippet description()}
<h2>Random Challenge!</h2>
<ul>
<li>The answer of the game is determined by a seed number {@render seedNumber()}.</li>
<li>You can right-click on the seed number to obtain a permalink to this exact game.</li>
<li>Unlike Daily Challenge, the progress of the game does not persist.</li>
<li>You can also play <a href="/kripke">Daily Challenge</a>, if you have not yet.</li>
</ul>
{/snippet}
<section class="w-[300px] prose prose-sm">
<h2>Random Challenge!</h2>
<ul>
<li>The answer of the game is determined by a seed number {@render seedNumber()}.</li>
<li>You can right-click on the seed number to obtain a permalink to this exact game.</li>
<li>Unlike Daily Challenge, the progress of the game does not persist.</li>
<li>You can also play <a href="/kripke">Daily Challenge</a>, if you have not yet.</li>
</ul>
<Rules relationSize={relationSize} />
</section>
</div>
</main>
{#if status !== "playing"}
{#await getAnswer() then answerId}
<Dialog.Root bind:open={dialogOpen}>
<Dialog.Content class="animate-fade-in">
<Dialog.Header>
<Dialog.Title>
{#if status === "win"}
YOU WIN!
{:else if status === "lose"}
YOU LOSE!
{/if}
</Dialog.Title>
<Dialog.Description>
The answer was:
</Dialog.Description>
</Dialog.Header>
<div class="flex flex-col items-center w-fit rounded bg-background mx-auto">
<span class="text-xs text-muted self-start px-2 py-1">id: {answerId}, seed: <a class="text-primary underline font-medium" href="/kripke/random/{seed}">{seed}</a></span>
<FrameInput class="pb-6" disabled width={250} height={250} frame={frame} />
</div>
<Dialog.Footer>
<div class="flex flex-col md:flex-row gap-2 w-full justify-end">
<Share seed={seed} moves={moves} status={status} />
<Button
data-sveltekit-reload
href="/kripke/random">
<LuRotateCw class="w-4 h-4 mt-[2px]" /> Play New Game
</Button>
<Button
variant="foreground"
onclick={() => (dialogOpen = false)}>
<LuX class="w-4 h-4 mt-[2px]" /> Close
</Button>
</div>
</Dialog.Footer>
</Dialog.Content>
</Dialog.Root>
{/await}
{/if}
<Template
relationSize={relationSize}
guess={guess}
check={check}
getAnswer={getAnswer}
getSeed={getSeed}
getShareProps={(moves, status) => ({ moves, status, seed })}
title={title}
description={description}
newGame={{ href: "/kripke/random", text: "Play New Game" }}
/>

View File

@@ -3,7 +3,11 @@ import type { Config } from "tailwindcss";
import { fontFamily } from "tailwindcss/defaultTheme";
export default {
content: ["./src/**/*.{html,js,svelte,ts,md}"],
content: [
"./src/**/*.{html,js,svelte,ts,md}",
"../../node_modules/svelte-ux/**/*.{svelte,js}",
"../../node_modules/layerchart/**/*.{svelte,js}",
],
theme: {
container: {

543
yarn.lock
View File

@@ -206,6 +206,22 @@ __metadata:
languageName: node
linkType: hard
"@dagrejs/dagre@npm:^1.1.4":
version: 1.1.5
resolution: "@dagrejs/dagre@npm:1.1.5"
dependencies:
"@dagrejs/graphlib": "npm:2.2.4"
checksum: 10c0/738e2d86ee093b99ec96098f1a4d0b6290b6ddaef51db912885df0ab5d09291edb82ef875575a4b321bc13bab78b1cb00347b246aad4099ce4af3202a72a8586
languageName: node
linkType: hard
"@dagrejs/graphlib@npm:2.2.4":
version: 2.2.4
resolution: "@dagrejs/graphlib@npm:2.2.4"
checksum: 10c0/14597ea9294c46b2571aee78bcaad3a24e3e5e0ebcdf198b6eae5b3805f99af727ac54a477dd9152e8b0a576efea0528fb7d4919c74801e9f669c90e5e6f5bd9
languageName: node
linkType: hard
"@emnapi/runtime@npm:^1.2.0":
version: 1.3.1
resolution: "@emnapi/runtime@npm:1.3.1"
@@ -588,6 +604,25 @@ __metadata:
languageName: node
linkType: hard
"@floating-ui/core@npm:^1.7.3":
version: 1.7.3
resolution: "@floating-ui/core@npm:1.7.3"
dependencies:
"@floating-ui/utils": "npm:^0.2.10"
checksum: 10c0/edfc23800122d81df0df0fb780b7328ae6c5f00efbb55bd48ea340f4af8c5b3b121ceb4bb81220966ab0f87b443204d37105abdd93d94846468be3243984144c
languageName: node
linkType: hard
"@floating-ui/dom@npm:^1.6.13":
version: 1.7.4
resolution: "@floating-ui/dom@npm:1.7.4"
dependencies:
"@floating-ui/core": "npm:^1.7.3"
"@floating-ui/utils": "npm:^0.2.10"
checksum: 10c0/da6166c25f9b0729caa9f498685a73a0e28251613b35d27db8de8014bc9d045158a23c092b405321a3d67c2064909b6e2a7e6c1c9cc0f62967dca5779f5aef30
languageName: node
linkType: hard
"@floating-ui/dom@npm:^1.6.7":
version: 1.6.13
resolution: "@floating-ui/dom@npm:1.6.13"
@@ -598,6 +633,13 @@ __metadata:
languageName: node
linkType: hard
"@floating-ui/utils@npm:^0.2.10":
version: 0.2.10
resolution: "@floating-ui/utils@npm:0.2.10"
checksum: 10c0/e9bc2a1730ede1ee25843937e911ab6e846a733a4488623cd353f94721b05ec2c9ec6437613a2ac9379a94c2fd40c797a2ba6fa1df2716f5ce4aa6ddb1cf9ea4
languageName: node
linkType: hard
"@floating-ui/utils@npm:^0.2.9":
version: 0.2.9
resolution: "@floating-ui/utils@npm:0.2.9"
@@ -902,6 +944,61 @@ __metadata:
languageName: node
linkType: hard
"@layerstack/svelte-actions@npm:^1.0.1":
version: 1.0.1
resolution: "@layerstack/svelte-actions@npm:1.0.1"
dependencies:
"@floating-ui/dom": "npm:^1.6.13"
"@layerstack/utils": "npm:1.0.1"
d3-array: "npm:^3.2.4"
d3-scale: "npm:^4.0.2"
date-fns: "npm:^4.1.0"
lodash-es: "npm:^4.17.21"
checksum: 10c0/498335fa0fc0ed71f5d64340cd52ba5af6c9c6a1e24c01f18523e79a8e44e37aaba54991aa82090269cb198c0f61ed7c17502551e2e3c1516866108752766178
languageName: node
linkType: hard
"@layerstack/svelte-stores@npm:^1.0.2":
version: 1.0.2
resolution: "@layerstack/svelte-stores@npm:1.0.2"
dependencies:
"@layerstack/utils": "npm:1.0.1"
d3-array: "npm:^3.2.4"
date-fns: "npm:^4.1.0"
immer: "npm:^10.1.1"
lodash-es: "npm:^4.17.21"
zod: "npm:^3.24.2"
checksum: 10c0/5c163918c10ebec22be3046f56475d2fba7975e4f1bc1f76b304a9e6ca147ee8077fc01cafe05e353fee1d7374df0b015d5ca8e74fc1347f81e7e19c94c0249c
languageName: node
linkType: hard
"@layerstack/tailwind@npm:^1.0.1":
version: 1.0.1
resolution: "@layerstack/tailwind@npm:1.0.1"
dependencies:
"@layerstack/utils": "npm:^1.0.1"
clsx: "npm:^2.1.1"
culori: "npm:^4.0.1"
d3-array: "npm:^3.2.4"
date-fns: "npm:^4.1.0"
lodash-es: "npm:^4.17.21"
tailwind-merge: "npm:^2.5.4"
tailwindcss: "npm:^3.4.15"
checksum: 10c0/4c9bd396315f768d63ec17953ab0f5612cd8283e48e675e443609d717cb6e2fc48596df0db850b35281ae65f6121d16f1b6556f2c7f2b31fa9b1cc3e651342b6
languageName: node
linkType: hard
"@layerstack/utils@npm:1.0.1, @layerstack/utils@npm:^1.0.1":
version: 1.0.1
resolution: "@layerstack/utils@npm:1.0.1"
dependencies:
d3-array: "npm:^3.2.4"
date-fns: "npm:^4.1.0"
lodash-es: "npm:^4.17.21"
checksum: 10c0/2b9b9ca1cee87bb28f4d7efd2b0908ebae729f8079d29bec0c422850ef210c503fd9b4b5e5bc692dd93e1b626426f8b814956cad7d52b2467d1e25f6fd746e7c
languageName: node
linkType: hard
"@nodelib/fs.scandir@npm:2.1.5":
version: 2.1.5
resolution: "@nodelib/fs.scandir@npm:2.1.5"
@@ -1295,6 +1392,45 @@ __metadata:
languageName: node
linkType: hard
"@types/d3-array@npm:^3":
version: 3.2.2
resolution: "@types/d3-array@npm:3.2.2"
checksum: 10c0/6137cb97302f8a4f18ca22c0560c585cfcb823f276b23d89f2c0c005d72697ec13bca671c08e68b4b0cabd622e3f0e91782ee221580d6774074050be96dd7028
languageName: node
linkType: hard
"@types/d3-path@npm:*":
version: 3.1.1
resolution: "@types/d3-path@npm:3.1.1"
checksum: 10c0/2c36eb31ebaf2ce4712e793fd88087117976f7c4ed69cc2431825f999c8c77cca5cea286f3326432b770739ac6ccd5d04d851eb65e7a4dbcc10c982b49ad2c02
languageName: node
linkType: hard
"@types/d3-scale@npm:^4":
version: 4.0.9
resolution: "@types/d3-scale@npm:4.0.9"
dependencies:
"@types/d3-time": "npm:*"
checksum: 10c0/4ac44233c05cd50b65b33ecb35d99fdf07566bcdbc55bc1306b2f27d1c5134d8c560d356f2c8e76b096e9125ffb8d26d95f78d56e210d1c542cb255bdf31d6c8
languageName: node
linkType: hard
"@types/d3-shape@npm:^3":
version: 3.1.7
resolution: "@types/d3-shape@npm:3.1.7"
dependencies:
"@types/d3-path": "npm:*"
checksum: 10c0/38e59771c1c4c83b67aa1f941ce350410522a149d2175832fdc06396b2bb3b2c1a2dd549e0f8230f9f24296ee5641a515eaf10f55ee1ef6c4f83749e2dd7dcfd
languageName: node
linkType: hard
"@types/d3-time@npm:*":
version: 3.0.4
resolution: "@types/d3-time@npm:3.0.4"
checksum: 10c0/6d9e2255d63f7a313a543113920c612e957d70da4fb0890931da6c2459010291b8b1f95e149a538500c1c99e7e6c89ffcce5554dd29a31ff134a38ea94b6d174
languageName: node
linkType: hard
"@types/deep-eql@npm:*":
version: 4.0.2
resolution: "@types/deep-eql@npm:4.0.2"
@@ -1832,6 +1968,13 @@ __metadata:
languageName: node
linkType: hard
"commander@npm:7, commander@npm:^7.2.0":
version: 7.2.0
resolution: "commander@npm:7.2.0"
checksum: 10c0/8d690ff13b0356df7e0ebbe6c59b4712f754f4b724d4f473d3cc5b3fdcf978e3a5dc3078717858a2ceb50b0f84d0660a7f22a96cdc50fb877d0c9bb31593d23a
languageName: node
linkType: hard
"commander@npm:^4.0.0":
version: 4.1.1
resolution: "commander@npm:4.1.1"
@@ -1839,13 +1982,6 @@ __metadata:
languageName: node
linkType: hard
"commander@npm:^7.2.0":
version: 7.2.0
resolution: "commander@npm:7.2.0"
checksum: 10c0/8d690ff13b0356df7e0ebbe6c59b4712f754f4b724d4f473d3cc5b3fdcf978e3a5dc3078717858a2ceb50b0f84d0660a7f22a96cdc50fb877d0c9bb31593d23a
languageName: node
linkType: hard
"commander@npm:^8.3.0":
version: 8.3.0
resolution: "commander@npm:8.3.0"
@@ -1943,6 +2079,258 @@ __metadata:
languageName: node
linkType: hard
"culori@npm:^4.0.1":
version: 4.0.2
resolution: "culori@npm:4.0.2"
checksum: 10c0/5d3c952b947ac5915409bab513e1d2e8bd813caa491af8ded0c769fdc1186a5ff61fb3c59fc8edf5393237d92074dbc54a492e6e99cb039dd6535d5d96106bfe
languageName: node
linkType: hard
"d3-array@npm:1 - 2":
version: 2.12.1
resolution: "d3-array@npm:2.12.1"
dependencies:
internmap: "npm:^1.0.0"
checksum: 10c0/7eca10427a9f113a4ca6a0f7301127cab26043fd5e362631ef5a0edd1c4b2dd70c56ed317566700c31e4a6d88b55f3951aaba192291817f243b730cb2352882e
languageName: node
linkType: hard
"d3-array@npm:2 - 3, d3-array@npm:2.10.0 - 3, d3-array@npm:2.5.0 - 3, d3-array@npm:3, d3-array@npm:^3.2.4":
version: 3.2.4
resolution: "d3-array@npm:3.2.4"
dependencies:
internmap: "npm:1 - 2"
checksum: 10c0/08b95e91130f98c1375db0e0af718f4371ccacef7d5d257727fe74f79a24383e79aba280b9ffae655483ffbbad4fd1dec4ade0119d88c4749f388641c8bf8c50
languageName: node
linkType: hard
"d3-color@npm:1 - 3, d3-color@npm:^3.1.0":
version: 3.1.0
resolution: "d3-color@npm:3.1.0"
checksum: 10c0/a4e20e1115fa696fce041fbe13fbc80dc4c19150fa72027a7c128ade980bc0eeeba4bcf28c9e21f0bce0e0dbfe7ca5869ef67746541dcfda053e4802ad19783c
languageName: node
linkType: hard
"d3-delaunay@npm:6, d3-delaunay@npm:^6.0.4":
version: 6.0.4
resolution: "d3-delaunay@npm:6.0.4"
dependencies:
delaunator: "npm:5"
checksum: 10c0/57c3aecd2525664b07c4c292aa11cf49b2752c0cf3f5257f752999399fe3c592de2d418644d79df1f255471eec8057a9cc0c3062ed7128cb3348c45f69597754
languageName: node
linkType: hard
"d3-dispatch@npm:1 - 3":
version: 3.0.1
resolution: "d3-dispatch@npm:3.0.1"
checksum: 10c0/6eca77008ce2dc33380e45d4410c67d150941df7ab45b91d116dbe6d0a3092c0f6ac184dd4602c796dc9e790222bad3ff7142025f5fd22694efe088d1d941753
languageName: node
linkType: hard
"d3-dsv@npm:^3.0.1":
version: 3.0.1
resolution: "d3-dsv@npm:3.0.1"
dependencies:
commander: "npm:7"
iconv-lite: "npm:0.6"
rw: "npm:1"
bin:
csv2json: bin/dsv2json.js
csv2tsv: bin/dsv2dsv.js
dsv2dsv: bin/dsv2dsv.js
dsv2json: bin/dsv2json.js
json2csv: bin/json2dsv.js
json2dsv: bin/json2dsv.js
json2tsv: bin/json2dsv.js
tsv2csv: bin/dsv2dsv.js
tsv2json: bin/dsv2json.js
checksum: 10c0/10e6af9e331950ed258f34ab49ac1b7060128ef81dcf32afc790bd1f7e8c3cc2aac7f5f875250a83f21f39bb5925fbd0872bb209f8aca32b3b77d32bab8a65ab
languageName: node
linkType: hard
"d3-force@npm:^3.0.0":
version: 3.0.0
resolution: "d3-force@npm:3.0.0"
dependencies:
d3-dispatch: "npm:1 - 3"
d3-quadtree: "npm:1 - 3"
d3-timer: "npm:1 - 3"
checksum: 10c0/220a16a1a1ac62ba56df61028896e4b52be89c81040d20229c876efc8852191482c233f8a52bb5a4e0875c321b8e5cb6413ef3dfa4d8fe79eeb7d52c587f52cf
languageName: node
linkType: hard
"d3-format@npm:1 - 3":
version: 3.1.0
resolution: "d3-format@npm:3.1.0"
checksum: 10c0/049f5c0871ebce9859fc5e2f07f336b3c5bfff52a2540e0bac7e703fce567cd9346f4ad1079dd18d6f1e0eaa0599941c1810898926f10ac21a31fd0a34b4aa75
languageName: node
linkType: hard
"d3-geo-voronoi@npm:^2.1.0":
version: 2.1.0
resolution: "d3-geo-voronoi@npm:2.1.0"
dependencies:
d3-array: "npm:3"
d3-delaunay: "npm:6"
d3-geo: "npm:3"
d3-tricontour: "npm:1"
checksum: 10c0/e626c64ef01bc06dd52ce11224ab563acb118becd5ef9490d351c6541662948a0f7bd6dd89dd6da14f885ee55b1d1eaf56f1a16afcd269498743141f6b8be91c
languageName: node
linkType: hard
"d3-geo@npm:3, d3-geo@npm:^3.1.1":
version: 3.1.1
resolution: "d3-geo@npm:3.1.1"
dependencies:
d3-array: "npm:2.5.0 - 3"
checksum: 10c0/d32270dd2dc8ac3ea63e8805d63239c4c8ec6c0d339d73b5e5a30a87f8f54db22a78fb434369799465eae169503b25f9a107c642c8a16c32a3285bc0e6d8e8c1
languageName: node
linkType: hard
"d3-hierarchy@npm:^3.1.2":
version: 3.1.2
resolution: "d3-hierarchy@npm:3.1.2"
checksum: 10c0/6dcdb480539644aa7fc0d72dfc7b03f99dfbcdf02714044e8c708577e0d5981deb9d3e99bbbb2d26422b55bcc342ac89a0fa2ea6c9d7302e2fc0951dd96f89cf
languageName: node
linkType: hard
"d3-interpolate-path@npm:^2.3.0":
version: 2.3.0
resolution: "d3-interpolate-path@npm:2.3.0"
checksum: 10c0/5249d35ab903e6955d8a240029b60c84d347d20ab6e730ef99d4ae516996bebf641257b2718779f141a88bd0306840344e5d863d893f662aeeab5cc4d9a87360
languageName: node
linkType: hard
"d3-interpolate@npm:1 - 3, d3-interpolate@npm:1.2.0 - 3, d3-interpolate@npm:^3.0.1":
version: 3.0.1
resolution: "d3-interpolate@npm:3.0.1"
dependencies:
d3-color: "npm:1 - 3"
checksum: 10c0/19f4b4daa8d733906671afff7767c19488f51a43d251f8b7f484d5d3cfc36c663f0a66c38fe91eee30f40327443d799be17169f55a293a3ba949e84e57a33e6a
languageName: node
linkType: hard
"d3-path@npm:1":
version: 1.0.9
resolution: "d3-path@npm:1.0.9"
checksum: 10c0/e35e84df5abc18091f585725b8235e1fa97efc287571585427d3a3597301e6c506dea56b11dfb3c06ca5858b3eb7f02c1bf4f6a716aa9eade01c41b92d497eb5
languageName: node
linkType: hard
"d3-path@npm:^3.1.0":
version: 3.1.0
resolution: "d3-path@npm:3.1.0"
checksum: 10c0/dc1d58ec87fa8319bd240cf7689995111a124b141428354e9637aa83059eb12e681f77187e0ada5dedfce346f7e3d1f903467ceb41b379bfd01cd8e31721f5da
languageName: node
linkType: hard
"d3-quadtree@npm:1 - 3, d3-quadtree@npm:^3.0.1":
version: 3.0.1
resolution: "d3-quadtree@npm:3.0.1"
checksum: 10c0/18302d2548bfecaef788152397edec95a76400fd97d9d7f42a089ceb68d910f685c96579d74e3712d57477ed042b056881b47cd836a521de683c66f47ce89090
languageName: node
linkType: hard
"d3-random@npm:^3.0.1":
version: 3.0.1
resolution: "d3-random@npm:3.0.1"
checksum: 10c0/987a1a1bcbf26e6cf01fd89d5a265b463b2cea93560fc17d9b1c45e8ed6ff2db5924601bcceb808de24c94133f000039eb7fa1c469a7a844ccbf1170cbb25b41
languageName: node
linkType: hard
"d3-sankey@npm:^0.12.3":
version: 0.12.3
resolution: "d3-sankey@npm:0.12.3"
dependencies:
d3-array: "npm:1 - 2"
d3-shape: "npm:^1.2.0"
checksum: 10c0/261debb01a13269f6fc53b9ebaef174a015d5ad646242c23995bf514498829ab8b8f920a7873724a7494288b46bea3ce7ebc5a920b745bc8ae4caa5885cf5204
languageName: node
linkType: hard
"d3-scale-chromatic@npm:^3.1.0":
version: 3.1.0
resolution: "d3-scale-chromatic@npm:3.1.0"
dependencies:
d3-color: "npm:1 - 3"
d3-interpolate: "npm:1 - 3"
checksum: 10c0/9a3f4671ab0b971f4a411b42180d7cf92bfe8e8584e637ce7e698d705e18d6d38efbd20ec64f60cc0dfe966c20d40fc172565bc28aaa2990c0a006360eed91af
languageName: node
linkType: hard
"d3-scale@npm:4, d3-scale@npm:4.0.2, d3-scale@npm:^4.0.2":
version: 4.0.2
resolution: "d3-scale@npm:4.0.2"
dependencies:
d3-array: "npm:2.10.0 - 3"
d3-format: "npm:1 - 3"
d3-interpolate: "npm:1.2.0 - 3"
d3-time: "npm:2.1.1 - 3"
d3-time-format: "npm:2 - 4"
checksum: 10c0/65d9ad8c2641aec30ed5673a7410feb187a224d6ca8d1a520d68a7d6eac9d04caedbff4713d1e8545be33eb7fec5739983a7ab1d22d4e5ad35368c6729d362f1
languageName: node
linkType: hard
"d3-shape@npm:^1.2.0":
version: 1.3.7
resolution: "d3-shape@npm:1.3.7"
dependencies:
d3-path: "npm:1"
checksum: 10c0/548057ce59959815decb449f15632b08e2a1bdce208f9a37b5f98ec7629dda986c2356bc7582308405ce68aedae7d47b324df41507404df42afaf352907577ae
languageName: node
linkType: hard
"d3-shape@npm:^3.2.0":
version: 3.2.0
resolution: "d3-shape@npm:3.2.0"
dependencies:
d3-path: "npm:^3.1.0"
checksum: 10c0/f1c9d1f09926daaf6f6193ae3b4c4b5521e81da7d8902d24b38694517c7f527ce3c9a77a9d3a5722ad1e3ff355860b014557b450023d66a944eabf8cfde37132
languageName: node
linkType: hard
"d3-tile@npm:^1.0.0":
version: 1.0.0
resolution: "d3-tile@npm:1.0.0"
checksum: 10c0/9abe3654f3a23c5c105f0e89a358b5ae3b130f5eded1e496e80efeb554d889c55d92d2e638d7790326de834b9380b66652830c2803071edd8c19ea221a06fcea
languageName: node
linkType: hard
"d3-time-format@npm:2 - 4":
version: 4.1.0
resolution: "d3-time-format@npm:4.1.0"
dependencies:
d3-time: "npm:1 - 3"
checksum: 10c0/735e00fb25a7fd5d418fac350018713ae394eefddb0d745fab12bbff0517f9cdb5f807c7bbe87bb6eeb06249662f8ea84fec075f7d0cd68609735b2ceb29d206
languageName: node
linkType: hard
"d3-time@npm:1 - 3, d3-time@npm:2.1.1 - 3, d3-time@npm:^3.1.0":
version: 3.1.0
resolution: "d3-time@npm:3.1.0"
dependencies:
d3-array: "npm:2 - 3"
checksum: 10c0/a984f77e1aaeaa182679b46fbf57eceb6ebdb5f67d7578d6f68ef933f8eeb63737c0949991618a8d29472dbf43736c7d7f17c452b2770f8c1271191cba724ca1
languageName: node
linkType: hard
"d3-timer@npm:1 - 3":
version: 3.0.1
resolution: "d3-timer@npm:3.0.1"
checksum: 10c0/d4c63cb4bb5461d7038aac561b097cd1c5673969b27cbdd0e87fa48d9300a538b9e6f39b4a7f0e3592ef4f963d858c8a9f0e92754db73116770856f2fc04561a
languageName: node
linkType: hard
"d3-tricontour@npm:1":
version: 1.0.2
resolution: "d3-tricontour@npm:1.0.2"
dependencies:
d3-delaunay: "npm:6"
d3-scale: "npm:4"
checksum: 10c0/d417b5978bc370d5cb02d3f68178a5b4824a6a797018d46f56781d94b1d800901cc71c826829b97fc5ba30e725ae8d64e7597c0633e6da49642ee3f6f595db4d
languageName: node
linkType: hard
"data-uri-to-buffer@npm:^2.0.0":
version: 2.0.2
resolution: "data-uri-to-buffer@npm:2.0.2"
@@ -1950,6 +2338,13 @@ __metadata:
languageName: node
linkType: hard
"date-fns@npm:^4.1.0":
version: 4.1.0
resolution: "date-fns@npm:4.1.0"
checksum: 10c0/b79ff32830e6b7faa009590af6ae0fb8c3fd9ffad46d930548fbb5acf473773b4712ae887e156ba91a7b3dc30591ce0f517d69fd83bd9c38650fdc03b4e0bac8
languageName: node
linkType: hard
"debug@npm:4, debug@npm:^4.3.4":
version: 4.4.0
resolution: "debug@npm:4.4.0"
@@ -1995,6 +2390,15 @@ __metadata:
languageName: node
linkType: hard
"delaunator@npm:5":
version: 5.0.1
resolution: "delaunator@npm:5.0.1"
dependencies:
robust-predicates: "npm:^3.0.2"
checksum: 10c0/3d7ea4d964731c5849af33fec0a271bc6753487b331fd7d43ccb17d77834706e1c383e6ab8fda0032da955e7576d1083b9603cdaf9cbdfd6b3ebd1fb8bb675a5
languageName: node
linkType: hard
"dequal@npm:^2.0.0":
version: 2.0.3
resolution: "dequal@npm:2.0.3"
@@ -2759,7 +3163,7 @@ __metadata:
languageName: node
linkType: hard
"iconv-lite@npm:^0.6.2":
"iconv-lite@npm:0.6, iconv-lite@npm:^0.6.2":
version: 0.6.3
resolution: "iconv-lite@npm:0.6.3"
dependencies:
@@ -2775,6 +3179,13 @@ __metadata:
languageName: node
linkType: hard
"immer@npm:^10.1.1":
version: 10.1.3
resolution: "immer@npm:10.1.3"
checksum: 10c0/b3929022c1999935c9c5e9491fce20d883c15a04072628056f3b8c51a63ac0876d1c1f25cec146e325c30c906bc7f15a636c29ed53156f0a3049150f152df4c8
languageName: node
linkType: hard
"import-meta-resolve@npm:^4.1.0":
version: 4.1.0
resolution: "import-meta-resolve@npm:4.1.0"
@@ -2796,6 +3207,20 @@ __metadata:
languageName: node
linkType: hard
"internmap@npm:1 - 2":
version: 2.0.3
resolution: "internmap@npm:2.0.3"
checksum: 10c0/8cedd57f07bbc22501516fbfc70447f0c6812871d471096fad9ea603516eacc2137b633633daf432c029712df0baefd793686388ddf5737e3ea15074b877f7ed
languageName: node
linkType: hard
"internmap@npm:^1.0.0":
version: 1.0.1
resolution: "internmap@npm:1.0.1"
checksum: 10c0/60942be815ca19da643b6d4f23bd0bf4e8c97abbd080fb963fe67583b60bdfb3530448ad4486bae40810e92317bded9995cc31411218acc750d72cd4e8646eee
languageName: node
linkType: hard
"ip-address@npm:^9.0.5":
version: 9.0.5
resolution: "ip-address@npm:9.0.5"
@@ -2945,6 +3370,58 @@ __metadata:
languageName: node
linkType: hard
"layercake@npm:8.4.3":
version: 8.4.3
resolution: "layercake@npm:8.4.3"
dependencies:
d3-array: "npm:^3.2.4"
d3-color: "npm:^3.1.0"
d3-scale: "npm:^4.0.2"
d3-shape: "npm:^3.2.0"
peerDependencies:
svelte: 3 - 5 || >=5.0.0-next.120
typescript: ^5.0.2
checksum: 10c0/5955e0a7f8f319fd53e8882a59d971ee5e4decb7710038fafb1c0a17bbb095c6973c1af3d3344baf4bdf82e427cdf1dd5ab79e69ca47aae429829caee38f4b98
languageName: node
linkType: hard
"layerchart@npm:1.0.12":
version: 1.0.12
resolution: "layerchart@npm:1.0.12"
dependencies:
"@dagrejs/dagre": "npm:^1.1.4"
"@layerstack/svelte-actions": "npm:^1.0.1"
"@layerstack/svelte-stores": "npm:^1.0.2"
"@layerstack/tailwind": "npm:^1.0.1"
"@layerstack/utils": "npm:^1.0.1"
d3-array: "npm:^3.2.4"
d3-color: "npm:^3.1.0"
d3-delaunay: "npm:^6.0.4"
d3-dsv: "npm:^3.0.1"
d3-force: "npm:^3.0.0"
d3-geo: "npm:^3.1.1"
d3-geo-voronoi: "npm:^2.1.0"
d3-hierarchy: "npm:^3.1.2"
d3-interpolate: "npm:^3.0.1"
d3-interpolate-path: "npm:^2.3.0"
d3-path: "npm:^3.1.0"
d3-quadtree: "npm:^3.0.1"
d3-random: "npm:^3.0.1"
d3-sankey: "npm:^0.12.3"
d3-scale: "npm:^4.0.2"
d3-scale-chromatic: "npm:^3.1.0"
d3-shape: "npm:^3.2.0"
d3-tile: "npm:^1.0.0"
d3-time: "npm:^3.1.0"
date-fns: "npm:^4.1.0"
layercake: "npm:8.4.3"
lodash-es: "npm:^4.17.21"
peerDependencies:
svelte: ^3.56.0 || ^4.0.0 || ^5.0.0
checksum: 10c0/e1a5d4dd88b688d01e1e689f890259639098aa6e18786ff35a5ce857f144ba956a313db612bf35684353c951c00013e046912f305a2e97fdbc24491fe50c472b
languageName: node
linkType: hard
"lilconfig@npm:^3.0.0, lilconfig@npm:^3.1.3":
version: 3.1.3
resolution: "lilconfig@npm:3.1.3"
@@ -2966,6 +3443,13 @@ __metadata:
languageName: node
linkType: hard
"lodash-es@npm:^4.17.21":
version: 4.17.21
resolution: "lodash-es@npm:4.17.21"
checksum: 10c0/fb407355f7e6cd523a9383e76e6b455321f0f153a6c9625e21a8827d10c54c2a2341bd2ae8d034358b60e07325e1330c14c224ff582d04612a46a4f0479ff2f2
languageName: node
linkType: hard
"lodash.castarray@npm:^4.4.0":
version: 4.4.0
resolution: "lodash.castarray@npm:4.4.0"
@@ -3811,6 +4295,13 @@ __metadata:
languageName: node
linkType: hard
"robust-predicates@npm:^3.0.2":
version: 3.0.2
resolution: "robust-predicates@npm:3.0.2"
checksum: 10c0/4ecd53649f1c2d49529c85518f2fa69ffb2f7a4453f7fd19c042421c7b4d76c3efb48bc1c740c8f7049346d7cb58cf08ee0c9adaae595cc23564d360adb1fde4
languageName: node
linkType: hard
"rollup@npm:^4.43.0":
version: 4.50.2
resolution: "rollup@npm:4.50.2"
@@ -3909,6 +4400,13 @@ __metadata:
languageName: node
linkType: hard
"rw@npm:1":
version: 1.3.3
resolution: "rw@npm:1.3.3"
checksum: 10c0/b1e1ef37d1e79d9dc7050787866e30b6ddcb2625149276045c262c6b4d53075ddc35f387a856a8e76f0d0df59f4cd58fe24707e40797ebee66e542b840ed6a53
languageName: node
linkType: hard
"sade@npm:^1.7.4, sade@npm:^1.8.1":
version: 1.8.1
resolution: "sade@npm:1.8.1"
@@ -4359,6 +4857,13 @@ __metadata:
languageName: node
linkType: hard
"tailwind-merge@npm:^2.5.4":
version: 2.6.0
resolution: "tailwind-merge@npm:2.6.0"
checksum: 10c0/fc8a5535524de9f4dacf1c16ab298581c7bb757d68a95faaf28942b1c555a619bba9d4c6726fe83986e44973b315410c1a5226e5354c30ba82353bd6d2288fa5
languageName: node
linkType: hard
"tailwind-variants@npm:1.0.0":
version: 1.0.0
resolution: "tailwind-variants@npm:1.0.0"
@@ -4370,7 +4875,7 @@ __metadata:
languageName: node
linkType: hard
"tailwindcss@npm:3.4.17":
"tailwindcss@npm:3.4.17, tailwindcss@npm:^3.4.15":
version: 3.4.17
resolution: "tailwindcss@npm:3.4.17"
dependencies:
@@ -5070,11 +5575,16 @@ __metadata:
"@sveltejs/kit": "npm:2.20.7"
"@sveltejs/vite-plugin-svelte": "npm:6.2.0"
"@tailwindcss/typography": "npm:0.5.16"
"@types/d3-array": "npm:^3"
"@types/d3-scale": "npm:^4"
"@types/d3-shape": "npm:^3"
"@types/prismjs": "npm:1.26.5"
autoprefixer: "npm:10.4.20"
bits-ui: "npm:1.3.3"
d3-scale: "npm:4.0.2"
deepmerge: "npm:4.3.1"
katex: "npm:0.16.21"
layerchart: "npm:1.0.12"
lucide-svelte: "npm:0.475.0"
mdsvex: "npm:0.12.5"
misskey-js: "npm:2024.11.1-alpha.0"
@@ -5096,6 +5606,7 @@ __metadata:
typescript: "npm:5.7.3"
vite: "npm:7.1.7"
wrangler: "npm:4.12.0"
zod: "npm:4.1.11"
languageName: unknown
linkType: soft
@@ -5285,6 +5796,20 @@ __metadata:
languageName: node
linkType: hard
"zod@npm:4.1.11":
version: 4.1.11
resolution: "zod@npm:4.1.11"
checksum: 10c0/ce6a4c4acfbf51d7dd0f2669c82f207d62a1f00264eef608994b94eb99d86a74c99f59b0dd3e61ef82909ee136631378b709e0908f0a02a2d5c21d0c497de5db
languageName: node
linkType: hard
"zod@npm:^3.24.2":
version: 3.25.76
resolution: "zod@npm:3.25.76"
checksum: 10c0/5718ec35e3c40b600316c5b4c5e4976f7fee68151bc8f8d90ec18a469be9571f072e1bbaace10f1e85cf8892ea12d90821b200e980ab46916a6166a4260a983c
languageName: node
linkType: hard
"zwitch@npm:^2.0.0":
version: 2.0.4
resolution: "zwitch@npm:2.0.4"