Repo for dnd.vielle.dev.

add old project in to quote myself: say NO to sane commits instead: commit fucking everything! this is a priv repo idc lmfao

+5 -1
astro.config.mjs
··· 3 3 4 4 import cloudflare from '@astrojs/cloudflare'; 5 5 6 + import svelte from '@astrojs/svelte'; 7 + 6 8 // https://astro.build/config 7 9 export default defineConfig({ 8 10 adapter: cloudflare({ 9 11 platformProxy: { 10 12 enabled: true 11 13 } 12 - }) 14 + }), 15 + 16 + integrations: [svelte()] 13 17 });
+7 -2
package.json
··· 3 3 "type": "module", 4 4 "version": "0.0.1", 5 5 "scripts": { 6 - "dev": "astro dev", 6 + "dev": "astro dev --port 3000 --host", 7 7 "build": "astro build", 8 8 "preview": "astro build && wrangler pages dev", 9 9 "astro": "astro", ··· 12 12 }, 13 13 "dependencies": { 14 14 "@astrojs/cloudflare": "^12.1.0", 15 - "astro": "^5.1.5" 15 + "@astrojs/svelte": "^7.0.3", 16 + "@nanostores/persistent": "^0.10.2", 17 + "astro": "^5.1.5", 18 + "nanostores": "^0.11.3", 19 + "svelte": "^5.17.3", 20 + "typescript": "^5.7.3" 16 21 }, 17 22 "devDependencies": { 18 23 "@cloudflare/workers-types": "^4.20250109.0",
+237
pnpm-lock.yaml
··· 11 11 '@astrojs/cloudflare': 12 12 specifier: ^12.1.0 13 13 version: 12.1.0(@types/node@22.10.5)(astro@5.1.5(@types/node@22.10.5)(rollup@4.30.1)(typescript@5.7.3)) 14 + '@astrojs/svelte': 15 + specifier: ^7.0.3 16 + version: 7.0.3(@types/node@22.10.5)(astro@5.1.5(@types/node@22.10.5)(rollup@4.30.1)(typescript@5.7.3))(svelte@5.17.3)(typescript@5.7.3) 17 + '@nanostores/persistent': 18 + specifier: ^0.10.2 19 + version: 0.10.2(nanostores@0.11.3) 14 20 astro: 15 21 specifier: ^5.1.5 16 22 version: 5.1.5(@types/node@22.10.5)(rollup@4.30.1)(typescript@5.7.3) 23 + nanostores: 24 + specifier: ^0.11.3 25 + version: 0.11.3 26 + svelte: 27 + specifier: ^5.17.3 28 + version: 5.17.3 29 + typescript: 30 + specifier: ^5.7.3 31 + version: 5.7.3 17 32 devDependencies: 18 33 '@cloudflare/workers-types': 19 34 specifier: ^4.20250109.0 ··· 23 38 version: 3.101.0(@cloudflare/workers-types@4.20250109.0) 24 39 25 40 packages: 41 + 42 + '@ampproject/remapping@2.3.0': 43 + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} 44 + engines: {node: '>=6.0.0'} 26 45 27 46 '@astrojs/cloudflare@12.1.0': 28 47 resolution: {integrity: sha512-tx2HrZclERHI9MV/Jx/+cUVbQ0UGWlVCxV7ozRgnwCNG3fgBtpk1Qf60eTMnCLDQTKXy6C5b3nE+c9+dMpW6Hg==} ··· 44 63 '@astrojs/prism@3.2.0': 45 64 resolution: {integrity: sha512-GilTHKGCW6HMq7y3BUv9Ac7GMe/MO9gi9GW62GzKtth0SwukCu/qp2wLiGpEujhY+VVhaG9v7kv/5vFzvf4NYw==} 46 65 engines: {node: ^18.17.1 || ^20.3.0 || >=22.0.0} 66 + 67 + '@astrojs/svelte@7.0.3': 68 + resolution: {integrity: sha512-cUR9lQ7p3LPZnWpGb7uWBHVzF6wbRbCkyGgEG20EQTx4Am2OyACM/xqZ3KuDKZJQd3HcqKbjkWX/nTJePpNDRw==} 69 + engines: {node: ^18.17.1 || ^20.3.0 || >=22.0.0} 70 + peerDependencies: 71 + astro: ^5.0.0 72 + svelte: ^5.1.16 73 + typescript: ^5.3.3 47 74 48 75 '@astrojs/telemetry@3.2.0': 49 76 resolution: {integrity: sha512-wxhSKRfKugLwLlr4OFfcqovk+LIFtKwLyGPqMsv+9/ibqqnW3Gv7tBhtKEb0gAyUAC4G9BTVQeQahqnQAhd6IQ==} ··· 820 847 peerDependencies: 821 848 astro: ^5 822 849 850 + '@jridgewell/gen-mapping@0.3.8': 851 + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} 852 + engines: {node: '>=6.0.0'} 853 + 823 854 '@jridgewell/resolve-uri@3.1.2': 824 855 resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 825 856 engines: {node: '>=6.0.0'} 826 857 858 + '@jridgewell/set-array@1.2.1': 859 + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} 860 + engines: {node: '>=6.0.0'} 861 + 827 862 '@jridgewell/sourcemap-codec@1.5.0': 828 863 resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} 829 864 865 + '@jridgewell/trace-mapping@0.3.25': 866 + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} 867 + 830 868 '@jridgewell/trace-mapping@0.3.9': 831 869 resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} 870 + 871 + '@nanostores/persistent@0.10.2': 872 + resolution: {integrity: sha512-BEndnLhRC+yP7gXTESepBbSj8XNl8OXK9hu4xAgKC7MWJHKXnEqJMqY47LUyHxK6vYgFnisyHmqq+vq8AUFyIg==} 873 + engines: {node: ^18.0.0 || >=20.0.0} 874 + peerDependencies: 875 + nanostores: ^0.9.0 || ^0.10.0 || ^0.11.0 832 876 833 877 '@nodelib/fs.scandir@2.1.5': 834 878 resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} ··· 1182 1226 resolution: {integrity: sha512-piUTHyp2Axx3p/kc2CIJkYSv0BAaheBQmbACZgQSSfWUumWNW+R1lL+H9PDBxKJkvOeEX+hKYEFiwO8xagL8AQ==} 1183 1227 engines: {node: '>=18.0.0'} 1184 1228 1229 + '@sveltejs/vite-plugin-svelte-inspector@4.0.1': 1230 + resolution: {integrity: sha512-J/Nmb2Q2y7mck2hyCX4ckVHcR5tu2J+MtBEQqpDrrgELZ2uvraQcK/ioCV61AqkdXFgriksOKIceDcQmqnGhVw==} 1231 + engines: {node: ^18.0.0 || ^20.0.0 || >=22} 1232 + peerDependencies: 1233 + '@sveltejs/vite-plugin-svelte': ^5.0.0 1234 + svelte: ^5.0.0 1235 + vite: ^6.0.0 1236 + 1237 + '@sveltejs/vite-plugin-svelte@5.0.3': 1238 + resolution: {integrity: sha512-MCFS6CrQDu1yGwspm4qtli0e63vaPCehf6V7pIMP15AsWgMKrqDGCPFF/0kn4SP0ii4aySu4Pa62+fIRGFMjgw==} 1239 + engines: {node: ^18.0.0 || ^20.0.0 || >=22} 1240 + peerDependencies: 1241 + svelte: ^5.0.0 1242 + vite: ^6.0.0 1243 + 1185 1244 '@types/cookie@0.6.0': 1186 1245 resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} 1187 1246 ··· 1215 1274 '@ungap/structured-clone@1.2.1': 1216 1275 resolution: {integrity: sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==} 1217 1276 1277 + acorn-typescript@1.4.13: 1278 + resolution: {integrity: sha512-xsc9Xv0xlVfwp2o7sQ+GCQ1PgbkdcpWdTzrwXxO3xDMTAywVS3oXVOcOHuRjAPkS4P9b+yc/qNF15460v+jp4Q==} 1279 + peerDependencies: 1280 + acorn: '>=8.9.0' 1281 + 1218 1282 acorn-walk@8.3.4: 1219 1283 resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} 1220 1284 engines: {node: '>=0.4.0'} ··· 1404 1468 decode-named-character-reference@1.0.2: 1405 1469 resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} 1406 1470 1471 + dedent-js@1.0.1: 1472 + resolution: {integrity: sha512-OUepMozQULMLUmhxS95Vudo0jb0UchLimi3+pQ2plj61Fcy8axbP9hbiD4Sz6DPqn6XG3kfmziVfQ1rSys5AJQ==} 1473 + 1474 + deepmerge@4.3.1: 1475 + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} 1476 + engines: {node: '>=0.10.0'} 1477 + 1407 1478 defu@6.1.4: 1408 1479 resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} 1409 1480 ··· 1478 1549 resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} 1479 1550 engines: {node: '>=12'} 1480 1551 1552 + esm-env@1.2.2: 1553 + resolution: {integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==} 1554 + 1481 1555 esprima@4.0.1: 1482 1556 resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} 1483 1557 engines: {node: '>=4'} 1484 1558 hasBin: true 1485 1559 1560 + esrap@1.4.2: 1561 + resolution: {integrity: sha512-FhVlJzvTw7ZLxYZ7RyHwQCFE64dkkpzGNNnphaGCLwjqGk1SQcqzbgdx9FowPCktx6NOSHkzvcZ3vsvdH54YXA==} 1562 + 1486 1563 estree-walker@0.6.1: 1487 1564 resolution: {integrity: sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==} 1488 1565 ··· 1659 1736 resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} 1660 1737 engines: {node: '>=12'} 1661 1738 1739 + is-reference@3.0.3: 1740 + resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==} 1741 + 1662 1742 is-wsl@3.1.0: 1663 1743 resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} 1664 1744 engines: {node: '>=16'} ··· 1685 1765 load-yaml-file@0.2.0: 1686 1766 resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==} 1687 1767 engines: {node: '>=6'} 1768 + 1769 + locate-character@3.0.0: 1770 + resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} 1688 1771 1689 1772 locate-path@5.0.0: 1690 1773 resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} ··· 1693 1776 longest-streak@3.1.0: 1694 1777 resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} 1695 1778 1779 + lower-case@2.0.2: 1780 + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} 1781 + 1696 1782 lru-cache@10.4.3: 1697 1783 resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} 1698 1784 ··· 1867 1953 resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} 1868 1954 engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 1869 1955 hasBin: true 1956 + 1957 + nanostores@0.11.3: 1958 + resolution: {integrity: sha512-TUes3xKIX33re4QzdxwZ6tdbodjmn3tWXCEc1uokiEmo14sI1EaGYNs2k3bU2pyyGNmBqFGAVl6jAGWd06AVIg==} 1959 + engines: {node: ^18.0.0 || >=20.0.0} 1870 1960 1871 1961 neotraverse@0.6.18: 1872 1962 resolution: {integrity: sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==} ··· 1875 1965 nlcst-to-string@4.0.0: 1876 1966 resolution: {integrity: sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==} 1877 1967 1968 + no-case@3.0.4: 1969 + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} 1970 + 1878 1971 node-fetch-native@1.6.4: 1879 1972 resolution: {integrity: sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==} 1880 1973 ··· 1924 2017 1925 2018 parse5@7.2.1: 1926 2019 resolution: {integrity: sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==} 2020 + 2021 + pascal-case@3.1.2: 2022 + resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} 1927 2023 1928 2024 path-exists@4.0.0: 1929 2025 resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} ··· 2153 2249 resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 2154 2250 engines: {node: '>= 0.4'} 2155 2251 2252 + svelte2tsx@0.7.34: 2253 + resolution: {integrity: sha512-WTMhpNhFf8/h3SMtR5dkdSy2qfveomkhYei/QW9gSPccb0/b82tjHvLop6vT303ZkGswU/da1s6XvrLgthQPCw==} 2254 + peerDependencies: 2255 + svelte: ^3.55 || ^4.0.0-next.0 || ^4.0 || ^5.0.0-next.0 2256 + typescript: ^4.9.4 || ^5.0.0 2257 + 2258 + svelte@5.17.3: 2259 + resolution: {integrity: sha512-eLgtpR2JiTgeuNQRCDcLx35Z7Lu9Qe09GPOz+gvtR9nmIZu5xgFd6oFiLGQlxLD0/u7xVyF5AUkjDVyFHe6Bvw==} 2260 + engines: {node: '>=18'} 2261 + 2156 2262 tiny-glob@0.2.9: 2157 2263 resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==} 2158 2264 ··· 2434 2540 youch@3.3.4: 2435 2541 resolution: {integrity: sha512-UeVBXie8cA35DS6+nBkls68xaBBXCye0CNznrhszZjTbRVnJKQuNsyLKBTTL4ln1o1rh2PKtv35twV7irj5SEg==} 2436 2542 2543 + zimmerframe@1.1.2: 2544 + resolution: {integrity: sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w==} 2545 + 2437 2546 zod-to-json-schema@3.24.1: 2438 2547 resolution: {integrity: sha512-3h08nf3Vw3Wl3PK+q3ow/lIil81IT2Oa7YpQyUUDsEWbXveMesdfK1xBd2RhCkynwZndAxixji/7SYJJowr62w==} 2439 2548 peerDependencies: ··· 2452 2561 resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} 2453 2562 2454 2563 snapshots: 2564 + 2565 + '@ampproject/remapping@2.3.0': 2566 + dependencies: 2567 + '@jridgewell/gen-mapping': 0.3.8 2568 + '@jridgewell/trace-mapping': 0.3.25 2455 2569 2456 2570 '@astrojs/cloudflare@12.1.0(@types/node@22.10.5)(astro@5.1.5(@types/node@22.10.5)(rollup@4.30.1)(typescript@5.7.3))': 2457 2571 dependencies: ··· 2518 2632 dependencies: 2519 2633 prismjs: 1.29.0 2520 2634 2635 + '@astrojs/svelte@7.0.3(@types/node@22.10.5)(astro@5.1.5(@types/node@22.10.5)(rollup@4.30.1)(typescript@5.7.3))(svelte@5.17.3)(typescript@5.7.3)': 2636 + dependencies: 2637 + '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.17.3)(vite@6.0.7(@types/node@22.10.5)) 2638 + astro: 5.1.5(@types/node@22.10.5)(rollup@4.30.1)(typescript@5.7.3) 2639 + svelte: 5.17.3 2640 + svelte2tsx: 0.7.34(svelte@5.17.3)(typescript@5.7.3) 2641 + typescript: 5.7.3 2642 + vite: 6.0.7(@types/node@22.10.5) 2643 + transitivePeerDependencies: 2644 + - '@types/node' 2645 + - jiti 2646 + - less 2647 + - lightningcss 2648 + - sass 2649 + - sass-embedded 2650 + - stylus 2651 + - sugarss 2652 + - supports-color 2653 + - terser 2654 + - tsx 2655 + - yaml 2656 + 2521 2657 '@astrojs/telemetry@3.2.0': 2522 2658 dependencies: 2523 2659 ci-info: 4.1.0 ··· 3387 3523 transitivePeerDependencies: 3388 3524 - supports-color 3389 3525 3526 + '@jridgewell/gen-mapping@0.3.8': 3527 + dependencies: 3528 + '@jridgewell/set-array': 1.2.1 3529 + '@jridgewell/sourcemap-codec': 1.5.0 3530 + '@jridgewell/trace-mapping': 0.3.25 3531 + 3390 3532 '@jridgewell/resolve-uri@3.1.2': {} 3391 3533 3534 + '@jridgewell/set-array@1.2.1': {} 3535 + 3392 3536 '@jridgewell/sourcemap-codec@1.5.0': {} 3393 3537 3538 + '@jridgewell/trace-mapping@0.3.25': 3539 + dependencies: 3540 + '@jridgewell/resolve-uri': 3.1.2 3541 + '@jridgewell/sourcemap-codec': 1.5.0 3542 + 3394 3543 '@jridgewell/trace-mapping@0.3.9': 3395 3544 dependencies: 3396 3545 '@jridgewell/resolve-uri': 3.1.2 3397 3546 '@jridgewell/sourcemap-codec': 1.5.0 3547 + 3548 + '@nanostores/persistent@0.10.2(nanostores@0.11.3)': 3549 + dependencies: 3550 + nanostores: 0.11.3 3398 3551 3399 3552 '@nodelib/fs.scandir@2.1.5': 3400 3553 dependencies: ··· 3841 3994 '@smithy/types': 4.1.0 3842 3995 tslib: 2.8.1 3843 3996 3997 + '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.17.3)(vite@6.0.7(@types/node@22.10.5)))(svelte@5.17.3)(vite@6.0.7(@types/node@22.10.5))': 3998 + dependencies: 3999 + '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.17.3)(vite@6.0.7(@types/node@22.10.5)) 4000 + debug: 4.4.0 4001 + svelte: 5.17.3 4002 + vite: 6.0.7(@types/node@22.10.5) 4003 + transitivePeerDependencies: 4004 + - supports-color 4005 + 4006 + '@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.17.3)(vite@6.0.7(@types/node@22.10.5))': 4007 + dependencies: 4008 + '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.17.3)(vite@6.0.7(@types/node@22.10.5)))(svelte@5.17.3)(vite@6.0.7(@types/node@22.10.5)) 4009 + debug: 4.4.0 4010 + deepmerge: 4.3.1 4011 + kleur: 4.1.5 4012 + magic-string: 0.30.17 4013 + svelte: 5.17.3 4014 + vite: 6.0.7(@types/node@22.10.5) 4015 + vitefu: 1.0.5(vite@6.0.7(@types/node@22.10.5)) 4016 + transitivePeerDependencies: 4017 + - supports-color 4018 + 3844 4019 '@types/cookie@0.6.0': {} 3845 4020 3846 4021 '@types/debug@4.1.12': ··· 3875 4050 3876 4051 '@ungap/structured-clone@1.2.1': {} 3877 4052 4053 + acorn-typescript@1.4.13(acorn@8.14.0): 4054 + dependencies: 4055 + acorn: 8.14.0 4056 + 3878 4057 acorn-walk@8.3.4: 3879 4058 dependencies: 3880 4059 acorn: 8.14.0 ··· 4135 4314 dependencies: 4136 4315 character-entities: 2.0.2 4137 4316 4317 + dedent-js@1.0.1: {} 4318 + 4319 + deepmerge@4.3.1: {} 4320 + 4138 4321 defu@6.1.4: {} 4139 4322 4140 4323 dequal@2.0.3: {} ··· 4253 4436 4254 4437 escape-string-regexp@5.0.0: {} 4255 4438 4439 + esm-env@1.2.2: {} 4440 + 4256 4441 esprima@4.0.1: {} 4257 4442 4443 + esrap@1.4.2: 4444 + dependencies: 4445 + '@jridgewell/sourcemap-codec': 1.5.0 4446 + 4258 4447 estree-walker@0.6.1: {} 4259 4448 4260 4449 estree-walker@2.0.2: {} ··· 4471 4660 is-number@7.0.0: {} 4472 4661 4473 4662 is-plain-obj@4.1.0: {} 4663 + 4664 + is-reference@3.0.3: 4665 + dependencies: 4666 + '@types/estree': 1.0.6 4474 4667 4475 4668 is-wsl@3.1.0: 4476 4669 dependencies: ··· 4498 4691 pify: 4.0.1 4499 4692 strip-bom: 3.0.0 4500 4693 4694 + locate-character@3.0.0: {} 4695 + 4501 4696 locate-path@5.0.0: 4502 4697 dependencies: 4503 4698 p-locate: 4.1.0 4504 4699 4505 4700 longest-streak@3.1.0: {} 4701 + 4702 + lower-case@2.0.2: 4703 + dependencies: 4704 + tslib: 2.8.1 4506 4705 4507 4706 lru-cache@10.4.3: {} 4508 4707 ··· 4876 5075 4877 5076 nanoid@3.3.8: {} 4878 5077 5078 + nanostores@0.11.3: {} 5079 + 4879 5080 neotraverse@0.6.18: {} 4880 5081 4881 5082 nlcst-to-string@4.0.0: 4882 5083 dependencies: 4883 5084 '@types/nlcst': 2.0.3 5085 + 5086 + no-case@3.0.4: 5087 + dependencies: 5088 + lower-case: 2.0.2 5089 + tslib: 2.8.1 4884 5090 4885 5091 node-fetch-native@1.6.4: {} 4886 5092 ··· 4936 5142 dependencies: 4937 5143 entities: 4.5.0 4938 5144 5145 + pascal-case@3.1.2: 5146 + dependencies: 5147 + no-case: 3.0.4 5148 + tslib: 2.8.1 5149 + 4939 5150 path-exists@4.0.0: {} 4940 5151 4941 5152 path-parse@1.0.7: {} ··· 5256 5467 5257 5468 supports-preserve-symlinks-flag@1.0.0: {} 5258 5469 5470 + svelte2tsx@0.7.34(svelte@5.17.3)(typescript@5.7.3): 5471 + dependencies: 5472 + dedent-js: 1.0.1 5473 + pascal-case: 3.1.2 5474 + svelte: 5.17.3 5475 + typescript: 5.7.3 5476 + 5477 + svelte@5.17.3: 5478 + dependencies: 5479 + '@ampproject/remapping': 2.3.0 5480 + '@jridgewell/sourcemap-codec': 1.5.0 5481 + '@types/estree': 1.0.6 5482 + acorn: 8.14.0 5483 + acorn-typescript: 1.4.13(acorn@8.14.0) 5484 + aria-query: 5.3.2 5485 + axobject-query: 4.1.0 5486 + clsx: 2.1.1 5487 + esm-env: 1.2.2 5488 + esrap: 1.4.2 5489 + is-reference: 3.0.3 5490 + locate-character: 3.0.0 5491 + magic-string: 0.30.17 5492 + zimmerframe: 1.1.2 5493 + 5259 5494 tiny-glob@0.2.9: 5260 5495 dependencies: 5261 5496 globalyzer: 0.1.0 ··· 5478 5713 cookie: 0.7.2 5479 5714 mustache: 4.2.0 5480 5715 stacktracey: 2.1.8 5716 + 5717 + zimmerframe@1.1.2: {} 5481 5718 5482 5719 zod-to-json-schema@3.24.1(zod@3.24.1): 5483 5720 dependencies:
public/acursed.png

This is a binary file and will not be displayed.

public/bind.jpg

This is a binary file and will not be displayed.

public/bond.jpeg

This is a binary file and will not be displayed.

public/claw.jpg

This is a binary file and will not be displayed.

public/darksight.png

This is a binary file and will not be displayed.

public/eldritch_adaptability.png

This is a binary file and will not be displayed.

public/eldritch_assault.png

This is a binary file and will not be displayed.

public/eldritch_enchantment.jpg

This is a binary file and will not be displayed.

public/eldritch_visage.jpg

This is a binary file and will not be displayed.

public/faceless.png

This is a binary file and will not be displayed.

public/fate_scriber.png

This is a binary file and will not be displayed.

-9
public/favicon.svg
··· 1 - <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 128 128"> 2 - <path d="M50.4 78.5a75.1 75.1 0 0 0-28.5 6.9l24.2-65.7c.7-2 1.9-3.2 3.4-3.2h29c1.5 0 2.7 1.2 3.4 3.2l24.2 65.7s-11.6-7-28.5-7L67 45.5c-.4-1.7-1.6-2.8-2.9-2.8-1.3 0-2.5 1.1-2.9 2.7L50.4 78.5Zm-1.1 28.2Zm-4.2-20.2c-2 6.6-.6 15.8 4.2 20.2a17.5 17.5 0 0 1 .2-.7 5.5 5.5 0 0 1 5.7-4.5c2.8.1 4.3 1.5 4.7 4.7.2 1.1.2 2.3.2 3.5v.4c0 2.7.7 5.2 2.2 7.4a13 13 0 0 0 5.7 4.9v-.3l-.2-.3c-1.8-5.6-.5-9.5 4.4-12.8l1.5-1a73 73 0 0 0 3.2-2.2 16 16 0 0 0 6.8-11.4c.3-2 .1-4-.6-6l-.8.6-1.6 1a37 37 0 0 1-22.4 2.7c-5-.7-9.7-2-13.2-6.2Z" /> 3 - <style> 4 - path { fill: #000; } 5 - @media (prefers-color-scheme: dark) { 6 - path { fill: #FFF; } 7 - } 8 - </style> 9 - </svg>
public/instill.jpg

This is a binary file and will not be displayed.

public/locked.png

This is a binary file and will not be displayed.

public/regenerate.jpg

This is a binary file and will not be displayed.

public/rune_seeker.png

This is a binary file and will not be displayed.

public/spray.png

This is a binary file and will not be displayed.

public/whisperer.png

This is a binary file and will not be displayed.

-1
src/assets/astro.svg
··· 1 - <svg xmlns="http://www.w3.org/2000/svg" fill="none" width="115" height="48"><path fill="#17191E" d="M7.77 36.35C6.4 35.11 6 32.51 6.57 30.62c.99 1.2 2.35 1.57 3.75 1.78 2.18.33 4.31.2 6.33-.78.23-.12.44-.27.7-.42.18.55.23 1.1.17 1.67a4.56 4.56 0 0 1-1.94 3.23c-.43.32-.9.61-1.34.91-1.38.94-1.76 2.03-1.24 3.62l.05.17a3.63 3.63 0 0 1-1.6-1.38 3.87 3.87 0 0 1-.63-2.1c0-.37 0-.74-.05-1.1-.13-.9-.55-1.3-1.33-1.32a1.56 1.56 0 0 0-1.63 1.26c0 .06-.03.12-.05.2Z"/><path fill="url(#a)" d="M7.77 36.35C6.4 35.11 6 32.51 6.57 30.62c.99 1.2 2.35 1.57 3.75 1.78 2.18.33 4.31.2 6.33-.78.23-.12.44-.27.7-.42.18.55.23 1.1.17 1.67a4.56 4.56 0 0 1-1.94 3.23c-.43.32-.9.61-1.34.91-1.38.94-1.76 2.03-1.24 3.62l.05.17a3.63 3.63 0 0 1-1.6-1.38 3.87 3.87 0 0 1-.63-2.1c0-.37 0-.74-.05-1.1-.13-.9-.55-1.3-1.33-1.32a1.56 1.56 0 0 0-1.63 1.26c0 .06-.03.12-.05.2Z"/><path fill="#17191E" d="M.02 30.31s4.02-1.95 8.05-1.95l3.04-9.4c.11-.45.44-.76.82-.76.37 0 .7.31.82.76l3.04 9.4c4.77 0 8.05 1.95 8.05 1.95L17 11.71c-.2-.56-.53-.91-.98-.91H7.83c-.44 0-.76.35-.97.9L.02 30.31Zm42.37-5.97c0 1.64-2.05 2.62-4.88 2.62-1.85 0-2.5-.45-2.5-1.41 0-1 .8-1.49 2.65-1.49 1.67 0 3.09.03 4.73.23v.05Zm.03-2.04a21.37 21.37 0 0 0-4.37-.36c-5.32 0-7.82 1.25-7.82 4.18 0 3.04 1.71 4.2 5.68 4.2 3.35 0 5.63-.84 6.46-2.92h.14c-.03.5-.05 1-.05 1.4 0 1.07.18 1.16 1.06 1.16h4.15a16.9 16.9 0 0 1-.36-4c0-1.67.06-2.93.06-4.62 0-3.45-2.07-5.64-8.56-5.64-2.8 0-5.9.48-8.26 1.19.22.93.54 2.83.7 4.06 2.04-.96 4.95-1.37 7.2-1.37 3.11 0 3.97.71 3.97 2.15v.57Zm11.37 3c-.56.07-1.33.07-2.12.07-.83 0-1.6-.03-2.12-.1l-.02.58c0 2.85 1.87 4.52 8.45 4.52 6.2 0 8.2-1.64 8.2-4.55 0-2.74-1.33-4.09-7.2-4.39-4.58-.2-4.99-.7-4.99-1.28 0-.66.59-1 3.65-1 3.18 0 4.03.43 4.03 1.35v.2a46.13 46.13 0 0 1 4.24.03l.02-.55c0-3.36-2.8-4.46-8.2-4.46-6.08 0-8.13 1.49-8.13 4.39 0 2.6 1.64 4.23 7.48 4.48 4.3.14 4.77.62 4.77 1.28 0 .7-.7 1.03-3.71 1.03-3.47 0-4.35-.48-4.35-1.47v-.13Zm19.82-12.05a17.5 17.5 0 0 1-6.24 3.48c.03.84.03 2.4.03 3.24l1.5.02c-.02 1.63-.04 3.6-.04 4.9 0 3.04 1.6 5.32 6.58 5.32 2.1 0 3.5-.23 5.23-.6a43.77 43.77 0 0 1-.46-4.13c-1.03.34-2.34.53-3.78.53-2 0-2.82-.55-2.82-2.13 0-1.37 0-2.65.03-3.84 2.57.02 5.13.07 6.64.11-.02-1.18.03-2.9.1-4.04-2.2.04-4.65.07-6.68.07l.07-2.93h-.16Zm13.46 6.04a767.33 767.33 0 0 1 .07-3.18H82.6c.07 1.96.07 3.98.07 6.92 0 2.95-.03 4.99-.07 6.93h5.18c-.09-1.37-.11-3.68-.11-5.65 0-3.1 1.26-4 4.12-4 1.33 0 2.28.16 3.1.46.03-1.16.26-3.43.4-4.43-.86-.25-1.81-.41-2.96-.41-2.46-.03-4.26.98-5.1 3.38l-.17-.02Zm22.55 3.65c0 2.5-1.8 3.66-4.64 3.66-2.81 0-4.61-1.1-4.61-3.66s1.82-3.52 4.61-3.52c2.82 0 4.64 1.03 4.64 3.52Zm4.71-.11c0-4.96-3.87-7.18-9.35-7.18-5.5 0-9.23 2.22-9.23 7.18 0 4.94 3.49 7.59 9.21 7.59 5.77 0 9.37-2.65 9.37-7.6Z"/><defs><linearGradient id="a" x1="6.33" x2="19.43" y1="40.8" y2="34.6" gradientUnits="userSpaceOnUse"><stop stop-color="#D83333"/><stop offset="1" stop-color="#F041FF"/></linearGradient></defs></svg>
-1
src/assets/background.svg
··· 1 - <svg xmlns="http://www.w3.org/2000/svg" width="1440" height="1024" fill="none"><path fill="url(#a)" fill-rule="evenodd" d="M-217.58 475.75c91.82-72.02 225.52-29.38 341.2-44.74C240 415.56 372.33 315.14 466.77 384.9c102.9 76.02 44.74 246.76 90.31 366.31 29.83 78.24 90.48 136.14 129.48 210.23 57.92 109.99 169.67 208.23 155.9 331.77-13.52 121.26-103.42 264.33-224.23 281.37-141.96 20.03-232.72-220.96-374.06-196.99-151.7 25.73-172.68 330.24-325.85 315.72-128.6-12.2-110.9-230.73-128.15-358.76-12.16-90.14 65.87-176.25 44.1-264.57-26.42-107.2-167.12-163.46-176.72-273.45-10.15-116.29 33.01-248.75 124.87-320.79Z" clip-rule="evenodd" style="opacity:.154"/><path fill="url(#b)" fill-rule="evenodd" d="M1103.43 115.43c146.42-19.45 275.33-155.84 413.5-103.59 188.09 71.13 409 212.64 407.06 413.88-1.94 201.25-259.28 278.6-414.96 405.96-130 106.35-240.24 294.39-405.6 265.3-163.7-28.8-161.93-274.12-284.34-386.66-134.95-124.06-436-101.46-445.82-284.6-9.68-180.38 247.41-246.3 413.54-316.9 101.01-42.93 207.83 21.06 316.62 6.61Z" clip-rule="evenodd" style="opacity:.154"/><defs><linearGradient id="b" x1="373" x2="1995.44" y1="1100" y2="118.03" gradientUnits="userSpaceOnUse"><stop stop-color="#D83333"/><stop offset="1" stop-color="#F041FF"/></linearGradient><linearGradient id="a" x1="107.37" x2="1130.66" y1="1993.35" y2="1026.31" gradientUnits="userSpaceOnUse"><stop stop-color="#3245FF"/><stop offset="1" stop-color="#BC52EE"/></linearGradient></defs></svg>
-209
src/components/Welcome.astro
··· 1 - --- 2 - import astroLogo from '../assets/astro.svg'; 3 - import background from '../assets/background.svg'; 4 - --- 5 - 6 - <div id="container"> 7 - <img id="background" src={background.src} alt="" fetchpriority="high" /> 8 - <main> 9 - <section id="hero"> 10 - <a href="https://astro.build" 11 - ><img src={astroLogo.src} width="115" height="48" alt="Astro Homepage" /></a 12 - > 13 - <h1> 14 - To get started, open the <code><pre>src/pages</pre></code> directory in your project. 15 - </h1> 16 - <section id="links"> 17 - <a class="button" href="https://docs.astro.build">Read our docs</a> 18 - <a href="https://astro.build/chat" 19 - >Join our Discord <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 127.14 96.36" 20 - ><path 21 - fill="currentColor" 22 - d="M107.7 8.07A105.15 105.15 0 0 0 81.47 0a72.06 72.06 0 0 0-3.36 6.83 97.68 97.68 0 0 0-29.11 0A72.37 72.37 0 0 0 45.64 0a105.89 105.89 0 0 0-26.25 8.09C2.79 32.65-1.71 56.6.54 80.21a105.73 105.73 0 0 0 32.17 16.15 77.7 77.7 0 0 0 6.89-11.11 68.42 68.42 0 0 1-10.85-5.18c.91-.66 1.8-1.34 2.66-2a75.57 75.57 0 0 0 64.32 0c.87.71 1.76 1.39 2.66 2a68.68 68.68 0 0 1-10.87 5.19 77 77 0 0 0 6.89 11.1 105.25 105.25 0 0 0 32.19-16.14c2.64-27.38-4.51-51.11-18.9-72.15ZM42.45 65.69C36.18 65.69 31 60 31 53s5-12.74 11.43-12.74S54 46 53.89 53s-5.05 12.69-11.44 12.69Zm42.24 0C78.41 65.69 73.25 60 73.25 53s5-12.74 11.44-12.74S96.23 46 96.12 53s-5.04 12.69-11.43 12.69Z" 23 - ></path></svg 24 - > 25 - </a> 26 - </section> 27 - </section> 28 - </main> 29 - 30 - <a href="https://astro.build/blog/astro-5/" id="news" class="box"> 31 - <svg width="32" height="32" fill="none" xmlns="http://www.w3.org/2000/svg" 32 - ><path 33 - d="M24.667 12c1.333 1.414 2 3.192 2 5.334 0 4.62-4.934 5.7-7.334 12C18.444 28.567 18 27.456 18 26c0-4.642 6.667-7.053 6.667-14Zm-5.334-5.333c1.6 1.65 2.4 3.43 2.4 5.333 0 6.602-8.06 7.59-6.4 17.334C13.111 27.787 12 25.564 12 22.666c0-4.434 7.333-8 7.333-16Zm-6-5.333C15.111 3.555 16 5.556 16 7.333c0 8.333-11.333 10.962-5.333 22-3.488-.774-6-4-6-8 0-8.667 8.666-10 8.666-20Z" 34 - fill="#111827"></path></svg 35 - > 36 - <h2>What's New in Astro 5.0?</h2> 37 - <p> 38 - From content layers to server islands, click to learn more about the new features and 39 - improvements in Astro 5.0 40 - </p> 41 - </a> 42 - </div> 43 - 44 - <style> 45 - #background { 46 - position: fixed; 47 - top: 0; 48 - left: 0; 49 - width: 100%; 50 - height: 100%; 51 - z-index: -1; 52 - filter: blur(100px); 53 - } 54 - 55 - #container { 56 - font-family: Inter, Roboto, 'Helvetica Neue', 'Arial Nova', 'Nimbus Sans', Arial, sans-serif; 57 - height: 100%; 58 - } 59 - 60 - main { 61 - height: 100%; 62 - display: flex; 63 - justify-content: center; 64 - } 65 - 66 - #hero { 67 - display: flex; 68 - align-items: start; 69 - flex-direction: column; 70 - justify-content: center; 71 - padding: 16px; 72 - } 73 - 74 - h1 { 75 - font-size: 22px; 76 - margin-top: 0.25em; 77 - } 78 - 79 - #links { 80 - display: flex; 81 - gap: 16px; 82 - } 83 - 84 - #links a { 85 - display: flex; 86 - align-items: center; 87 - padding: 10px 12px; 88 - color: #111827; 89 - text-decoration: none; 90 - transition: color 0.2s; 91 - } 92 - 93 - #links a:hover { 94 - color: rgb(78, 80, 86); 95 - } 96 - 97 - #links a svg { 98 - height: 1em; 99 - margin-left: 8px; 100 - } 101 - 102 - #links a.button { 103 - color: white; 104 - background: linear-gradient(83.21deg, #3245ff 0%, #bc52ee 100%); 105 - box-shadow: 106 - inset 0 0 0 1px rgba(255, 255, 255, 0.12), 107 - inset 0 -2px 0 rgba(0, 0, 0, 0.24); 108 - border-radius: 10px; 109 - } 110 - 111 - #links a.button:hover { 112 - color: rgb(230, 230, 230); 113 - box-shadow: none; 114 - } 115 - 116 - pre { 117 - font-family: ui-monospace, 'Cascadia Code', 'Source Code Pro', Menlo, Consolas, 118 - 'DejaVu Sans Mono', monospace; 119 - font-weight: normal; 120 - background: linear-gradient(14deg, #d83333 0%, #f041ff 100%); 121 - -webkit-background-clip: text; 122 - -webkit-text-fill-color: transparent; 123 - background-clip: text; 124 - margin: 0; 125 - } 126 - 127 - h2 { 128 - margin: 0 0 1em; 129 - font-weight: normal; 130 - color: #111827; 131 - font-size: 20px; 132 - } 133 - 134 - p { 135 - color: #4b5563; 136 - font-size: 16px; 137 - line-height: 24px; 138 - letter-spacing: -0.006em; 139 - margin: 0; 140 - } 141 - 142 - code { 143 - display: inline-block; 144 - background: 145 - linear-gradient(66.77deg, #f3cddd 0%, #f5cee7 100%) padding-box, 146 - linear-gradient(155deg, #d83333 0%, #f041ff 18%, #f5cee7 45%) border-box; 147 - border-radius: 8px; 148 - border: 1px solid transparent; 149 - padding: 6px 8px; 150 - } 151 - 152 - .box { 153 - padding: 16px; 154 - background: rgba(255, 255, 255, 1); 155 - border-radius: 16px; 156 - border: 1px solid white; 157 - } 158 - 159 - #news { 160 - position: absolute; 161 - bottom: 16px; 162 - right: 16px; 163 - max-width: 300px; 164 - text-decoration: none; 165 - transition: background 0.2s; 166 - backdrop-filter: blur(50px); 167 - } 168 - 169 - #news:hover { 170 - background: rgba(255, 255, 255, 0.55); 171 - } 172 - 173 - @media screen and (max-height: 368px) { 174 - #news { 175 - display: none; 176 - } 177 - } 178 - 179 - @media screen and (max-width: 768px) { 180 - #container { 181 - display: flex; 182 - flex-direction: column; 183 - } 184 - 185 - #hero { 186 - display: block; 187 - padding-top: 10%; 188 - } 189 - 190 - #links { 191 - flex-wrap: wrap; 192 - } 193 - 194 - #links a.button { 195 - padding: 14px 18px; 196 - } 197 - 198 - #news { 199 - right: 16px; 200 - left: 16px; 201 - bottom: 2.5rem; 202 - max-width: 100%; 203 - } 204 - 205 - h1 { 206 - line-height: 1.5; 207 - } 208 - } 209 - </style>
+29
src/components/points.svelte
··· 1 + <script> 2 + import { mutatePowers, powers } from "@/stores/powers"; 3 + </script> 4 + 5 + <div class="points"> 6 + <button 7 + onclick={() => { 8 + console.log( 9 + $powers.powers.length, 10 + $powers.maxPowers - 1, 11 + $powers.powers.length < $powers.maxPowers - 1 12 + ); 13 + if ($powers.powers.length > $powers.maxPowers - 1) { 14 + mutatePowers((n) => ({ ...n, maxPowers: n.powers.length })); 15 + return; 16 + } 17 + mutatePowers((n) => ({ ...n, maxPowers: n.maxPowers - 1 })); 18 + }} 19 + > 20 + - 21 + </button> 22 + <meter value={$powers.powers.length} max={$powers.maxPowers}></meter> 23 + {$powers.powers.length}/{$powers.maxPowers} 24 + <button 25 + onclick={() => mutatePowers((n) => ({ ...n, maxPowers: n.maxPowers + 1 }))} 26 + > 27 + + 28 + </button> 29 + </div>
+95
src/components/power.svelte
··· 1 + <script lang="ts"> 2 + import { type Power, type Locked, isUnlocked } from "@/powers"; 3 + import Self from "./power.svelte"; 4 + 5 + const { power }: { power: Power | Locked } = $props(); 6 + </script> 7 + 8 + <div class="wrapper"> 9 + <div class={`power ${isUnlocked(power) ? "unlocked" : "locked"}`}> 10 + <img 11 + {...isUnlocked(power) 12 + ? power.image 13 + : { 14 + src: "/locked.png", 15 + alt: "", 16 + }} 17 + /> 18 + {#if isUnlocked(power)} 19 + <details> 20 + <summary>{power.name}</summary> 21 + <p>{power.description}</p> 22 + </details> 23 + {:else} 24 + <p>Locked</p> 25 + {/if} 26 + </div> 27 + <div class="children" style={`--rows: ${power.children.length}`}> 28 + {#each power.children as child} 29 + <Self power={child} /> 30 + {/each} 31 + </div> 32 + </div> 33 + 34 + <style> 35 + /* positions */ 36 + .wrapper { 37 + display: flex; 38 + align-items: stretch; 39 + width: fit-content; 40 + } 41 + 42 + .power { 43 + width: 25rem; 44 + flex-shrink: 0; 45 + margin-right: 2rem; 46 + } 47 + .power.locked { 48 + width: 15rem; 49 + } 50 + 51 + .children { 52 + width: fit-content; 53 + height: 100%; 54 + display: grid; 55 + grid-template-rows: repeat(var(--rows), 1fr); 56 + } 57 + 58 + /* looks */ 59 + 60 + .power { 61 + display: grid; 62 + grid-template-columns: 5rem 1fr; 63 + align-items: center; 64 + gap: 0.5rem; 65 + 66 + & img { 67 + width: 5rem; 68 + height: 5rem; 69 + object-fit: cover; 70 + border-radius: 2.5rem; 71 + } 72 + & details { 73 + & summary { 74 + list-style: none; 75 + &::after { 76 + content: "?"; 77 + color: Background; 78 + margin-left: 1rem; 79 + width: 1.25em; 80 + height: 1.25em; 81 + border-radius: 50%; 82 + line-height: 1.25em; 83 + text-align: center; 84 + display: inline-block; 85 + background-color: white; 86 + } 87 + } 88 + & > p { 89 + position: absolute; 90 + width: 45ch; 91 + background-color: Background; 92 + } 93 + } 94 + } 95 + </style>
-5
src/env.d.ts
··· 1 - type Runtime = import("@astrojs/cloudflare").Runtime<Env>; 2 - 3 - declare namespace App { 4 - interface Locals extends Runtime {} 5 - }
-22
src/layouts/Layout.astro
··· 1 - <!doctype html> 2 - <html lang="en"> 3 - <head> 4 - <meta charset="UTF-8" /> 5 - <meta name="viewport" content="width=device-width" /> 6 - <link rel="icon" type="image/svg+xml" href="/favicon.svg" /> 7 - <meta name="generator" content={Astro.generator} /> 8 - <title>Astro Basics</title> 9 - </head> 10 - <body> 11 - <slot /> 12 - </body> 13 - </html> 14 - 15 - <style> 16 - html, 17 - body { 18 - margin: 0; 19 - width: 100%; 20 - height: 100%; 21 - } 22 - </style>
+87
src/layouts/base.astro
··· 1 + --- 2 + export interface Props { 3 + title: string; 4 + } 5 + 6 + const { title } = Astro.props; 7 + --- 8 + 9 + <!doctype html> 10 + <html lang="en"> 11 + <head> 12 + <meta charset="UTF-8" /> 13 + <meta name="viewport" content="width=device-width" /> 14 + <link rel="icon" type="image/svg+xml" href="/favicon.svg" /> 15 + <meta name="generator" content={Astro.generator} /> 16 + <title>{title}</title> 17 + 18 + <style is:global> 19 + /* instantly overwrite reset */ 20 + @layer reset { 21 + :root { 22 + font-size: 62.5%; 23 + } 24 + 25 + body { 26 + font-size: 1.6rem; 27 + font-family: system-ui, sans-serif; 28 + line-height: 1.5; 29 + -webkit-font-smoothing: antialiased; 30 + } 31 + 32 + *, 33 + *::before, 34 + *::after { 35 + margin: 0; 36 + padding: 0; 37 + box-sizing: border-box; 38 + appearance: none; 39 + color-scheme: dark; 40 + } 41 + 42 + img, 43 + picture, 44 + video, 45 + canvas, 46 + svg { 47 + display: block; 48 + max-width: 100%; 49 + } 50 + 51 + input, 52 + button, 53 + textarea, 54 + select { 55 + font: inherit; 56 + } 57 + 58 + p, 59 + h1, 60 + h2, 61 + h3, 62 + h4, 63 + h5, 64 + h6 { 65 + overflow-wrap: break-word; 66 + } 67 + 68 + p { 69 + text-wrap: pretty; 70 + } 71 + 72 + h1, 73 + h2, 74 + h3, 75 + h4, 76 + h5, 77 + h6 { 78 + text-wrap: balance; 79 + } 80 + } 81 + </style> 82 + <slot name="head" /> 83 + </head> 84 + <body> 85 + <slot /> 86 + </body> 87 + </html>
+39 -7
src/pages/index.astro
··· 1 1 --- 2 - import Welcome from '../components/Welcome.astro'; 3 - import Layout from '../layouts/Layout.astro'; 2 + import Base from "@/layouts/base.astro"; 3 + import Points from "@/components/points.svelte"; 4 + import Power from "@/components/power.svelte"; 4 5 5 - // Welcome to Astro! Wondering what to do next? Check out the Astro documentation at https://docs.astro.build 6 - // Don't want to use any of this? Delete everything in this file, the `assets`, `components`, and `layouts` directories, and start fresh. 6 + import { powers } from "@/powers"; 7 7 --- 8 8 9 - <Layout> 10 - <Welcome /> 11 - </Layout> 9 + <Base title="Astral Powers"> 10 + <Fragment slot="head"> 11 + <script> 12 + import { powers } from "@/stores/powers"; 13 + 14 + document.getElementById("clear")?.addEventListener("click", () => { 15 + powers.set({ 16 + powers: [], 17 + maxPowers: 1, 18 + }); 19 + }); 20 + </script> 21 + 22 + <style> 23 + #head { 24 + width: 100vw; 25 + height: 75px; 26 + } 27 + 28 + #body { 29 + width: 100vw; 30 + height: calc(100vh - 75px); 31 + } 32 + </style> 33 + </Fragment> 34 + 35 + <header id="head"> 36 + <Points client:load /> 37 + <button id="clear">Clear</button> 38 + </header> 39 + 40 + <main id="body"> 41 + <Power client:load power={powers} /> 42 + </main> 43 + </Base>
+402
src/powers.ts
··· 1 + export interface Power { 2 + status: "unlocked"; 3 + name: string; 4 + description: string; 5 + image: { 6 + src: sunlockedring; 7 + alt: string; 8 + }; 9 + meta: { 10 + name: string; 11 + value: string; 12 + }[]; 13 + children: (Power | Locked)[]; 14 + } 15 + 16 + export interface Locked { 17 + status: "locked"; 18 + children: Locked[]; 19 + } 20 + 21 + export const isUnlocked = (power: Power | Locked): power is Power => { 22 + return power.status === "unlocked"; 23 + } 24 + 25 + export const powers: Power = { 26 + status: "unlocked", 27 + name: "Eldritch Adaptability", 28 + description: 29 + "You become more adaptable to other envirmonents. When entering another world your body automatically adjusts to endure there better. This can include new languages, gills, cultural understanding, and more.", 30 + image: { 31 + src: "/eldritch_adaptability.png", 32 + alt: "", 33 + }, 34 + meta: [], 35 + children: [ 36 + { 37 + status: "unlocked", 38 + name: "Eldritch Assault", 39 + description: 40 + "Use your action to cause your attacks to deal an additional 1d4 Force damage for the next 10 turns, but you take 1d4 Force damage for the next 10 turns. To determine damage, roll 2 dice. Use the lower result for damage dealt to yourself, and the higher for the damage dealt to the target. This dice increases to a d6 at 5th level, d8 at 11th level, and d10 at 17th level. Additionally, you take 1 less damage from this at 7th level, 2 less at 15th level, and 3 less at 19th level. (This cannot reduce damage below 1.)", 41 + image: { 42 + src: "/eldritch_assault.png", 43 + alt: "", 44 + }, 45 + meta: [], 46 + children: [ 47 + { 48 + status: "unlocked", 49 + name: "Spray", 50 + description: 51 + "Choose one damaging cantrip you have access to which gains additional damage dice at 5th, 11th, and 17th level. The cantrip no longer gains aditional damage dice in this way, but can instead target 2 different creatures at level 5, 3 at level 11, and 4 at level 17. You must make an attack roll for each target. The effect can target the same creature multiple times.", 52 + image: { 53 + src: "/spray.png", 54 + alt: "", 55 + }, 56 + meta: [], 57 + children: [ 58 + { 59 + status: "locked", 60 + children: [ 61 + { status: "locked", children: [] }, 62 + { status: "locked", children: [] }, 63 + ], 64 + }, 65 + ], 66 + }, 67 + { 68 + status: "unlocked", 69 + name: "Acursed", 70 + description: 71 + "As an action, choose 1 creature. The creature takes 1d8 force damage whenever you attack it or deal damage (even if the attack misses or it saves). It takes an additional d8 of damage for every extra unique damage type in the attack (ie: 1d6 piercing gets 1d8, 1d6 piercing and 5d6 cold and 2d4 radiant and 1d8 piercing gets 3d8. The creature also gets disadvantage on any d20 test using an ability you choose when you select the creature. This can be cast while raging", 72 + image: { 73 + src: "/acursed.png", 74 + alt: "", 75 + }, 76 + meta: [ 77 + { 78 + name: "Charges", 79 + value: "1x short rest, concentration", 80 + }, 81 + { 82 + name: "Range", 83 + value: "120ft", 84 + }, 85 + ], 86 + children: [ 87 + { 88 + status: "locked", 89 + children: [ 90 + { status: "locked", children: [] }, 91 + { status: "locked", children: [] }, 92 + ], 93 + }, 94 + ], 95 + }, 96 + ], 97 + }, 98 + { 99 + status: "unlocked", 100 + name: "Rune Seeker", 101 + description: 102 + "You may cast Comprehend Languages. This does not cost V, S, or M components. If you use all 3 uses you may cast it using spell slots as a normal spell.", 103 + image: { 104 + src: "rune_seeker.png", 105 + alt: "", 106 + }, 107 + meta: [ 108 + { 109 + name: "Charges", 110 + value: "3x long rest", 111 + }, 112 + ], 113 + children: [ 114 + { 115 + status: "unlocked", 116 + name: "Darksight", 117 + description: 118 + "You gain darkvision and can see through any magical darkness created by your spells or powers. You can allow any creature to see through darkness made by your spells at any point at no cost. If you already have darkvision of 120ft or greater, your darkvision increases by 120ft. This does not affect your ability to see through magical darkness.", 119 + image: { 120 + src: "/darksight.png", 121 + alt: "", 122 + }, 123 + meta: [ 124 + { 125 + name: "Duration", 126 + value: "passive", 127 + }, 128 + { 129 + name: "Range", 130 + value: "120ft", 131 + }, 132 + ], 133 + children: [ 134 + { 135 + status: "locked", 136 + children: [ 137 + { status: "locked", children: [] }, 138 + { status: "locked", children: [] }, 139 + ], 140 + }, 141 + ], 142 + }, 143 + { 144 + status: "unlocked", 145 + name: "Eldritch Visage", 146 + description: 147 + "You gain Truesight for the next round. This requires concentration but do not gain the ability to see into the ethereal plane.", 148 + image: { 149 + src: "/eldritch_visage.jpg", 150 + alt: "", 151 + }, 152 + meta: [ 153 + { 154 + name: "Charges", 155 + value: "1x long rest", 156 + }, 157 + { 158 + name: "Range", 159 + value: "15ft", 160 + }, 161 + ], 162 + children: [ 163 + { 164 + status: "locked", 165 + children: [ 166 + { status: "locked", children: [] }, 167 + { status: "locked", children: [] }, 168 + ], 169 + }, 170 + ], 171 + }, 172 + ], 173 + }, 174 + { 175 + status: "unlocked", 176 + name: "Fate Scriber", 177 + description: 178 + "You may make an attack hit if it was a miss, a miss if it was a hit, a critical hit if it was a hit, or a normal hit if it was a critical hit. This costs a reaction and may be performed on any attack roll.", 179 + image: { 180 + src: "/fate_scriber.png", 181 + alt: "", 182 + }, 183 + meta: [ 184 + { 185 + name: "Charges", 186 + value: "1x long rest", 187 + }, 188 + { 189 + name: "Range", 190 + value: "60ft", 191 + }, 192 + ], 193 + children: [ 194 + { 195 + status: "unlocked", 196 + name: "Regenerate", 197 + description: 198 + "As an action you may target yourself or someone else with access to Astral Powers. You choose an astral power they have access to which recharges on a short or long rest and has been used. The ability can be used. If it can be used multiple times it regains half its uses. If you do not know what abilities they have then an ability is choosen at random by the DM. This cannot be recharged using this same ability.", 199 + image: { 200 + src: "/regenerate.jpg", 201 + alt: "", 202 + }, 203 + meta: [ 204 + { 205 + name: "Charges", 206 + value: "1x long rest", 207 + }, 208 + { 209 + name: "Range", 210 + value: "touch", 211 + }, 212 + ], 213 + children: [ 214 + { 215 + status: "locked", 216 + children: [ 217 + { status: "locked", children: [] }, 218 + { status: "locked", children: [] }, 219 + ], 220 + }, 221 + ], 222 + }, 223 + { 224 + status: "unlocked", 225 + name: "Instill", 226 + description: 227 + "Use your action to allow a creature to take any one of their actions or bonus actions as a free action.", 228 + image: { 229 + src: "/instill.jpg", 230 + alt: "", 231 + }, 232 + meta: [ 233 + { 234 + name: "Charges", 235 + value: "proficiency x short rest", 236 + }, 237 + { 238 + name: "Range", 239 + value: "120ft", 240 + }, 241 + ], 242 + children: [ 243 + { 244 + status: "locked", 245 + children: [ 246 + { status: "locked", children: [] }, 247 + { status: "locked", children: [] }, 248 + ], 249 + }, 250 + ], 251 + }, 252 + ], 253 + }, 254 + { 255 + status: "unlocked", 256 + name: "Faceless", 257 + description: 258 + "You may cast disguise self as an action without expending a spell slot. It takes an action to dispell the illusion created this way, and you must pass a DC10 sanity save or choose a different apperance instead of dropping the illusion.", 259 + image: { 260 + src: "/faceless.png", 261 + alt: "", 262 + }, 263 + meta: [], 264 + children: [ 265 + { 266 + status: "unlocked", 267 + name: "Eldritch Enchantment", 268 + description: 269 + "You may cast Friends or Minor Illusion at will as an action. You may also cast Animal Friendship, Charm Person, or Illusiory Script.", 270 + image: { 271 + src: "/eldritch_enchantment.jpg", 272 + alt: "", 273 + }, 274 + meta: [ 275 + { 276 + name: "Charges", 277 + value: "prof bonus x per day (af, cp, is)", 278 + }, 279 + ], 280 + children: [ 281 + { 282 + status: "locked", 283 + children: [ 284 + { status: "locked", children: [] }, 285 + { status: "locked", children: [] }, 286 + ], 287 + }, 288 + ], 289 + }, 290 + { 291 + status: "unlocked", 292 + name: "Whisperer", 293 + description: 294 + "Choose 3 charisma based skills or 2 charisma based skill and 3 musical instruments. You gain proficiency in those skills and instruments.", 295 + image: { 296 + src: "/whisperer.png", 297 + alt: "", 298 + }, 299 + meta: [ 300 + { 301 + name: "Duration", 302 + value: "passive", 303 + }, 304 + ], 305 + children: [ 306 + { 307 + status: "locked", 308 + children: [ 309 + { status: "locked", children: [] }, 310 + { status: "locked", children: [] }, 311 + ], 312 + }, 313 + ], 314 + }, 315 + ], 316 + }, 317 + { 318 + status: "unlocked", 319 + name: "Bind", 320 + description: 321 + "As an action, target 2 creatures you can see that are within 15ft of each other. The creatures must make a dex save (DC equals 9 + half your proficieny bonus + any ability modifier of your choosing) or they are tied together. If one creature passes the save, the other creature is dragged to the creature who saved, otherwise they are both moved to a tile between them. If either creature moves, the other creature moves with it and they stay in the same position relative to each other. They are both considered grappled, with the exception of the advantage/disadvantage, which is replaced to a +2 and -2 respectivley. This requires concentration and lasts up to 5 turns.", 322 + image: { 323 + src: "/bind.jpg", 324 + alt: "", 325 + }, 326 + meta: [ 327 + { 328 + name: "Duration", 329 + value: "30 seconds, concentration", 330 + }, 331 + { 332 + name: "Charges", 333 + value: "prof bonus x per short rest", 334 + }, 335 + { 336 + name: "Range", 337 + value: "120ft", 338 + }, 339 + ], 340 + children: [ 341 + { 342 + status: "unlocked", 343 + name: "Bond", 344 + description: 345 + "You may bond to a willing creature once after gaining this power. This creature becomes your familiar and gains all the boons of find familiar and none of the drawbacks. This creature must be in the small pocket dimension while another creature from Find Familiar and other similar effects are in the world. The bonded creature cannot die and gains an ability score improvement when you reach levels 4, 8, 12, 16, 19, and 20. You do not gain ASIs retroactivley upon bonding. If you choose to bond to a familiar, the creature gains the additional boons listed and you may negotiate new powers, abilities, or improvements with your DM. If the creature you bond to chooses to end your bond, you loose this feature and gain one extra astral power point. Regaining this feature after loosing it allows you to choose a new creature. When a creature chooses to break its bond with you it will gain the ability to return to any point it knows in its home reality once, in order to leave.", 346 + image: { 347 + src: "/bond.jpeg", 348 + alt: "", 349 + }, 350 + meta: [ 351 + { 352 + name: "Charges", 353 + value: "1x unlocked (bond), 1x short rest (revive)", 354 + }, 355 + { 356 + name: "Range", 357 + value: "touch", 358 + }, 359 + ], 360 + children: [ 361 + { 362 + status: "locked", 363 + children: [ 364 + { status: "locked", children: [] }, 365 + { status: "locked", children: [] }, 366 + ], 367 + }, 368 + ], 369 + }, 370 + { 371 + status: "unlocked", 372 + name: "Claw", 373 + description: 374 + "Touch a severed hand which has similar atributes to a crawling claw. The hand becomes a crawling claw which you control for the duration. You can cast spells with a range of touch through it, and control it in ititiative. It takes its turn immediatley after yours, and casting a spell through it takes its action. After the duration of the power, the claw gains sentience and you loose control. It gains the consciencness if the owner of the original owner and can understand your words but not other peoples. You may only have one claw at a time. <br /> <b>Changes from statblock:</b> <br /> The claw shares an alignment with its original owner. It can understand any language, but only when spoken by the animator. The damage type from its attack is determined based on which would deal more damage to the target (accounting for immunity and resistance and bonus damage)", 375 + image: { 376 + src: "/claw.jpg", 377 + alt: "", 378 + }, 379 + meta: [ 380 + { 381 + name: "Duration", 382 + value: "24 hours", 383 + }, 384 + { 385 + name: "Charges", 386 + value: "1x long rest", 387 + }, 388 + ], 389 + children: [ 390 + { 391 + status: "locked", 392 + children: [ 393 + { status: "locked", children: [] }, 394 + { status: "locked", children: [] }, 395 + ], 396 + }, 397 + ], 398 + }, 399 + ], 400 + }, 401 + ], 402 + };
+27
src/stores/powers.ts
··· 1 + import { persistentAtom } from "@nanostores/persistent"; 2 + import type { StoreValue, WritableAtom } from "nanostores"; 3 + 4 + export const powers = persistentAtom<{ 5 + powers: string[]; 6 + maxPowers: number; 7 + }>( 8 + "powers", 9 + { 10 + powers: [], 11 + maxPowers: 1, 12 + }, 13 + { 14 + encode: JSON.stringify, 15 + decode: JSON.parse, 16 + } 17 + ); 18 + 19 + export const mutate = <T>(atom: WritableAtom<T>, fn: (n: T) => T) => { 20 + atom.set(fn(atom.get())); 21 + }; 22 + 23 + export const mutatePowers = ( 24 + fn: (n: StoreValue<typeof powers>) => StoreValue<typeof powers> 25 + ) => { 26 + mutate<StoreValue<typeof powers>>(powers, fn); 27 + };
+5
svelte.config.js
··· 1 + import { vitePreprocess } from '@astrojs/svelte'; 2 + 3 + export default { 4 + preprocess: vitePreprocess(), 5 + }
+8 -8
tsconfig.json
··· 1 1 { 2 2 "extends": "astro/tsconfigs/strict", 3 3 "include": [".astro/types.d.ts", "**/*"], 4 - "exclude": [ 5 - "dist" 6 - ], 7 - "compilerOptions": { 8 - "types": [ 9 - "@cloudflare/workers-types/2023-07-01" 10 - ] 11 - } 4 + "exclude": ["dist"], 5 + "compilerOptions": { 6 + "baseUrl": "./", 7 + "paths": { 8 + "@/*": ["./src/*"] 9 + }, 10 + "types": ["@cloudflare/workers-types/2023-07-01"] 11 + } 12 12 }