diff --git a/package.json b/package.json
index 56548dc..74c730a 100644
--- a/package.json
+++ b/package.json
@@ -14,11 +14,12 @@
},
"devDependencies": {
"@codemirror/lang-python": "^6.2.1",
- "@codemirror/view": "^6.43.1",
+ "@codemirror/theme-one-dark": "^6.1.3",
"@eslint/js": "^10.0.1",
"@sveltejs/adapter-static": "^3.0.10",
"@sveltejs/kit": "^2.49.1",
"@sveltejs/vite-plugin-svelte": "^6.2.1",
+ "@tailwindcss/vite": "^4.3.3",
"@types/node": "^24",
"codemirror": "^6.0.2",
"eslint": "^10.4.1",
@@ -30,6 +31,7 @@
"pyodide": "^314.0.0",
"svelte": "^5.56.3",
"svelte-check": "^4.3.4",
+ "tailwindcss": "^4.3.3",
"typescript": "^5.9.3",
"typescript-eslint": "^8.60.1",
"vite": "^7.2.6",
diff --git a/src/app.css b/src/app.css
new file mode 100644
index 0000000..f1d8c73
--- /dev/null
+++ b/src/app.css
@@ -0,0 +1 @@
+@import "tailwindcss";
diff --git a/src/lib/playground/Editor.svelte b/src/lib/playground/Editor.svelte
new file mode 100644
index 0000000..9bbb5c6
--- /dev/null
+++ b/src/lib/playground/Editor.svelte
@@ -0,0 +1,64 @@
+
+
+
+ {#if loading}
+ Loading...
+ {/if}
+
diff --git a/src/lib/playground/StatusBar.svelte b/src/lib/playground/StatusBar.svelte
new file mode 100644
index 0000000..624f01c
--- /dev/null
+++ b/src/lib/playground/StatusBar.svelte
@@ -0,0 +1,35 @@
+
+
+
+
+
+ {#if status.has_unsaved_changes}
+ Unsaved changes
+ {:else}
+ Up to date
+ {/if}
+
+
+
+
+
+
+
+
diff --git a/src/lib/playground/Terminal.svelte b/src/lib/playground/Terminal.svelte
new file mode 100644
index 0000000..194b825
--- /dev/null
+++ b/src/lib/playground/Terminal.svelte
@@ -0,0 +1,20 @@
+
+
+
diff --git a/src/lib/playground/TerminalDragger.svelte b/src/lib/playground/TerminalDragger.svelte
new file mode 100644
index 0000000..5ba0931
--- /dev/null
+++ b/src/lib/playground/TerminalDragger.svelte
@@ -0,0 +1,73 @@
+
+
+
+
+
diff --git a/src/lib/playground/Toolbar.svelte b/src/lib/playground/Toolbar.svelte
new file mode 100644
index 0000000..4b5a9b7
--- /dev/null
+++ b/src/lib/playground/Toolbar.svelte
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+ PurePy
+
+
+
Check
+
+ Run
+ ⌘S
+
+
diff --git a/src/lib/playground/components/Kbd.svelte b/src/lib/playground/components/Kbd.svelte
new file mode 100644
index 0000000..69915ca
--- /dev/null
+++ b/src/lib/playground/components/Kbd.svelte
@@ -0,0 +1,9 @@
+
+
+
+ {@render children()}
+
diff --git a/src/lib/playground/components/StatusItem.svelte b/src/lib/playground/components/StatusItem.svelte
new file mode 100644
index 0000000..448d677
--- /dev/null
+++ b/src/lib/playground/components/StatusItem.svelte
@@ -0,0 +1,46 @@
+
+
+
+
+ {#if success === true}
+
+ {:else if success === false}
+
+ {/if}
+
+
+ {#if success !== null}
+
+ {type}
+ {time}ms
+
+ {/if}
+
diff --git a/src/lib/playground/components/ToolbarButton.svelte b/src/lib/playground/components/ToolbarButton.svelte
new file mode 100644
index 0000000..567b332
--- /dev/null
+++ b/src/lib/playground/components/ToolbarButton.svelte
@@ -0,0 +1,16 @@
+
+
+
diff --git a/src/lib/playground/components/ToolbarItem.svelte b/src/lib/playground/components/ToolbarItem.svelte
new file mode 100644
index 0000000..285c656
--- /dev/null
+++ b/src/lib/playground/components/ToolbarItem.svelte
@@ -0,0 +1,9 @@
+
+
+
+ {@render children()}
+
diff --git a/src/lib/playground/components/ToolbarLink.svelte b/src/lib/playground/components/ToolbarLink.svelte
new file mode 100644
index 0000000..2e8da00
--- /dev/null
+++ b/src/lib/playground/components/ToolbarLink.svelte
@@ -0,0 +1,27 @@
+
+
+
+
+ {@render children()}
+
+ {#if external}
+
+ {/if}
+
+
diff --git a/src/routes/playground/purepy.ts b/src/lib/playground/lib/purepy.ts
similarity index 75%
rename from src/routes/playground/purepy.ts
rename to src/lib/playground/lib/purepy.ts
index 0359fd2..7cd2514 100644
--- a/src/routes/playground/purepy.ts
+++ b/src/lib/playground/lib/purepy.ts
@@ -8,7 +8,7 @@ import reasons_py from "$lib/assets/reasons.py?raw";
import { type PyodideAPI } from "pyodide";
import type { Stdout } from "./stdout.svelte";
-const ParseError = z.object({
+const PurePyError = z.object({
msg: z.string(),
line: z.optional(z.number()),
col: z.optional(z.number()),
@@ -22,7 +22,7 @@ const capture_err = (fn: () => unknown) => {
return { success: true } as const;
}
- const error = ParseError.parse(result);
+ const error = PurePyError.parse(result);
return { success: false, error } as const;
};
@@ -55,15 +55,32 @@ export class PurePy {
};
run = (src: string) => {
- const result: unknown = this.pyodide.runPython(src);
- return result;
+ try {
+ const result: unknown = this.pyodide.runPython(src);
+ return result;
+ } catch (error) {
+ // something went wrong in Python/Pyodide
+ console.error(error);
+ return {
+ msg: "Unhandled exception (see console)",
+ };
+ }
};
parse = (path: string) =>
capture_err(() =>
this.run(`
import parse
- parse.check_file("${path}")
+ def fn():
+ try:
+ parse.check_file("${path}")
+ except SyntaxError as err:
+ return {
+ "msg": "Syntax error",
+ "line": err.lineno,
+ "col": err.offset
+ }
+ fn()
`),
);
@@ -76,7 +93,7 @@ export class PurePy {
`),
);
- evaluate = (src: string) => {
+ parse_and_check = (src: string) => {
const path = this.write_file("whatever.purepy", src);
const parse_result = this.parse(path);
@@ -89,6 +106,10 @@ export class PurePy {
return check_result;
}
+ return { success: true, error: null } as const;
+ };
+
+ evaluate = (src: string) => {
const result = this.run(src);
return { success: true, output: result } as const;
};
diff --git a/src/lib/playground/lib/state.ts b/src/lib/playground/lib/state.ts
new file mode 100644
index 0000000..55bf43d
--- /dev/null
+++ b/src/lib/playground/lib/state.ts
@@ -0,0 +1,12 @@
+// TODO: something more sensible
+export type Status = {
+ has_unsaved_changes: boolean;
+ check_success: boolean | null;
+ eval_success: boolean | null;
+ is_running_check: boolean;
+ is_running_evaluate: boolean;
+ is_pyodide_ready: boolean;
+ is_codemirror_ready: boolean;
+ check_time: number;
+ eval_time: number;
+};
diff --git a/src/routes/playground/stdout.svelte.ts b/src/lib/playground/lib/stdout.svelte.ts
similarity index 100%
rename from src/routes/playground/stdout.svelte.ts
rename to src/lib/playground/lib/stdout.svelte.ts
diff --git a/src/routes/(home)/+layout.svelte b/src/routes/(home)/+layout.svelte
new file mode 100644
index 0000000..000451c
--- /dev/null
+++ b/src/routes/(home)/+layout.svelte
@@ -0,0 +1,34 @@
+
+
+
+
+
+ {@render children()}
+
+
+
diff --git a/src/routes/+page.svelte b/src/routes/(home)/+page.svelte
similarity index 100%
rename from src/routes/+page.svelte
rename to src/routes/(home)/+page.svelte
diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte
index 000451c..3fa208a 100644
--- a/src/routes/+layout.svelte
+++ b/src/routes/+layout.svelte
@@ -1,34 +1,6 @@
-
-
-
- {@render children()}
-
-
-
+{@render children()}
diff --git a/src/routes/playground/+page.svelte b/src/routes/playground/+page.svelte
index 0bd4508..43cae4f 100644
--- a/src/routes/playground/+page.svelte
+++ b/src/routes/playground/+page.svelte
@@ -1,45 +1,141 @@
-
-
- {#if loading}
- Loading...
- {/if}
-
diff --git a/vite.config.ts b/vite.config.ts
index 4d2bed6..c309c9d 100644
--- a/vite.config.ts
+++ b/vite.config.ts
@@ -1,4 +1,5 @@
import { sveltekit } from "@sveltejs/kit/vite";
+import tailwindcss from "@tailwindcss/vite";
import { dirname, join } from "path";
import { fileURLToPath } from "url";
import { defineConfig } from "vite";
@@ -28,5 +29,5 @@ export function viteStaticCopyPyodide() {
export default defineConfig({
optimizeDeps: { exclude: ["pyodide"] },
- plugins: [sveltekit(), viteStaticCopyPyodide()],
+ plugins: [tailwindcss(), sveltekit(), viteStaticCopyPyodide()],
});
diff --git a/yarn.lock b/yarn.lock
index c982be4..9974e3b 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -43,8 +43,8 @@ __metadata:
linkType: hard
"@codemirror/language@npm:^6.0.0, @codemirror/language@npm:^6.8.0":
- version: 6.12.3
- resolution: "@codemirror/language@npm:6.12.3"
+ version: 6.12.4
+ resolution: "@codemirror/language@npm:6.12.4"
dependencies:
"@codemirror/state": "npm:^6.0.0"
"@codemirror/view": "npm:^6.23.0"
@@ -52,7 +52,7 @@ __metadata:
"@lezer/highlight": "npm:^1.0.0"
"@lezer/lr": "npm:^1.0.0"
style-mod: "npm:^4.0.0"
- checksum: 10c0/682d476f35f187a8d2f59f9b2e561045353c87736e5774b5b8dd22ade7deb3c85b9d3cdde988b00aafb345732144c134adf45dadab067430aaee159abcc456a4
+ checksum: 10c0/1b704a66f618d96eddf5937a41996e1ab42a70b5333a90b768e5539c25b7ab822e91a93e66b14d47a886cd73b3e3e22ddf77b8f11fb2f496ebd7ba010f3c4deb
languageName: node
linkType: hard
@@ -78,24 +78,64 @@ __metadata:
languageName: node
linkType: hard
-"@codemirror/state@npm:^6.0.0, @codemirror/state@npm:^6.6.0":
- version: 6.6.0
- resolution: "@codemirror/state@npm:6.6.0"
+"@codemirror/state@npm:^6.0.0, @codemirror/state@npm:^6.6.0, @codemirror/state@npm:^6.7.0":
+ version: 6.7.1
+ resolution: "@codemirror/state@npm:6.7.1"
dependencies:
"@marijn/find-cluster-break": "npm:^1.0.0"
- checksum: 10c0/4e5d6ddd28fc642e8d749fe80a7dd278afd547e4d93c562eaab6f23bdf25bb12a94226db3efab6321d458c531eb6d357184809f3704aee419fe3230d53f16e24
+ checksum: 10c0/2490b87759d1f4f27f4573a084414bf30bf9ed5dccaa75485334a2d132c039f2255e3bca564fb07c6760a16bf86cc29532475d9fb75cfdb0771b330fe71be4e7
languageName: node
linkType: hard
-"@codemirror/view@npm:^6.0.0, @codemirror/view@npm:^6.17.0, @codemirror/view@npm:^6.23.0, @codemirror/view@npm:^6.27.0, @codemirror/view@npm:^6.37.0, @codemirror/view@npm:^6.42.0, @codemirror/view@npm:^6.43.1":
- version: 6.43.1
- resolution: "@codemirror/view@npm:6.43.1"
+"@codemirror/theme-one-dark@npm:^6.1.3":
+ version: 6.1.3
+ resolution: "@codemirror/theme-one-dark@npm:6.1.3"
dependencies:
- "@codemirror/state": "npm:^6.6.0"
+ "@codemirror/language": "npm:^6.0.0"
+ "@codemirror/state": "npm:^6.0.0"
+ "@codemirror/view": "npm:^6.0.0"
+ "@lezer/highlight": "npm:^1.0.0"
+ checksum: 10c0/de8483c69911bcd61a19679384de663ced9c8bed3c776f08581a8b724e9f456a17053b1cf6e9d1f2a475fa6bc42e905ec8ba1ee0a8b55213d18087d9d9150317
+ languageName: node
+ linkType: hard
+
+"@codemirror/view@npm:^6.0.0, @codemirror/view@npm:^6.17.0, @codemirror/view@npm:^6.23.0, @codemirror/view@npm:^6.27.0, @codemirror/view@npm:^6.37.0, @codemirror/view@npm:^6.42.0":
+ version: 6.43.8
+ resolution: "@codemirror/view@npm:6.43.8"
+ dependencies:
+ "@codemirror/state": "npm:^6.7.0"
crelt: "npm:^1.0.6"
style-mod: "npm:^4.1.0"
w3c-keyname: "npm:^2.2.4"
- checksum: 10c0/1ef96bfc756703f6675957793a3ea0f9aef8b2014172c15fc4063b58cefd6974688148eb25c1f2277d6b59d7ca9cb7f66d05e7b6e8c15d68bf050795c902fc18
+ checksum: 10c0/6cbd2254ee31024fa204519602fe916776d8a4952100cc2bcc7a683e69641ef7eaab0a3af754b2204efe9cd4c7f7f4f6e3feeccd703ad483e7aa0138371021da
+ languageName: node
+ linkType: hard
+
+"@emnapi/core@npm:^1.11.1":
+ version: 1.11.3
+ resolution: "@emnapi/core@npm:1.11.3"
+ dependencies:
+ "@emnapi/wasi-threads": "npm:1.2.3"
+ tslib: "npm:^2.4.0"
+ checksum: 10c0/4ca08d349a82d5d2887ccc9e12df630877b0412ddcd59b9faee61e3c3947ccead27a18257a18bfe17abdf2b0709857808ad75d423ac49edd50c32fb140a7ed6e
+ languageName: node
+ linkType: hard
+
+"@emnapi/runtime@npm:^1.11.1":
+ version: 1.11.3
+ resolution: "@emnapi/runtime@npm:1.11.3"
+ dependencies:
+ tslib: "npm:^2.4.0"
+ checksum: 10c0/a00f1020fefb9d4145c367f93a9fddb383a00da8ffd7871e20b19659890379b83aeecb9f84d7d0eda5456343f4a09eb05b0acb5153b0d3d889539dedb1ed87c3
+ languageName: node
+ linkType: hard
+
+"@emnapi/wasi-threads@npm:1.2.3, @emnapi/wasi-threads@npm:^1.2.2":
+ version: 1.2.3
+ resolution: "@emnapi/wasi-threads@npm:1.2.3"
+ dependencies:
+ tslib: "npm:^2.4.0"
+ checksum: 10c0/5aed84bc5dbe867973b20406ca1ed95661a4892ecaef80378fdf2d37424b3f7b9c428df8a3e1d82b783a3345a530032bf049e699e1f113ea52203c3e9b4e6ce5
languageName: node
linkType: hard
@@ -417,7 +457,7 @@ __metadata:
languageName: node
linkType: hard
-"@jridgewell/remapping@npm:^2.3.4":
+"@jridgewell/remapping@npm:^2.3.4, @jridgewell/remapping@npm:^2.3.5":
version: 2.3.5
resolution: "@jridgewell/remapping@npm:2.3.5"
dependencies:
@@ -494,6 +534,18 @@ __metadata:
languageName: node
linkType: hard
+"@napi-rs/wasm-runtime@npm:^1.1.4":
+ version: 1.2.2
+ resolution: "@napi-rs/wasm-runtime@npm:1.2.2"
+ dependencies:
+ "@tybys/wasm-util": "npm:^0.10.3"
+ peerDependencies:
+ "@emnapi/core": ^1.7.1 || ^2.0.0-alpha.3
+ "@emnapi/runtime": ^1.7.1 || ^2.0.0-alpha.3
+ checksum: 10c0/670ff8359761660f58d95a29fe22ac959d2c295675144fe9bc35118b0e723d1e0ac192df9896ba428eb13930cf0893b632606b70ccaea259fd6eca1836c2eb09
+ languageName: node
+ linkType: hard
+
"@polka/url@npm:^1.0.0-next.24":
version: 1.0.0-next.29
resolution: "@polka/url@npm:1.0.0-next.29"
@@ -770,6 +822,179 @@ __metadata:
languageName: node
linkType: hard
+"@tailwindcss/node@npm:4.3.3":
+ version: 4.3.3
+ resolution: "@tailwindcss/node@npm:4.3.3"
+ dependencies:
+ "@jridgewell/remapping": "npm:^2.3.5"
+ enhanced-resolve: "npm:^5.24.1"
+ jiti: "npm:^2.7.0"
+ lightningcss: "npm:1.32.0"
+ magic-string: "npm:^0.30.21"
+ source-map-js: "npm:^1.2.1"
+ tailwindcss: "npm:4.3.3"
+ checksum: 10c0/0123669be5b3e78d42b0e10cb34d547fb8574c8e7dc7a97a141c8a4ab4215852b5b1b99b97763e898e1da1493ee8424cb72e28225cc4876828c95156f94d7f0e
+ languageName: node
+ linkType: hard
+
+"@tailwindcss/oxide-android-arm64@npm:4.3.3":
+ version: 4.3.3
+ resolution: "@tailwindcss/oxide-android-arm64@npm:4.3.3"
+ conditions: os=android & cpu=arm64
+ languageName: node
+ linkType: hard
+
+"@tailwindcss/oxide-darwin-arm64@npm:4.3.3":
+ version: 4.3.3
+ resolution: "@tailwindcss/oxide-darwin-arm64@npm:4.3.3"
+ conditions: os=darwin & cpu=arm64
+ languageName: node
+ linkType: hard
+
+"@tailwindcss/oxide-darwin-x64@npm:4.3.3":
+ version: 4.3.3
+ resolution: "@tailwindcss/oxide-darwin-x64@npm:4.3.3"
+ conditions: os=darwin & cpu=x64
+ languageName: node
+ linkType: hard
+
+"@tailwindcss/oxide-freebsd-x64@npm:4.3.3":
+ version: 4.3.3
+ resolution: "@tailwindcss/oxide-freebsd-x64@npm:4.3.3"
+ conditions: os=freebsd & cpu=x64
+ languageName: node
+ linkType: hard
+
+"@tailwindcss/oxide-linux-arm-gnueabihf@npm:4.3.3":
+ version: 4.3.3
+ resolution: "@tailwindcss/oxide-linux-arm-gnueabihf@npm:4.3.3"
+ conditions: os=linux & cpu=arm
+ languageName: node
+ linkType: hard
+
+"@tailwindcss/oxide-linux-arm64-gnu@npm:4.3.3":
+ version: 4.3.3
+ resolution: "@tailwindcss/oxide-linux-arm64-gnu@npm:4.3.3"
+ conditions: os=linux & cpu=arm64 & libc=glibc
+ languageName: node
+ linkType: hard
+
+"@tailwindcss/oxide-linux-arm64-musl@npm:4.3.3":
+ version: 4.3.3
+ resolution: "@tailwindcss/oxide-linux-arm64-musl@npm:4.3.3"
+ conditions: os=linux & cpu=arm64 & libc=musl
+ languageName: node
+ linkType: hard
+
+"@tailwindcss/oxide-linux-x64-gnu@npm:4.3.3":
+ version: 4.3.3
+ resolution: "@tailwindcss/oxide-linux-x64-gnu@npm:4.3.3"
+ conditions: os=linux & cpu=x64 & libc=glibc
+ languageName: node
+ linkType: hard
+
+"@tailwindcss/oxide-linux-x64-musl@npm:4.3.3":
+ version: 4.3.3
+ resolution: "@tailwindcss/oxide-linux-x64-musl@npm:4.3.3"
+ conditions: os=linux & cpu=x64 & libc=musl
+ languageName: node
+ linkType: hard
+
+"@tailwindcss/oxide-wasm32-wasi@npm:4.3.3":
+ version: 4.3.3
+ resolution: "@tailwindcss/oxide-wasm32-wasi@npm:4.3.3"
+ dependencies:
+ "@emnapi/core": "npm:^1.11.1"
+ "@emnapi/runtime": "npm:^1.11.1"
+ "@emnapi/wasi-threads": "npm:^1.2.2"
+ "@napi-rs/wasm-runtime": "npm:^1.1.4"
+ "@tybys/wasm-util": "npm:^0.10.2"
+ tslib: "npm:^2.8.1"
+ conditions: cpu=wasm32
+ languageName: node
+ linkType: hard
+
+"@tailwindcss/oxide-win32-arm64-msvc@npm:4.3.3":
+ version: 4.3.3
+ resolution: "@tailwindcss/oxide-win32-arm64-msvc@npm:4.3.3"
+ conditions: os=win32 & cpu=arm64
+ languageName: node
+ linkType: hard
+
+"@tailwindcss/oxide-win32-x64-msvc@npm:4.3.3":
+ version: 4.3.3
+ resolution: "@tailwindcss/oxide-win32-x64-msvc@npm:4.3.3"
+ conditions: os=win32 & cpu=x64
+ languageName: node
+ linkType: hard
+
+"@tailwindcss/oxide@npm:4.3.3":
+ version: 4.3.3
+ resolution: "@tailwindcss/oxide@npm:4.3.3"
+ dependencies:
+ "@tailwindcss/oxide-android-arm64": "npm:4.3.3"
+ "@tailwindcss/oxide-darwin-arm64": "npm:4.3.3"
+ "@tailwindcss/oxide-darwin-x64": "npm:4.3.3"
+ "@tailwindcss/oxide-freebsd-x64": "npm:4.3.3"
+ "@tailwindcss/oxide-linux-arm-gnueabihf": "npm:4.3.3"
+ "@tailwindcss/oxide-linux-arm64-gnu": "npm:4.3.3"
+ "@tailwindcss/oxide-linux-arm64-musl": "npm:4.3.3"
+ "@tailwindcss/oxide-linux-x64-gnu": "npm:4.3.3"
+ "@tailwindcss/oxide-linux-x64-musl": "npm:4.3.3"
+ "@tailwindcss/oxide-wasm32-wasi": "npm:4.3.3"
+ "@tailwindcss/oxide-win32-arm64-msvc": "npm:4.3.3"
+ "@tailwindcss/oxide-win32-x64-msvc": "npm:4.3.3"
+ dependenciesMeta:
+ "@tailwindcss/oxide-android-arm64":
+ optional: true
+ "@tailwindcss/oxide-darwin-arm64":
+ optional: true
+ "@tailwindcss/oxide-darwin-x64":
+ optional: true
+ "@tailwindcss/oxide-freebsd-x64":
+ optional: true
+ "@tailwindcss/oxide-linux-arm-gnueabihf":
+ optional: true
+ "@tailwindcss/oxide-linux-arm64-gnu":
+ optional: true
+ "@tailwindcss/oxide-linux-arm64-musl":
+ optional: true
+ "@tailwindcss/oxide-linux-x64-gnu":
+ optional: true
+ "@tailwindcss/oxide-linux-x64-musl":
+ optional: true
+ "@tailwindcss/oxide-wasm32-wasi":
+ optional: true
+ "@tailwindcss/oxide-win32-arm64-msvc":
+ optional: true
+ "@tailwindcss/oxide-win32-x64-msvc":
+ optional: true
+ checksum: 10c0/6c38b25226dad252347451ed8953a998432b51f1e068b25e021215b886ccf8bcf3af58faf5f4ab50368091e657ca2fa341df1deca6101651eddb567122f2acb5
+ languageName: node
+ linkType: hard
+
+"@tailwindcss/vite@npm:^4.3.3":
+ version: 4.3.3
+ resolution: "@tailwindcss/vite@npm:4.3.3"
+ dependencies:
+ "@tailwindcss/node": "npm:4.3.3"
+ "@tailwindcss/oxide": "npm:4.3.3"
+ tailwindcss: "npm:4.3.3"
+ peerDependencies:
+ vite: ^5.2.0 || ^6 || ^7 || ^8
+ checksum: 10c0/bb1fe12f7a0bb8f6d6142f6bb2e96060ee853902314ef838e8d7f50cf30cc4b07adb7c2c86be2164e0d62eb581b8cc4df2d9aa13b4449f597a67f73c5772d549
+ languageName: node
+ linkType: hard
+
+"@tybys/wasm-util@npm:^0.10.2, @tybys/wasm-util@npm:^0.10.3":
+ version: 0.10.3
+ resolution: "@tybys/wasm-util@npm:0.10.3"
+ dependencies:
+ tslib: "npm:^2.4.0"
+ checksum: 10c0/fd2bd2a79c6cd8c79ed1cf7a0fa375c64589264c88a27acaf9756d556b453ea222b62a4f68dd2fbb8b3a78b6bab3b1f4fb2431b6afc6aeda8344b53a521a1cd3
+ languageName: node
+ linkType: hard
+
"@types/cookie@npm:^0.6.0":
version: 0.6.0
resolution: "@types/cookie@npm:0.6.0"
@@ -1166,6 +1391,13 @@ __metadata:
languageName: node
linkType: hard
+"detect-libc@npm:^2.0.3":
+ version: 2.1.2
+ resolution: "detect-libc@npm:2.1.2"
+ checksum: 10c0/acc675c29a5649fa1fb6e255f993b8ee829e510b6b56b0910666949c80c364738833417d0edb5f90e4e46be17228b0f2b66a010513984e18b15deeeac49369c4
+ languageName: node
+ linkType: hard
+
"devalue@npm:^5.8.1":
version: 5.8.1
resolution: "devalue@npm:5.8.1"
@@ -1173,6 +1405,16 @@ __metadata:
languageName: node
linkType: hard
+"enhanced-resolve@npm:^5.24.1":
+ version: 5.24.5
+ resolution: "enhanced-resolve@npm:5.24.5"
+ dependencies:
+ graceful-fs: "npm:^4.2.4"
+ tapable: "npm:^2.3.3"
+ checksum: 10c0/76c32ce5485ecea0ef808c9289bc6f7c49ce85142943598d89a23a846f2909556d3dc6db97a007442a48c185baad5514c1c76d20a2656497f9511d13ccfab73b
+ languageName: node
+ linkType: hard
+
"env-paths@npm:^2.2.0":
version: 2.2.1
resolution: "env-paths@npm:2.2.1"
@@ -1610,7 +1852,7 @@ __metadata:
languageName: node
linkType: hard
-"graceful-fs@npm:^4.2.6":
+"graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6":
version: 4.2.11
resolution: "graceful-fs@npm:4.2.11"
checksum: 10c0/386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2
@@ -1693,6 +1935,15 @@ __metadata:
languageName: node
linkType: hard
+"jiti@npm:^2.7.0":
+ version: 2.7.0
+ resolution: "jiti@npm:2.7.0"
+ bin:
+ jiti: lib/jiti-cli.mjs
+ checksum: 10c0/1b1e2310a490dce1aeea3da5f5dfe18273516c20ce48be2e98eb8ea452d5f3dcc8fd0cfd6d28b4052a24c5dbab6e3089b2d7e79f0bce7915b10d750929563c42
+ languageName: node
+ linkType: hard
+
"json-buffer@npm:3.0.1":
version: 3.0.1
resolution: "json-buffer@npm:3.0.1"
@@ -1747,6 +1998,126 @@ __metadata:
languageName: node
linkType: hard
+"lightningcss-android-arm64@npm:1.32.0":
+ version: 1.32.0
+ resolution: "lightningcss-android-arm64@npm:1.32.0"
+ conditions: os=android & cpu=arm64
+ languageName: node
+ linkType: hard
+
+"lightningcss-darwin-arm64@npm:1.32.0":
+ version: 1.32.0
+ resolution: "lightningcss-darwin-arm64@npm:1.32.0"
+ conditions: os=darwin & cpu=arm64
+ languageName: node
+ linkType: hard
+
+"lightningcss-darwin-x64@npm:1.32.0":
+ version: 1.32.0
+ resolution: "lightningcss-darwin-x64@npm:1.32.0"
+ conditions: os=darwin & cpu=x64
+ languageName: node
+ linkType: hard
+
+"lightningcss-freebsd-x64@npm:1.32.0":
+ version: 1.32.0
+ resolution: "lightningcss-freebsd-x64@npm:1.32.0"
+ conditions: os=freebsd & cpu=x64
+ languageName: node
+ linkType: hard
+
+"lightningcss-linux-arm-gnueabihf@npm:1.32.0":
+ version: 1.32.0
+ resolution: "lightningcss-linux-arm-gnueabihf@npm:1.32.0"
+ conditions: os=linux & cpu=arm
+ languageName: node
+ linkType: hard
+
+"lightningcss-linux-arm64-gnu@npm:1.32.0":
+ version: 1.32.0
+ resolution: "lightningcss-linux-arm64-gnu@npm:1.32.0"
+ conditions: os=linux & cpu=arm64 & libc=glibc
+ languageName: node
+ linkType: hard
+
+"lightningcss-linux-arm64-musl@npm:1.32.0":
+ version: 1.32.0
+ resolution: "lightningcss-linux-arm64-musl@npm:1.32.0"
+ conditions: os=linux & cpu=arm64 & libc=musl
+ languageName: node
+ linkType: hard
+
+"lightningcss-linux-x64-gnu@npm:1.32.0":
+ version: 1.32.0
+ resolution: "lightningcss-linux-x64-gnu@npm:1.32.0"
+ conditions: os=linux & cpu=x64 & libc=glibc
+ languageName: node
+ linkType: hard
+
+"lightningcss-linux-x64-musl@npm:1.32.0":
+ version: 1.32.0
+ resolution: "lightningcss-linux-x64-musl@npm:1.32.0"
+ conditions: os=linux & cpu=x64 & libc=musl
+ languageName: node
+ linkType: hard
+
+"lightningcss-win32-arm64-msvc@npm:1.32.0":
+ version: 1.32.0
+ resolution: "lightningcss-win32-arm64-msvc@npm:1.32.0"
+ conditions: os=win32 & cpu=arm64
+ languageName: node
+ linkType: hard
+
+"lightningcss-win32-x64-msvc@npm:1.32.0":
+ version: 1.32.0
+ resolution: "lightningcss-win32-x64-msvc@npm:1.32.0"
+ conditions: os=win32 & cpu=x64
+ languageName: node
+ linkType: hard
+
+"lightningcss@npm:1.32.0":
+ version: 1.32.0
+ resolution: "lightningcss@npm:1.32.0"
+ dependencies:
+ detect-libc: "npm:^2.0.3"
+ lightningcss-android-arm64: "npm:1.32.0"
+ lightningcss-darwin-arm64: "npm:1.32.0"
+ lightningcss-darwin-x64: "npm:1.32.0"
+ lightningcss-freebsd-x64: "npm:1.32.0"
+ lightningcss-linux-arm-gnueabihf: "npm:1.32.0"
+ lightningcss-linux-arm64-gnu: "npm:1.32.0"
+ lightningcss-linux-arm64-musl: "npm:1.32.0"
+ lightningcss-linux-x64-gnu: "npm:1.32.0"
+ lightningcss-linux-x64-musl: "npm:1.32.0"
+ lightningcss-win32-arm64-msvc: "npm:1.32.0"
+ lightningcss-win32-x64-msvc: "npm:1.32.0"
+ dependenciesMeta:
+ lightningcss-android-arm64:
+ optional: true
+ lightningcss-darwin-arm64:
+ optional: true
+ lightningcss-darwin-x64:
+ optional: true
+ lightningcss-freebsd-x64:
+ optional: true
+ lightningcss-linux-arm-gnueabihf:
+ optional: true
+ lightningcss-linux-arm64-gnu:
+ optional: true
+ lightningcss-linux-arm64-musl:
+ optional: true
+ lightningcss-linux-x64-gnu:
+ optional: true
+ lightningcss-linux-x64-musl:
+ optional: true
+ lightningcss-win32-arm64-msvc:
+ optional: true
+ lightningcss-win32-x64-msvc:
+ optional: true
+ checksum: 10c0/70945bd55097af46fc9fab7f5ed09cd5869d85940a2acab7ee06d0117004a1d68155708a2d462531cea2fc3c67aefc9333a7068c80b0b78dd404c16838809e03
+ languageName: node
+ linkType: hard
+
"lilconfig@npm:^2.0.5":
version: 2.1.0
resolution: "lilconfig@npm:2.1.0"
@@ -2062,11 +2433,12 @@ __metadata:
resolution: "purepy-website@workspace:."
dependencies:
"@codemirror/lang-python": "npm:^6.2.1"
- "@codemirror/view": "npm:^6.43.1"
+ "@codemirror/theme-one-dark": "npm:^6.1.3"
"@eslint/js": "npm:^10.0.1"
"@sveltejs/adapter-static": "npm:^3.0.10"
"@sveltejs/kit": "npm:^2.49.1"
"@sveltejs/vite-plugin-svelte": "npm:^6.2.1"
+ "@tailwindcss/vite": "npm:^4.3.3"
"@types/node": "npm:^24"
codemirror: "npm:^6.0.2"
eslint: "npm:^10.4.1"
@@ -2078,6 +2450,7 @@ __metadata:
pyodide: "npm:^314.0.0"
svelte: "npm:^5.56.3"
svelte-check: "npm:^4.3.4"
+ tailwindcss: "npm:^4.3.3"
typescript: "npm:^5.9.3"
typescript-eslint: "npm:^8.60.1"
vite: "npm:^7.2.6"
@@ -2331,6 +2704,20 @@ __metadata:
languageName: node
linkType: hard
+"tailwindcss@npm:4.3.3, tailwindcss@npm:^4.3.3":
+ version: 4.3.3
+ resolution: "tailwindcss@npm:4.3.3"
+ checksum: 10c0/7e9cd7553cd890ffa5350efb0ca8971ba5435257d0f98bf0714994ac8f1fee5c7cdf9a9da47fe83e8ac995d728410837ac49d3ef5ea66b5afe1db312086ffae2
+ languageName: node
+ linkType: hard
+
+"tapable@npm:^2.3.3":
+ version: 2.3.3
+ resolution: "tapable@npm:2.3.3"
+ checksum: 10c0/47992e861053f861154e92fb4a98ac4ab47b6463717e60792dd1e8c755da0c4964cd8bb68c308a9066d6da89000b6310457b4d5d985c30de4ccc29066068cc17
+ languageName: node
+ linkType: hard
+
"tar@npm:^7.5.4":
version: 7.5.16
resolution: "tar@npm:7.5.16"
@@ -2379,6 +2766,13 @@ __metadata:
languageName: node
linkType: hard
+"tslib@npm:^2.4.0, tslib@npm:^2.8.1":
+ version: 2.8.1
+ resolution: "tslib@npm:2.8.1"
+ checksum: 10c0/9c4759110a19c53f992d9aae23aac5ced636e99887b51b9e61def52611732872ff7668757d4e4c61f19691e36f4da981cd9485e869b4a7408d689f6bf1f14e62
+ languageName: node
+ linkType: hard
+
"type-check@npm:^0.4.0, type-check@npm:~0.4.0":
version: 0.4.0
resolution: "type-check@npm:0.4.0"