[READ-ONLY] Mirror of https://github.com/probablykasper/cpc. Text calculator with support for units and conversion cpc.kasper.space
calculator cli conversion converter library math package units units-converter wasm website
0

Configure Feed

Select the types of activity you want to include in your feed.

web: Store history

Kasper (Jun 20, 2026, 3:22 AM +0200) f5c05500 f802ff52

+61 -5
+51 -1
web/package-lock.json
··· 10 10 "@sveltejs/vite-plugin-svelte": "^6.2.4", 11 11 "@tailwindcss/vite": "^4.3.1", 12 12 "cpc": "file:../pkg", 13 + "runed": "^0.37.1", 13 14 "svelte": "^5.56.3", 14 15 "svelte-check": "^4.6.0", 15 16 "tailwindcss": "^4.1.8", ··· 22 23 }, 23 24 "../pkg": { 24 25 "name": "cpc", 25 - "version": "3.0.0", 26 + "version": "3.1.0", 26 27 "dev": true, 27 28 "license": "MIT" 28 29 }, ··· 5062 5063 "node": ">= 0.6" 5063 5064 } 5064 5065 }, 5066 + "node_modules/dequal": { 5067 + "version": "2.0.3", 5068 + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", 5069 + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", 5070 + "dev": true, 5071 + "license": "MIT", 5072 + "engines": { 5073 + "node": ">=6" 5074 + } 5075 + }, 5065 5076 "node_modules/detect-libc": { 5066 5077 "version": "2.1.2", 5067 5078 "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", ··· 6335 6346 "node": ">=12" 6336 6347 } 6337 6348 }, 6349 + "node_modules/lz-string": { 6350 + "version": "1.5.0", 6351 + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", 6352 + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", 6353 + "dev": true, 6354 + "license": "MIT", 6355 + "bin": { 6356 + "lz-string": "bin/bin.js" 6357 + } 6358 + }, 6338 6359 "node_modules/magic-string": { 6339 6360 "version": "0.30.21", 6340 6361 "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", ··· 7178 7199 "license": "MIT", 7179 7200 "dependencies": { 7180 7201 "queue-microtask": "^1.2.2" 7202 + } 7203 + }, 7204 + "node_modules/runed": { 7205 + "version": "0.37.1", 7206 + "resolved": "https://registry.npmjs.org/runed/-/runed-0.37.1.tgz", 7207 + "integrity": "sha512-MeFY73xBW8IueWBm012nNFIGy19WUGPLtknavyUPMpnyt350M47PhGSGrGoSLbidwn+Zlt/O0cp8/OZE3LASWA==", 7208 + "dev": true, 7209 + "funding": [ 7210 + "https://github.com/sponsors/huntabyte", 7211 + "https://github.com/sponsors/tglide" 7212 + ], 7213 + "license": "MIT", 7214 + "dependencies": { 7215 + "dequal": "^2.0.3", 7216 + "esm-env": "^1.0.0", 7217 + "lz-string": "^1.5.0" 7218 + }, 7219 + "peerDependencies": { 7220 + "@sveltejs/kit": "^2.21.0", 7221 + "svelte": "^5.7.0", 7222 + "zod": "^4.1.0" 7223 + }, 7224 + "peerDependenciesMeta": { 7225 + "@sveltejs/kit": { 7226 + "optional": true 7227 + }, 7228 + "zod": { 7229 + "optional": true 7230 + } 7181 7231 } 7182 7232 }, 7183 7233 "node_modules/sade": {
+1
web/package.json
··· 16 16 "@sveltejs/vite-plugin-svelte": "^6.2.4", 17 17 "@tailwindcss/vite": "^4.3.1", 18 18 "cpc": "file:../pkg", 19 + "runed": "^0.37.1", 19 20 "svelte": "^5.56.3", 20 21 "svelte-check": "^4.6.0", 21 22 "tailwindcss": "^4.1.8",
+9 -4
web/src/routes/+page.svelte
··· 2 2 import { check_shortcut } from "$lib/helpers"; 3 3 import { flip } from "svelte/animate"; 4 4 import { fly } from "svelte/transition"; 5 + import { PersistedState } from "runed"; 6 + 5 7 // Has to be dynamically imported for prerendering to work 6 8 // https://github.com/sveltejs/svelte/issues/13155 7 9 const cpc_promise = import("cpc"); ··· 23 25 24 26 let input = $state(""); 25 27 let output = $derived(wasm_eval(input)); 26 - let saved_queries: { id: number; in: string; out: string }[] = $state([]); 28 + let calc_history = new PersistedState< 29 + { id: number; in: string; out: string }[] 30 + >("calc_history", []); 27 31 </script> 28 32 29 33 <svelte:head> ··· 71 75 if (check_shortcut(e, "Enter")) { 72 76 const out = wasm_eval(input); 73 77 console.log(out); 74 - saved_queries.unshift({ 75 - id: saved_queries.length, 78 + calc_history.current.push({ 79 + id: Date.now(), 76 80 in: input, 77 81 out, 78 82 }); ··· 87 91 <div class="px-3 py-2"> 88 92 {output}<span class="invisible select-none">x</span> 89 93 </div> 90 - {#each saved_queries as query (query.id)} 94 + {#each calc_history.current as _, i (calc_history.current.length - 1 - i)} 95 + {let query = calc_history.current[calc_history.current.length - 1 - i]} 91 96 <div 92 97 class="px-3 py-2" 93 98 in:fly={{ y: -10, duration: 150 }}