diff --git a/astro.config.mjs b/astro.config.mjs
new file mode 100644
index 0000000..2c3e25d
--- /dev/null
+++ b/astro.config.mjs
@@ -0,0 +1,5 @@
+import { defineConfig } from "astro/config";
+
+export default defineConfig({
+ trailingSlash: "always",
+});
diff --git a/deno.json b/deno.json
index 0647e37..95f71d1 100644
--- a/deno.json
+++ b/deno.json
@@ -1,11 +1,12 @@
{
"imports": {
- "@web-applets/sdk": "npm:@web-applets/sdk@0.2.0-alpha.8",
- "astro": "npm:astro@^5.4.1"
+ "@web-applets/sdk": "npm:@web-applets/sdk@0.2.0-alpha.12",
+ "astro": "npm:astro@^5.4.1",
+ "spellcaster": "npm:spellcaster@^5.0.2"
},
"tasks": {
"build": "astro build",
- "dev": "astro preview"
+ "dev": "astro dev"
},
"compilerOptions": {
"lib": ["dom", "dom.iterable", "dom.asynciterable", "deno.ns"]
diff --git a/deno.lock b/deno.lock
index 96dcf1b..7d48497 100644
--- a/deno.lock
+++ b/deno.lock
@@ -1,12 +1,13 @@
{
"version": "4",
"specifiers": {
- "npm:@web-applets/sdk@0.2.0-alpha.8": "0.2.0-alpha.8",
+ "npm:@web-applets/sdk@0.2.0-alpha.12": "0.2.0-alpha.12",
"npm:asto@*": "0.1.0",
"npm:asto@0.1.0": "0.1.0",
"npm:astro@5.4.2": "5.4.2_vite@6.2.1_zod@3.24.2",
"npm:astro@^5.4.1": "5.4.2_vite@6.2.1_zod@3.24.2",
- "npm:create-astro@latest": "4.11.1"
+ "npm:create-astro@latest": "4.11.1",
+ "npm:spellcaster@^5.0.2": "5.0.2"
},
"npm": {
"@astrojs/cli-kit@0.4.1": {
@@ -484,8 +485,8 @@
"@ungap/structured-clone@1.3.0": {
"integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g=="
},
- "@web-applets/sdk@0.2.0-alpha.8": {
- "integrity": "sha512-rEAAUlWy9IN8lNh7SGbnOPVGEOhtC7rfsCHK8Sc/sNhqTWY1Vwwiq6tsb+O2xHjibfWq3aJAQ7G8roR1Rcmzlg=="
+ "@web-applets/sdk@0.2.0-alpha.12": {
+ "integrity": "sha512-LCGHB/7q3h5EZReZAK9zrrODBDsFbJaNXhEhGFF8ga2JKXKnBCkeF3fYg7tTVsIOLY52dG7JkUo2911hEABfhw=="
},
"acorn@8.14.1": {
"integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg=="
@@ -1979,6 +1980,9 @@
"signal-exit@3.0.7": {
"integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="
},
+ "signal-polyfill@0.1.2": {
+ "integrity": "sha512-HT9d+L9NMiTzMxb/tU2Baym6129ROyRETSjvchvSkQa7wN0+SrG/IUlsaBLqKn2c+4mlze6CgQBEvgBjxOpiaQ=="
+ },
"simple-swizzle@0.2.2": {
"integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==",
"dependencies": [
@@ -2004,6 +2008,12 @@
"space-separated-tokens@2.0.2": {
"integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q=="
},
+ "spellcaster@5.0.2": {
+ "integrity": "sha512-suCHnQlCyXAV1OCrL0jEjE8lCK+f2bfmnvBfIqkG6Q3fNiQ7mAaeXtSyEKCI5p2ifSieC5bS/59EcIfDh5PWMA==",
+ "dependencies": [
+ "signal-polyfill"
+ ]
+ },
"sprintf-js@1.0.3": {
"integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="
},
@@ -2308,8 +2318,9 @@
},
"workspace": {
"dependencies": [
- "npm:@web-applets/sdk@0.2.0-alpha.8",
- "npm:astro@^5.4.1"
+ "npm:@web-applets/sdk@0.2.0-alpha.12",
+ "npm:astro@^5.4.1",
+ "npm:spellcaster@^5.0.2"
]
}
}
diff --git a/src/pages/engines/audio/index.astro b/src/pages/engines/audio/index.astro
index fee6178..96deb7e 100644
--- a/src/pages/engines/audio/index.astro
+++ b/src/pages/engines/audio/index.astro
@@ -12,17 +12,38 @@ import Applet from "../../../layouts/applet.astro";
diff --git a/src/pages/interface/audio/index.astro b/src/pages/interface/audio/index.astro
index 65d99a4..2b595e9 100644
--- a/src/pages/interface/audio/index.astro
+++ b/src/pages/interface/audio/index.astro
@@ -19,20 +19,37 @@ import Applet from "../../../layouts/applet.astro";
const context = applets.register();
+ ////////////////////////////////////////////
+ // Initial state
+ ////////////////////////////////////////////
+ context.data = {
+ isPlaying: false,
+ };
+
+ ////////////////////////////////////////////
+ // Actions
+ ////////////////////////////////////////////
context.setActionHandler("set_is_playing", (isPlaying: boolean) => {
- context.data = { ...context.data, isPlaying };
+ context.data.isPlaying = isPlaying;
+ render();
});
context.setActionHandler("set_progress", (progress: number) => {
document.body.querySelector("progress").value = Math.round(progress * 100);
+ render();
});
- context.ondata = () => {
- document.body.querySelector("button").innerText = context.data.isPlaying ? "⏸️" : "▶️";
- };
-
+ ////////////////////////////////////////////
+ // DOM
+ ////////////////////////////////////////////
document.body.querySelector("button").onclick = () => {
context.data = { isPlaying: !(context.data?.isPlaying ?? false) };
};
+
+ function render() {
+ document.body.querySelector("button").innerText = context.data.isPlaying ? "⏸️" : "▶️";
+ }
+
+ render();