diff --git a/site/astro.config.mjs b/site/astro.config.mjs index 64e97a2..6a08544 100644 --- a/site/astro.config.mjs +++ b/site/astro.config.mjs @@ -3,6 +3,7 @@ import { fileURLToPath } from 'url' import { existsSync, lstatSync } from 'fs' import { resolve } from 'path' import compress from 'astro-compress' +import favicons from 'astro-favicons' import icon from 'astro-icon' import mdx from '@astrojs/mdx' import sitemap from '@astrojs/sitemap' @@ -93,7 +94,17 @@ export default defineConfig({ compressHTML: true, site: 'https://pywire.dev', base: '/', - integrations: [compress(), icon(), mdx(), sitemap()], + integrations: [ + compress(), + favicons({ + name: 'PyWire', + short_name: 'PyWire', + themes: ['#1e1e2e', '#eff1f5'], + }), + icon(), + mdx(), + sitemap(), + ], markdown: { shikiConfig: { langs: [ diff --git a/site/package.json b/site/package.json index 8ef5a52..24807b9 100644 --- a/site/package.json +++ b/site/package.json @@ -51,6 +51,7 @@ "astro": "^5.13.7", "astro-compress": "^2.3.8", "astro-eslint-parser": "^1.2.2", + "astro-favicons": "^3.1.6", "astro-icon": "^1.1.5", "eslint": "^9.35.0", "eslint-plugin-astro": "^1.3.1", @@ -67,6 +68,7 @@ }, "dependencies": { "@astrojs/sitemap": "^3.5.1", + "@iconify-json/simple-icons": "^1.2.80", "@tailwindcss/vite": "^4.1.13", "accessible-astro-components": "^5.1.1" } diff --git a/site/pnpm-lock.yaml b/site/pnpm-lock.yaml index f541fc7..0cdc51f 100644 --- a/site/pnpm-lock.yaml +++ b/site/pnpm-lock.yaml @@ -11,6 +11,9 @@ importers: '@astrojs/sitemap': specifier: ^3.5.1 version: 3.7.0 + '@iconify-json/simple-icons': + specifier: ^1.2.80 + version: 1.2.80 '@tailwindcss/vite': specifier: ^4.1.13 version: 4.1.18(vite@6.4.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.97.3)(terser@5.44.1)) @@ -51,6 +54,9 @@ importers: astro-eslint-parser: specifier: ^1.2.2 version: 1.2.2 + astro-favicons: + specifier: ^3.1.6 + version: 3.1.6(astro@5.16.15(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.56.0)(sass@1.97.3)(terser@5.44.1)(typescript@5.9.3)) astro-icon: specifier: ^1.1.5 version: 1.1.5 @@ -365,6 +371,9 @@ packages: '@iconify-json/lucide@1.2.86': resolution: {integrity: sha512-W/Jz7/gGOkI9u43r+UHmQtZtcyw2YLvMwiHa01WV6V4DYltrPNXiD+bCa+djV8LZB1uwF8CiympOMIbgiQ74nA==} + '@iconify-json/simple-icons@1.2.80': + resolution: {integrity: sha512-iglncJJ6X/dVuzFDU32MrHwwo4RBwivGf108dgyYg+HKS78ifx0h7sTenpDZMVT+UhdS6CSgZcvY/SvRXlIEUg==} + '@iconify/tools@4.2.0': resolution: {integrity: sha512-WRxPva/ipxYkqZd1+CkEAQmd86dQmrwH0vwK89gmp2Kh2WyyVw57XbPng0NehP3x4V1LzLsXUneP1uMfTMZmUA==} @@ -378,33 +387,65 @@ packages: resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==} engines: {node: '>=18'} + '@img/sharp-darwin-arm64@0.33.5': + resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + '@img/sharp-darwin-arm64@0.34.5': resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [darwin] + '@img/sharp-darwin-x64@0.33.5': + resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + '@img/sharp-darwin-x64@0.34.5': resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [darwin] + '@img/sharp-libvips-darwin-arm64@1.0.4': + resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==} + cpu: [arm64] + os: [darwin] + '@img/sharp-libvips-darwin-arm64@1.2.4': resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==} cpu: [arm64] os: [darwin] + '@img/sharp-libvips-darwin-x64@1.0.4': + resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==} + cpu: [x64] + os: [darwin] + '@img/sharp-libvips-darwin-x64@1.2.4': resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==} cpu: [x64] os: [darwin] + '@img/sharp-libvips-linux-arm64@1.0.4': + resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} + cpu: [arm64] + os: [linux] + '@img/sharp-libvips-linux-arm64@1.2.4': resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} cpu: [arm64] os: [linux] + '@img/sharp-libvips-linux-arm@1.0.5': + resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} + cpu: [arm] + os: [linux] + '@img/sharp-libvips-linux-arm@1.2.4': resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} cpu: [arm] @@ -420,32 +461,64 @@ packages: cpu: [riscv64] os: [linux] + '@img/sharp-libvips-linux-s390x@1.0.4': + resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} + cpu: [s390x] + os: [linux] + '@img/sharp-libvips-linux-s390x@1.2.4': resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} cpu: [s390x] os: [linux] + '@img/sharp-libvips-linux-x64@1.0.4': + resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} + cpu: [x64] + os: [linux] + '@img/sharp-libvips-linux-x64@1.2.4': resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} cpu: [x64] os: [linux] + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': + resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} + cpu: [arm64] + os: [linux] + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} cpu: [arm64] os: [linux] + '@img/sharp-libvips-linuxmusl-x64@1.0.4': + resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} + cpu: [x64] + os: [linux] + '@img/sharp-libvips-linuxmusl-x64@1.2.4': resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} cpu: [x64] os: [linux] + '@img/sharp-linux-arm64@0.33.5': + resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + '@img/sharp-linux-arm64@0.34.5': resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + '@img/sharp-linux-arm@0.33.5': + resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + '@img/sharp-linux-arm@0.34.5': resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -464,30 +537,59 @@ packages: cpu: [riscv64] os: [linux] + '@img/sharp-linux-s390x@0.33.5': + resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + '@img/sharp-linux-s390x@0.34.5': resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] + '@img/sharp-linux-x64@0.33.5': + resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + '@img/sharp-linux-x64@0.34.5': resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + '@img/sharp-linuxmusl-arm64@0.33.5': + resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + '@img/sharp-linuxmusl-arm64@0.34.5': resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + '@img/sharp-linuxmusl-x64@0.33.5': + resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + '@img/sharp-linuxmusl-x64@0.34.5': resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + '@img/sharp-wasm32@0.33.5': + resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + '@img/sharp-wasm32@0.34.5': resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -499,12 +601,24 @@ packages: cpu: [arm64] os: [win32] + '@img/sharp-win32-ia32@0.33.5': + resolution: {integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + '@img/sharp-win32-ia32@0.34.5': resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ia32] os: [win32] + '@img/sharp-win32-x64@0.33.5': + resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + '@img/sharp-win32-x64@0.34.5': resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -1103,6 +1217,11 @@ packages: resolution: {integrity: sha512-JepyLROIad6f44uyqMF6HKE2QbunNzp3mYKRcPoDGt0QkxXmH222FAFC64WTyQu2Kg8NNEXHTN/sWuUId9sSxw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + astro-favicons@3.1.6: + resolution: {integrity: sha512-9YfNWaBEFz1nCHy4P1l4wfPRvuLe4qHuHovIcqD5HYfZeW82wyVG1+CZUVGhcjwbRCVkGRJ3G+CKTyX9BcoI5w==} + peerDependencies: + astro: '>= 4.0.0' + astro-icon@1.1.5: resolution: {integrity: sha512-CJYS5nWOw9jz4RpGWmzNQY7D0y2ZZacH7atL2K9DeJXJVaz7/5WrxeyIxO8KASk1jCM96Q4LjRx/F3R+InjJrw==} @@ -1261,6 +1380,13 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + + color@4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} @@ -1525,6 +1651,9 @@ packages: engines: {node: '>=18'} hasBin: true + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} @@ -1647,6 +1776,10 @@ packages: fastq@1.20.1: resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} + favilib@1.0.5: + resolution: {integrity: sha512-3Fk5LQRU96QUmHWmyZc3WIMyz1tmte6TPlCVjaairXeHGtPHM4pnLvg11CyXTq6od1v5aaopHoREHNSwN4BKDA==} + engines: {node: '>=14.0.0'} + fd-slicer@1.1.0: resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} @@ -1898,6 +2031,9 @@ packages: resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} engines: {node: '>= 0.4'} + is-arrayish@0.3.4: + resolution: {integrity: sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==} + is-async-function@2.1.1: resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} engines: {node: '>= 0.4'} @@ -2828,6 +2964,10 @@ packages: resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} engines: {node: '>= 0.4'} + sharp@0.33.5: + resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + sharp@0.34.5: resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -2859,6 +2999,9 @@ packages: resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} engines: {node: '>= 0.4'} + simple-swizzle@0.2.4: + resolution: {integrity: sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==} + sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} @@ -3280,6 +3423,14 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + xml2js@0.6.2: + resolution: {integrity: sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==} + engines: {node: '>=4.0.0'} + + xmlbuilder@11.0.1: + resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} + engines: {node: '>=4.0'} + xxhash-wasm@1.1.0: resolution: {integrity: sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==} @@ -3573,6 +3724,10 @@ snapshots: dependencies: '@iconify/types': 2.0.0 + '@iconify-json/simple-icons@1.2.80': + dependencies: + '@iconify/types': 2.0.0 + '@iconify/tools@4.2.0': dependencies: '@iconify/types': 2.0.0 @@ -3604,25 +3759,47 @@ snapshots: '@img/colour@1.0.0': {} + '@img/sharp-darwin-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.0.4 + optional: true + '@img/sharp-darwin-arm64@0.34.5': optionalDependencies: '@img/sharp-libvips-darwin-arm64': 1.2.4 optional: true + '@img/sharp-darwin-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.0.4 + optional: true + '@img/sharp-darwin-x64@0.34.5': optionalDependencies: '@img/sharp-libvips-darwin-x64': 1.2.4 optional: true + '@img/sharp-libvips-darwin-arm64@1.0.4': + optional: true + '@img/sharp-libvips-darwin-arm64@1.2.4': optional: true + '@img/sharp-libvips-darwin-x64@1.0.4': + optional: true + '@img/sharp-libvips-darwin-x64@1.2.4': optional: true + '@img/sharp-libvips-linux-arm64@1.0.4': + optional: true + '@img/sharp-libvips-linux-arm64@1.2.4': optional: true + '@img/sharp-libvips-linux-arm@1.0.5': + optional: true + '@img/sharp-libvips-linux-arm@1.2.4': optional: true @@ -3632,23 +3809,45 @@ snapshots: '@img/sharp-libvips-linux-riscv64@1.2.4': optional: true + '@img/sharp-libvips-linux-s390x@1.0.4': + optional: true + '@img/sharp-libvips-linux-s390x@1.2.4': optional: true + '@img/sharp-libvips-linux-x64@1.0.4': + optional: true + '@img/sharp-libvips-linux-x64@1.2.4': optional: true + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': + optional: true + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': optional: true + '@img/sharp-libvips-linuxmusl-x64@1.0.4': + optional: true + '@img/sharp-libvips-linuxmusl-x64@1.2.4': optional: true + '@img/sharp-linux-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.0.4 + optional: true + '@img/sharp-linux-arm64@0.34.5': optionalDependencies: '@img/sharp-libvips-linux-arm64': 1.2.4 optional: true + '@img/sharp-linux-arm@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.0.5 + optional: true + '@img/sharp-linux-arm@0.34.5': optionalDependencies: '@img/sharp-libvips-linux-arm': 1.2.4 @@ -3664,26 +3863,51 @@ snapshots: '@img/sharp-libvips-linux-riscv64': 1.2.4 optional: true + '@img/sharp-linux-s390x@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.0.4 + optional: true + '@img/sharp-linux-s390x@0.34.5': optionalDependencies: '@img/sharp-libvips-linux-s390x': 1.2.4 optional: true + '@img/sharp-linux-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.0.4 + optional: true + '@img/sharp-linux-x64@0.34.5': optionalDependencies: '@img/sharp-libvips-linux-x64': 1.2.4 optional: true + '@img/sharp-linuxmusl-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + optional: true + '@img/sharp-linuxmusl-arm64@0.34.5': optionalDependencies: '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 optional: true + '@img/sharp-linuxmusl-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + optional: true + '@img/sharp-linuxmusl-x64@0.34.5': optionalDependencies: '@img/sharp-libvips-linuxmusl-x64': 1.2.4 optional: true + '@img/sharp-wasm32@0.33.5': + dependencies: + '@emnapi/runtime': 1.8.1 + optional: true + '@img/sharp-wasm32@0.34.5': dependencies: '@emnapi/runtime': 1.8.1 @@ -3692,9 +3916,15 @@ snapshots: '@img/sharp-win32-arm64@0.34.5': optional: true + '@img/sharp-win32-ia32@0.33.5': + optional: true + '@img/sharp-win32-ia32@0.34.5': optional: true + '@img/sharp-win32-x64@0.33.5': + optional: true + '@img/sharp-win32-x64@0.34.5': optional: true @@ -4338,6 +4568,12 @@ snapshots: transitivePeerDependencies: - supports-color + astro-favicons@3.1.6(astro@5.16.15(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.56.0)(sass@1.97.3)(terser@5.44.1)(typescript@5.9.3)): + dependencies: + astro: 5.16.15(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.56.0)(sass@1.97.3)(terser@5.44.1)(typescript@5.9.3) + favilib: 1.0.5 + ultrahtml: 1.6.0 + astro-icon@1.1.5: dependencies: '@iconify/tools': 4.2.0 @@ -4695,6 +4931,16 @@ snapshots: color-name@1.1.4: {} + color-string@1.9.1: + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.4 + + color@4.2.3: + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + comma-separated-tokens@2.0.3: {} commander@10.0.1: {} @@ -5020,6 +5266,8 @@ snapshots: '@esbuild/win32-ia32': 0.25.12 '@esbuild/win32-x64': 0.25.12 + escape-html@1.0.3: {} + escape-string-regexp@4.0.0: {} escape-string-regexp@5.0.0: {} @@ -5199,6 +5447,12 @@ snapshots: dependencies: reusify: 1.1.0 + favilib@1.0.5: + dependencies: + escape-html: 1.0.3 + sharp: 0.33.5 + xml2js: 0.6.2 + fd-slicer@1.1.0: dependencies: pend: 1.2.0 @@ -5548,6 +5802,8 @@ snapshots: call-bound: 1.0.4 get-intrinsic: 1.3.0 + is-arrayish@0.3.4: {} + is-async-function@2.1.1: dependencies: async-function: 1.0.0 @@ -6802,6 +7058,32 @@ snapshots: es-errors: 1.3.0 es-object-atoms: 1.1.1 + sharp@0.33.5: + dependencies: + color: 4.2.3 + detect-libc: 2.1.2 + semver: 7.7.3 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.33.5 + '@img/sharp-darwin-x64': 0.33.5 + '@img/sharp-libvips-darwin-arm64': 1.0.4 + '@img/sharp-libvips-darwin-x64': 1.0.4 + '@img/sharp-libvips-linux-arm': 1.0.5 + '@img/sharp-libvips-linux-arm64': 1.0.4 + '@img/sharp-libvips-linux-s390x': 1.0.4 + '@img/sharp-libvips-linux-x64': 1.0.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + '@img/sharp-linux-arm': 0.33.5 + '@img/sharp-linux-arm64': 0.33.5 + '@img/sharp-linux-s390x': 0.33.5 + '@img/sharp-linux-x64': 0.33.5 + '@img/sharp-linuxmusl-arm64': 0.33.5 + '@img/sharp-linuxmusl-x64': 0.33.5 + '@img/sharp-wasm32': 0.33.5 + '@img/sharp-win32-ia32': 0.33.5 + '@img/sharp-win32-x64': 0.33.5 + sharp@0.34.5: dependencies: '@img/colour': 1.0.0 @@ -6878,6 +7160,10 @@ snapshots: side-channel-map: 1.0.1 side-channel-weakmap: 1.0.2 + simple-swizzle@0.2.4: + dependencies: + is-arrayish: 0.3.4 + sisteransi@1.0.5: {} sitemap@8.0.2: @@ -7292,6 +7578,13 @@ snapshots: wrappy@1.0.2: {} + xml2js@0.6.2: + dependencies: + sax: 1.4.4 + xmlbuilder: 11.0.1 + + xmlbuilder@11.0.1: {} + xxhash-wasm@1.1.0: {} yallist@5.0.0: {} diff --git a/site/public/favicon.svg b/site/public/favicon.svg index 0043fb2..8fc114c 100644 --- a/site/public/favicon.svg +++ b/site/public/favicon.svg @@ -1,9 +1,8 @@ - - - - - - - - + + + + + + + diff --git a/site/src/assets/img/pywire-mark.svg b/site/src/assets/img/pywire-mark.svg new file mode 100644 index 0000000..9684a3c --- /dev/null +++ b/site/src/assets/img/pywire-mark.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/site/src/assets/scss/base/_root.scss b/site/src/assets/scss/base/_root.scss index a89aaef..2bc25fb 100644 --- a/site/src/assets/scss/base/_root.scss +++ b/site/src/assets/scss/base/_root.scss @@ -1,66 +1,126 @@ :root { - color-scheme: light; + color-scheme: light dark; interpolate-size: allow-keywords; - /* --- PRIMARY BRAND --- */ - --color-wire-glow: #00f0ff; - --color-wire-dim: #00a8b3; + /* --- PRIMARY BRAND — "The Wire" --- + One OKLCH hue (195°), one chroma (0.13), three lightnesses. + Same formula as the neutral ladder: keep H + C identical across + modes, only invert L. Reads as one accent at two times of day. */ + --color-wire-90: oklch(89% 0.13 195); /* Void primary ≈ #5feaff */ + --color-wire-65: oklch(65% 0.13 195); /* Lab primary ≈ #00b3c4 */ + --color-wire-55: oklch(55% 0.13 195); /* Lab AAA link ≈ #00969f */ + --color-wire-25: oklch(25% 0.13 195); /* Void accent-bg */ + --color-wire-95: oklch(95% 0.05 195); /* Lab accent-bg */ + + /* Aliases kept for back-compat with components written before the rework. */ + --color-wire-glow: var(--color-wire-90); + --color-wire-dim: var(--color-wire-65); + --color-wire-deep: var(--color-wire-55); + --color-py-blue: #3776ab; --color-py-yellow: #ffd343; - /* --- DARK MODE (The "Void") --- */ - --theme-dark-bg: #090a11; - --theme-dark-surface: rgba(19, 21, 32, 0.6); - --theme-dark-border: #2a2d3d; - --theme-dark-text: #e0e6ed; - --theme-dark-muted: #949cb0; - - /* --- LIGHT MODE (The "Lab") --- */ - --theme-light-bg: #ffffff; - --theme-light-surface: rgba(255, 255, 255, 0.6); - --theme-light-border: #0f172a; // Deep Navy for sharp borders - --theme-light-text: #0f172a; // Deep Navy - --theme-light-muted: #475569; + /* --- DARK MODE (The "Void") --- + Same hue/chroma as Lab so the palette feels like one space rotated. */ + --theme-dark-bg: oklch(11% 0.01 250); /* ≈ #0a0c14 */ + --theme-dark-surface: oklch(15% 0.012 250 / 0.7); /* ≈ rgba(18,20,30,.7) */ + --theme-dark-surface-2: oklch(20% 0.015 250); /* ≈ #1b1e2c */ + --theme-dark-border: oklch(28% 0.018 250); /* ≈ #2a2e40 */ + --theme-dark-text: oklch(92% 0.012 250); /* ≈ #e3e6ee */ + --theme-dark-muted: oklch(66% 0.02 250); /* ≈ #969db1 */ + + /* --- LIGHT MODE (The "Lab") --- + Built on a single OKLCH neutral hue (250°, very low chroma) so that + Lab and Void are perceptual mirrors along the L axis. */ + --theme-light-bg: oklch(99% 0.005 250); /* ≈ #fdfdff */ + --theme-light-surface: oklch(97.5% 0.006 250 / 0.7); + --theme-light-surface-2: oklch(95% 0.008 250); /* ≈ #eff1f6 */ + --theme-light-border: oklch(89% 0.01 250); /* ≈ #d8dbe5 */ + --theme-light-border-strong: oklch(20% 0.04 250); /* ≈ #0e1525 */ + --theme-light-text: oklch(20% 0.04 250); /* ≈ #0e1525 */ + --theme-light-muted: oklch(48% 0.025 250); /* ≈ #5d6577 */ /* --- STATE COLORS --- */ --color-success: #00ff9d; --color-error: #ff0055; + --color-warning: #ffd343; // brand colors - --brand-primary: var(--color-wire-glow); - --brand-secondary: var(--color-wire-dim); + --brand-primary: light-dark(var(--color-wire-65), var(--color-wire-90)); + --brand-secondary: light-dark(var(--color-wire-55), oklch(94% 0.1 195)); --brand-neutral: var(--theme-dark-muted); // color scheme mapping --foreground-color: light-dark(var(--theme-light-text), var(--theme-dark-text)); --background-color: light-dark(var(--theme-light-bg), var(--theme-dark-bg)); --surface-color: light-dark(var(--theme-light-surface), var(--theme-dark-surface)); + --surface-2-color: light-dark(var(--theme-light-surface-2), var(--theme-dark-surface-2)); --icon-color: light-dark(var(--theme-light-text), var(--theme-dark-text)); - --link-color: light-dark(var(--color-wire-dim), var(--color-wire-glow)); - --link-hover-color: light-dark(var(--color-wire-glow), var(--color-wire-dim)); + --link-color: light-dark(var(--color-wire-55), var(--color-wire-90)); + --link-hover-color: light-dark(var(--color-wire-65), oklch(94% 0.1 195)); + --accent-color: light-dark(var(--color-wire-65), var(--color-wire-90)); + --accent-bg-color: light-dark(var(--color-wire-95), var(--color-wire-25)); --border-color: light-dark(var(--theme-light-border), var(--theme-dark-border)); - --border-color-subtle: light-dark(rgba(15, 23, 42, 0.1), var(--theme-dark-border)); + --border-color-subtle: light-dark(rgba(14, 21, 37, 0.08), rgba(227, 230, 238, 0.08)); + --border-color-strong: light-dark(var(--theme-light-border-strong), var(--theme-dark-text)); --text-decoration-color: light-dark(var(--theme-light-muted), var(--theme-dark-muted)); --text-decoration-color-hover: var(--link-color); + --grid-line: light-dark(rgba(14, 21, 37, 0.06), rgba(227, 230, 238, 0.05)); + --grid-line-strong: light-dark(rgba(14, 21, 37, 0.1), rgba(227, 230, 238, 0.09)); + + // glow tokens — matched intensity across modes. + // On Void this reads as a soft cyan halo; on Lab it reads as a quiet + // cool-ink lift at the same visual weight. Same recipe, both modes. + --glow-cyan-soft: 0 0 10px rgba(0, 200, 220, 0.18); + --glow-cyan: 0 0 14px rgba(0, 200, 220, 0.32); + --glow-cyan-loud: 0 0 22px rgba(0, 220, 240, 0.55), 0 0 1px rgba(0, 220, 240, 0.9); + --shadow-soft: 0 1px 2px rgba(14, 21, 37, 0.05), 0 4px 14px rgba(14, 21, 37, 0.06); // gradient tokens --text-gradient: linear-gradient( 315deg, - light-dark(#0f172a, var(--color-wire-glow)) 25%, - light-dark(var(--color-wire-dim), #00d1b7) + light-dark(var(--theme-light-text), var(--color-wire-90)) 25%, + light-dark(var(--color-wire-65), oklch(85% 0.13 195)) ); + // ---- Button color tokens consumed by accessible-astro . + // Primary = filled cyan (wire ladder); Secondary = outlined dark/light; + // Ghost = transparent. Same recipe in both modes — only the wire stop + // changes. Halo is added per-instance via .button--glow when needed. + --color-primary-bg: var(--accent-color); + --color-primary-border: var(--accent-color); + --color-primary-text: light-dark(#fff, oklch(15% 0.04 195)); + --color-primary-bg-hover: var(--link-hover-color); + --color-primary-border-hover: var(--link-hover-color); + --color-primary-text-hover: var(--color-primary-text); + + --color-secondary-bg: transparent; + --color-secondary-border: var(--foreground-color); + --color-secondary-text: var(--foreground-color); + --color-secondary-bg-hover: var(--accent-bg-color); + --color-secondary-border-hover: var(--accent-color); + --color-secondary-text-hover: var(--foreground-color); + + --color-default-bg: transparent; + --color-default-border: var(--border-color); + --color-default-text: var(--foreground-color); + --color-default-bg-hover: var(--surface-2-color); + --color-default-border-hover: var(--border-color); + --color-default-text-hover: var(--foreground-color); + // theme settings --radius-small: 3px; --radius-large: 6px; --gap-default: 2rem; --font-measure: 70ch; - --font-family-default: 'Atkinson Hyperlegible', sans-serif; - --font-family-special: 'Atkinson Hyperlegible', sans-serif; + --font-family-default: 'Atkinson Hyperlegible', ui-sans-serif, system-ui, -apple-system, sans-serif; + --font-family-special: 'Atkinson Hyperlegible', ui-sans-serif, system-ui, sans-serif; + --font-family-mono: 'JetBrains Mono', 'Fira Code', ui-monospace, SFMono-Regular, Menlo, monospace; // font families --font-heading: var(--font-family-special); --font-body: var(--font-family-default); + --font-mono: var(--font-family-mono); // font sizes // @link https://utopia.fyi/type/calculator?c=320,16,1.2,1240,18,1.25,6,2,&s=0.75|0.5|0.25,1.5|2|3|4|6,s-l&g=s,l,xl,12 diff --git a/site/src/components/Feature.astro b/site/src/components/Feature.astro index 1973512..32ede1d 100644 --- a/site/src/components/Feature.astro +++ b/site/src/components/Feature.astro @@ -3,69 +3,108 @@ import { Heading } from 'accessible-astro-components' import { Icon } from 'astro-icon/components' /** - * Feature Component - * - * @description A component that displays a feature with an icon, title, and description + * Feature card — surface bg, border, accent icon-chip, title, body. + * Optional monoface highlight chip — used for code-token examples like + * `count = wire(0)` so the card carries a piece of the framework's + * actual syntax. Hover shifts border to accent; no lift, no shadow. */ interface Props { - /** - * The icon to display - */ icon: string - /** - * The title to display - */ title: string + highlight?: string | string[] } -const { icon = 'mdi:rocket', title = 'Title' }: Props = Astro.props +const { icon = 'lucide:zap', title = 'Title', highlight }: Props = Astro.props +const highlights = Array.isArray(highlight) ? highlight : highlight ? [highlight] : [] --- -
-
+
+ + {title} +

+ Lorem ipsum dolor sit amet consectetur adipisicing elit. Hic, corporis. +

+ { + highlights.length > 0 && ( +
+ {highlights.map((h) => ( + {h} + ))} +
+ ) + } +
diff --git a/site/src/components/Footer.astro b/site/src/components/Footer.astro index 8fe773e..f4667ce 100644 --- a/site/src/components/Footer.astro +++ b/site/src/components/Footer.astro @@ -1,55 +1,143 @@ --- import Logo from './Logo.astro' -import { Heading, Link } from 'accessible-astro-components' /** - * Footer Component - * - * @description A component that displays the footer of the website + * Footer — minimal, monoface eyebrow column headers, lockup at the left. + * Apache 2.0-licensed badge + copyright line in the bottom row. */ const currentYear = new Date().getFullYear() --- - - diff --git a/site/src/components/Header.astro b/site/src/components/Header.astro index 1a804ad..2e16b34 100644 --- a/site/src/components/Header.astro +++ b/site/src/components/Header.astro @@ -22,19 +22,25 @@ import { Icon } from 'astro-icon/components' - - - +