Non-official site for The Life Series Minecraft hardcore survival multiplayer series housing every video www.life-series.online
0
fork

Configure Feed

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

Rewrite progress (#53)

* Nunito font

* Member page progress

* Migrate from prettier to biome

* Styles

* Fix titles and 1 id

authored by

Ghustvn and committed by
GitHub
35b04034 860d7989

+1309 -102
-3
.prettierignore
··· 1 - posthog.astro 2 - pnpm-lock.yaml 3 - pnpm-workspace.yaml
-15
.prettierrc
··· 1 - { 2 - "tabWidth": 4, 3 - "singleQuote": true, 4 - "printWidth": 100, 5 - "singleAttributePerLine": true, 6 - "plugins": ["prettier-plugin-astro", "prettier-plugin-tailwindcss"], 7 - "overrides": [ 8 - { 9 - "files": "*.astro", 10 - "options": { 11 - "parser": "astro" 12 - } 13 - } 14 - ] 15 - }
+17 -3
astro.config.mjs
··· 1 1 // @ts-check 2 - import { defineConfig } from 'astro/config'; 2 + import sitemap from '@astrojs/sitemap'; 3 3 import vercel from '@astrojs/vercel'; 4 - import sitemap from '@astrojs/sitemap'; 5 4 import tailwindcss from '@tailwindcss/vite'; 5 + import { defineConfig, fontProviders } from 'astro/config'; 6 + import icon from 'astro-icon'; 6 7 import og from 'astro-og'; 7 8 8 9 export default defineConfig({ 9 10 site: 'https://www.life-series.online', 10 11 trailingSlash: 'never', 11 - integrations: [sitemap(), og()], 12 + integrations: [sitemap(), og(), icon()], 12 13 experimental: { 13 14 contentIntellisense: true, 15 + fonts: [ 16 + { 17 + provider: fontProviders.fontsource(), 18 + name: 'Nunito', 19 + cssVariable: '--font-nunito', 20 + weights: [400, 700], 21 + styles: ['normal'], 22 + subsets: ['latin'], 23 + fallbacks: ['sans-serif'], 24 + formats: ['woff2'], 25 + display: 'swap', 26 + }, 27 + ], 14 28 }, 15 29 vite: { 16 30 plugins: [tailwindcss()],
+65
biome.json
··· 1 + { 2 + "$schema": "https://biomejs.dev/schemas/2.3.11/schema.json", 3 + "vcs": { 4 + "enabled": true, 5 + "clientKind": "git", 6 + "useIgnoreFile": true 7 + }, 8 + "files": { 9 + "includes": ["**", "!!**/dist", "!!**/posthog.astro"] 10 + }, 11 + "formatter": { 12 + "enabled": true, 13 + "indentStyle": "space", 14 + "indentWidth": 4 15 + }, 16 + "linter": { 17 + "enabled": true, 18 + "rules": { 19 + "recommended": true 20 + } 21 + }, 22 + "javascript": { 23 + "formatter": { 24 + "quoteStyle": "single" 25 + } 26 + }, 27 + "assist": { 28 + "enabled": true, 29 + "actions": { 30 + "source": { 31 + "organizeImports": "on" 32 + } 33 + } 34 + }, 35 + "html": { 36 + "experimentalFullSupportEnabled": true 37 + }, 38 + "overrides": [ 39 + { 40 + "includes": ["**/*.astro"], 41 + "linter": { 42 + "rules": { 43 + "correctness": { 44 + "noUnusedVariables": "off", 45 + "noUnusedImports": "off", 46 + "noUnknownPseudoClass": "off" 47 + } 48 + } 49 + }, 50 + "css": { 51 + "parser": { 52 + "cssModules": true 53 + } 54 + } 55 + } 56 + ], 57 + "css": { 58 + "formatter": { 59 + "quoteStyle": "single" 60 + }, 61 + "parser": { 62 + "tailwindDirectives": true 63 + } 64 + } 65 + }
+5 -1
package.json
··· 7 7 "build": "astro build", 8 8 "preview": "astro preview", 9 9 "astro": "astro", 10 - "format": "prettier . --write" 10 + "biome:check": "biome check", 11 + "biome:check:write": "biome check --write" 11 12 }, 12 13 "dependencies": { 13 14 "@astro-community/astro-embed-youtube": "^0.5.9", 14 15 "@astrojs/sitemap": "^3.6.1", 15 16 "@astrojs/vercel": "^9.0.3", 17 + "@iconify-json/lucide": "1.2.83", 16 18 "@tailwindcss/vite": "^4.1.17", 17 19 "astro": "^5.16.8", 18 20 "astro-capo": "^0.0.1", 21 + "astro-icon": "1.1.5", 19 22 "astro-og": "^0.3.0", 20 23 "astro-seo": "^0.8.4", 21 24 "sharp": "^0.34.5", ··· 23 26 "typescript": "^5.9.3" 24 27 }, 25 28 "devDependencies": { 29 + "@biomejs/biome": "2.3.11", 26 30 "prettier": "^3.6.2", 27 31 "prettier-plugin-astro": "^0.14.1", 28 32 "prettier-plugin-tailwindcss": "^0.7.1"
+461
pnpm-lock.yaml
··· 17 17 '@astrojs/vercel': 18 18 specifier: ^9.0.3 19 19 version: 9.0.3(astro@5.16.8(@types/node@24.10.1)(@vercel/functions@2.2.13)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.2)(typescript@5.9.3)(yaml@2.8.1))(rollup@4.53.2) 20 + '@iconify-json/lucide': 21 + specifier: 1.2.83 22 + version: 1.2.83 20 23 '@tailwindcss/vite': 21 24 specifier: ^4.1.17 22 25 version: 4.1.17(vite@6.4.1(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.1)) ··· 26 29 astro-capo: 27 30 specifier: ^0.0.1 28 31 version: 0.0.1(astro@5.16.8(@types/node@24.10.1)(@vercel/functions@2.2.13)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.2)(typescript@5.9.3)(yaml@2.8.1)) 32 + astro-icon: 33 + specifier: 1.1.5 34 + version: 1.1.5 29 35 astro-og: 30 36 specifier: ^0.3.0 31 37 version: 0.3.0(astro@5.16.8(@types/node@24.10.1)(@vercel/functions@2.2.13)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.2)(typescript@5.9.3)(yaml@2.8.1)) ··· 42 48 specifier: ^5.9.3 43 49 version: 5.9.3 44 50 devDependencies: 51 + '@biomejs/biome': 52 + specifier: 2.3.11 53 + version: 2.3.11 45 54 prettier: 46 55 specifier: ^3.6.2 47 56 version: 3.6.2 ··· 53 62 version: 0.7.1(prettier-plugin-astro@0.14.1)(prettier@3.6.2) 54 63 55 64 packages: 65 + 66 + '@antfu/install-pkg@1.1.0': 67 + resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==} 68 + 69 + '@antfu/utils@8.1.1': 70 + resolution: {integrity: sha512-Mex9nXf9vR6AhcXmMrlz/HVgYYZpVGJ6YlPgwl7UnaFpnshXs6EK/oa5Gpf3CzENMjkvEx2tQtntGnb7UtSTOQ==} 56 71 57 72 '@astro-community/astro-embed-youtube@0.5.9': 58 73 resolution: {integrity: sha512-8Uk2SKbyZVb+jxwqSAMoEpQo+063XYwCI3yRy9cbkyHpu09mDabGZNTF5XrL8CKr3NtR5haBkeYK/kSuKUkJ/g==} ··· 122 137 resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} 123 138 engines: {node: '>=6.9.0'} 124 139 140 + '@biomejs/biome@2.3.11': 141 + resolution: {integrity: sha512-/zt+6qazBWguPG6+eWmiELqO+9jRsMZ/DBU3lfuU2ngtIQYzymocHhKiZRyrbra4aCOoyTg/BmY+6WH5mv9xmQ==} 142 + engines: {node: '>=14.21.3'} 143 + hasBin: true 144 + 145 + '@biomejs/cli-darwin-arm64@2.3.11': 146 + resolution: {integrity: sha512-/uXXkBcPKVQY7rc9Ys2CrlirBJYbpESEDme7RKiBD6MmqR2w3j0+ZZXRIL2xiaNPsIMMNhP1YnA+jRRxoOAFrA==} 147 + engines: {node: '>=14.21.3'} 148 + cpu: [arm64] 149 + os: [darwin] 150 + 151 + '@biomejs/cli-darwin-x64@2.3.11': 152 + resolution: {integrity: sha512-fh7nnvbweDPm2xEmFjfmq7zSUiox88plgdHF9OIW4i99WnXrAC3o2P3ag9judoUMv8FCSUnlwJCM1B64nO5Fbg==} 153 + engines: {node: '>=14.21.3'} 154 + cpu: [x64] 155 + os: [darwin] 156 + 157 + '@biomejs/cli-linux-arm64-musl@2.3.11': 158 + resolution: {integrity: sha512-XPSQ+XIPZMLaZ6zveQdwNjbX+QdROEd1zPgMwD47zvHV+tCGB88VH+aynyGxAHdzL+Tm/+DtKST5SECs4iwCLg==} 159 + engines: {node: '>=14.21.3'} 160 + cpu: [arm64] 161 + os: [linux] 162 + 163 + '@biomejs/cli-linux-arm64@2.3.11': 164 + resolution: {integrity: sha512-l4xkGa9E7Uc0/05qU2lMYfN1H+fzzkHgaJoy98wO+b/7Gl78srbCRRgwYSW+BTLixTBrM6Ede5NSBwt7rd/i6g==} 165 + engines: {node: '>=14.21.3'} 166 + cpu: [arm64] 167 + os: [linux] 168 + 169 + '@biomejs/cli-linux-x64-musl@2.3.11': 170 + resolution: {integrity: sha512-vU7a8wLs5C9yJ4CB8a44r12aXYb8yYgBn+WeyzbMjaCMklzCv1oXr8x+VEyWodgJt9bDmhiaW/I0RHbn7rsNmw==} 171 + engines: {node: '>=14.21.3'} 172 + cpu: [x64] 173 + os: [linux] 174 + 175 + '@biomejs/cli-linux-x64@2.3.11': 176 + resolution: {integrity: sha512-/1s9V/H3cSe0r0Mv/Z8JryF5x9ywRxywomqZVLHAoa/uN0eY7F8gEngWKNS5vbbN/BsfpCG5yeBT5ENh50Frxg==} 177 + engines: {node: '>=14.21.3'} 178 + cpu: [x64] 179 + os: [linux] 180 + 181 + '@biomejs/cli-win32-arm64@2.3.11': 182 + resolution: {integrity: sha512-PZQ6ElCOnkYapSsysiTy0+fYX+agXPlWugh6+eQ6uPKI3vKAqNp6TnMhoM3oY2NltSB89hz59o8xIfOdyhi9Iw==} 183 + engines: {node: '>=14.21.3'} 184 + cpu: [arm64] 185 + os: [win32] 186 + 187 + '@biomejs/cli-win32-x64@2.3.11': 188 + resolution: {integrity: sha512-43VrG813EW+b5+YbDbz31uUsheX+qFKCpXeY9kfdAx+ww3naKxeVkTD9zLIWxUPfJquANMHrmW3wbe/037G0Qg==} 189 + engines: {node: '>=14.21.3'} 190 + cpu: [x64] 191 + os: [win32] 192 + 125 193 '@capsizecss/unpack@4.0.0': 126 194 resolution: {integrity: sha512-VERIM64vtTP1C4mxQ5thVT9fK0apjPFobqybMtA1UdUujWka24ERHbRHFGmpbbhp73MhV+KSsHQH9C6uOTdEQA==} 127 195 engines: {node: '>=18'} ··· 306 374 engines: {node: '>=18'} 307 375 cpu: [x64] 308 376 os: [win32] 377 + 378 + '@iconify-json/lucide@1.2.83': 379 + resolution: {integrity: sha512-k/255BFdcE+gY8cwQOlJMKjxOScW++8tiMxWw8jJXqHoQhBmOgsxm8SHVUIZqSrquMCcSNJn6rx67ZTQhoR2cA==} 380 + 381 + '@iconify/tools@4.2.0': 382 + resolution: {integrity: sha512-WRxPva/ipxYkqZd1+CkEAQmd86dQmrwH0vwK89gmp2Kh2WyyVw57XbPng0NehP3x4V1LzLsXUneP1uMfTMZmUA==} 383 + 384 + '@iconify/types@2.0.0': 385 + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} 386 + 387 + '@iconify/utils@2.3.0': 388 + resolution: {integrity: sha512-GmQ78prtwYW6EtzXRU1rY+KwOKfz32PD7iJh6Iyqw68GiKuoZ2A6pRtzWONz5VQJbp50mEjXh/7NkumtrAgRKA==} 309 389 310 390 '@img/colour@1.0.0': 311 391 resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==} ··· 722 802 peerDependencies: 723 803 vite: ^5.2.0 || ^6 || ^7 724 804 805 + '@trysound/sax@0.2.0': 806 + resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} 807 + engines: {node: '>=10.13.0'} 808 + 725 809 '@types/debug@4.1.12': 726 810 resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} 727 811 ··· 751 835 752 836 '@types/unist@3.0.3': 753 837 resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} 838 + 839 + '@types/yauzl@2.10.3': 840 + resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} 754 841 755 842 '@ungap/structured-clone@1.3.0': 756 843 resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} ··· 901 988 peerDependencies: 902 989 astro: '>= 2.8' 903 990 991 + astro-icon@1.1.5: 992 + resolution: {integrity: sha512-CJYS5nWOw9jz4RpGWmzNQY7D0y2ZZacH7atL2K9DeJXJVaz7/5WrxeyIxO8KASk1jCM96Q4LjRx/F3R+InjJrw==} 993 + 904 994 astro-og@0.3.0: 905 995 resolution: {integrity: sha512-qC3/EbNg863hBH3e8a7HkomAzU2ZoDcRNey1H1iXVXoLmRbLvCj8ZDrz0gJOZ3H1oWAAJWsagUnFy+d33rSdxA==} 906 996 peerDependencies: ··· 951 1041 resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 952 1042 engines: {node: '>=8'} 953 1043 1044 + buffer-crc32@0.2.13: 1045 + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} 1046 + 954 1047 camelcase@8.0.0: 955 1048 resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==} 956 1049 engines: {node: '>=16'} ··· 971 1064 character-entities@2.0.2: 972 1065 resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} 973 1066 1067 + cheerio-select@2.1.0: 1068 + resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} 1069 + 1070 + cheerio@1.1.2: 1071 + resolution: {integrity: sha512-IkxPpb5rS/d1IiLbHMgfPuS0FgiWTtFIm/Nj+2woXDLTZ7fOT2eqzgYbdMlLweqlHbsZjxEChoVK+7iph7jyQg==} 1072 + engines: {node: '>=20.18.1'} 1073 + 974 1074 chokidar@3.6.0: 975 1075 resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} 976 1076 engines: {node: '>= 8.10.0'} ··· 1013 1113 resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} 1014 1114 engines: {node: '>=16'} 1015 1115 1116 + commander@7.2.0: 1117 + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} 1118 + engines: {node: '>= 10'} 1119 + 1016 1120 common-ancestor-path@1.0.1: 1017 1121 resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==} 1122 + 1123 + confbox@0.1.8: 1124 + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} 1125 + 1126 + confbox@0.2.2: 1127 + resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==} 1018 1128 1019 1129 consola@3.4.2: 1020 1130 resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} ··· 1040 1150 css-tree@2.2.1: 1041 1151 resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==} 1042 1152 engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} 1153 + 1154 + css-tree@2.3.1: 1155 + resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} 1156 + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} 1043 1157 1044 1158 css-tree@3.1.0: 1045 1159 resolution: {integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==} ··· 1133 1247 emoji-regex@9.2.2: 1134 1248 resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} 1135 1249 1250 + encoding-sniffer@0.2.1: 1251 + resolution: {integrity: sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==} 1252 + 1253 + end-of-stream@1.4.5: 1254 + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} 1255 + 1136 1256 enhanced-resolve@5.18.3: 1137 1257 resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==} 1138 1258 engines: {node: '>=10.13.0'} ··· 1170 1290 eventemitter3@5.0.1: 1171 1291 resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} 1172 1292 1293 + exsolve@1.0.8: 1294 + resolution: {integrity: sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==} 1295 + 1173 1296 extend@3.0.2: 1174 1297 resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} 1298 + 1299 + extract-zip@2.0.1: 1300 + resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} 1301 + engines: {node: '>= 10.17.0'} 1302 + hasBin: true 1175 1303 1176 1304 fast-deep-equal@3.1.3: 1177 1305 resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} ··· 1188 1316 1189 1317 fastq@1.19.1: 1190 1318 resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} 1319 + 1320 + fd-slicer@1.1.0: 1321 + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} 1191 1322 1192 1323 fdir@6.5.0: 1193 1324 resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} ··· 1233 1364 resolution: {integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==} 1234 1365 engines: {node: '>=18'} 1235 1366 1367 + get-stream@5.2.0: 1368 + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} 1369 + engines: {node: '>=8'} 1370 + 1236 1371 github-slugger@2.0.0: 1237 1372 resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} 1238 1373 ··· 1243 1378 glob@10.5.0: 1244 1379 resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} 1245 1380 hasBin: true 1381 + 1382 + globals@15.15.0: 1383 + resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} 1384 + engines: {node: '>=18'} 1246 1385 1247 1386 graceful-fs@4.2.11: 1248 1387 resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} ··· 1286 1425 html-void-elements@3.0.0: 1287 1426 resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} 1288 1427 1428 + htmlparser2@10.0.0: 1429 + resolution: {integrity: sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==} 1430 + 1289 1431 http-cache-semantics@4.2.0: 1290 1432 resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} 1291 1433 ··· 1293 1435 resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} 1294 1436 engines: {node: '>= 14'} 1295 1437 1438 + iconv-lite@0.6.3: 1439 + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} 1440 + engines: {node: '>=0.10.0'} 1441 + 1296 1442 import-meta-resolve@4.2.0: 1297 1443 resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} 1298 1444 ··· 1370 1516 kleur@4.1.5: 1371 1517 resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} 1372 1518 engines: {node: '>=6'} 1519 + 1520 + kolorist@1.8.0: 1521 + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} 1373 1522 1374 1523 lightningcss-android-arm64@1.30.2: 1375 1524 resolution: {integrity: sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==} ··· 1443 1592 1444 1593 lite-youtube-embed@0.3.4: 1445 1594 resolution: {integrity: sha512-aXgxpwK7AIW58GEbRzA8EYaY4LWvF3FKak6B9OtSJmuNyLhX2ouD4cMTxz/yR5HFInhknaYd2jLWOTRTvT8oAw==} 1595 + 1596 + local-pkg@1.1.2: 1597 + resolution: {integrity: sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==} 1598 + engines: {node: '>=14'} 1446 1599 1447 1600 lodash@4.17.21: 1448 1601 resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} ··· 1504 1657 mdn-data@2.0.28: 1505 1658 resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} 1506 1659 1660 + mdn-data@2.0.30: 1661 + resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} 1662 + 1507 1663 mdn-data@2.12.2: 1508 1664 resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} 1509 1665 ··· 1611 1767 resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} 1612 1768 engines: {node: '>= 18'} 1613 1769 1770 + mlly@1.8.0: 1771 + resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} 1772 + 1614 1773 mrmime@2.0.1: 1615 1774 resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} 1616 1775 engines: {node: '>=10'} ··· 1670 1829 ohash@2.0.11: 1671 1830 resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} 1672 1831 1832 + once@1.4.0: 1833 + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 1834 + 1673 1835 oniguruma-parser@0.12.1: 1674 1836 resolution: {integrity: sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==} 1675 1837 ··· 1697 1859 parse-latin@7.0.0: 1698 1860 resolution: {integrity: sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==} 1699 1861 1862 + parse5-htmlparser2-tree-adapter@7.1.0: 1863 + resolution: {integrity: sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==} 1864 + 1865 + parse5-parser-stream@7.1.2: 1866 + resolution: {integrity: sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==} 1867 + 1700 1868 parse5@7.3.0: 1701 1869 resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} 1702 1870 ··· 1716 1884 1717 1885 path-to-regexp@6.3.0: 1718 1886 resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} 1887 + 1888 + pathe@2.0.3: 1889 + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} 1890 + 1891 + pend@1.2.0: 1892 + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} 1719 1893 1720 1894 piccolore@0.1.3: 1721 1895 resolution: {integrity: sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw==} ··· 1731 1905 resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} 1732 1906 engines: {node: '>=12'} 1733 1907 1908 + pkg-types@1.3.1: 1909 + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} 1910 + 1911 + pkg-types@2.3.0: 1912 + resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==} 1913 + 1734 1914 postcss@8.5.6: 1735 1915 resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} 1736 1916 engines: {node: ^10 || ^12 || >=14} ··· 1816 1996 property-information@7.1.0: 1817 1997 resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} 1818 1998 1999 + pump@3.0.3: 2000 + resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} 2001 + 1819 2002 punycode@2.3.1: 1820 2003 resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 1821 2004 engines: {node: '>=6'} 2005 + 2006 + quansync@0.2.11: 2007 + resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} 1822 2008 1823 2009 queue-microtask@1.2.3: 1824 2010 resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} ··· 1915 2101 1916 2102 s.color@0.0.15: 1917 2103 resolution: {integrity: sha512-AUNrbEUHeKY8XsYr/DYpl+qk5+aM+DChopnWOPEzn8YKzOhv4l2zH6LzZms3tOZP3wwdOyc0RmTciyi46HLIuA==} 2104 + 2105 + safer-buffer@2.1.2: 2106 + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} 1918 2107 1919 2108 sass-formatter@0.7.9: 1920 2109 resolution: {integrity: sha512-CWZ8XiSim+fJVG0cFLStwDvft1VI7uvXdCNJYXhDvowiv+DsbD1nXLiQ4zrE5UBvj5DWZJ93cwN0NX5PMsr1Pw==} ··· 1994 2183 suf-log@2.5.3: 1995 2184 resolution: {integrity: sha512-KvC8OPjzdNOe+xQ4XWJV2whQA0aM1kGVczMQ8+dStAO6KfEB140JEVQ9dE76ONZ0/Ylf67ni4tILPJB41U0eow==} 1996 2185 2186 + svgo@3.3.2: 2187 + resolution: {integrity: sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==} 2188 + engines: {node: '>=14.0.0'} 2189 + hasBin: true 2190 + 1997 2191 svgo@4.0.0: 1998 2192 resolution: {integrity: sha512-VvrHQ+9uniE+Mvx3+C9IEe/lWasXCU0nXMY2kZeLrHNICuRiC8uMPyM14UEaMOFA5mhyQqEkB02VoQ16n3DLaw==} 1999 2193 engines: {node: '>=16'} ··· 2073 2267 2074 2268 undici-types@7.16.0: 2075 2269 resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} 2270 + 2271 + undici@7.18.2: 2272 + resolution: {integrity: sha512-y+8YjDFzWdQlSE9N5nzKMT3g4a5UBX1HKowfdXh0uvAnTaqqwqB92Jt4UXBAeKekDs5IaDKyJFR4X1gYVCgXcw==} 2273 + engines: {node: '>=20.18.1'} 2076 2274 2077 2275 unified@11.0.5: 2078 2276 resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} ··· 2327 2525 webidl-conversions@3.0.1: 2328 2526 resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} 2329 2527 2528 + whatwg-encoding@3.1.1: 2529 + resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} 2530 + engines: {node: '>=18'} 2531 + deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation 2532 + 2533 + whatwg-mimetype@4.0.0: 2534 + resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} 2535 + engines: {node: '>=18'} 2536 + 2330 2537 whatwg-url@5.0.0: 2331 2538 resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} 2332 2539 ··· 2355 2562 resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} 2356 2563 engines: {node: '>=18'} 2357 2564 2565 + wrappy@1.0.2: 2566 + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 2567 + 2358 2568 xxhash-wasm@1.1.0: 2359 2569 resolution: {integrity: sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==} 2360 2570 ··· 2388 2598 resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} 2389 2599 engines: {node: '>=12'} 2390 2600 2601 + yauzl@2.10.0: 2602 + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} 2603 + 2391 2604 yocto-queue@1.2.2: 2392 2605 resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==} 2393 2606 engines: {node: '>=12.20'} ··· 2418 2631 resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} 2419 2632 2420 2633 snapshots: 2634 + 2635 + '@antfu/install-pkg@1.1.0': 2636 + dependencies: 2637 + package-manager-detector: 1.6.0 2638 + tinyexec: 1.0.2 2639 + 2640 + '@antfu/utils@8.1.1': {} 2421 2641 2422 2642 '@astro-community/astro-embed-youtube@0.5.9(astro@5.16.8(@types/node@24.10.1)(@vercel/functions@2.2.13)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.2)(typescript@5.9.3)(yaml@2.8.1))': 2423 2643 dependencies: ··· 2554 2774 '@babel/helper-string-parser': 7.27.1 2555 2775 '@babel/helper-validator-identifier': 7.28.5 2556 2776 2777 + '@biomejs/biome@2.3.11': 2778 + optionalDependencies: 2779 + '@biomejs/cli-darwin-arm64': 2.3.11 2780 + '@biomejs/cli-darwin-x64': 2.3.11 2781 + '@biomejs/cli-linux-arm64': 2.3.11 2782 + '@biomejs/cli-linux-arm64-musl': 2.3.11 2783 + '@biomejs/cli-linux-x64': 2.3.11 2784 + '@biomejs/cli-linux-x64-musl': 2.3.11 2785 + '@biomejs/cli-win32-arm64': 2.3.11 2786 + '@biomejs/cli-win32-x64': 2.3.11 2787 + 2788 + '@biomejs/cli-darwin-arm64@2.3.11': 2789 + optional: true 2790 + 2791 + '@biomejs/cli-darwin-x64@2.3.11': 2792 + optional: true 2793 + 2794 + '@biomejs/cli-linux-arm64-musl@2.3.11': 2795 + optional: true 2796 + 2797 + '@biomejs/cli-linux-arm64@2.3.11': 2798 + optional: true 2799 + 2800 + '@biomejs/cli-linux-x64-musl@2.3.11': 2801 + optional: true 2802 + 2803 + '@biomejs/cli-linux-x64@2.3.11': 2804 + optional: true 2805 + 2806 + '@biomejs/cli-win32-arm64@2.3.11': 2807 + optional: true 2808 + 2809 + '@biomejs/cli-win32-x64@2.3.11': 2810 + optional: true 2811 + 2557 2812 '@capsizecss/unpack@4.0.0': 2558 2813 dependencies: 2559 2814 fontkitten: 1.0.0 ··· 2663 2918 2664 2919 '@esbuild/win32-x64@0.25.12': 2665 2920 optional: true 2921 + 2922 + '@iconify-json/lucide@1.2.83': 2923 + dependencies: 2924 + '@iconify/types': 2.0.0 2925 + 2926 + '@iconify/tools@4.2.0': 2927 + dependencies: 2928 + '@iconify/types': 2.0.0 2929 + '@iconify/utils': 2.3.0 2930 + cheerio: 1.1.2 2931 + domhandler: 5.0.3 2932 + extract-zip: 2.0.1 2933 + local-pkg: 1.1.2 2934 + pathe: 2.0.3 2935 + svgo: 3.3.2 2936 + tar: 7.5.2 2937 + transitivePeerDependencies: 2938 + - supports-color 2939 + 2940 + '@iconify/types@2.0.0': {} 2941 + 2942 + '@iconify/utils@2.3.0': 2943 + dependencies: 2944 + '@antfu/install-pkg': 1.1.0 2945 + '@antfu/utils': 8.1.1 2946 + '@iconify/types': 2.0.0 2947 + debug: 4.4.3 2948 + globals: 15.15.0 2949 + kolorist: 1.8.0 2950 + local-pkg: 1.1.2 2951 + mlly: 1.8.0 2952 + transitivePeerDependencies: 2953 + - supports-color 2666 2954 2667 2955 '@img/colour@1.0.0': {} 2668 2956 ··· 2997 3285 tailwindcss: 4.1.17 2998 3286 vite: 6.4.1(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.1) 2999 3287 3288 + '@trysound/sax@0.2.0': {} 3289 + 3000 3290 '@types/debug@4.1.12': 3001 3291 dependencies: 3002 3292 '@types/ms': 2.1.0 ··· 3028 3318 '@types/node': 24.10.1 3029 3319 3030 3320 '@types/unist@3.0.3': {} 3321 + 3322 + '@types/yauzl@2.10.3': 3323 + dependencies: 3324 + '@types/node': 24.10.1 3325 + optional: true 3031 3326 3032 3327 '@ungap/structured-clone@1.3.0': {} 3033 3328 ··· 3179 3474 astro: 5.16.8(@types/node@24.10.1)(@vercel/functions@2.2.13)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.2)(typescript@5.9.3)(yaml@2.8.1) 3180 3475 ultrahtml: 1.6.0 3181 3476 3477 + astro-icon@1.1.5: 3478 + dependencies: 3479 + '@iconify/tools': 4.2.0 3480 + '@iconify/types': 2.0.0 3481 + '@iconify/utils': 2.3.0 3482 + transitivePeerDependencies: 3483 + - supports-color 3484 + 3182 3485 astro-og@0.3.0(astro@5.16.8(@types/node@24.10.1)(@vercel/functions@2.2.13)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.2)(typescript@5.9.3)(yaml@2.8.1)): 3183 3486 dependencies: 3184 3487 astro: 5.16.8(@types/node@24.10.1)(@vercel/functions@2.2.13)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.2)(typescript@5.9.3)(yaml@2.8.1) ··· 3331 3634 dependencies: 3332 3635 fill-range: 7.1.1 3333 3636 3637 + buffer-crc32@0.2.13: {} 3638 + 3334 3639 camelcase@8.0.0: {} 3335 3640 3336 3641 ccount@2.0.1: {} ··· 3343 3648 3344 3649 character-entities@2.0.2: {} 3345 3650 3651 + cheerio-select@2.1.0: 3652 + dependencies: 3653 + boolbase: 1.0.0 3654 + css-select: 5.2.2 3655 + css-what: 6.2.2 3656 + domelementtype: 2.3.0 3657 + domhandler: 5.0.3 3658 + domutils: 3.2.2 3659 + 3660 + cheerio@1.1.2: 3661 + dependencies: 3662 + cheerio-select: 2.1.0 3663 + dom-serializer: 2.0.0 3664 + domhandler: 5.0.3 3665 + domutils: 3.2.2 3666 + encoding-sniffer: 0.2.1 3667 + htmlparser2: 10.0.0 3668 + parse5: 7.3.0 3669 + parse5-htmlparser2-tree-adapter: 7.1.0 3670 + parse5-parser-stream: 7.1.2 3671 + undici: 7.18.2 3672 + whatwg-mimetype: 4.0.0 3673 + 3346 3674 chokidar@3.6.0: 3347 3675 dependencies: 3348 3676 anymatch: 3.1.3 ··· 3383 3711 3384 3712 commander@11.1.0: {} 3385 3713 3714 + commander@7.2.0: {} 3715 + 3386 3716 common-ancestor-path@1.0.1: {} 3387 3717 3718 + confbox@0.1.8: {} 3719 + 3720 + confbox@0.2.2: {} 3721 + 3388 3722 consola@3.4.2: {} 3389 3723 3390 3724 cookie-es@1.2.2: {} ··· 3412 3746 css-tree@2.2.1: 3413 3747 dependencies: 3414 3748 mdn-data: 2.0.28 3749 + source-map-js: 1.2.1 3750 + 3751 + css-tree@2.3.1: 3752 + dependencies: 3753 + mdn-data: 2.0.30 3415 3754 source-map-js: 1.2.1 3416 3755 3417 3756 css-tree@3.1.0: ··· 3490 3829 3491 3830 emoji-regex@9.2.2: {} 3492 3831 3832 + encoding-sniffer@0.2.1: 3833 + dependencies: 3834 + iconv-lite: 0.6.3 3835 + whatwg-encoding: 3.1.1 3836 + 3837 + end-of-stream@1.4.5: 3838 + dependencies: 3839 + once: 1.4.0 3840 + 3493 3841 enhanced-resolve@5.18.3: 3494 3842 dependencies: 3495 3843 graceful-fs: 4.2.11 ··· 3542 3890 3543 3891 eventemitter3@5.0.1: {} 3544 3892 3893 + exsolve@1.0.8: {} 3894 + 3545 3895 extend@3.0.2: {} 3896 + 3897 + extract-zip@2.0.1: 3898 + dependencies: 3899 + debug: 4.4.3 3900 + get-stream: 5.2.0 3901 + yauzl: 2.10.0 3902 + optionalDependencies: 3903 + '@types/yauzl': 2.10.3 3904 + transitivePeerDependencies: 3905 + - supports-color 3546 3906 3547 3907 fast-deep-equal@3.1.3: {} 3548 3908 ··· 3563 3923 dependencies: 3564 3924 reusify: 1.1.0 3565 3925 3926 + fd-slicer@1.1.0: 3927 + dependencies: 3928 + pend: 1.2.0 3929 + 3566 3930 fdir@6.5.0(picomatch@4.0.3): 3567 3931 optionalDependencies: 3568 3932 picomatch: 4.0.3 ··· 3595 3959 3596 3960 get-east-asian-width@1.4.0: {} 3597 3961 3962 + get-stream@5.2.0: 3963 + dependencies: 3964 + pump: 3.0.3 3965 + 3598 3966 github-slugger@2.0.0: {} 3599 3967 3600 3968 glob-parent@5.1.2: ··· 3609 3977 minipass: 7.1.2 3610 3978 package-json-from-dist: 1.0.1 3611 3979 path-scurry: 1.11.1 3980 + 3981 + globals@15.15.0: {} 3612 3982 3613 3983 graceful-fs@4.2.11: {} 3614 3984 ··· 3715 4085 3716 4086 html-void-elements@3.0.0: {} 3717 4087 4088 + htmlparser2@10.0.0: 4089 + dependencies: 4090 + domelementtype: 2.3.0 4091 + domhandler: 5.0.3 4092 + domutils: 3.2.2 4093 + entities: 6.0.1 4094 + 3718 4095 http-cache-semantics@4.2.0: {} 3719 4096 3720 4097 https-proxy-agent@7.0.6: ··· 3723 4100 debug: 4.4.3 3724 4101 transitivePeerDependencies: 3725 4102 - supports-color 4103 + 4104 + iconv-lite@0.6.3: 4105 + dependencies: 4106 + safer-buffer: 2.1.2 3726 4107 3727 4108 import-meta-resolve@4.2.0: {} 3728 4109 ··· 3781 4162 3782 4163 kleur@4.1.5: {} 3783 4164 4165 + kolorist@1.8.0: {} 4166 + 3784 4167 lightningcss-android-arm64@1.30.2: 3785 4168 optional: true 3786 4169 ··· 3831 4214 lightningcss-win32-x64-msvc: 1.30.2 3832 4215 3833 4216 lite-youtube-embed@0.3.4: {} 4217 + 4218 + local-pkg@1.1.2: 4219 + dependencies: 4220 + mlly: 1.8.0 4221 + pkg-types: 2.3.0 4222 + quansync: 0.2.11 3834 4223 3835 4224 lodash@4.17.21: {} 3836 4225 ··· 3972 4361 3973 4362 mdn-data@2.0.28: {} 3974 4363 4364 + mdn-data@2.0.30: {} 4365 + 3975 4366 mdn-data@2.12.2: {} 3976 4367 3977 4368 merge2@1.4.1: {} ··· 4182 4573 dependencies: 4183 4574 minipass: 7.1.2 4184 4575 4576 + mlly@1.8.0: 4577 + dependencies: 4578 + acorn: 8.15.0 4579 + pathe: 2.0.3 4580 + pkg-types: 1.3.1 4581 + ufo: 1.6.1 4582 + 4185 4583 mrmime@2.0.1: {} 4186 4584 4187 4585 ms@2.1.3: {} ··· 4224 4622 4225 4623 ohash@2.0.11: {} 4226 4624 4625 + once@1.4.0: 4626 + dependencies: 4627 + wrappy: 1.0.2 4628 + 4227 4629 oniguruma-parser@0.12.1: {} 4228 4630 4229 4631 oniguruma-to-es@4.3.4: ··· 4256 4658 unist-util-visit-children: 3.0.0 4257 4659 vfile: 6.0.3 4258 4660 4661 + parse5-htmlparser2-tree-adapter@7.1.0: 4662 + dependencies: 4663 + domhandler: 5.0.3 4664 + parse5: 7.3.0 4665 + 4666 + parse5-parser-stream@7.1.2: 4667 + dependencies: 4668 + parse5: 7.3.0 4669 + 4259 4670 parse5@7.3.0: 4260 4671 dependencies: 4261 4672 entities: 6.0.1 ··· 4273 4684 4274 4685 path-to-regexp@6.3.0: {} 4275 4686 4687 + pathe@2.0.3: {} 4688 + 4689 + pend@1.2.0: {} 4690 + 4276 4691 piccolore@0.1.3: {} 4277 4692 4278 4693 picocolors@1.1.1: {} ··· 4281 4696 4282 4697 picomatch@4.0.3: {} 4283 4698 4699 + pkg-types@1.3.1: 4700 + dependencies: 4701 + confbox: 0.1.8 4702 + mlly: 1.8.0 4703 + pathe: 2.0.3 4704 + 4705 + pkg-types@2.3.0: 4706 + dependencies: 4707 + confbox: 0.2.2 4708 + exsolve: 1.0.8 4709 + pathe: 2.0.3 4710 + 4284 4711 postcss@8.5.6: 4285 4712 dependencies: 4286 4713 nanoid: 3.3.11 ··· 4314 4741 4315 4742 property-information@7.1.0: {} 4316 4743 4744 + pump@3.0.3: 4745 + dependencies: 4746 + end-of-stream: 1.4.5 4747 + once: 1.4.0 4748 + 4317 4749 punycode@2.3.1: 4318 4750 optional: true 4319 4751 4752 + quansync@0.2.11: {} 4753 + 4320 4754 queue-microtask@1.2.3: {} 4321 4755 4322 4756 radix3@1.1.2: {} ··· 4474 4908 4475 4909 s.color@0.0.15: {} 4476 4910 4911 + safer-buffer@2.1.2: {} 4912 + 4477 4913 sass-formatter@0.7.9: 4478 4914 dependencies: 4479 4915 suf-log: 2.5.3 ··· 4584 5020 dependencies: 4585 5021 s.color: 0.0.15 4586 5022 5023 + svgo@3.3.2: 5024 + dependencies: 5025 + '@trysound/sax': 0.2.0 5026 + commander: 7.2.0 5027 + css-select: 5.2.2 5028 + css-tree: 2.3.1 5029 + css-what: 6.2.2 5030 + csso: 5.0.5 5031 + picocolors: 1.1.1 5032 + 4587 5033 svgo@4.0.0: 4588 5034 dependencies: 4589 5035 commander: 11.1.0 ··· 4650 5096 4651 5097 undici-types@7.16.0: {} 4652 5098 5099 + undici@7.18.2: {} 5100 + 4653 5101 unified@11.0.5: 4654 5102 dependencies: 4655 5103 '@types/unist': 3.0.3 ··· 4861 5309 4862 5310 webidl-conversions@3.0.1: {} 4863 5311 5312 + whatwg-encoding@3.1.1: 5313 + dependencies: 5314 + iconv-lite: 0.6.3 5315 + 5316 + whatwg-mimetype@4.0.0: {} 5317 + 4864 5318 whatwg-url@5.0.0: 4865 5319 dependencies: 4866 5320 tr46: 0.0.3 ··· 4894 5348 string-width: 7.2.0 4895 5349 strip-ansi: 7.1.2 4896 5350 5351 + wrappy@1.0.2: {} 5352 + 4897 5353 xxhash-wasm@1.1.0: {} 4898 5354 4899 5355 y18n@5.0.8: {} ··· 4930 5386 string-width: 4.2.3 4931 5387 y18n: 5.0.8 4932 5388 yargs-parser: 21.1.1 5389 + 5390 + yauzl@2.10.0: 5391 + dependencies: 5392 + buffer-crc32: 0.2.13 5393 + fd-slicer: 1.1.0 4933 5394 4934 5395 yocto-queue@1.2.2: {} 4935 5396
src/assets/rewrite/images/seasons/icons/3rd-life.webp

This is a binary file and will not be displayed.

src/assets/rewrite/images/seasons/icons/double-life.webp

This is a binary file and will not be displayed.

src/assets/rewrite/images/seasons/icons/last-life.webp

This is a binary file and will not be displayed.

src/assets/rewrite/images/seasons/icons/limited-life.webp

This is a binary file and will not be displayed.

src/assets/rewrite/images/seasons/icons/past-life.webp

This is a binary file and will not be displayed.

src/assets/rewrite/images/seasons/icons/secret-life.webp

This is a binary file and will not be displayed.

src/assets/rewrite/images/seasons/icons/wild-life.webp

This is a binary file and will not be displayed.

+2 -2
src/components/CustomCursor.astro
··· 8 8 <path 9 9 fill="#648D2E" 10 10 d="M12 8c0 0 0 0 0.76 -1c0.88 -1.16 2.18 -2 3.74 -2c2.49 0 4.5 2.01 4.5 4.5c0 0.93 -0.28 1.79 -0.76 2.5c-0.81 1.21 -8.24 9 -8.24 9c0 0 -7.43 -7.79 -8.24 -9c-0.48 -0.71 -0.76 -1.57 -0.76 -2.5c0 -2.49 2.01 -4.5 4.5 -4.5c1.56 0 2.87 0.84 3.74 2c0.76 1 0.76 1 0.76 1Z" 11 - ></path> 11 + /> 12 12 <path 13 13 fill="none" 14 14 stroke="#fafafa" ··· 16 16 stroke-linejoin="round" 17 17 stroke-width="2" 18 18 d="M12 8c0 0 0 0 -0.76 -1c-0.88 -1.16 -2.18 -2 -3.74 -2c-2.49 0 -4.5 2.01 -4.5 4.5c0 0.93 0.28 1.79 0.76 2.5c0.81 1.21 8.24 9 8.24 9M12 8c0 0 0 0 0.76 -1c0.88 -1.16 2.18 -2 3.74 -2c2.49 0 4.5 2.01 4.5 4.5c0 0.93 -0.28 1.79 -0.76 2.5c-0.81 1.21 -8.24 9 -8.24 9" 19 - ></path> 19 + /> 20 20 </svg> 21 21 </div> 22 22
+1 -1
src/components/MemberList.astro
··· 1 1 --- 2 2 import { Image } from 'astro:assets'; 3 - import { type CollectionEntry } from 'astro:content'; 3 + import type { CollectionEntry } from 'astro:content'; 4 4 import { getMemberImage } from '@/utils/images'; 5 5 import { isCurrentPage } from '@/utils/url'; 6 6
+2 -2
src/components/SeasonList.astro
··· 1 1 --- 2 2 import { Image } from 'astro:assets'; 3 - import { type CollectionEntry } from 'astro:content'; 3 + import type { CollectionEntry } from 'astro:content'; 4 4 import { getSeasonImage } from '@/utils/images'; 5 - import { isCurrentPage, containsPath } from '@/utils/url'; 5 + import { containsPath, isCurrentPage } from '@/utils/url'; 6 6 7 7 interface Props { 8 8 seasons: CollectionEntry<'seasons'>[];
+65
src/components/rewrite/CustomCursor.astro
··· 1 + <div class="custom-cursor"> 2 + <svg 3 + xmlns="http://www.w3.org/2000/svg" 4 + width="24" 5 + height="24" 6 + viewBox="0 0 24 24" 7 + aria-hidden="true" 8 + > 9 + <path 10 + fill="#648D2E" 11 + d="M12 8c0 0 0 0 0.76 -1c0.88 -1.16 2.18 -2 3.74 -2c2.49 0 4.5 2.01 4.5 4.5c0 0.93 -0.28 1.79 -0.76 2.5c-0.81 1.21 -8.24 9 -8.24 9c0 0 -7.43 -7.79 -8.24 -9c-0.48 -0.71 -0.76 -1.57 -0.76 -2.5c0 -2.49 2.01 -4.5 4.5 -4.5c1.56 0 2.87 0.84 3.74 2c0.76 1 0.76 1 0.76 1Z" 12 + /> 13 + <path 14 + fill="none" 15 + stroke="#fafafa" 16 + stroke-linecap="round" 17 + stroke-linejoin="round" 18 + stroke-width="2" 19 + d="M12 8c0 0 0 0 -0.76 -1c-0.88 -1.16 -2.18 -2 -3.74 -2c-2.49 0 -4.5 2.01 -4.5 4.5c0 0.93 0.28 1.79 0.76 2.5c0.81 1.21 8.24 9 8.24 9M12 8c0 0 0 0 0.76 -1c0.88 -1.16 2.18 -2 3.74 -2c2.49 0 4.5 2.01 4.5 4.5c0 0.93 -0.28 1.79 -0.76 2.5c-0.81 1.21 -8.24 9 -8.24 9" 20 + /> 21 + </svg> 22 + </div> 23 + 24 + <script> 25 + const cursor = document.querySelector('.custom-cursor') as HTMLElement | null; 26 + const isTouchDevice = 'ontouchstart' in window || navigator.maxTouchPoints > 0; 27 + 28 + if (!isTouchDevice && cursor) { 29 + let hasMoved = false; 30 + 31 + document.addEventListener('mousemove', (event) => { 32 + if (!hasMoved) { 33 + cursor.style.display = 'block'; 34 + hasMoved = true; 35 + } 36 + 37 + cursor.style.left = `${event.clientX}px`; 38 + cursor.style.top = `${event.clientY}px`; 39 + }); 40 + } 41 + </script> 42 + 43 + <style> 44 + .custom-cursor { 45 + display: none; 46 + pointer-events: none; 47 + position: fixed; 48 + z-index: calc(infinity * 1); 49 + translate: 50% -75%; 50 + rotate: 25deg; 51 + transform-origin: top left; 52 + filter: drop-shadow( 53 + color-mix(in oklch, var(--color-canvas-text) 25%, transparent) 1px 1px 2px 54 + ); 55 + transition: opacity 100ms linear; 56 + 57 + @starting-style { 58 + opacity: 0; 59 + } 60 + } 61 + 62 + :global(:has(a:hover)) .custom-cursor { 63 + opacity: 0.25; 64 + } 65 + </style>
+31
src/components/rewrite/MemberItem.astro
··· 1 + --- 2 + import { Image } from 'astro:assets'; 3 + import { getMemberImage } from '@/utils/images'; 4 + 5 + interface Props { 6 + memberName: string; 7 + title?: string; 8 + } 9 + 10 + const { memberName, title } = Astro.props; 11 + --- 12 + 13 + <div class="cluster gap-text-icon"> 14 + <Image 15 + src={getMemberImage(memberName)} 16 + alt="" 17 + loading="eager" 18 + width="64" 19 + height="64" 20 + /> 21 + <div class="name">{title ?? memberName}</div> 22 + </div> 23 + 24 + <style> 25 + img { 26 + max-width: 30px; 27 + aspect-ratio: 1; 28 + border: 1px solid var(--color-surface-2); 29 + border-radius: calc(infinity * 1px); 30 + } 31 + </style>
+104
src/components/rewrite/SeasonLayout.astro
··· 1 + --- 2 + import type { CollectionEntry } from 'astro:content'; 3 + import SiteFooter from '@/components/rewrite/SiteFooter.astro'; 4 + import SiteHeader from '@/components/rewrite/SiteHeader.astro'; 5 + 6 + interface Props { 7 + season: CollectionEntry<'seasonsRewrite'>; 8 + } 9 + 10 + const { season } = Astro.props; 11 + --- 12 + 13 + <div class="wrapper"> 14 + <SiteHeader season={season}> 15 + <slot name="inline-start-links" slot="inline-start-links" /> 16 + </SiteHeader> 17 + <aside> 18 + <nav aria-labelledby="sidebar-title"> 19 + <h2 id="sidebar-title" class="visually-hidden"> 20 + <slot name="sidebar-title" /> 21 + </h2> 22 + <div class="sidebar-nav-list"> 23 + <slot name="sidebar-nav" /> 24 + </div> 25 + </nav> 26 + </aside> 27 + <main> 28 + <div class="main-inner"> 29 + <h1 id="main-content" tabindex="-1"> 30 + <slot name="main-title" /> 31 + </h1> 32 + <slot /> 33 + </div> 34 + </main> 35 + <SiteFooter /> 36 + </div> 37 + 38 + <style> 39 + .wrapper { 40 + max-inline-size: 1586px; 41 + margin-inline: auto; 42 + display: grid; 43 + grid-template-rows: auto auto 1fr auto; 44 + min-height: 100svh; 45 + 46 + @media (width >= 48rem) { 47 + grid-template-rows: auto 1fr auto; 48 + grid-template-columns: 250px 1fr; 49 + } 50 + } 51 + 52 + aside { 53 + @media (width >= 48rem) { 54 + display: grid; 55 + grid-row: 1 / -1; 56 + max-height: 100svh; 57 + position: sticky; 58 + top: 0; 59 + overflow-y: auto; 60 + overscroll-behavior-y: none; 61 + } 62 + 63 + nav { 64 + @media (width < 48rem) { 65 + margin-inline: clamp(16px, 10.2857px + 1.7857vw, 24px); 66 + } 67 + 68 + @media (width >= 48rem) { 69 + align-self: center; 70 + padding: 16px 24px; 71 + } 72 + } 73 + 74 + .sidebar-nav-list { 75 + @media (width < 48rem) { 76 + max-block-size: 25vmax; 77 + overflow-y: auto; 78 + } 79 + } 80 + } 81 + 82 + main { 83 + container-type: inline-size; 84 + } 85 + 86 + .main-inner { 87 + margin-inline: clamp(16px, 10.2857px + 1.7857vw, 24px); 88 + padding-top: calc(clamp(16px, 10.2857px + 1.7857vw, 24px) - 16px); 89 + padding-bottom: 10vh; 90 + max-width: 1080px; 91 + 92 + @media (width >= 48rem) { 93 + margin-inline: clamp(24px, -44.7367px + 8.9501vw, 128px); 94 + padding-top: calc(clamp(24px, 12.8696px + 3.4783cqi, 80px) - 16px); 95 + } 96 + } 97 + 98 + h1 { 99 + position: sticky; 100 + top: 0; 101 + padding-block: 16px; 102 + background-color: var(--color-canvas); 103 + } 104 + </style>
+58
src/components/rewrite/SiteFooter.astro
··· 1 + --- 2 + import { Icon } from 'astro-icon/components'; 3 + --- 4 + 5 + <footer> 6 + <div class="footer-inner"> 7 + <div class="cluster"> 8 + <a href="/sitemap-0.xml"> 9 + <span>Sitemap</span> 10 + </a> 11 + <a href="https://github.com/ghustvn/life_series" rel="external"> 12 + <span class="cluster gap-text-icon"> 13 + <Icon 14 + name="lucide:github" 15 + title="GitHub" 16 + role="img" 17 + /> 18 + <span>Source code</span> 19 + </span> 20 + </a> 21 + </div> 22 + </div> 23 + </footer> 24 + 25 + <style> 26 + footer { 27 + padding-block: 8px; 28 + } 29 + 30 + footer a { 31 + padding-block: 8px; 32 + 33 + &:focus-visible { 34 + outline: none; 35 + 36 + > span { 37 + outline: 2px solid var(--color-canvas-text); 38 + outline-offset: 4px; 39 + border-radius: 1px; 40 + } 41 + } 42 + } 43 + 44 + .footer-inner { 45 + --cluster-row-gap: 0; 46 + 47 + max-inline-size: 1080px; 48 + margin-inline: clamp(16px, 10.2857px + 1.7857vw, 24px); 49 + 50 + @media (width >= 48rem) { 51 + margin-inline: clamp(24px, -44.7367px + 8.9501vw, 128px); 52 + } 53 + 54 + > * { 55 + justify-self: end; 56 + } 57 + } 58 + </style>
+77
src/components/rewrite/SiteHeader.astro
··· 1 + --- 2 + import { Image } from 'astro:assets'; 3 + import type { CollectionEntry } from 'astro:content'; 4 + import { Icon } from 'astro-icon/components'; 5 + import { getSeasonIconImage } from '@/utils/rewrite/images'; 6 + 7 + interface Props { 8 + season: CollectionEntry<'seasonsRewrite'>; 9 + } 10 + 11 + const { season } = Astro.props; 12 + --- 13 + 14 + <header> 15 + <div class="cluster header-inner"> 16 + <div class="cluster"> 17 + <div class="cluster gap-text-icon header-season"> 18 + <Image 19 + src={getSeasonIconImage(season.id)} 20 + alt="" 21 + loading="eager" 22 + width="64" 23 + /> 24 + <div>{season.data.title}</div> 25 + </div> 26 + <slot name="inline-start-links" /> 27 + </div> 28 + <div class="cluster"> 29 + <a href="https://grian.store/" rel="external"> 30 + <span class="cluster gap-text-icon"> 31 + <Icon name="lucide:shopping-cart" /> 32 + <span>grian.store</span> 33 + </span> 34 + </a> 35 + </div> 36 + </div> 37 + </header> 38 + 39 + <style> 40 + header { 41 + padding-block: 8px; 42 + } 43 + 44 + header a { 45 + padding-block: 8px; 46 + 47 + &:focus-visible { 48 + outline: none; 49 + 50 + > span { 51 + outline: 2px solid var(--color-canvas-text); 52 + outline-offset: 4px; 53 + border-radius: 1px; 54 + } 55 + } 56 + } 57 + 58 + .header-inner { 59 + --cluster-horizontal-alignment: space-between; 60 + --cluster-row-gap: 0; 61 + 62 + max-inline-size: 1080px; 63 + margin-inline: clamp(16px, 10.2857px + 1.7857vw, 24px); 64 + 65 + @media (width >= 48rem) { 66 + margin-inline: clamp(24px, -44.7367px + 8.9501vw, 128px); 67 + } 68 + } 69 + 70 + .header-season { 71 + font-weight: 700; 72 + 73 + img { 74 + max-width: 32px; 75 + } 76 + } 77 + </style>
+47
src/components/rewrite/VideoItem.astro
··· 1 + --- 2 + import { Icon } from 'astro-icon/components'; 3 + 4 + interface Props { 5 + ytId: string; 6 + title: string; 7 + } 8 + 9 + const { ytId, title } = Astro.props; 10 + --- 11 + 12 + <a href={`https://www.youtube.com/watch?v=${ytId}`}> 13 + <span class="cluster gap-text-icon"> 14 + <Icon 15 + name="lucide:youtube" 16 + title="Watch on YouTube" 17 + role="img" 18 + size="1.5em" 19 + /> 20 + <span>{title}</span> 21 + </span> 22 + </a> 23 + 24 + <style> 25 + a { 26 + box-sizing: border-box; 27 + display: grid; 28 + place-items: center; 29 + max-width: var(--video-max-width, 720px); 30 + aspect-ratio: 16 / 9; 31 + padding: 16px; 32 + background-color: var(--color-surface-1); 33 + border: 1px solid var(--color-surface-2); 34 + border-radius: 8px; 35 + text-wrap: balance; 36 + text-align: center; 37 + font-weight: 400; 38 + line-height: 1.5; 39 + 40 + --cluster-horizontal-alignment: center; 41 + 42 + &:focus-visible { 43 + outline-offset: 8px; 44 + outline: 4px solid; 45 + } 46 + } 47 + </style>
+6 -6
src/data/seasons.json
··· 203 203 }, 204 204 { 205 205 "id": "Pu0LSmiwYLY", 206 - "title": "Payback :: Bdubs Past Life" 206 + "title": "Bdubs Past Life :: Payback" 207 207 }, 208 208 { 209 209 "id": "uVnfjrHMcwA", ··· 245 245 }, 246 246 { 247 247 "id": "Q5WpZdPpzfo", 248 - "title": "Past Life SMP | Ep.5 | PINK SHEEP!?" 248 + "title": "Past Life SMP | Ep.5 | PINK SHEEP?.." 249 249 }, 250 250 { 251 251 "id": "wv0Rzuj5g1s", ··· 403 403 }, 404 404 { 405 405 "id": "HnH_aNOuV68", 406 - "title": "Today Your Birthday? | Past Life Episode 2" 406 + "title": "Dodging Death Like A Boss! | Past Life Episode 2" 407 407 }, 408 408 { 409 409 "id": "U5hzqczP1cw", ··· 534 534 "title": "Past Life Ep 2 - REJECTS SUIT UP!!" 535 535 }, 536 536 { 537 - "id": "qjy1bhocqi4", 538 - "title": "i'm tearing the server in half!!! - past life ep 3" 537 + "id": "QjY1BHocqI4", 538 + "title": "I'M TEARING THE SERVER IN HALF!!! - Past Life Ep 3" 539 539 }, 540 540 { 541 541 "id": "8p-FU3i9fFM", ··· 577 577 }, 578 578 { 579 579 "id": "wdGys2fOT5w", 580 - "title": "I was the Boogeyman TWICE?! - Past Life - Ep.5" 580 + "title": "I was the Boogeyman TWICE in One Episode?! - Past Life - Ep.5" 581 581 }, 582 582 { 583 583 "id": "B_RtGYJbGvw",
+7 -22
src/layouts/BaseLayout.astro
··· 1 1 --- 2 2 import { Head } from 'astro-capo'; 3 + 4 + import CustomCursor from '@/components/CustomCursor.astro'; 3 5 import PostHog from '@/components/posthog.astro'; 4 - import CustomCursor from '@/components/CustomCursor.astro'; 5 6 import '@/styles/global.css'; 6 7 7 8 interface Props { ··· 17 18 <html lang="en"> 18 19 <Head> 19 20 <meta charset="utf-8" /> 20 - <meta 21 - name="theme-color" 22 - content="#d9ebd2" 23 - /> 24 - <link 25 - rel="icon" 26 - type="image/svg+xml" 27 - href="/favicon_green.svg" 28 - /> 29 - <link 30 - rel="sitemap" 31 - href="/sitemap-index.xml" 32 - /> 33 - <meta 34 - name="viewport" 35 - content="width=device-width" 36 - /> 37 - <meta 38 - name="generator" 39 - content={Astro.generator} 40 - /> 21 + <meta name="theme-color" content="#d9ebd2" /> 22 + <link rel="icon" type="image/svg+xml" href="/favicon_green.svg" /> 23 + <link rel="sitemap" href="/sitemap-index.xml" /> 24 + <meta name="viewport" content="width=device-width" /> 25 + <meta name="generator" content={Astro.generator} /> 41 26 <title>{title} · Life Series · Non-official site</title> 42 27 <slot name="seo" /> 43 28 <PostHog />
+4 -4
src/layouts/SeasonsLayout.astro
··· 1 1 --- 2 - import { getCollection, type CollectionEntry } from 'astro:content'; 2 + import { type CollectionEntry, getCollection } from 'astro:content'; 3 3 import { Head } from 'astro-capo'; 4 - import PostHog from '@/components/posthog.astro'; 5 4 import CustomCursor from '@/components/CustomCursor.astro'; 6 - import SeasonList from '@/components/SeasonList.astro'; 7 - import MemberList from '@/components/MemberList.astro'; 8 5 import MenuIcon from '@/components/icons/MenuIcon.astro'; 6 + import MemberList from '@/components/MemberList.astro'; 7 + import PostHog from '@/components/posthog.astro'; 8 + import SeasonList from '@/components/SeasonList.astro'; 9 9 import '@/styles/global.css'; 10 10 11 11 interface Props {
+10 -22
src/layouts/rewrite/BaseLayout.astro
··· 1 1 --- 2 + import { Font } from 'astro:assets'; 2 3 import { Head } from 'astro-capo'; 4 + import CustomCursor from '@/components/rewrite/CustomCursor.astro'; 5 + import '@/styles/rewrite/global.css'; 3 6 4 7 const { title } = Astro.props; 5 8 --- ··· 7 10 <html lang="en"> 8 11 <Head> 9 12 <meta charset="utf-8" /> 10 - <meta 11 - name="theme-color" 12 - content="#d9ebd2" 13 - /> 14 - <link 15 - rel="icon" 16 - href="/rewrite/favicon.png" 17 - /> 13 + <meta name="theme-color" content="#d9ebd2" /> 14 + <link rel="icon" href="/rewrite/favicon.png" /> 18 15 <!-- TODO --> 19 - <!-- <link 20 - rel="sitemap" 21 - href="/sitemap-index.xml" 22 - /> --> 23 - <meta 24 - name="viewport" 25 - content="width=device-width" 26 - /> 27 - <meta 28 - name="generator" 29 - content={Astro.generator} 30 - /> 16 + <!-- <link rel="sitemap" href="/sitemap-index.xml" /> --> 17 + <meta name="viewport" content="width=device-width" /> 18 + <meta name="generator" content={Astro.generator} /> 31 19 <title>{title} - Life Series - Non-official site</title> 20 + <Font cssVariable="--font-nunito" preload /> 32 21 <!-- TODO --> 33 22 <!-- <slot name="seo" /> 34 23 <PostHog /> --> 35 24 </Head> 36 25 <body> 37 26 <slot /> 38 - <!-- TODO --> 39 - <!-- <CustomCursor /> --> 27 + <CustomCursor /> 40 28 </body> 41 29 </html>
+2 -2
src/pages/index.astro
··· 1 1 --- 2 + import { getImage, Image } from 'astro:assets'; 2 3 import { site } from 'astro:config/client'; 3 - import { Image, getImage } from 'astro:assets'; 4 4 import { getCollection } from 'astro:content'; 5 5 import { SEO } from 'astro-seo'; 6 + import ogIndexImage from '@/assets/images/og/index.png'; 6 7 import BaseLayout from '@/layouts/BaseLayout.astro'; 7 8 import { getSeasonImage } from '@/utils/images'; 8 - import ogIndexImage from '@/assets/images/og/index.png'; 9 9 10 10 const { isRewrite } = Astro.locals; 11 11 if (isRewrite) {
+178 -1
src/pages/rewrite/seasons/[season_id]/[member_name].astro
··· 1 1 --- 2 2 import { getCollection, getEntry } from 'astro:content'; 3 + import MemberItem from '@/components/rewrite/MemberItem.astro'; 4 + import SeasonLayout from '@/components/rewrite/SeasonLayout.astro'; 5 + import VideoItem from '@/components/rewrite/VideoItem.astro'; 3 6 import BaseLayout from '@/layouts/rewrite/BaseLayout.astro'; 7 + import { isCurrentPage } from '@/utils/url'; 4 8 5 9 const { isRewrite } = Astro.locals; 6 10 if (!isRewrite) { ··· 52 56 const pageTitle = `${member.data.name} - ${season.data.title}`; 53 57 --- 54 58 55 - <BaseLayout title={pageTitle} /> 59 + <BaseLayout title={pageTitle}> 60 + <SeasonLayout season={season}> 61 + { 62 + season.data.sessionCount && ( 63 + <a 64 + slot="inline-start-links" 65 + href={`/rewrite/seasons/${season.id}/sessions/1`} 66 + > 67 + <span>All sessions</span> 68 + </a> 69 + ) 70 + } 71 + <Fragment slot="sidebar-title">Members</Fragment> 72 + <ul 73 + slot="sidebar-nav" 74 + role="list" 75 + aria-labelledby="sidebar-title" 76 + class="member-list" 77 + > 78 + { 79 + members.map((member) => { 80 + const isPlaying = Object.keys(season.data.videos).includes(member.data.name); 81 + 82 + return ( 83 + <li> 84 + <a 85 + class="member-item-link" 86 + role={!isPlaying ? 'link' : undefined} 87 + aria-disabled={!isPlaying ? 'true' : undefined} 88 + href={ 89 + isPlaying 90 + ? `/rewrite/seasons/${season.id}/${member.data.name}` 91 + : undefined 92 + } 93 + aria-current={ 94 + isPlaying 95 + ? isCurrentPage( 96 + Astro.url.pathname, 97 + `/rewrite/seasons/${season.id}/${member.data.name}`, 98 + ) 99 + : undefined 100 + } 101 + > 102 + <MemberItem memberName={member.data.name} /> 103 + </a> 104 + </li> 105 + ); 106 + }) 107 + } 108 + </ul> 109 + <MemberItem 110 + slot="main-title" 111 + memberName={member.data.name} 112 + title={`${member.data.name} - ${season.data.title}`} 113 + /> 114 + <div class="flow movie-session-wrapper"> 115 + { 116 + movie && ( 117 + <div class="flow movie-wrapper"> 118 + <h2>The Movie</h2> 119 + <VideoItem 120 + ytId={movie.id} 121 + title={movie.title} 122 + /> 123 + </div> 124 + ) 125 + } 126 + { 127 + sessions.length > 0 && ( 128 + <div class="flow session-wrapper"> 129 + <h2>Sessions</h2> 130 + <ol role="list" class="flow session-list"> 131 + {sessions.map((session, i) => ( 132 + <li> 133 + <h2> 134 + <VideoItem 135 + ytId={session.id} 136 + title={`Session ${i + 1} - ${session.title}`} 137 + /> 138 + </h2> 139 + </li> 140 + ))} 141 + </ol> 142 + </div> 143 + ) 144 + } 145 + </div> 146 + </SeasonLayout> 147 + </BaseLayout> 148 + 149 + <style> 150 + .member-list { 151 + &:has(.member-item-link:focus-visible) .member-item-link:not(:focus-visible) { 152 + filter: grayscale(75%); 153 + opacity: 0.8; 154 + } 155 + 156 + @media (hover) { 157 + &:has(.member-item-link:not([aria-disabled='true']):hover) 158 + .member-item-link:not(:hover) { 159 + filter: grayscale(75%); 160 + opacity: 0.8; 161 + } 162 + } 163 + } 164 + 165 + .member-item-link { 166 + display: grid; /* Fixes parent to be 1px taller */ 167 + justify-content: start; 168 + inline-size: 100%; 169 + padding-block: 4px; 170 + padding-inline-end: 12px; 171 + text-decoration: none; 172 + transition-property: filter, opacity; 173 + transition-duration: 100ms; 174 + transition-timing-function: linear; 175 + 176 + &:focus-visible { 177 + outline: none; 178 + 179 + > :global(div) { 180 + outline: 2px solid var(--color-canvas-text); 181 + outline-offset: 4px; 182 + border-radius: 1px; 183 + } 184 + } 185 + 186 + @media (prefers-reduced-motion: no-preference) { 187 + transition: translate var(--spring-transition-duration); 188 + transition-timing-function: var(--spring-transition-timing-function); 189 + 190 + &:focus-visible:not([aria-current='page']) { 191 + translate: 8px; 192 + } 193 + } 194 + 195 + @media (hover) and (prefers-reduced-motion: no-preference) { 196 + &:hover:not([aria-current='page']):not([aria-disabled]) { 197 + translate: 8px; 198 + } 199 + } 200 + 201 + &[aria-current='page'] { 202 + translate: 12px; 203 + text-decoration-line: underline; 204 + text-decoration-style: wavy; 205 + } 206 + 207 + &[aria-disabled='true'] { 208 + filter: grayscale(75%); 209 + text-decoration: line-through 2px; 210 + } 211 + } 212 + 213 + .movie-session-wrapper > * + * { 214 + --flow-space: clamp(48px, 25.7391px + 6.9565cqi, 160px); 215 + } 216 + 217 + .movie-wrapper { 218 + --video-max-width: 1080px; 219 + 220 + > * + * { 221 + --flow-space: 1em; 222 + } 223 + } 224 + 225 + .session-wrapper > * + * { 226 + --flow-space: 1em; 227 + } 228 + 229 + .session-list > * + * { 230 + --flow-space: clamp(24px, -4.5714px + 8.9286cqi, 64px); 231 + } 232 + </style>
+3 -3
src/pages/seasons/7/sessions/[session_id].astro
··· 1 1 --- 2 2 import { Image } from 'astro:assets'; 3 - import { getEntry, type CollectionEntry } from 'astro:content'; 4 - import { SEO } from 'astro-seo'; 3 + import { type CollectionEntry, getEntry } from 'astro:content'; 5 4 import { YouTube } from '@astro-community/astro-embed-youtube'; 5 + import { SEO } from 'astro-seo'; 6 + import SessionList from '@/components/SessionList.astro'; 6 7 import SeasonsLayout from '@/layouts/SeasonsLayout.astro'; 7 - import SessionList from '@/components/SessionList.astro'; 8 8 import { getMemberImage } from '@/utils/images'; 9 9 10 10 const { isRewrite } = Astro.locals;
+1 -1
src/pages/seasons/[season_id].astro
··· 1 1 --- 2 2 import { getCollection } from 'astro:content'; 3 3 import { SEO } from 'astro-seo'; 4 - import SeasonsLayout from '@/layouts/SeasonsLayout.astro'; 5 4 import SessionList from '@/components/SessionList.astro'; 5 + import SeasonsLayout from '@/layouts/SeasonsLayout.astro'; 6 6 import { getSeasonOGImage } from '@/utils/images'; 7 7 8 8 const { isRewrite } = Astro.locals;
+3 -3
src/pages/seasons/[season_id]/[member_name].astro
··· 1 1 --- 2 2 import { getCollection, getEntry } from 'astro:content'; 3 - import { SEO } from 'astro-seo'; 4 3 import { YouTube } from '@astro-community/astro-embed-youtube'; 4 + import { SEO } from 'astro-seo'; 5 5 import SeasonsLayout from '@/layouts/SeasonsLayout.astro'; 6 6 7 7 const { isRewrite } = Astro.locals; ··· 9 9 return Astro.redirect('/404'); 10 10 } 11 11 12 - async function asyncFilter<T>(arr: T[], predicate: (value: T) => {}) { 12 + async function asyncFilter<T>(arr: T[], predicate: (value: T) => object) { 13 13 return Promise.all(arr.map(predicate)).then((results) => 14 - arr.filter((_: any, index: number) => results[index]), 14 + arr.filter((_: unknown, index: number) => results[index]), 15 15 ); 16 16 } 17 17
+3 -3
src/pages/seasons/nice-life/sessions/[session_id].astro
··· 1 1 --- 2 2 import { Image } from 'astro:assets'; 3 - import { getEntry, type CollectionEntry } from 'astro:content'; 4 - import { SEO } from 'astro-seo'; 3 + import { type CollectionEntry, getEntry } from 'astro:content'; 5 4 import { YouTube } from '@astro-community/astro-embed-youtube'; 5 + import { SEO } from 'astro-seo'; 6 + import SessionList from '@/components/SessionList.astro'; 6 7 import SeasonsLayout from '@/layouts/SeasonsLayout.astro'; 7 - import SessionList from '@/components/SessionList.astro'; 8 8 import { getMemberImage } from '@/utils/images'; 9 9 10 10 const { isRewrite } = Astro.locals;
+22 -5
src/styles/global.css
··· 13 13 /* @link https://utopia.fyi/clamp/calculator?a=320,1930,24—80 */ 14 14 --spacing-fluid-c-320-1930-24-80: clamp(24px, 12.8696px + 3.4783cqi, 80px); 15 15 /* @link https://utopia.fyi/clamp/calculator?a=768,1930,24—128 */ 16 - --spacing-fluid-v-768-1930-24-128: clamp(24px, -44.7367px + 8.9501vw, 128px); 16 + --spacing-fluid-v-768-1930-24-128: clamp( 17 + 24px, 18 + -44.7367px + 19 + 8.9501vw, 20 + 128px 21 + ); 17 22 18 23 /* @link https://utopia.fyi/type/calculator?c=320,16,1.25,768,20,1.25,5,2,&s=0.75|0.5|0.25,1.5|2|3|4|6,s-l&g=s,l,xl,12 */ 19 24 --text-h3: clamp(1rem, 0.8214rem + 0.8929cqi, 1.25rem); ··· 50 55 } 51 56 52 57 @theme inline { 53 - --color-canvas: color-mix(in oklab, var(--green-color), var(--color-white) 80%); 54 - --color-canvas-text: color-mix(in oklab, var(--green-color), var(--color-black) 50%); 58 + --color-canvas: color-mix( 59 + in oklab, 60 + var(--green-color), 61 + var(--color-white) 80% 62 + ); 63 + --color-canvas-text: color-mix( 64 + in oklab, 65 + var(--green-color), 66 + var(--color-black) 50% 67 + ); 55 68 } 56 69 57 70 @utility custom-scrollbar-gutter-stable { ··· 191 204 transition: 192 205 scale var(--spring-transition-duration), 193 206 rotate var(--spring-transition-duration); 194 - transition-timing-function: var(--spring-transition-timing-function); 207 + transition-timing-function: var( 208 + --spring-transition-timing-function 209 + ); 195 210 } 196 211 197 212 a:focus-visible { ··· 237 252 @media (prefers-reduced-motion: no-preference) { 238 253 div { 239 254 transition: translate var(--spring-transition-duration); 240 - transition-timing-function: var(--spring-transition-timing-function); 255 + transition-timing-function: var( 256 + --spring-transition-timing-function 257 + ); 241 258 } 242 259 243 260 a:focus-visible:not([aria-current='page']) div {
+118
src/styles/rewrite/global.css
··· 1 + :root { 2 + --color-canvas: oklch(0.92 0.04 136.79); 3 + --color-canvas-text: oklch(0.3 0.09 137.86); 4 + --color-surface-1: oklch(0.89 0.04 136.27); 5 + --color-surface-2: oklch(0.76 0.05 137.31); 6 + 7 + --spring-transition-duration: 250ms; 8 + --spring-transition-timing-function: linear( 9 + 0, 10 + 0.01 1%, 11 + 0.041 2.1%, 12 + 0.091 3.2%, 13 + 0.163 4.4%, 14 + 0.329 6.6%, 15 + 0.83 12.5%, 16 + 0.955 14.2%, 17 + 1.056 15.8%, 18 + 1.138 17.4%, 19 + 1.2 19%, 20 + 1.243 20.6%, 21 + 1.268 22.2%, 22 + 1.275 24.5%, 23 + 1.251 27%, 24 + 1.204 29.6%, 25 + 1.059 35.8%, 26 + 0.999 38.8%, 27 + 0.951 42.2%, 28 + 0.928 45.6%, 29 + 0.931 50.8%, 30 + 1 62.5%, 31 + 1.019 69%, 32 + 1.019 74.7%, 33 + 0.996 90%, 34 + 1 35 + ); 36 + } 37 + 38 + @view-transition { 39 + navigation: auto; 40 + } 41 + 42 + html { 43 + text-size-adjust: none; 44 + -webkit-tap-highlight-color: color-mix( 45 + in oklch, 46 + var(--color-surface-2) 40%, 47 + transparent 48 + ); 49 + scrollbar-color: var(--color-canvas-text) var(--color-canvas); 50 + } 51 + 52 + body { 53 + margin: 0; 54 + background-color: var(--color-canvas); 55 + color: var(--color-canvas-text); 56 + font-family: var(--font-nunito); 57 + } 58 + 59 + ::selection { 60 + background-color: var(--color-surface-2); 61 + } 62 + 63 + :focus-visible { 64 + outline: 2px solid var(--color-canvas-text); 65 + outline-offset: 4px; 66 + border-radius: 1px; 67 + } 68 + 69 + h1, 70 + h2 { 71 + margin: 0; 72 + font-size: 1rem; 73 + } 74 + 75 + ul[role='list'], 76 + ol[role='list'] { 77 + list-style: none; 78 + padding: 0; 79 + margin: 0; 80 + } 81 + 82 + img { 83 + max-width: 100%; 84 + height: auto; 85 + vertical-align: middle; 86 + } 87 + 88 + a { 89 + display: inline-block; 90 + color: inherit; 91 + text-underline-position: under; 92 + } 93 + 94 + .visually-hidden:not(:focus-visible):not(:active) { 95 + clip-path: inset(50%); 96 + height: 1px; 97 + overflow: hidden; 98 + position: absolute; 99 + white-space: nowrap; 100 + width: 1px; 101 + } 102 + 103 + .flow > * + * { 104 + margin-block-start: var(--flow-space, 1em); 105 + } 106 + 107 + .cluster { 108 + display: flex; 109 + flex-wrap: wrap; 110 + align-items: center; 111 + justify-content: var(--cluster-horizontal-alignment, flex-start); 112 + column-gap: var(--cluster-column-gap, var(--gutter, 16px)); 113 + row-gap: var(--cluster-row-gap, var(--gutter, 16px)); 114 + } 115 + 116 + .gap-text-icon { 117 + --gutter: 8px; 118 + }
+4 -3
src/utils/images.ts
··· 1 - import type { ImageMetadata } from 'astro'; 2 - import { site } from 'astro:config/client'; 3 1 import { getImage } from 'astro:assets'; 2 + import { site } from 'astro:config/client'; 3 + import type { ImageMetadata } from 'astro'; 4 4 5 5 export async function getMemberImage(member: string) { 6 6 const memberImages = import.meta.glob<{ default: ImageMetadata }>( ··· 20 20 const seasonImages = import.meta.glob<{ default: ImageMetadata }>( 21 21 '/src/assets/images/og/seasons/*', 22 22 ); 23 - const image = await seasonImages[`/src/assets/images/og/seasons/${season}.png`](); 23 + const image = 24 + await seasonImages[`/src/assets/images/og/seasons/${season}.png`](); 24 25 const formattedImage = await getImage({ 25 26 src: image.default, 26 27 format: 'webp',
+13
src/utils/rewrite/images.ts
··· 1 + import type { ImageMetadata } from 'astro'; 2 + 3 + export async function getSeasonIconImage(season: string) { 4 + const seasonImages = import.meta.glob<{ default: ImageMetadata }>( 5 + '/src/assets/rewrite/images/seasons/icons/*', 6 + ); 7 + return ( 8 + seasonImages[ 9 + `/src/assets/rewrite/images/seasons/icons/${season}.webp` 10 + ] ?? 11 + seasonImages[`/src/assets/rewrite/images/seasons/icons/3rd-life.webp`] 12 + )(); 13 + }