Experiment to rebuild Diffuse using web applets.
0
fork

Configure Feed

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

chore: fix build system

+707 -165
+6 -1
astro.config.js
··· 1 1 import { defineConfig } from "astro/config"; 2 2 import scope from "astro-scope"; 3 3 4 + import purgecss from "astro-purgecss"; 5 + 4 6 export default defineConfig({ 5 - integrations: [scope()], 7 + integrations: [scope(), purgecss()], 8 + build: { 9 + inlineStylesheets: "never", 10 + }, 6 11 });
-3
deno.json
··· 11 11 }, 12 12 "copy-types": "deno run --allow-read --allow-write tasks/copy-types.ts", 13 13 "dev": "astro dev" 14 - }, 15 - "compilerOptions": { 16 - "lib": ["dom", "dom.iterable", "dom.asynciterable", "deno.ns"] 17 14 } 18 15 }
+3 -1
deno.lock
··· 1 1 { 2 - "version": "4", 2 + "version": "5", 3 3 "specifiers": { 4 4 "jsr:@std/fs@1": "1.0.16", 5 5 "jsr:@std/path@^1.0.8": "1.0.8" ··· 22 22 "packageJson": { 23 23 "dependencies": [ 24 24 "npm:@picocss/pico@^2.1.1", 25 + "npm:astro-purgecss@^5.2.2", 25 26 "npm:astro-scope@^3.0.1", 26 27 "npm:astro@^5.7.4", 27 28 "npm:iconoir@^7.11.0", 28 29 "npm:idb-keyval@^6.2.1", 29 30 "npm:native-file-system-adapter@^3.0.1", 31 + "npm:purgecss@^7.0.2", 30 32 "npm:sass@^1.87.0", 31 33 "npm:throttle-debounce@^5.0.2", 32 34 "npm:xxh32@^2.0.5"
+490 -6
package-lock.json
··· 10 10 "iconoir": "^7.11.0", 11 11 "idb-keyval": "^6.2.1", 12 12 "native-file-system-adapter": "^3.0.1", 13 - "sass": "^1.87.0", 14 13 "spellcaster": "gordonbrander/spellcaster#1613e5e3b7f202cfe57f37ea7c637ec83588a297", 15 14 "throttle-debounce": "^5.0.2", 16 15 "xxh32": "^2.0.5" 17 16 }, 18 17 "devDependencies": { 19 18 "astro": "^5.7.4", 20 - "astro-scope": "^3.0.1" 19 + "astro-purgecss": "^5.2.2", 20 + "astro-scope": "^3.0.1", 21 + "purgecss": "^7.0.2", 22 + "sass": "^1.87.0" 21 23 } 22 24 }, 23 25 "../../unternet-co/web-applets/sdk": { ··· 930 932 "url": "https://opencollective.com/libvips" 931 933 } 932 934 }, 935 + "node_modules/@isaacs/cliui": { 936 + "version": "8.0.2", 937 + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", 938 + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", 939 + "dev": true, 940 + "dependencies": { 941 + "string-width": "^5.1.2", 942 + "string-width-cjs": "npm:string-width@^4.2.0", 943 + "strip-ansi": "^7.0.1", 944 + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", 945 + "wrap-ansi": "^8.1.0", 946 + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" 947 + }, 948 + "engines": { 949 + "node": ">=12" 950 + } 951 + }, 952 + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { 953 + "version": "9.2.2", 954 + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", 955 + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", 956 + "dev": true 957 + }, 958 + "node_modules/@isaacs/cliui/node_modules/string-width": { 959 + "version": "5.1.2", 960 + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", 961 + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", 962 + "dev": true, 963 + "dependencies": { 964 + "eastasianwidth": "^0.2.0", 965 + "emoji-regex": "^9.2.2", 966 + "strip-ansi": "^7.0.1" 967 + }, 968 + "engines": { 969 + "node": ">=12" 970 + }, 971 + "funding": { 972 + "url": "https://github.com/sponsors/sindresorhus" 973 + } 974 + }, 975 + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { 976 + "version": "8.1.0", 977 + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", 978 + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", 979 + "dev": true, 980 + "dependencies": { 981 + "ansi-styles": "^6.1.0", 982 + "string-width": "^5.0.1", 983 + "strip-ansi": "^7.0.1" 984 + }, 985 + "engines": { 986 + "node": ">=12" 987 + }, 988 + "funding": { 989 + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 990 + } 991 + }, 933 992 "node_modules/@jridgewell/sourcemap-codec": { 934 993 "version": "1.5.0", 935 994 "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", ··· 946 1005 "version": "2.5.1", 947 1006 "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", 948 1007 "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", 1008 + "dev": true, 949 1009 "hasInstallScript": true, 950 1010 "optional": true, 951 1011 "dependencies": { ··· 984 1044 "cpu": [ 985 1045 "arm64" 986 1046 ], 1047 + "dev": true, 987 1048 "optional": true, 988 1049 "os": [ 989 1050 "android" ··· 1003 1064 "cpu": [ 1004 1065 "arm64" 1005 1066 ], 1067 + "dev": true, 1006 1068 "optional": true, 1007 1069 "os": [ 1008 1070 "darwin" ··· 1022 1084 "cpu": [ 1023 1085 "x64" 1024 1086 ], 1087 + "dev": true, 1025 1088 "optional": true, 1026 1089 "os": [ 1027 1090 "darwin" ··· 1041 1104 "cpu": [ 1042 1105 "x64" 1043 1106 ], 1107 + "dev": true, 1044 1108 "optional": true, 1045 1109 "os": [ 1046 1110 "freebsd" ··· 1060 1124 "cpu": [ 1061 1125 "arm" 1062 1126 ], 1127 + "dev": true, 1063 1128 "optional": true, 1064 1129 "os": [ 1065 1130 "linux" ··· 1079 1144 "cpu": [ 1080 1145 "arm" 1081 1146 ], 1147 + "dev": true, 1082 1148 "optional": true, 1083 1149 "os": [ 1084 1150 "linux" ··· 1098 1164 "cpu": [ 1099 1165 "arm64" 1100 1166 ], 1167 + "dev": true, 1101 1168 "optional": true, 1102 1169 "os": [ 1103 1170 "linux" ··· 1117 1184 "cpu": [ 1118 1185 "arm64" 1119 1186 ], 1187 + "dev": true, 1120 1188 "optional": true, 1121 1189 "os": [ 1122 1190 "linux" ··· 1136 1204 "cpu": [ 1137 1205 "x64" 1138 1206 ], 1207 + "dev": true, 1139 1208 "optional": true, 1140 1209 "os": [ 1141 1210 "linux" ··· 1155 1224 "cpu": [ 1156 1225 "x64" 1157 1226 ], 1227 + "dev": true, 1158 1228 "optional": true, 1159 1229 "os": [ 1160 1230 "linux" ··· 1174 1244 "cpu": [ 1175 1245 "arm64" 1176 1246 ], 1247 + "dev": true, 1177 1248 "optional": true, 1178 1249 "os": [ 1179 1250 "win32" ··· 1193 1264 "cpu": [ 1194 1265 "ia32" 1195 1266 ], 1267 + "dev": true, 1196 1268 "optional": true, 1197 1269 "os": [ 1198 1270 "win32" ··· 1212 1284 "cpu": [ 1213 1285 "x64" 1214 1286 ], 1287 + "dev": true, 1215 1288 "optional": true, 1216 1289 "os": [ 1217 1290 "win32" ··· 1228 1301 "version": "1.0.3", 1229 1302 "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", 1230 1303 "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", 1304 + "dev": true, 1231 1305 "optional": true, 1232 1306 "bin": { 1233 1307 "detect-libc": "bin/detect-libc.js" ··· 1887 1961 "sharp": "^0.33.3" 1888 1962 } 1889 1963 }, 1964 + "node_modules/astro-purgecss": { 1965 + "version": "5.2.2", 1966 + "resolved": "https://registry.npmjs.org/astro-purgecss/-/astro-purgecss-5.2.2.tgz", 1967 + "integrity": "sha512-lL4JqBlIyRTj6CQPJrGRWJYX6OzyGBEGjLwxmgSHALn0xKsU0zf9X4Lnd+L+SM0wa+o7UbD9wXMhmK42sjXl8g==", 1968 + "dev": true, 1969 + "peerDependencies": { 1970 + "astro": "^5.0.0", 1971 + "purgecss": "^7.0.0" 1972 + } 1973 + }, 1890 1974 "node_modules/astro-scope": { 1891 1975 "version": "3.0.1", 1892 1976 "resolved": "https://registry.npmjs.org/astro-scope/-/astro-scope-3.0.1.tgz", ··· 1915 1999 "url": "https://github.com/sponsors/wooorm" 1916 2000 } 1917 2001 }, 2002 + "node_modules/balanced-match": { 2003 + "version": "1.0.2", 2004 + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 2005 + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 2006 + "dev": true 2007 + }, 1918 2008 "node_modules/base-64": { 1919 2009 "version": "1.0.0", 1920 2010 "resolved": "https://registry.npmjs.org/base-64/-/base-64-1.0.0.tgz", ··· 1983 2073 "url": "https://github.com/sponsors/sindresorhus" 1984 2074 } 1985 2075 }, 2076 + "node_modules/brace-expansion": { 2077 + "version": "2.0.1", 2078 + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 2079 + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 2080 + "dev": true, 2081 + "dependencies": { 2082 + "balanced-match": "^1.0.0" 2083 + } 2084 + }, 1986 2085 "node_modules/braces": { 1987 2086 "version": "3.0.3", 1988 2087 "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", 1989 2088 "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", 2089 + "dev": true, 1990 2090 "optional": true, 1991 2091 "dependencies": { 1992 2092 "fill-range": "^7.1.1" ··· 2072 2172 "version": "4.0.3", 2073 2173 "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", 2074 2174 "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", 2175 + "dev": true, 2075 2176 "dependencies": { 2076 2177 "readdirp": "^4.0.1" 2077 2178 }, ··· 2146 2247 "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 2147 2248 "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 2148 2249 "dev": true, 2149 - "optional": true, 2150 2250 "dependencies": { 2151 2251 "color-name": "~1.1.4" 2152 2252 }, ··· 2158 2258 "version": "1.1.4", 2159 2259 "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 2160 2260 "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 2161 - "dev": true, 2162 - "optional": true 2261 + "dev": true 2163 2262 }, 2164 2263 "node_modules/color-string": { 2165 2264 "version": "1.9.1", ··· 2182 2281 "url": "https://github.com/sponsors/wooorm" 2183 2282 } 2184 2283 }, 2284 + "node_modules/commander": { 2285 + "version": "12.1.0", 2286 + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", 2287 + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", 2288 + "dev": true, 2289 + "engines": { 2290 + "node": ">=18" 2291 + } 2292 + }, 2185 2293 "node_modules/common-ancestor-path": { 2186 2294 "version": "1.0.1", 2187 2295 "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz", ··· 2212 2320 "node-fetch": "^2.7.0" 2213 2321 } 2214 2322 }, 2323 + "node_modules/cross-spawn": { 2324 + "version": "7.0.6", 2325 + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", 2326 + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", 2327 + "dev": true, 2328 + "dependencies": { 2329 + "path-key": "^3.1.0", 2330 + "shebang-command": "^2.0.0", 2331 + "which": "^2.0.1" 2332 + }, 2333 + "engines": { 2334 + "node": ">= 8" 2335 + } 2336 + }, 2215 2337 "node_modules/crossws": { 2216 2338 "version": "0.3.4", 2217 2339 "resolved": "https://registry.npmjs.org/crossws/-/crossws-0.3.4.tgz", ··· 2368 2490 "node": ">=4" 2369 2491 } 2370 2492 }, 2493 + "node_modules/eastasianwidth": { 2494 + "version": "0.2.0", 2495 + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", 2496 + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", 2497 + "dev": true 2498 + }, 2371 2499 "node_modules/emoji-regex": { 2372 2500 "version": "10.4.0", 2373 2501 "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", ··· 2518 2646 "version": "7.1.1", 2519 2647 "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", 2520 2648 "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", 2649 + "dev": true, 2521 2650 "optional": true, 2522 2651 "dependencies": { 2523 2652 "to-regex-range": "^5.0.1" ··· 2550 2679 "tiny-inflate": "^1.0.3", 2551 2680 "unicode-properties": "^1.4.0", 2552 2681 "unicode-trie": "^2.0.0" 2682 + } 2683 + }, 2684 + "node_modules/foreground-child": { 2685 + "version": "3.3.1", 2686 + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", 2687 + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", 2688 + "dev": true, 2689 + "dependencies": { 2690 + "cross-spawn": "^7.0.6", 2691 + "signal-exit": "^4.0.1" 2692 + }, 2693 + "engines": { 2694 + "node": ">=14" 2695 + }, 2696 + "funding": { 2697 + "url": "https://github.com/sponsors/isaacs" 2553 2698 } 2554 2699 }, 2555 2700 "node_modules/fsevents": { ··· 2584 2729 "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==", 2585 2730 "dev": true 2586 2731 }, 2732 + "node_modules/glob": { 2733 + "version": "11.0.2", 2734 + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.2.tgz", 2735 + "integrity": "sha512-YT7U7Vye+t5fZ/QMkBFrTJ7ZQxInIUjwyAjVj84CYXqgBdv30MFUPGnBR6sQaVq6Is15wYJUsnzTuWaGRBhBAQ==", 2736 + "dev": true, 2737 + "dependencies": { 2738 + "foreground-child": "^3.1.0", 2739 + "jackspeak": "^4.0.1", 2740 + "minimatch": "^10.0.0", 2741 + "minipass": "^7.1.2", 2742 + "package-json-from-dist": "^1.0.0", 2743 + "path-scurry": "^2.0.0" 2744 + }, 2745 + "bin": { 2746 + "glob": "dist/esm/bin.mjs" 2747 + }, 2748 + "engines": { 2749 + "node": "20 || >=22" 2750 + }, 2751 + "funding": { 2752 + "url": "https://github.com/sponsors/isaacs" 2753 + } 2754 + }, 2587 2755 "node_modules/h3": { 2588 2756 "version": "1.15.1", 2589 2757 "resolved": "https://registry.npmjs.org/h3/-/h3-1.15.1.tgz", ··· 2827 2995 "node_modules/immutable": { 2828 2996 "version": "5.1.1", 2829 2997 "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.1.tgz", 2830 - "integrity": "sha512-3jatXi9ObIsPGr3N5hGw/vWWcTkq6hUYhpQz4k0wLC+owqWi/LiugIw9x0EdNZ2yGedKN/HzePiBvaJRXa0Ujg==" 2998 + "integrity": "sha512-3jatXi9ObIsPGr3N5hGw/vWWcTkq6hUYhpQz4k0wLC+owqWi/LiugIw9x0EdNZ2yGedKN/HzePiBvaJRXa0Ujg==", 2999 + "dev": true 2831 3000 }, 2832 3001 "node_modules/import-meta-resolve": { 2833 3002 "version": "4.1.0", ··· 2874 3043 "version": "2.1.1", 2875 3044 "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 2876 3045 "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 3046 + "dev": true, 2877 3047 "optional": true, 2878 3048 "engines": { 2879 3049 "node": ">=0.10.0" ··· 2892 3062 "version": "4.0.3", 2893 3063 "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 2894 3064 "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 3065 + "dev": true, 2895 3066 "optional": true, 2896 3067 "dependencies": { 2897 3068 "is-extglob": "^2.1.1" ··· 2922 3093 "version": "7.0.0", 2923 3094 "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 2924 3095 "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 3096 + "dev": true, 2925 3097 "optional": true, 2926 3098 "engines": { 2927 3099 "node": ">=0.12.0" ··· 2954 3126 "url": "https://github.com/sponsors/sindresorhus" 2955 3127 } 2956 3128 }, 3129 + "node_modules/isexe": { 3130 + "version": "2.0.0", 3131 + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 3132 + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 3133 + "dev": true 3134 + }, 3135 + "node_modules/jackspeak": { 3136 + "version": "4.1.0", 3137 + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.0.tgz", 3138 + "integrity": "sha512-9DDdhb5j6cpeitCbvLO7n7J4IxnbM6hoF6O1g4HQ5TfhvvKN8ywDM7668ZhMHRqVmxqhps/F6syWK2KcPxYlkw==", 3139 + "dev": true, 3140 + "dependencies": { 3141 + "@isaacs/cliui": "^8.0.2" 3142 + }, 3143 + "engines": { 3144 + "node": "20 || >=22" 3145 + }, 3146 + "funding": { 3147 + "url": "https://github.com/sponsors/isaacs" 3148 + } 3149 + }, 2957 3150 "node_modules/js-yaml": { 2958 3151 "version": "4.1.0", 2959 3152 "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", ··· 3819 4012 "version": "4.0.8", 3820 4013 "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", 3821 4014 "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", 4015 + "dev": true, 3822 4016 "optional": true, 3823 4017 "dependencies": { 3824 4018 "braces": "^3.0.3", ··· 3832 4026 "version": "2.3.1", 3833 4027 "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 3834 4028 "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 4029 + "dev": true, 3835 4030 "optional": true, 3836 4031 "engines": { 3837 4032 "node": ">=8.6" ··· 3840 4035 "url": "https://github.com/sponsors/jonschlinkert" 3841 4036 } 3842 4037 }, 4038 + "node_modules/minimatch": { 4039 + "version": "10.0.1", 4040 + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", 4041 + "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", 4042 + "dev": true, 4043 + "dependencies": { 4044 + "brace-expansion": "^2.0.1" 4045 + }, 4046 + "engines": { 4047 + "node": "20 || >=22" 4048 + }, 4049 + "funding": { 4050 + "url": "https://github.com/sponsors/isaacs" 4051 + } 4052 + }, 4053 + "node_modules/minipass": { 4054 + "version": "7.1.2", 4055 + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", 4056 + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", 4057 + "dev": true, 4058 + "engines": { 4059 + "node": ">=16 || 14 >=14.17" 4060 + } 4061 + }, 3843 4062 "node_modules/mrmime": { 3844 4063 "version": "2.0.1", 3845 4064 "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", ··· 3920 4139 "version": "7.1.1", 3921 4140 "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", 3922 4141 "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", 4142 + "dev": true, 3923 4143 "optional": true 3924 4144 }, 3925 4145 "node_modules/node-domexception": { ··· 4060 4280 "funding": { 4061 4281 "url": "https://github.com/sponsors/sindresorhus" 4062 4282 } 4283 + }, 4284 + "node_modules/package-json-from-dist": { 4285 + "version": "1.0.1", 4286 + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", 4287 + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", 4288 + "dev": true 4063 4289 }, 4064 4290 "node_modules/package-manager-detector": { 4065 4291 "version": "1.2.0", ··· 4103 4329 "url": "https://github.com/inikulin/parse5?sponsor=1" 4104 4330 } 4105 4331 }, 4332 + "node_modules/path-key": { 4333 + "version": "3.1.1", 4334 + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 4335 + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 4336 + "dev": true, 4337 + "engines": { 4338 + "node": ">=8" 4339 + } 4340 + }, 4341 + "node_modules/path-scurry": { 4342 + "version": "2.0.0", 4343 + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", 4344 + "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", 4345 + "dev": true, 4346 + "dependencies": { 4347 + "lru-cache": "^11.0.0", 4348 + "minipass": "^7.1.2" 4349 + }, 4350 + "engines": { 4351 + "node": "20 || >=22" 4352 + }, 4353 + "funding": { 4354 + "url": "https://github.com/sponsors/isaacs" 4355 + } 4356 + }, 4357 + "node_modules/path-scurry/node_modules/lru-cache": { 4358 + "version": "11.1.0", 4359 + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.1.0.tgz", 4360 + "integrity": "sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==", 4361 + "dev": true, 4362 + "engines": { 4363 + "node": "20 || >=22" 4364 + } 4365 + }, 4106 4366 "node_modules/picocolors": { 4107 4367 "version": "1.1.1", 4108 4368 "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", ··· 4149 4409 "node": "^10 || ^12 || >=14" 4150 4410 } 4151 4411 }, 4412 + "node_modules/postcss-selector-parser": { 4413 + "version": "6.1.2", 4414 + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", 4415 + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", 4416 + "dev": true, 4417 + "dependencies": { 4418 + "cssesc": "^3.0.0", 4419 + "util-deprecate": "^1.0.2" 4420 + }, 4421 + "engines": { 4422 + "node": ">=4" 4423 + } 4424 + }, 4152 4425 "node_modules/prismjs": { 4153 4426 "version": "1.30.0", 4154 4427 "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", ··· 4190 4463 "url": "https://github.com/sponsors/wooorm" 4191 4464 } 4192 4465 }, 4466 + "node_modules/purgecss": { 4467 + "version": "7.0.2", 4468 + "resolved": "https://registry.npmjs.org/purgecss/-/purgecss-7.0.2.tgz", 4469 + "integrity": "sha512-4Ku8KoxNhOWi9X1XJ73XY5fv+I+hhTRedKpGs/2gaBKU8ijUiIKF/uyyIyh7Wo713bELSICF5/NswjcuOqYouQ==", 4470 + "dev": true, 4471 + "dependencies": { 4472 + "commander": "^12.1.0", 4473 + "glob": "^11.0.0", 4474 + "postcss": "^8.4.47", 4475 + "postcss-selector-parser": "^6.1.2" 4476 + }, 4477 + "bin": { 4478 + "purgecss": "bin/purgecss.js" 4479 + } 4480 + }, 4193 4481 "node_modules/radix3": { 4194 4482 "version": "1.1.2", 4195 4483 "resolved": "https://registry.npmjs.org/radix3/-/radix3-1.1.2.tgz", ··· 4200 4488 "version": "4.1.2", 4201 4489 "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", 4202 4490 "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", 4491 + "dev": true, 4203 4492 "engines": { 4204 4493 "node": ">= 14.18.0" 4205 4494 }, ··· 4484 4773 "version": "1.87.0", 4485 4774 "resolved": "https://registry.npmjs.org/sass/-/sass-1.87.0.tgz", 4486 4775 "integrity": "sha512-d0NoFH4v6SjEK7BoX810Jsrhj7IQSYHAHLi/iSpgqKc7LaIDshFRlSg5LOymf9FqQhxEHs2W5ZQXlvy0KD45Uw==", 4776 + "dev": true, 4487 4777 "dependencies": { 4488 4778 "chokidar": "^4.0.0", 4489 4779 "immutable": "^5.0.2", ··· 4551 4841 "@img/sharp-win32-x64": "0.33.5" 4552 4842 } 4553 4843 }, 4844 + "node_modules/shebang-command": { 4845 + "version": "2.0.0", 4846 + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 4847 + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 4848 + "dev": true, 4849 + "dependencies": { 4850 + "shebang-regex": "^3.0.0" 4851 + }, 4852 + "engines": { 4853 + "node": ">=8" 4854 + } 4855 + }, 4856 + "node_modules/shebang-regex": { 4857 + "version": "3.0.0", 4858 + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 4859 + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 4860 + "dev": true, 4861 + "engines": { 4862 + "node": ">=8" 4863 + } 4864 + }, 4554 4865 "node_modules/shiki": { 4555 4866 "version": "3.2.2", 4556 4867 "resolved": "https://registry.npmjs.org/shiki/-/shiki-3.2.2.tgz", ··· 4567 4878 "@types/hast": "^3.0.4" 4568 4879 } 4569 4880 }, 4881 + "node_modules/signal-exit": { 4882 + "version": "4.1.0", 4883 + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", 4884 + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", 4885 + "dev": true, 4886 + "engines": { 4887 + "node": ">=14" 4888 + }, 4889 + "funding": { 4890 + "url": "https://github.com/sponsors/isaacs" 4891 + } 4892 + }, 4570 4893 "node_modules/signal-polyfill": { 4571 4894 "version": "0.2.2", 4572 4895 "resolved": "https://registry.npmjs.org/signal-polyfill/-/signal-polyfill-0.2.2.tgz", ··· 4604 4927 "version": "1.2.1", 4605 4928 "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", 4606 4929 "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", 4930 + "dev": true, 4607 4931 "engines": { 4608 4932 "node": ">=0.10.0" 4609 4933 } ··· 4643 4967 "url": "https://github.com/sponsors/sindresorhus" 4644 4968 } 4645 4969 }, 4970 + "node_modules/string-width-cjs": { 4971 + "name": "string-width", 4972 + "version": "4.2.3", 4973 + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 4974 + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 4975 + "dev": true, 4976 + "dependencies": { 4977 + "emoji-regex": "^8.0.0", 4978 + "is-fullwidth-code-point": "^3.0.0", 4979 + "strip-ansi": "^6.0.1" 4980 + }, 4981 + "engines": { 4982 + "node": ">=8" 4983 + } 4984 + }, 4985 + "node_modules/string-width-cjs/node_modules/ansi-regex": { 4986 + "version": "5.0.1", 4987 + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 4988 + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 4989 + "dev": true, 4990 + "engines": { 4991 + "node": ">=8" 4992 + } 4993 + }, 4994 + "node_modules/string-width-cjs/node_modules/emoji-regex": { 4995 + "version": "8.0.0", 4996 + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 4997 + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 4998 + "dev": true 4999 + }, 5000 + "node_modules/string-width-cjs/node_modules/strip-ansi": { 5001 + "version": "6.0.1", 5002 + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 5003 + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 5004 + "dev": true, 5005 + "dependencies": { 5006 + "ansi-regex": "^5.0.1" 5007 + }, 5008 + "engines": { 5009 + "node": ">=8" 5010 + } 5011 + }, 4646 5012 "node_modules/stringify-entities": { 4647 5013 "version": "4.0.4", 4648 5014 "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", ··· 4672 5038 "url": "https://github.com/chalk/strip-ansi?sponsor=1" 4673 5039 } 4674 5040 }, 5041 + "node_modules/strip-ansi-cjs": { 5042 + "name": "strip-ansi", 5043 + "version": "6.0.1", 5044 + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 5045 + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 5046 + "dev": true, 5047 + "dependencies": { 5048 + "ansi-regex": "^5.0.1" 5049 + }, 5050 + "engines": { 5051 + "node": ">=8" 5052 + } 5053 + }, 5054 + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { 5055 + "version": "5.0.1", 5056 + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 5057 + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 5058 + "dev": true, 5059 + "engines": { 5060 + "node": ">=8" 5061 + } 5062 + }, 4675 5063 "node_modules/throttle-debounce": { 4676 5064 "version": "5.0.2", 4677 5065 "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-5.0.2.tgz", ··· 4712 5100 "version": "5.0.1", 4713 5101 "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 4714 5102 "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 5103 + "dev": true, 4715 5104 "optional": true, 4716 5105 "dependencies": { 4717 5106 "is-number": "^7.0.0" ··· 5080 5469 } 5081 5470 } 5082 5471 }, 5472 + "node_modules/util-deprecate": { 5473 + "version": "1.0.2", 5474 + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 5475 + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", 5476 + "dev": true 5477 + }, 5083 5478 "node_modules/vfile": { 5084 5479 "version": "6.0.3", 5085 5480 "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", ··· 5249 5644 "webidl-conversions": "^3.0.0" 5250 5645 } 5251 5646 }, 5647 + "node_modules/which": { 5648 + "version": "2.0.2", 5649 + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 5650 + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 5651 + "dev": true, 5652 + "dependencies": { 5653 + "isexe": "^2.0.0" 5654 + }, 5655 + "bin": { 5656 + "node-which": "bin/node-which" 5657 + }, 5658 + "engines": { 5659 + "node": ">= 8" 5660 + } 5661 + }, 5252 5662 "node_modules/which-pm-runs": { 5253 5663 "version": "1.1.0", 5254 5664 "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.1.0.tgz", ··· 5288 5698 }, 5289 5699 "funding": { 5290 5700 "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 5701 + } 5702 + }, 5703 + "node_modules/wrap-ansi-cjs": { 5704 + "name": "wrap-ansi", 5705 + "version": "7.0.0", 5706 + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 5707 + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 5708 + "dev": true, 5709 + "dependencies": { 5710 + "ansi-styles": "^4.0.0", 5711 + "string-width": "^4.1.0", 5712 + "strip-ansi": "^6.0.0" 5713 + }, 5714 + "engines": { 5715 + "node": ">=10" 5716 + }, 5717 + "funding": { 5718 + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 5719 + } 5720 + }, 5721 + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { 5722 + "version": "5.0.1", 5723 + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 5724 + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 5725 + "dev": true, 5726 + "engines": { 5727 + "node": ">=8" 5728 + } 5729 + }, 5730 + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { 5731 + "version": "4.3.0", 5732 + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 5733 + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 5734 + "dev": true, 5735 + "dependencies": { 5736 + "color-convert": "^2.0.1" 5737 + }, 5738 + "engines": { 5739 + "node": ">=8" 5740 + }, 5741 + "funding": { 5742 + "url": "https://github.com/chalk/ansi-styles?sponsor=1" 5743 + } 5744 + }, 5745 + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { 5746 + "version": "8.0.0", 5747 + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 5748 + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 5749 + "dev": true 5750 + }, 5751 + "node_modules/wrap-ansi-cjs/node_modules/string-width": { 5752 + "version": "4.2.3", 5753 + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 5754 + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 5755 + "dev": true, 5756 + "dependencies": { 5757 + "emoji-regex": "^8.0.0", 5758 + "is-fullwidth-code-point": "^3.0.0", 5759 + "strip-ansi": "^6.0.1" 5760 + }, 5761 + "engines": { 5762 + "node": ">=8" 5763 + } 5764 + }, 5765 + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { 5766 + "version": "6.0.1", 5767 + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 5768 + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 5769 + "dev": true, 5770 + "dependencies": { 5771 + "ansi-regex": "^5.0.1" 5772 + }, 5773 + "engines": { 5774 + "node": ">=8" 5291 5775 } 5292 5776 }, 5293 5777 "node_modules/xxh32": {
+4 -2
package.json
··· 5 5 "iconoir": "^7.11.0", 6 6 "idb-keyval": "^6.2.1", 7 7 "native-file-system-adapter": "^3.0.1", 8 - "sass": "^1.87.0", 9 8 "spellcaster": "gordonbrander/spellcaster#1613e5e3b7f202cfe57f37ea7c637ec83588a297", 10 9 "throttle-debounce": "^5.0.2", 11 10 "xxh32": "^2.0.5" 12 11 }, 13 12 "devDependencies": { 14 13 "astro": "^5.7.4", 15 - "astro-scope": "^3.0.1" 14 + "astro-purgecss": "^5.2.2", 15 + "astro-scope": "^3.0.1", 16 + "purgecss": "^7.0.2", 17 + "sass": "^1.87.0" 16 18 } 17 19 }
+6 -21
src/applets/configurator/storage/output/applet.astro src/pages/configurator/storage/output/_applet.astro
··· 26 26 </mark> 27 27 </small> 28 28 </p> 29 - <div id="iframes"></div> 30 29 </main> 31 30 32 - <style lang="scss"> 33 - @use "@picocss/pico/scss/pico" with ( 34 - $enable-responsive-spacings: true, 35 - $enable-responsive-typography: true 36 - ); 37 - 38 - @use "@picocss/pico/scss/colors/utilities"; 39 - </style> 40 - 41 31 <style> 42 - @import "../../../../styles/configurator.css"; 43 - 44 32 #iframes { 45 33 display: none; 46 34 } ··· 50 38 display: inline-flex; 51 39 gap: 0.75em; 52 40 } 53 - 54 - [data-storage] { 55 - cursor: pointer; 56 - } 57 41 </style> 58 42 59 43 <script> ··· 63 47 import { type ElementConfigurator, repeat, text } from "spellcaster/hyperscript.js"; 64 48 import { applets } from "@web-applets/sdk"; 65 49 66 - import { applet, hs } from "../../../../scripts/theme"; 67 - import { OutputGetter, OutputSetter } from "../../../core/types"; 50 + import { applet, hs } from "@src/scripts/theme"; 51 + import type { OutputGetter, OutputSetter } from "@applets/core/types.d.ts"; 68 52 69 53 const METHODS = ["browser", "custom", "device"] as const; 70 54 ··· 87 71 //////////////////////////////////////////// 88 72 const context = applets.register(); 89 73 90 - const container = document.getElementById("iframes"); 91 - if (!container) throw new Error("Missing iframe container"); 74 + const container = document.createElement("div"); 75 + container.id = "iframes"; 76 + document.body.appendChild(container); 92 77 93 78 // TODO: Use https://developer.mozilla.org/en-US/docs/Web/API/Broadcast_Channel_API 94 79 // so that the other instances of this applet can be notified ··· 327 312 let missingAction; 328 313 329 314 ["get", "put", "mount", "unmount"].forEach((method) => { 330 - if (!apl.manifest.actions[method]) missingAction = method; 315 + if (!apl.manifest.actions?.[method]) missingAction = method; 331 316 }); 332 317 333 318 if (missingAction) {
src/applets/configurator/storage/output/manifest.json src/pages/configurator/storage/output/_manifest.json
src/applets/core/types.d.ts src/pages/core/types.d.ts
+5 -4
src/applets/engine/audio/applet.astro src/pages/engine/audio/_applet.astro
··· 1 - <div id="container"></div> 2 - 3 1 <script> 4 2 import { applets } from "@web-applets/sdk"; 5 3 import { State, Track, TrackState } from "./types"; ··· 14 12 // SETUP 15 13 //////////////////////////////////////////// 16 14 const context = applets.register<State>(); 17 - const container = document.querySelector("#container"); 15 + const container = document.createElement("div"); 16 + 17 + container.id = "container"; 18 + document.body.appendChild(container); 18 19 19 20 // Initial state 20 21 context.data = { ··· 123 124 //////////////////////////////////////////// 124 125 async function render(tracks: Array<Track>) { 125 126 const ids = tracks.map((e) => e.id); 126 - const existingNodes = {}; 127 + const existingNodes: Record<string, HTMLAudioElement> = {}; 127 128 128 129 // Manage existing nodes 129 130 Array.from(container.querySelectorAll("audio")).map((node: HTMLAudioElement) => {
src/applets/engine/audio/manifest.json src/pages/engine/audio/_manifest.json
src/applets/engine/audio/types.d.ts src/pages/engine/audio/types.d.ts
src/applets/engine/queue/applet.astro src/pages/engine/queue/_applet.astro
src/applets/engine/queue/manifest.json src/pages/engine/queue/_manifest.json
src/applets/engine/queue/types.d.ts src/pages/engine/queue/types.d.ts
+4 -10
src/applets/orchestrator/queue/applet.astro src/pages/orchestrator/queue/_applet.astro
··· 1 1 <script> 2 2 import { applets } from "@web-applets/sdk"; 3 3 4 - import type { Track, Output } from "../../core/types.d.ts"; 5 - import { applet, comparable, reactive } from "../../../scripts/theme"; 4 + import type { Track, Output } from "@applets/core/types.d.ts"; 5 + import { applet, comparable, reactive } from "@scripts/theme"; 6 6 7 7 //////////////////////////////////////////// 8 8 // SETUP 9 9 //////////////////////////////////////////// 10 - import type * as AudioEngine from "../../engine/audio/types.d.ts"; 11 - import type * as QueueEngine from "../../engine/queue/types.d.ts"; 10 + import type * as AudioEngine from "@applets/engine/audio/types.d.ts"; 11 + import type * as QueueEngine from "@applets/engine/queue/types.d.ts"; 12 12 13 13 // Register applet 14 14 const context = applets.register<unknown>(); ··· 108 108 }, 109 109 ); 110 110 </script> 111 - 112 - <style> 113 - iframe { 114 - display: none; 115 - } 116 - </style>
src/applets/orchestrator/queue/manifest.json src/pages/orchestrator/queue/_manifest.json
+2 -8
src/applets/orchestrator/storage/applet.astro src/pages/orchestrator/storage/_applet.astro
··· 2 2 <script> 3 3 import { applets } from "@web-applets/sdk"; 4 4 5 - import type { Output, Source, Track } from "../../core/types.d.ts"; 6 - import { applet } from "../../../scripts/theme"; 5 + import type { Output, Source, Track } from "@applets/core/types.d.ts"; 6 + import { applet } from "@scripts/theme"; 7 7 8 8 //////////////////////////////////////////// 9 9 // SETUP ··· 122 122 return new TextEncoder().encode(JSON.stringify(data)); 123 123 } 124 124 </script> 125 - 126 - <style> 127 - iframe { 128 - display: none; 129 - } 130 - </style>
src/applets/orchestrator/storage/manifest.json src/pages/orchestrator/storage/_manifest.json
+1 -1
src/applets/storage/output/indexed-db/applet.astro src/pages/storage/output/indexed-db/_applet.astro
··· 2 2 import * as IDB from "idb-keyval"; 3 3 import { applets } from "@web-applets/sdk"; 4 4 5 - import type { OutputGetter, OutputSetter } from "../../../core/types.d.ts"; 5 + import type { OutputGetter, OutputSetter } from "@applets/core/types.d.ts"; 6 6 7 7 //////////////////////////////////////////// 8 8 // SETUP
src/applets/storage/output/indexed-db/manifest.json src/pages/storage/output/indexed-db/_manifest.json
+1 -1
src/applets/storage/output/native-fs/applet.astro src/pages/storage/output/native-fs/_applet.astro
··· 3 3 import { applets } from "@web-applets/sdk"; 4 4 import { type FileSystemDirectoryHandle, showDirectoryPicker } from "native-file-system-adapter"; 5 5 6 - import type { OutputGetter, OutputSetter } from "../../../core/types.d.ts"; 6 + import type { OutputGetter, OutputSetter } from "@applets/core/types.d.ts"; 7 7 8 8 //////////////////////////////////////////// 9 9 // SETUP
src/applets/storage/output/native-fs/manifest.json src/pages/storage/output/native-fs/_manifest.json
+18 -9
src/applets/themes/pilot/ui/audio/applet.astro src/pages/themes/pilot/ui/audio/_applet.astro
··· 1 + --- 2 + import "@styles/reset.css"; 3 + import "@styles/variables.css"; 4 + import "@styles/fonts.css"; 5 + import "@styles/icons.css"; 6 + import "@styles/themes/pilot/variables.css"; 7 + --- 8 + 1 9 <main> 2 10 <div class="queue-entry"></div> 3 11 <div class="playback-info"> ··· 14 22 </main> 15 23 16 24 <style> 17 - @import "../../../../../styles/themes/pilot/variables.css"; 18 - @import "../../../../../styles/icons.css"; 19 - 20 25 main { 21 26 align-items: center; 22 27 background: var(--made-in-the-shade); ··· 111 116 112 117 context.setActionHandler("modifyProgress", (progress: number) => { 113 118 const p = isNaN(progress) || !isFinite(progress) ? 0 : Math.min(Math.max(progress, 0), 1); 114 - document.body.querySelector("progress").value = p * 100; 119 + const el = document.body.querySelector("progress"); 120 + if (el) el.value = p * 100; 115 121 }); 116 122 117 123 //////////////////////////////////////////// 118 124 // DOM 119 125 //////////////////////////////////////////// 120 - document.body.querySelector(".controls__playpause").addEventListener("click", () => { 126 + document.body.querySelector(".controls__playpause")?.addEventListener("click", () => { 121 127 context.data = { ...context.data, isPlaying: !(context.data?.isPlaying ?? false) }; 122 128 }); 123 129 124 - document.body.querySelector(".time").addEventListener("click", (event: Event) => { 130 + document.body.querySelector(".time")?.addEventListener("click", (event: Event) => { 125 131 const mouseEvent = event as MouseEvent; 126 132 const seekPosition = mouseEvent.offsetX / (event.target as HTMLProgressElement).clientWidth; 127 133 context.data = { ...context.data, seekPosition }; 128 134 }); 129 135 130 136 function render() { 131 - document.body.querySelector("button").innerHTML = context.data.isPlaying 132 - ? `<i class="iconoir-pause-solid" data-astro-cid-${scope}></i>` 133 - : `<i class="iconoir-play-solid" data-astro-cid-${scope}></i>`; 137 + const button = document.body.querySelector("button"); 138 + 139 + if (button) 140 + button.innerHTML = context.data.isPlaying 141 + ? `<i class="iconoir-pause-solid" data-astro-cid-${scope}></i>` 142 + : `<i class="iconoir-play-solid" data-astro-cid-${scope}></i>`; 134 143 } 135 144 </script>
+2 -1
src/applets/themes/pilot/ui/audio/manifest.json src/pages/themes/pilot/ui/audio/_manifest.json
··· 1 1 { 2 - "name": "diffuse/ui/audio", 2 + "name": "diffuse/themes/pilot/ui/audio", 3 + "title": "", 3 4 "entrypoint": "index.html", 4 5 "actions": { 5 6 "modifyIsPlaying": {
src/applets/themes/pilot/ui/audio/types.ts src/pages/themes/pilot/ui/audio/types.d.ts
+3 -3
src/content.config.ts
··· 1 1 import { defineCollection } from "astro:content"; 2 2 import { glob } from "astro/loaders"; 3 3 4 - const applets = defineCollection({ 5 - loader: glob({ pattern: "**/*.json", base: "./src/applets" }), 4 + const manifests = defineCollection({ 5 + loader: glob({ pattern: "**/_manifest.json", base: "./src/pages" }), 6 6 }); 7 7 8 - export const collections = { applets }; 8 + export const collections = { manifests };
+23
src/layouts/applet-pico-ui.astro
··· 1 + --- 2 + import "@styles/reset.css"; 3 + import "@styles/variables.css"; 4 + import "@styles/fonts.css"; 5 + import "@styles/icons.css"; 6 + import "@styles/pico.scss"; 7 + 8 + const { title } = Astro.props; 9 + --- 10 + 11 + <html lang="en"> 12 + <head> 13 + <meta charset="UTF-8" /> 14 + <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 15 + <meta name="color-scheme" content="light dark" /> 16 + <link rel="manifest" href="manifest.json" /> 17 + 18 + <title>{title}</title> 19 + </head> 20 + <body> 21 + <slot /> 22 + </body> 23 + </html>
-6
src/layouts/applet.astro
··· 10 10 <link rel="manifest" href="manifest.json" /> 11 11 12 12 <title>{title}</title> 13 - 14 - <style is:global> 15 - @import "../styles/reset.css"; 16 - @import "../styles/fonts.css"; 17 - @import "../styles/variables.css"; 18 - </style> 19 13 </head> 20 14 <body> 21 15 <slot />
+1 -1
src/layouts/page.astro
··· 9 9 10 10 <title>{title}</title> 11 11 12 - <style is:global> 12 + <style> 13 13 @import "../styles/reset.css"; 14 14 @import "../styles/fonts.css"; 15 15 @import "../styles/variables.css";
-64
src/pages/[...applet].astro
··· 1 - --- 2 - import { getCollection } from "astro:content"; 3 - import AppletLayout from "../layouts/applet.astro"; 4 - 5 - // Generate static paths 6 - export async function getStaticPaths() { 7 - async function gen(path: string[]): Promise<{ 8 - applet: string; 9 - title: string; 10 - Component: (_props: Record<string, any>) => any; 11 - }> { 12 - let Applet; 13 - let manifest; 14 - 15 - if (path.length === 2) { 16 - Applet = await import(`../applets/${path[0]}/${path[1]}/applet.astro`); 17 - manifest = await import(`../applets/${path[0]}/${path[1]}/manifest.json`); 18 - } 19 - 20 - if (path.length === 3) { 21 - Applet = await import(`../applets/${path[0]}/${path[1]}/${path[2]}/applet.astro`); 22 - manifest = await import(`../applets/${path[0]}/${path[1]}/${path[2]}/manifest.json`); 23 - } 24 - 25 - if (path.length === 4) { 26 - Applet = await import(`../applets/${path[0]}/${path[1]}/${path[2]}/${path[3]}/applet.astro`); 27 - manifest = await import( 28 - `../applets/${path[0]}/${path[1]}/${path[2]}/${path[3]}/manifest.json` 29 - ); 30 - } 31 - 32 - if (Applet === undefined || manifest === undefined) { 33 - throw new Error("Unsupported path length"); 34 - } 35 - 36 - return { 37 - applet: path.join("/"), 38 - title: manifest.default.title || manifest.default.name, 39 - Component: Applet.default, 40 - }; 41 - } 42 - 43 - const applets = await getCollection("applets"); 44 - const pages = await Promise.all( 45 - applets.map((applet) => { 46 - return gen(applet.id.split("/").slice(0, -1)); 47 - }), 48 - ); 49 - 50 - return pages.map(({ applet, Component, title }) => { 51 - return { 52 - params: { applet }, 53 - props: { Component, title }, 54 - }; 55 - }); 56 - } 57 - 58 - // Render props 59 - const { Component, title } = Astro.props; 60 - --- 61 - 62 - <AppletLayout title={title}> 63 - <Component /> 64 - </AppletLayout>
+5 -7
src/pages/[...manifest].json.ts
··· 3 3 4 4 // API Route 5 5 export const GET: APIRoute = ({ params, props, request }) => { 6 - return new Response( 7 - JSON.stringify(props.manifest), 8 - ); 6 + return new Response(JSON.stringify(props.manifest)); 9 7 }; 10 8 11 9 // Generate static paths 12 10 export async function getStaticPaths() { 13 - const applets = await getCollection("applets"); 11 + const manifests = await getCollection("manifests"); 14 12 15 - return applets.map((applet) => { 13 + return manifests.map((manifest) => { 16 14 return { 17 - params: { manifest: applet.id }, 18 - props: { manifest: applet.data }, 15 + params: { manifest: manifest.id.replace("/_manifest", "/manifest") }, 16 + props: { manifest: manifest.data }, 19 17 }; 20 18 }); 21 19 }
+9
src/pages/configurator/storage/output/index.astro
··· 1 + --- 2 + import Layout from "@layouts/applet-pico-ui.astro"; 3 + import Applet from "./_applet.astro"; 4 + import { title } from "./_manifest.json"; 5 + --- 6 + 7 + <Layout title={title}> 8 + <Applet /> 9 + </Layout>
+9
src/pages/engine/audio/index.astro
··· 1 + --- 2 + import Layout from "@layouts/applet.astro"; 3 + import Applet from "./_applet.astro"; 4 + import { title } from "./_manifest.json"; 5 + --- 6 + 7 + <Layout title={title}> 8 + <Applet /> 9 + </Layout>
+9
src/pages/engine/queue/index.astro
··· 1 + --- 2 + import Layout from "@layouts/applet.astro"; 3 + import Applet from "./_applet.astro"; 4 + import { title } from "./_manifest.json"; 5 + --- 6 + 7 + <Layout title={title}> 8 + <Applet /> 9 + </Layout>
+9
src/pages/orchestrator/queue/index.astro
··· 1 + --- 2 + import Layout from "@layouts/applet.astro"; 3 + import Applet from "./_applet.astro"; 4 + import { title } from "./_manifest.json"; 5 + --- 6 + 7 + <Layout title={title}> 8 + <Applet /> 9 + </Layout>
+9
src/pages/orchestrator/storage/index.astro
··· 1 + --- 2 + import Layout from "@layouts/applet.astro"; 3 + import Applet from "./_applet.astro"; 4 + import { title } from "./_manifest.json"; 5 + --- 6 + 7 + <Layout title={title}> 8 + <Applet /> 9 + </Layout>
+9
src/pages/storage/output/indexed-db/index.astro
··· 1 + --- 2 + import Layout from "@layouts/applet.astro"; 3 + import Applet from "./_applet.astro"; 4 + import { title } from "./_manifest.json"; 5 + --- 6 + 7 + <Layout title={title}> 8 + <Applet /> 9 + </Layout>
+9
src/pages/storage/output/native-fs/index.astro
··· 1 + --- 2 + import Layout from "@layouts/applet.astro"; 3 + import Applet from "./_applet.astro"; 4 + import { title } from "./_manifest.json"; 5 + --- 6 + 7 + <Layout title={title}> 8 + <Applet /> 9 + </Layout>
+9
src/pages/themes/pilot/ui/audio/index.astro
··· 1 + --- 2 + import Layout from "@layouts/applet.astro"; 3 + import Applet from "./_applet.astro"; 4 + import { title } from "./_manifest.json"; 5 + --- 6 + 7 + <Layout title={title}> 8 + <Applet /> 9 + </Layout>
+13 -5
src/scripts/theme.ts
··· 2 2 3 3 import { applets } from "@web-applets/sdk"; 4 4 import { type ElementConfigurator, h } from "spellcaster/hyperscript.js"; 5 - import { effect, isSignal, sample, Signal, signal } from "spellcaster/spellcaster.js"; 5 + import { effect, isSignal, Signal, signal } from "spellcaster/spellcaster.js"; 6 6 import { xxh32 } from "xxh32"; 7 7 8 8 //////////////////////////////////////////// ··· 50 50 throw new Error("iframe does not have a contentWindow"); 51 51 } 52 52 53 - const applet = await applets.connect<D>(frame.contentWindow, { context: opts.context }); 53 + const applet = await applets.connect<D>(frame.contentWindow, { 54 + context: opts.context, 55 + }); 54 56 55 57 if (opts.setHeight) { 56 58 applet.onresize = () => { ··· 80 82 ) { 81 83 const [getter, setter] = signal(dataFn(applet.data)); 82 84 83 - effect(() => effectFn(getter())); 85 + effect(() => { 86 + effectFn(getter()); 87 + return undefined; 88 + }); 84 89 85 90 applet.addEventListener("data", (event: AppletEvent) => { 86 91 setter(dataFn(event.data)); ··· 90 95 //////////////////////////////////////////// 91 96 // 🛠️ 92 97 //////////////////////////////////////////// 93 - export function addScope<O extends Object>(astroScope: string, object: O): O { 98 + export function addScope<O extends object>(astroScope: string, object: O): O { 94 99 return { 95 100 ...object, 96 - attrs: { ...((object as any).attrs || {}), [`data-astro-cid-${astroScope}`]: "" }, 101 + attrs: { 102 + ...((object as any).attrs || {}), 103 + [`data-astro-cid-${astroScope}`]: "", 104 + }, 97 105 }; 98 106 } 99 107
+10 -9
src/scripts/themes/pilot/index.ts
··· 1 - import type { Output } from "../../../applets/core/types.d.ts"; 2 - import { applet, comparable, reactive } from "../../theme.ts"; 1 + import type { Output } from "@applets/core/types.d.ts"; 2 + import { applet, reactive } from "../../theme.ts"; 3 3 4 4 //////////////////////////////////////////// 5 5 // 🎨 Styles 6 6 //////////////////////////////////////////// 7 - import "../../../styles/themes/pilot/index.css"; 7 + import "@styles/themes/pilot/index.css"; 8 8 9 9 //////////////////////////////////////////// 10 10 // 🗂️ Applets 11 11 //////////////////////////////////////////// 12 - import type * as AudioEngine from "../../../applets/engine/audio/types.d.ts"; 13 - import type * as QueueEngine from "../../../applets/engine/queue/types.d.ts"; 12 + import type * as AudioEngine from "@applets/engine/audio/types.d.ts"; 13 + import type * as QueueEngine from "@applets/engine/queue/types.d.ts"; 14 14 15 - import type * as AudioUI from "../../../applets/themes/pilot/ui/audio/types.ts"; 15 + import type * as AudioUI from "@applets/themes/pilot/ui/audio/types.d.ts"; 16 16 17 - const configurator = { 17 + const _configurator = { 18 18 storage: { 19 19 output: await applet("../../configurator/storage/output"), 20 20 }, ··· 25 25 queue: await applet<QueueEngine.State>("../../engine/queue"), 26 26 }; 27 27 28 - const orchestrator = { 28 + const _orchestrator = { 29 29 queue: await applet("../../orchestrator/queue"), 30 30 storage: await applet<Output>("../../orchestrator/storage"), 31 31 }; ··· 53 53 54 54 reactive( 55 55 engine.audio, 56 - (data) => data.items[engine.queue.data.now?.id ?? Infinity]?.isPlaying ?? false, 56 + (data) => 57 + data.items[engine.queue.data.now?.id ?? Infinity]?.isPlaying ?? false, 57 58 (isPlaying) => ui.audio.sendAction("modifyIsPlaying", isPlaying), 58 59 ); 59 60
+5
src/styles/applet.css
··· 1 + @import "./reset.css"; 2 + @import "./variables.css"; 3 + @import "./fonts.css"; 4 + @import "./icons.css"; 5 + @import "./pico.scss";
-1
src/styles/configurator.css
··· 1 - @import "./icons.css";
+6
src/styles/pico.scss
··· 1 + @use "@picocss/pico/scss/pico" with ( 2 + $enable-responsive-spacings: true, 3 + $enable-responsive-typography: true 4 + ); 5 + 6 + @use "@picocss/pico/scss/colors/utilities";
+1 -1
tasks/copy-types.ts
··· 1 1 import { walk } from "jsr:@std/fs@^1.0"; 2 2 3 3 // Copy .d.ts files to dist dir 4 - const it = walk("./src/applets/", { exts: [".d.ts"] }); 4 + const it = walk("./src/pages/", { exts: [".d.ts"] }); 5 5 6 6 for await (const item of it) { 7 7 const target = `dist/${item.path.replace("src/applets/", "")}`;
+26
tsconfig.json
··· 1 + { 2 + "compilerOptions": { 3 + "allowImportingTsExtensions": true, 4 + "allowJs": true, 5 + "esModuleInterop": true, 6 + "experimentalDecorators": false, 7 + "isolatedModules": true, 8 + "module": "esnext", 9 + "moduleResolution": "bundler", 10 + "moduleDetection": "force", 11 + "noEmit": true, 12 + "noImplicitOverride": true, 13 + "strict": true, 14 + "target": "esnext", 15 + "useDefineForClassFields": true, 16 + "baseUrl": ".", 17 + "paths": { 18 + "@applets/*": ["src/pages/*"], 19 + "@layouts/*": ["src/layouts/*"], 20 + "@pages/*": ["src/pages/*"], 21 + "@scripts/*": ["src/scripts/*"], 22 + "@styles/*": ["src/styles/*"], 23 + "@src/*": ["src/*"] 24 + } 25 + } 26 + }