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

Rewrite launch (#68)

* enable posthog, sitemap, crawling

* enable rewrite, remove dead code

* Generate dynamic pages

* Reduce motion

* deps: update packages

authored by ghustvn.com and committed by

GitHub 7f2c5460 e03e181f

+934 -7257
-7
astro.config.mjs
··· 1 1 // @ts-check 2 2 import sitemap from '@astrojs/sitemap'; 3 - import vercel from '@astrojs/vercel'; 4 - import tailwindcss from '@tailwindcss/vite'; 5 3 import { defineConfig, fontProviders } from 'astro/config'; 6 4 import icon from 'astro-icon'; 7 5 import og from 'astro-og'; ··· 26 24 }, 27 25 ], 28 26 }, 29 - vite: { 30 - plugins: [tailwindcss()], 31 - }, 32 - adapter: vercel(), 33 - output: 'server', 34 27 });
+1 -4
biome.json
··· 1 1 { 2 - "$schema": "https://biomejs.dev/schemas/2.3.13/schema.json", 2 + "$schema": "https://biomejs.dev/schemas/2.3.14/schema.json", 3 3 "vcs": { 4 4 "enabled": true, 5 5 "clientKind": "git", ··· 57 57 "css": { 58 58 "formatter": { 59 59 "quoteStyle": "single" 60 - }, 61 - "parser": { 62 - "tailwindDirectives": true 63 60 } 64 61 } 65 62 }
+8 -15
package.json
··· 11 11 "biome:check:write": "biome check --write" 12 12 }, 13 13 "dependencies": { 14 - "@astro-community/astro-embed-youtube": "^0.5.10", 15 - "@astrojs/sitemap": "^3.7.0", 16 - "@astrojs/vercel": "^9.0.4", 17 - "@iconify-json/lucide": "1.2.87", 18 - "@tailwindcss/vite": "^4.1.18", 19 - "astro": "^5.16.15", 20 - "astro-capo": "^0.0.1", 14 + "@astrojs/sitemap": "3.7.0", 15 + "@iconify-json/lucide": "1.2.89", 16 + "astro": "5.17.1", 17 + "astro-capo": "0.0.1", 21 18 "astro-icon": "1.1.5", 22 - "astro-og": "^0.3.2", 19 + "astro-og": "0.3.2", 23 20 "astro-seo": "1.1.0", 24 - "sharp": "^0.34.5", 25 - "tailwindcss": "^4.1.18", 26 - "typescript": "^5.9.3" 21 + "sharp": "0.34.5", 22 + "typescript": "5.9.3" 27 23 }, 28 24 "devDependencies": { 29 - "@biomejs/biome": "2.3.13", 30 - "prettier": "^3.8.1", 31 - "prettier-plugin-astro": "^0.14.1", 32 - "prettier-plugin-tailwindcss": "^0.7.2" 25 + "@biomejs/biome": "2.3.14" 33 26 } 34 27 }
+315 -1049
pnpm-lock.yaml
··· 8 8 9 9 .: 10 10 dependencies: 11 - '@astro-community/astro-embed-youtube': 12 - specifier: ^0.5.10 13 - version: 0.5.10 14 11 '@astrojs/sitemap': 15 - specifier: ^3.7.0 12 + specifier: 3.7.0 16 13 version: 3.7.0 17 - '@astrojs/vercel': 18 - specifier: ^9.0.4 19 - version: 9.0.4(astro@5.16.15(@types/node@25.0.10)(@vercel/functions@2.2.13)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.0)(typescript@5.9.3)(yaml@2.8.2))(rollup@4.57.0) 20 14 '@iconify-json/lucide': 21 - specifier: 1.2.87 22 - version: 1.2.87 23 - '@tailwindcss/vite': 24 - specifier: ^4.1.18 25 - version: 4.1.18(vite@6.4.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.2)) 15 + specifier: 1.2.89 16 + version: 1.2.89 26 17 astro: 27 - specifier: ^5.16.15 28 - version: 5.16.15(@types/node@25.0.10)(@vercel/functions@2.2.13)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.0)(typescript@5.9.3)(yaml@2.8.2) 18 + specifier: 5.17.1 19 + version: 5.17.1(@types/node@25.2.1)(@vercel/functions@2.2.13)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(typescript@5.9.3)(yaml@2.8.2) 29 20 astro-capo: 30 - specifier: ^0.0.1 31 - version: 0.0.1(astro@5.16.15(@types/node@25.0.10)(@vercel/functions@2.2.13)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.0)(typescript@5.9.3)(yaml@2.8.2)) 21 + specifier: 0.0.1 22 + version: 0.0.1(astro@5.17.1(@types/node@25.2.1)(@vercel/functions@2.2.13)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(typescript@5.9.3)(yaml@2.8.2)) 32 23 astro-icon: 33 24 specifier: 1.1.5 34 25 version: 1.1.5 35 26 astro-og: 36 - specifier: ^0.3.2 37 - version: 0.3.2(astro@5.16.15(@types/node@25.0.10)(@vercel/functions@2.2.13)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.0)(typescript@5.9.3)(yaml@2.8.2)) 27 + specifier: 0.3.2 28 + version: 0.3.2(astro@5.17.1(@types/node@25.2.1)(@vercel/functions@2.2.13)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(typescript@5.9.3)(yaml@2.8.2)) 38 29 astro-seo: 39 30 specifier: 1.1.0 40 31 version: 1.1.0(prettier-plugin-astro@0.14.1)(prettier@3.8.1)(typescript@5.9.3) 41 32 sharp: 42 - specifier: ^0.34.5 33 + specifier: 0.34.5 43 34 version: 0.34.5 44 - tailwindcss: 45 - specifier: ^4.1.18 46 - version: 4.1.18 47 35 typescript: 48 - specifier: ^5.9.3 36 + specifier: 5.9.3 49 37 version: 5.9.3 50 38 devDependencies: 51 39 '@biomejs/biome': 52 - specifier: 2.3.13 53 - version: 2.3.13 54 - prettier: 55 - specifier: ^3.8.1 56 - version: 3.8.1 57 - prettier-plugin-astro: 58 - specifier: ^0.14.1 59 - version: 0.14.1 60 - prettier-plugin-tailwindcss: 61 - specifier: ^0.7.2 62 - version: 0.7.2(prettier-plugin-astro@0.14.1)(prettier@3.8.1) 40 + specifier: 2.3.14 41 + version: 2.3.14 63 42 64 43 packages: 65 44 ··· 69 48 '@antfu/utils@8.1.1': 70 49 resolution: {integrity: sha512-Mex9nXf9vR6AhcXmMrlz/HVgYYZpVGJ6YlPgwl7UnaFpnshXs6EK/oa5Gpf3CzENMjkvEx2tQtntGnb7UtSTOQ==} 71 50 72 - '@astro-community/astro-embed-youtube@0.5.10': 73 - resolution: {integrity: sha512-hVlx77KQLjKzElVQnrU5znQ5/E60keVSAPrhuWvQQHuqva5auJtt8YBpOThkwDMuEKXjQybEF1/3C07RZ8MAOQ==} 74 - 75 51 '@astrojs/check@0.9.6': 76 52 resolution: {integrity: sha512-jlaEu5SxvSgmfGIFfNgcn5/f+29H61NJzEMfAZ82Xopr4XBchXB1GVlcJsE+elUlsYSbXlptZLX+JMG3b/wZEA==} 77 53 hasBin: true 78 54 peerDependencies: 79 55 typescript: ^5.0.0 80 56 81 - '@astrojs/compiler@2.13.0': 82 - resolution: {integrity: sha512-mqVORhUJViA28fwHYaWmsXSzLO9osbdZ5ImUfxBarqsYdMlPbqAqGJCxsNzvppp1BEzc1mJNjOVvQqeDN8Vspw==} 57 + '@astrojs/compiler@2.13.1': 58 + resolution: {integrity: sha512-f3FN83d2G/v32ipNClRKgYv30onQlMZX1vCeZMjPsMMPl1mDpmbl0+N5BYo4S/ofzqJyS5hvwacEo0CCVDn/Qg==} 83 59 84 60 '@astrojs/internal-helpers@0.7.5': 85 61 resolution: {integrity: sha512-vreGnYSSKhAjFJCWAwe/CNhONvoc5lokxtRoZims+0wa3KbHBdPHSSthJsKxPd8d/aic6lWKpRTYGY/hsgK6EA==} ··· 110 86 resolution: {integrity: sha512-UFBgfeldP06qu6khs/yY+q1cDAaArM2/7AEIqQ9Cuvf7B1hNLq0xDrZkct+QoIGyjq56y8IaE2I3CTvG99mlhQ==} 111 87 engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0} 112 88 113 - '@astrojs/vercel@9.0.4': 114 - resolution: {integrity: sha512-Nn5c0CODcx69FnNUhAcAhlDQ/Je2lLrlPmbMMI77ZvLMfyZI5NZyKD7MiKEeaYK/VTnx6fNI5rFHm6seqEPRtQ==} 115 - peerDependencies: 116 - astro: ^5.0.0 117 - 118 89 '@astrojs/yaml2ts@0.2.2': 119 90 resolution: {integrity: sha512-GOfvSr5Nqy2z5XiwqTouBBpy5FyI6DEe+/g/Mk5am9SjILN1S5fOEvYK0GuWHg98yS/dobP4m8qyqw/URW35fQ==} 120 91 ··· 126 97 resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} 127 98 engines: {node: '>=6.9.0'} 128 99 129 - '@babel/parser@7.28.6': 130 - resolution: {integrity: sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==} 100 + '@babel/parser@7.29.0': 101 + resolution: {integrity: sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==} 131 102 engines: {node: '>=6.0.0'} 132 103 hasBin: true 133 104 134 - '@babel/types@7.28.6': 135 - resolution: {integrity: sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==} 105 + '@babel/types@7.29.0': 106 + resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} 136 107 engines: {node: '>=6.9.0'} 137 108 138 - '@biomejs/biome@2.3.13': 139 - resolution: {integrity: sha512-Fw7UsV0UAtWIBIm0M7g5CRerpu1eKyKAXIazzxhbXYUyMkwNrkX/KLkGI7b+uVDQ5cLUMfOC9vR60q9IDYDstA==} 109 + '@biomejs/biome@2.3.14': 110 + resolution: {integrity: sha512-QMT6QviX0WqXJCaiqVMiBUCr5WRQ1iFSjvOLoTk6auKukJMvnMzWucXpwZB0e8F00/1/BsS9DzcKgWH+CLqVuA==} 140 111 engines: {node: '>=14.21.3'} 141 112 hasBin: true 142 113 143 - '@biomejs/cli-darwin-arm64@2.3.13': 144 - resolution: {integrity: sha512-0OCwP0/BoKzyJHnFdaTk/i7hIP9JHH9oJJq6hrSCPmJPo8JWcJhprK4gQlhFzrwdTBAW4Bjt/RmCf3ZZe59gwQ==} 114 + '@biomejs/cli-darwin-arm64@2.3.14': 115 + resolution: {integrity: sha512-UJGPpvWJMkLxSRtpCAKfKh41Q4JJXisvxZL8ChN1eNW3m/WlPFJ6EFDCE7YfUb4XS8ZFi3C1dFpxUJ0Ety5n+A==} 145 116 engines: {node: '>=14.21.3'} 146 117 cpu: [arm64] 147 118 os: [darwin] 148 119 149 - '@biomejs/cli-darwin-x64@2.3.13': 150 - resolution: {integrity: sha512-AGr8OoemT/ejynbIu56qeil2+F2WLkIjn2d8jGK1JkchxnMUhYOfnqc9sVzcRxpG9Ycvw4weQ5sprRvtb7Yhcw==} 120 + '@biomejs/cli-darwin-x64@2.3.14': 121 + resolution: {integrity: sha512-PNkLNQG6RLo8lG7QoWe/hhnMxJIt1tEimoXpGQjwS/dkdNiKBLPv4RpeQl8o3s1OKI3ZOR5XPiYtmbGGHAOnLA==} 151 122 engines: {node: '>=14.21.3'} 152 123 cpu: [x64] 153 124 os: [darwin] 154 125 155 - '@biomejs/cli-linux-arm64-musl@2.3.13': 156 - resolution: {integrity: sha512-TUdDCSY+Eo/EHjhJz7P2GnWwfqet+lFxBZzGHldrvULr59AgahamLs/N85SC4+bdF86EhqDuuw9rYLvLFWWlXA==} 126 + '@biomejs/cli-linux-arm64-musl@2.3.14': 127 + resolution: {integrity: sha512-LInRbXhYujtL3sH2TMCH/UBwJZsoGwfQjBrMfl84CD4hL/41C/EU5mldqf1yoFpsI0iPWuU83U+nB2TUUypWeg==} 157 128 engines: {node: '>=14.21.3'} 158 129 cpu: [arm64] 159 130 os: [linux] 160 131 161 - '@biomejs/cli-linux-arm64@2.3.13': 162 - resolution: {integrity: sha512-xvOiFkrDNu607MPMBUQ6huHmBG1PZLOrqhtK6pXJW3GjfVqJg0Z/qpTdhXfcqWdSZHcT+Nct2fOgewZvytESkw==} 132 + '@biomejs/cli-linux-arm64@2.3.14': 133 + resolution: {integrity: sha512-KT67FKfzIw6DNnUNdYlBg+eU24Go3n75GWK6NwU4+yJmDYFe9i/MjiI+U/iEzKvo0g7G7MZqoyrhIYuND2w8QQ==} 163 134 engines: {node: '>=14.21.3'} 164 135 cpu: [arm64] 165 136 os: [linux] 166 137 167 - '@biomejs/cli-linux-x64-musl@2.3.13': 168 - resolution: {integrity: sha512-0bdwFVSbbM//Sds6OjtnmQGp4eUjOTt6kHvR/1P0ieR9GcTUAlPNvPC3DiavTqq302W34Ae2T6u5VVNGuQtGlQ==} 138 + '@biomejs/cli-linux-x64-musl@2.3.14': 139 + resolution: {integrity: sha512-KQU7EkbBBuHPW3/rAcoiVmhlPtDSGOGRPv9js7qJVpYTzjQmVR+C9Rfcz+ti8YCH+zT1J52tuBybtP4IodjxZQ==} 169 140 engines: {node: '>=14.21.3'} 170 141 cpu: [x64] 171 142 os: [linux] 172 143 173 - '@biomejs/cli-linux-x64@2.3.13': 174 - resolution: {integrity: sha512-s+YsZlgiXNq8XkgHs6xdvKDFOj/bwTEevqEY6rC2I3cBHbxXYU1LOZstH3Ffw9hE5tE1sqT7U23C00MzkXztMw==} 144 + '@biomejs/cli-linux-x64@2.3.14': 145 + resolution: {integrity: sha512-ZsZzQsl9U+wxFrGGS4f6UxREUlgHwmEfu1IrXlgNFrNnd5Th6lIJr8KmSzu/+meSa9f4rzFrbEW9LBBA6ScoMA==} 175 146 engines: {node: '>=14.21.3'} 176 147 cpu: [x64] 177 148 os: [linux] 178 149 179 - '@biomejs/cli-win32-arm64@2.3.13': 180 - resolution: {integrity: sha512-QweDxY89fq0VvrxME+wS/BXKmqMrOTZlN9SqQ79kQSIc3FrEwvW/PvUegQF6XIVaekncDykB5dzPqjbwSKs9DA==} 150 + '@biomejs/cli-win32-arm64@2.3.14': 151 + resolution: {integrity: sha512-+IKYkj/pUBbnRf1G1+RlyA3LWiDgra1xpS7H2g4BuOzzRbRB+hmlw0yFsLprHhbbt7jUzbzAbAjK/Pn0FDnh1A==} 181 152 engines: {node: '>=14.21.3'} 182 153 cpu: [arm64] 183 154 os: [win32] 184 155 185 - '@biomejs/cli-win32-x64@2.3.13': 186 - resolution: {integrity: sha512-trDw2ogdM2lyav9WFQsdsfdVy1dvZALymRpgmWsvSez0BJzBjulhOT/t+wyKeh3pZWvwP3VMs1SoOKwO3wecMQ==} 156 + '@biomejs/cli-win32-x64@2.3.14': 157 + resolution: {integrity: sha512-oizCjdyQ3WJEswpb3Chdngeat56rIdSYK12JI3iI11Mt5T5EXcZ7WLuowzEaFPNJ3zmOQFliMN8QY1Pi+qsfdQ==} 187 158 engines: {node: '>=14.21.3'} 188 159 cpu: [x64] 189 160 os: [win32] ··· 372 343 cpu: [x64] 373 344 os: [win32] 374 345 375 - '@iconify-json/lucide@1.2.87': 376 - resolution: {integrity: sha512-wxYIAp0f8Uw0rJa6BMWMaRbiHk3yV4XczA38GKXFlqyZtTdmHM1QOF4NZw5xpMlRDzbh2MnB7wjteLeFnn/ciQ==} 346 + '@iconify-json/lucide@1.2.89': 347 + resolution: {integrity: sha512-9rZaJZn8VBls1KZnGaFTnqqZrUkd++XB3vy9WYIMgmHHgLxQMEZXg3V+oJSEeit0kCNr/OfDBmrDwuGl/LZulA==} 377 348 378 349 '@iconify/tools@4.2.0': 379 350 resolution: {integrity: sha512-WRxPva/ipxYkqZd1+CkEAQmd86dQmrwH0vwK89gmp2Kh2WyyVw57XbPng0NehP3x4V1LzLsXUneP1uMfTMZmUA==} ··· 521 492 cpu: [x64] 522 493 os: [win32] 523 494 524 - '@isaacs/cliui@8.0.2': 525 - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} 526 - engines: {node: '>=12'} 527 - 528 495 '@isaacs/fs-minipass@4.0.1': 529 496 resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} 530 497 engines: {node: '>=18.0.0'} 531 498 532 - '@jridgewell/gen-mapping@0.3.13': 533 - resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} 534 - 535 - '@jridgewell/remapping@2.3.5': 536 - resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} 537 - 538 - '@jridgewell/resolve-uri@3.1.2': 539 - resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 540 - engines: {node: '>=6.0.0'} 541 - 542 499 '@jridgewell/sourcemap-codec@1.5.5': 543 500 resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} 544 - 545 - '@jridgewell/trace-mapping@0.3.31': 546 - resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} 547 - 548 - '@mapbox/node-pre-gyp@2.0.3': 549 - resolution: {integrity: sha512-uwPAhccfFJlsfCxMYTwOdVfOz3xqyj8xYL3zJj8f0pb30tLohnnFPhLuqp4/qoEz8sNxe4SESZedcBojRefIzg==} 550 - engines: {node: '>=18'} 551 - hasBin: true 552 501 553 502 '@oslojs/encoding@1.1.0': 554 503 resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==} 555 504 556 - '@pkgjs/parseargs@0.11.0': 557 - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} 558 - engines: {node: '>=14'} 559 - 560 505 '@rollup/pluginutils@5.3.0': 561 506 resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} 562 507 engines: {node: '>=14.0.0'} ··· 566 511 rollup: 567 512 optional: true 568 513 569 - '@rollup/rollup-android-arm-eabi@4.57.0': 570 - resolution: {integrity: sha512-tPgXB6cDTndIe1ah7u6amCI1T0SsnlOuKgg10Xh3uizJk4e5M1JGaUMk7J4ciuAUcFpbOiNhm2XIjP9ON0dUqA==} 514 + '@rollup/rollup-android-arm-eabi@4.57.1': 515 + resolution: {integrity: sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==} 571 516 cpu: [arm] 572 517 os: [android] 573 518 574 - '@rollup/rollup-android-arm64@4.57.0': 575 - resolution: {integrity: sha512-sa4LyseLLXr1onr97StkU1Nb7fWcg6niokTwEVNOO7awaKaoRObQ54+V/hrF/BP1noMEaaAW6Fg2d/CfLiq3Mg==} 519 + '@rollup/rollup-android-arm64@4.57.1': 520 + resolution: {integrity: sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==} 576 521 cpu: [arm64] 577 522 os: [android] 578 523 579 - '@rollup/rollup-darwin-arm64@4.57.0': 580 - resolution: {integrity: sha512-/NNIj9A7yLjKdmkx5dC2XQ9DmjIECpGpwHoGmA5E1AhU0fuICSqSWScPhN1yLCkEdkCwJIDu2xIeLPs60MNIVg==} 524 + '@rollup/rollup-darwin-arm64@4.57.1': 525 + resolution: {integrity: sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==} 581 526 cpu: [arm64] 582 527 os: [darwin] 583 528 584 - '@rollup/rollup-darwin-x64@4.57.0': 585 - resolution: {integrity: sha512-xoh8abqgPrPYPr7pTYipqnUi1V3em56JzE/HgDgitTqZBZ3yKCWI+7KUkceM6tNweyUKYru1UMi7FC060RyKwA==} 529 + '@rollup/rollup-darwin-x64@4.57.1': 530 + resolution: {integrity: sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==} 586 531 cpu: [x64] 587 532 os: [darwin] 588 533 589 - '@rollup/rollup-freebsd-arm64@4.57.0': 590 - resolution: {integrity: sha512-PCkMh7fNahWSbA0OTUQ2OpYHpjZZr0hPr8lId8twD7a7SeWrvT3xJVyza+dQwXSSq4yEQTMoXgNOfMCsn8584g==} 534 + '@rollup/rollup-freebsd-arm64@4.57.1': 535 + resolution: {integrity: sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==} 591 536 cpu: [arm64] 592 537 os: [freebsd] 593 538 594 - '@rollup/rollup-freebsd-x64@4.57.0': 595 - resolution: {integrity: sha512-1j3stGx+qbhXql4OCDZhnK7b01s6rBKNybfsX+TNrEe9JNq4DLi1yGiR1xW+nL+FNVvI4D02PUnl6gJ/2y6WJA==} 539 + '@rollup/rollup-freebsd-x64@4.57.1': 540 + resolution: {integrity: sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==} 596 541 cpu: [x64] 597 542 os: [freebsd] 598 543 599 - '@rollup/rollup-linux-arm-gnueabihf@4.57.0': 600 - resolution: {integrity: sha512-eyrr5W08Ms9uM0mLcKfM/Uzx7hjhz2bcjv8P2uynfj0yU8GGPdz8iYrBPhiLOZqahoAMB8ZiolRZPbbU2MAi6Q==} 544 + '@rollup/rollup-linux-arm-gnueabihf@4.57.1': 545 + resolution: {integrity: sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==} 601 546 cpu: [arm] 602 547 os: [linux] 603 548 604 - '@rollup/rollup-linux-arm-musleabihf@4.57.0': 605 - resolution: {integrity: sha512-Xds90ITXJCNyX9pDhqf85MKWUI4lqjiPAipJ8OLp8xqI2Ehk+TCVhF9rvOoN8xTbcafow3QOThkNnrM33uCFQA==} 549 + '@rollup/rollup-linux-arm-musleabihf@4.57.1': 550 + resolution: {integrity: sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==} 606 551 cpu: [arm] 607 552 os: [linux] 608 553 609 - '@rollup/rollup-linux-arm64-gnu@4.57.0': 610 - resolution: {integrity: sha512-Xws2KA4CLvZmXjy46SQaXSejuKPhwVdaNinldoYfqruZBaJHqVo6hnRa8SDo9z7PBW5x84SH64+izmldCgbezw==} 554 + '@rollup/rollup-linux-arm64-gnu@4.57.1': 555 + resolution: {integrity: sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==} 611 556 cpu: [arm64] 612 557 os: [linux] 613 558 614 - '@rollup/rollup-linux-arm64-musl@4.57.0': 615 - resolution: {integrity: sha512-hrKXKbX5FdaRJj7lTMusmvKbhMJSGWJ+w++4KmjiDhpTgNlhYobMvKfDoIWecy4O60K6yA4SnztGuNTQF+Lplw==} 559 + '@rollup/rollup-linux-arm64-musl@4.57.1': 560 + resolution: {integrity: sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==} 616 561 cpu: [arm64] 617 562 os: [linux] 618 563 619 - '@rollup/rollup-linux-loong64-gnu@4.57.0': 620 - resolution: {integrity: sha512-6A+nccfSDGKsPm00d3xKcrsBcbqzCTAukjwWK6rbuAnB2bHaL3r9720HBVZ/no7+FhZLz/U3GwwZZEh6tOSI8Q==} 564 + '@rollup/rollup-linux-loong64-gnu@4.57.1': 565 + resolution: {integrity: sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==} 621 566 cpu: [loong64] 622 567 os: [linux] 623 568 624 - '@rollup/rollup-linux-loong64-musl@4.57.0': 625 - resolution: {integrity: sha512-4P1VyYUe6XAJtQH1Hh99THxr0GKMMwIXsRNOceLrJnaHTDgk1FTcTimDgneRJPvB3LqDQxUmroBclQ1S0cIJwQ==} 569 + '@rollup/rollup-linux-loong64-musl@4.57.1': 570 + resolution: {integrity: sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==} 626 571 cpu: [loong64] 627 572 os: [linux] 628 573 629 - '@rollup/rollup-linux-ppc64-gnu@4.57.0': 630 - resolution: {integrity: sha512-8Vv6pLuIZCMcgXre6c3nOPhE0gjz1+nZP6T+hwWjr7sVH8k0jRkH+XnfjjOTglyMBdSKBPPz54/y1gToSKwrSQ==} 574 + '@rollup/rollup-linux-ppc64-gnu@4.57.1': 575 + resolution: {integrity: sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==} 631 576 cpu: [ppc64] 632 577 os: [linux] 633 578 634 - '@rollup/rollup-linux-ppc64-musl@4.57.0': 635 - resolution: {integrity: sha512-r1te1M0Sm2TBVD/RxBPC6RZVwNqUTwJTA7w+C/IW5v9Ssu6xmxWEi+iJQlpBhtUiT1raJ5b48pI8tBvEjEFnFA==} 579 + '@rollup/rollup-linux-ppc64-musl@4.57.1': 580 + resolution: {integrity: sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==} 636 581 cpu: [ppc64] 637 582 os: [linux] 638 583 639 - '@rollup/rollup-linux-riscv64-gnu@4.57.0': 640 - resolution: {integrity: sha512-say0uMU/RaPm3CDQLxUUTF2oNWL8ysvHkAjcCzV2znxBr23kFfaxocS9qJm+NdkRhF8wtdEEAJuYcLPhSPbjuQ==} 584 + '@rollup/rollup-linux-riscv64-gnu@4.57.1': 585 + resolution: {integrity: sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==} 641 586 cpu: [riscv64] 642 587 os: [linux] 643 588 644 - '@rollup/rollup-linux-riscv64-musl@4.57.0': 645 - resolution: {integrity: sha512-/MU7/HizQGsnBREtRpcSbSV1zfkoxSTR7wLsRmBPQ8FwUj5sykrP1MyJTvsxP5KBq9SyE6kH8UQQQwa0ASeoQQ==} 589 + '@rollup/rollup-linux-riscv64-musl@4.57.1': 590 + resolution: {integrity: sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==} 646 591 cpu: [riscv64] 647 592 os: [linux] 648 593 649 - '@rollup/rollup-linux-s390x-gnu@4.57.0': 650 - resolution: {integrity: sha512-Q9eh+gUGILIHEaJf66aF6a414jQbDnn29zeu0eX3dHMuysnhTvsUvZTCAyZ6tJhUjnvzBKE4FtuaYxutxRZpOg==} 594 + '@rollup/rollup-linux-s390x-gnu@4.57.1': 595 + resolution: {integrity: sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==} 651 596 cpu: [s390x] 652 597 os: [linux] 653 598 654 - '@rollup/rollup-linux-x64-gnu@4.57.0': 655 - resolution: {integrity: sha512-OR5p5yG5OKSxHReWmwvM0P+VTPMwoBS45PXTMYaskKQqybkS3Kmugq1W+YbNWArF8/s7jQScgzXUhArzEQ7x0A==} 599 + '@rollup/rollup-linux-x64-gnu@4.57.1': 600 + resolution: {integrity: sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==} 656 601 cpu: [x64] 657 602 os: [linux] 658 603 659 - '@rollup/rollup-linux-x64-musl@4.57.0': 660 - resolution: {integrity: sha512-XeatKzo4lHDsVEbm1XDHZlhYZZSQYym6dg2X/Ko0kSFgio+KXLsxwJQprnR48GvdIKDOpqWqssC3iBCjoMcMpw==} 604 + '@rollup/rollup-linux-x64-musl@4.57.1': 605 + resolution: {integrity: sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==} 661 606 cpu: [x64] 662 607 os: [linux] 663 608 664 - '@rollup/rollup-openbsd-x64@4.57.0': 665 - resolution: {integrity: sha512-Lu71y78F5qOfYmubYLHPcJm74GZLU6UJ4THkf/a1K7Tz2ycwC2VUbsqbJAXaR6Bx70SRdlVrt2+n5l7F0agTUw==} 609 + '@rollup/rollup-openbsd-x64@4.57.1': 610 + resolution: {integrity: sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==} 666 611 cpu: [x64] 667 612 os: [openbsd] 668 613 669 - '@rollup/rollup-openharmony-arm64@4.57.0': 670 - resolution: {integrity: sha512-v5xwKDWcu7qhAEcsUubiav7r+48Uk/ENWdr82MBZZRIm7zThSxCIVDfb3ZeRRq9yqk+oIzMdDo6fCcA5DHfMyA==} 614 + '@rollup/rollup-openharmony-arm64@4.57.1': 615 + resolution: {integrity: sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==} 671 616 cpu: [arm64] 672 617 os: [openharmony] 673 618 674 - '@rollup/rollup-win32-arm64-msvc@4.57.0': 675 - resolution: {integrity: sha512-XnaaaSMGSI6Wk8F4KK3QP7GfuuhjGchElsVerCplUuxRIzdvZ7hRBpLR0omCmw+kI2RFJB80nenhOoGXlJ5TfQ==} 619 + '@rollup/rollup-win32-arm64-msvc@4.57.1': 620 + resolution: {integrity: sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==} 676 621 cpu: [arm64] 677 622 os: [win32] 678 623 679 - '@rollup/rollup-win32-ia32-msvc@4.57.0': 680 - resolution: {integrity: sha512-3K1lP+3BXY4t4VihLw5MEg6IZD3ojSYzqzBG571W3kNQe4G4CcFpSUQVgurYgib5d+YaCjeFow8QivWp8vuSvA==} 624 + '@rollup/rollup-win32-ia32-msvc@4.57.1': 625 + resolution: {integrity: sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==} 681 626 cpu: [ia32] 682 627 os: [win32] 683 628 684 - '@rollup/rollup-win32-x64-gnu@4.57.0': 685 - resolution: {integrity: sha512-MDk610P/vJGc5L5ImE4k5s+GZT3en0KoK1MKPXCRgzmksAMk79j4h3k1IerxTNqwDLxsGxStEZVBqG0gIqZqoA==} 629 + '@rollup/rollup-win32-x64-gnu@4.57.1': 630 + resolution: {integrity: sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==} 686 631 cpu: [x64] 687 632 os: [win32] 688 633 689 - '@rollup/rollup-win32-x64-msvc@4.57.0': 690 - resolution: {integrity: sha512-Zv7v6q6aV+VslnpwzqKAmrk5JdVkLUzok2208ZXGipjb+msxBr/fJPZyeEXiFgH7k62Ak0SLIfxQRZQvTuf7rQ==} 634 + '@rollup/rollup-win32-x64-msvc@4.57.1': 635 + resolution: {integrity: sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==} 691 636 cpu: [x64] 692 637 os: [win32] 693 638 694 - '@shikijs/core@3.21.0': 695 - resolution: {integrity: sha512-AXSQu/2n1UIQekY8euBJlvFYZIw0PHY63jUzGbrOma4wPxzznJXTXkri+QcHeBNaFxiiOljKxxJkVSoB3PjbyA==} 639 + '@shikijs/core@3.22.0': 640 + resolution: {integrity: sha512-iAlTtSDDbJiRpvgL5ugKEATDtHdUVkqgHDm/gbD2ZS9c88mx7G1zSYjjOxp5Qa0eaW0MAQosFRmJSk354PRoQA==} 696 641 697 - '@shikijs/engine-javascript@3.21.0': 698 - resolution: {integrity: sha512-ATwv86xlbmfD9n9gKRiwuPpWgPENAWCLwYCGz9ugTJlsO2kOzhOkvoyV/UD+tJ0uT7YRyD530x6ugNSffmvIiQ==} 642 + '@shikijs/engine-javascript@3.22.0': 643 + resolution: {integrity: sha512-jdKhfgW9CRtj3Tor0L7+yPwdG3CgP7W+ZEqSsojrMzCjD1e0IxIbwUMDDpYlVBlC08TACg4puwFGkZfLS+56Tw==} 699 644 700 - '@shikijs/engine-oniguruma@3.21.0': 701 - resolution: {integrity: sha512-OYknTCct6qiwpQDqDdf3iedRdzj6hFlOPv5hMvI+hkWfCKs5mlJ4TXziBG9nyabLwGulrUjHiCq3xCspSzErYQ==} 645 + '@shikijs/engine-oniguruma@3.22.0': 646 + resolution: {integrity: sha512-DyXsOG0vGtNtl7ygvabHd7Mt5EY8gCNqR9Y7Lpbbd/PbJvgWrqaKzH1JW6H6qFkuUa8aCxoiYVv8/YfFljiQxA==} 702 647 703 - '@shikijs/langs@3.21.0': 704 - resolution: {integrity: sha512-g6mn5m+Y6GBJ4wxmBYqalK9Sp0CFkUqfNzUy2pJglUginz6ZpWbaWjDB4fbQ/8SHzFjYbtU6Ddlp1pc+PPNDVA==} 648 + '@shikijs/langs@3.22.0': 649 + resolution: {integrity: sha512-x/42TfhWmp6H00T6uwVrdTJGKgNdFbrEdhaDwSR5fd5zhQ1Q46bHq9EO61SCEWJR0HY7z2HNDMaBZp8JRmKiIA==} 705 650 706 - '@shikijs/themes@3.21.0': 707 - resolution: {integrity: sha512-BAE4cr9EDiZyYzwIHEk7JTBJ9CzlPuM4PchfcA5ao1dWXb25nv6hYsoDiBq2aZK9E3dlt3WB78uI96UESD+8Mw==} 651 + '@shikijs/themes@3.22.0': 652 + resolution: {integrity: sha512-o+tlOKqsr6FE4+mYJG08tfCFDS+3CG20HbldXeVoyP+cYSUxDhrFf3GPjE60U55iOkkjbpY2uC3It/eeja35/g==} 708 653 709 - '@shikijs/types@3.21.0': 710 - resolution: {integrity: sha512-zGrWOxZ0/+0ovPY7PvBU2gIS9tmhSUUt30jAcNV0Bq0gb2S98gwfjIs1vxlmH5zM7/4YxLamT6ChlqqAJmPPjA==} 654 + '@shikijs/types@3.22.0': 655 + resolution: {integrity: sha512-491iAekgKDBFE67z70Ok5a8KBMsQ2IJwOWw3us/7ffQkIBCyOQfm/aNwVMBUriP02QshIfgHCBSIYAl3u2eWjg==} 711 656 712 657 '@shikijs/vscode-textmate@10.0.2': 713 658 resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} 714 659 715 - '@tailwindcss/node@4.1.18': 716 - resolution: {integrity: sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ==} 717 - 718 - '@tailwindcss/oxide-android-arm64@4.1.18': 719 - resolution: {integrity: sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q==} 720 - engines: {node: '>= 10'} 721 - cpu: [arm64] 722 - os: [android] 723 - 724 - '@tailwindcss/oxide-darwin-arm64@4.1.18': 725 - resolution: {integrity: sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A==} 726 - engines: {node: '>= 10'} 727 - cpu: [arm64] 728 - os: [darwin] 729 - 730 - '@tailwindcss/oxide-darwin-x64@4.1.18': 731 - resolution: {integrity: sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw==} 732 - engines: {node: '>= 10'} 733 - cpu: [x64] 734 - os: [darwin] 735 - 736 - '@tailwindcss/oxide-freebsd-x64@4.1.18': 737 - resolution: {integrity: sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA==} 738 - engines: {node: '>= 10'} 739 - cpu: [x64] 740 - os: [freebsd] 741 - 742 - '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.18': 743 - resolution: {integrity: sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA==} 744 - engines: {node: '>= 10'} 745 - cpu: [arm] 746 - os: [linux] 747 - 748 - '@tailwindcss/oxide-linux-arm64-gnu@4.1.18': 749 - resolution: {integrity: sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw==} 750 - engines: {node: '>= 10'} 751 - cpu: [arm64] 752 - os: [linux] 753 - 754 - '@tailwindcss/oxide-linux-arm64-musl@4.1.18': 755 - resolution: {integrity: sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==} 756 - engines: {node: '>= 10'} 757 - cpu: [arm64] 758 - os: [linux] 759 - 760 - '@tailwindcss/oxide-linux-x64-gnu@4.1.18': 761 - resolution: {integrity: sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==} 762 - engines: {node: '>= 10'} 763 - cpu: [x64] 764 - os: [linux] 765 - 766 - '@tailwindcss/oxide-linux-x64-musl@4.1.18': 767 - resolution: {integrity: sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==} 768 - engines: {node: '>= 10'} 769 - cpu: [x64] 770 - os: [linux] 771 - 772 - '@tailwindcss/oxide-wasm32-wasi@4.1.18': 773 - resolution: {integrity: sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==} 774 - engines: {node: '>=14.0.0'} 775 - cpu: [wasm32] 776 - bundledDependencies: 777 - - '@napi-rs/wasm-runtime' 778 - - '@emnapi/core' 779 - - '@emnapi/runtime' 780 - - '@tybys/wasm-util' 781 - - '@emnapi/wasi-threads' 782 - - tslib 783 - 784 - '@tailwindcss/oxide-win32-arm64-msvc@4.1.18': 785 - resolution: {integrity: sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA==} 786 - engines: {node: '>= 10'} 787 - cpu: [arm64] 788 - os: [win32] 789 - 790 - '@tailwindcss/oxide-win32-x64-msvc@4.1.18': 791 - resolution: {integrity: sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q==} 792 - engines: {node: '>= 10'} 793 - cpu: [x64] 794 - os: [win32] 795 - 796 - '@tailwindcss/oxide@4.1.18': 797 - resolution: {integrity: sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A==} 798 - engines: {node: '>= 10'} 799 - 800 - '@tailwindcss/vite@4.1.18': 801 - resolution: {integrity: sha512-jVA+/UpKL1vRLg6Hkao5jldawNmRo7mQYrZtNHMIVpLfLhDml5nMRUo/8MwoX2vNXvnaXNNMedrMfMugAVX1nA==} 802 - peerDependencies: 803 - vite: ^5.2.0 || ^6 || ^7 804 - 805 660 '@trysound/sax@0.2.0': 806 661 resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} 807 662 engines: {node: '>=10.13.0'} ··· 827 682 '@types/node@17.0.45': 828 683 resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} 829 684 830 - '@types/node@25.0.10': 831 - resolution: {integrity: sha512-zWW5KPngR/yvakJgGOmZ5vTBemDoSqF3AcV/LrO5u5wTWyEAVVh+IT39G4gtyAkh3CtTZs8aX/yRM82OfzHJRg==} 685 + '@types/node@25.2.1': 686 + resolution: {integrity: sha512-CPrnr8voK8vC6eEtyRzvMpgp3VyVRhgclonE7qYi6P9sXwYb59ucfrnmFBTaP0yUi8Gk4yZg/LlTJULGxvTNsg==} 832 687 833 688 '@types/sax@1.2.7': 834 689 resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==} ··· 842 697 '@ungap/structured-clone@1.3.0': 843 698 resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} 844 699 845 - '@vercel/analytics@1.6.1': 846 - resolution: {integrity: sha512-oH9He/bEM+6oKlv3chWuOOcp8Y6fo6/PSro8hEkgCW3pu9/OiCXiUpRUogDh3Fs3LH2sosDrx8CxeOLBEE+afg==} 847 - peerDependencies: 848 - '@remix-run/react': ^2 849 - '@sveltejs/kit': ^1 || ^2 850 - next: '>= 13' 851 - react: ^18 || ^19 || ^19.0.0-rc 852 - svelte: '>= 4' 853 - vue: ^3 854 - vue-router: ^4 855 - peerDependenciesMeta: 856 - '@remix-run/react': 857 - optional: true 858 - '@sveltejs/kit': 859 - optional: true 860 - next: 861 - optional: true 862 - react: 863 - optional: true 864 - svelte: 865 - optional: true 866 - vue: 867 - optional: true 868 - vue-router: 869 - optional: true 870 - 871 700 '@vercel/functions@2.2.13': 872 701 resolution: {integrity: sha512-14ArBSIIcOBx9nrEgaJb4Bw+en1gl6eSoJWh8qjifLl5G3E4dRXCFOT8HP+w66vb9Wqyd1lAQBrmRhRwOj9X9A==} 873 702 engines: {node: '>= 18'} ··· 877 706 '@aws-sdk/credential-provider-web-identity': 878 707 optional: true 879 708 880 - '@vercel/nft@0.30.4': 881 - resolution: {integrity: sha512-wE6eAGSXScra60N2l6jWvNtVK0m+sh873CpfZW4KI2v8EHuUQp+mSEi4T+IcdPCSEDgCdAS/7bizbhQlkjzrSA==} 882 - engines: {node: '>=18'} 883 - hasBin: true 884 - 885 709 '@vercel/oidc@2.0.2': 886 710 resolution: {integrity: sha512-59PBFx3T+k5hLTEWa3ggiMpGRz1OVvl9eN8SUai+A43IsqiOuAe7qPBf+cray/Fj6mkgnxm/D7IAtjc8zSHi7g==} 887 711 engines: {node: '>= 18'} 888 712 889 - '@vercel/routing-utils@5.3.2': 890 - resolution: {integrity: sha512-OKKhHKAON4vcwuPQvtxFRv7Ney0IGlp9CTsScKGbUsYYutRValK2GVdj7y4RRqm7RgzhuUMT/fSoK0ENKwrx9A==} 891 - 892 - '@volar/kit@2.4.27': 893 - resolution: {integrity: sha512-ilZoQDMLzqmSsImJRWx4YiZ4FcvvPrPnFVmL6hSsIWB6Bn3qc7k88J9yP32dagrs5Y8EXIlvvD/mAFaiuEOACQ==} 713 + '@volar/kit@2.4.28': 714 + resolution: {integrity: sha512-cKX4vK9dtZvDRaAzeoUdaAJEew6IdxHNCRrdp5Kvcl6zZOqb6jTOfk3kXkIkG3T7oTFXguEMt5+9ptyqYR84Pg==} 894 715 peerDependencies: 895 716 typescript: '*' 896 717 897 - '@volar/language-core@2.4.27': 898 - resolution: {integrity: sha512-DjmjBWZ4tJKxfNC1F6HyYERNHPYS7L7OPFyCrestykNdUZMFYzI9WTyvwPcaNaHlrEUwESHYsfEw3isInncZxQ==} 718 + '@volar/language-core@2.4.28': 719 + resolution: {integrity: sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==} 899 720 900 - '@volar/language-server@2.4.27': 901 - resolution: {integrity: sha512-SymGNkErcHg8GjiG65iQN8sLkhqu1pwKhFySmxeBuYq5xFYagKBW36eiNITXQTdvT0tutI1GXcXdq/FdE/IyjA==} 721 + '@volar/language-server@2.4.28': 722 + resolution: {integrity: sha512-NqcLnE5gERKuS4PUFwlhMxf6vqYo7hXtbMFbViXcbVkbZ905AIVWhnSo0ZNBC2V127H1/2zP7RvVOVnyITFfBw==} 902 723 903 - '@volar/language-service@2.4.27': 904 - resolution: {integrity: sha512-SxKZ8yLhpWa7Y5e/RDxtNfm7j7xsXp/uf2urijXEffRNpPSmVdfzQrFFy5d7l8PNpZy+bHg+yakmqBPjQN+MOw==} 724 + '@volar/language-service@2.4.28': 725 + resolution: {integrity: sha512-Rh/wYCZJrI5vCwMk9xyw/Z+MsWxlJY1rmMZPsxUoJKfzIRjS/NF1NmnuEcrMbEVGja00aVpCsInJfixQTMdvLw==} 905 726 906 - '@volar/source-map@2.4.27': 907 - resolution: {integrity: sha512-ynlcBReMgOZj2i6po+qVswtDUeeBRCTgDurjMGShbm8WYZgJ0PA4RmtebBJ0BCYol1qPv3GQF6jK7C9qoVc7lg==} 727 + '@volar/source-map@2.4.28': 728 + resolution: {integrity: sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==} 908 729 909 - '@volar/typescript@2.4.27': 910 - resolution: {integrity: sha512-eWaYCcl/uAPInSK2Lze6IqVWaBu/itVqR5InXcHXFyles4zO++Mglt3oxdgj75BDcv1Knr9Y93nowS8U3wqhxg==} 730 + '@volar/typescript@2.4.28': 731 + resolution: {integrity: sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==} 911 732 912 733 '@vscode/emmet-helper@2.11.0': 913 734 resolution: {integrity: sha512-QLxjQR3imPZPQltfbWRnHU6JecWTF1QSWhx3GAKQpslx7y3Dp6sIIXhKjiUJ/BR9FX8PVthjr9PD6pNwOJfAzw==} ··· 915 736 '@vscode/l10n@0.0.18': 916 737 resolution: {integrity: sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==} 917 738 918 - abbrev@3.0.1: 919 - resolution: {integrity: sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==} 920 - engines: {node: ^18.17.0 || >=20.5.0} 921 - 922 - acorn-import-attributes@1.9.5: 923 - resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} 924 - peerDependencies: 925 - acorn: ^8 926 - 927 739 acorn@8.15.0: 928 740 resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} 929 741 engines: {node: '>=0.4.0'} 930 742 hasBin: true 931 743 932 - agent-base@7.1.4: 933 - resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} 934 - engines: {node: '>= 14'} 935 - 936 744 ajv-draft-04@1.0.0: 937 745 resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} 938 746 peerDependencies: ··· 940 748 peerDependenciesMeta: 941 749 ajv: 942 750 optional: true 943 - 944 - ajv@6.12.6: 945 - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 946 751 947 752 ajv@8.17.1: 948 753 resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} ··· 999 804 astro-seo@1.1.0: 1000 805 resolution: {integrity: sha512-G6LDNDyga30o+52v58jU7C35n3cORUzk7RSuY+xf/ZRbW6JiNplyaOO1VoYVKO+xzYNaBcxqNln2RFRR/wgJNQ==} 1001 806 1002 - astro@5.16.15: 1003 - resolution: {integrity: sha512-+X1Z0NTi2pa5a0Te6h77Dgc44fYj63j1yx6+39Nvg05lExajxSq7b1Uj/gtY45zoum8fD0+h0nak+DnHighs3A==} 807 + astro@5.17.1: 808 + resolution: {integrity: sha512-oD3tlxTaVWGq/Wfbqk6gxzVRz98xa/rYlpe+gU2jXJMSD01k6sEDL01ZlT8mVSYB/rMgnvIOfiQQ3BbLdN237A==} 1004 809 engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0'} 1005 810 hasBin: true 1006 - 1007 - async-sema@3.1.1: 1008 - resolution: {integrity: sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==} 1009 811 1010 812 axobject-query@4.1.0: 1011 813 resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} ··· 1014 816 bail@2.0.2: 1015 817 resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} 1016 818 1017 - balanced-match@1.0.2: 1018 - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 1019 - 1020 819 base-64@1.0.0: 1021 820 resolution: {integrity: sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==} 1022 - 1023 - bindings@1.5.0: 1024 - resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} 1025 821 1026 822 boolbase@1.0.0: 1027 823 resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} ··· 1030 826 resolution: {integrity: sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==} 1031 827 engines: {node: '>=18'} 1032 828 1033 - brace-expansion@2.0.2: 1034 - resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} 1035 - 1036 829 buffer-crc32@0.2.13: 1037 830 resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} 1038 831 ··· 1075 868 resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} 1076 869 engines: {node: '>=18'} 1077 870 1078 - ci-info@4.3.1: 1079 - resolution: {integrity: sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==} 871 + ci-info@4.4.0: 872 + resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==} 1080 873 engines: {node: '>=8'} 1081 874 1082 875 cli-boxes@3.0.0: ··· 1115 908 confbox@0.1.8: 1116 909 resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} 1117 910 1118 - confbox@0.2.2: 1119 - resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==} 1120 - 1121 - consola@3.4.2: 1122 - resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} 1123 - engines: {node: ^14.18.0 || >=16.10.0} 911 + confbox@0.2.4: 912 + resolution: {integrity: sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==} 1124 913 1125 914 cookie-es@1.2.2: 1126 915 resolution: {integrity: sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==} ··· 1128 917 cookie@1.1.1: 1129 918 resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} 1130 919 engines: {node: '>=18'} 1131 - 1132 - cross-spawn@7.0.6: 1133 - resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} 1134 - engines: {node: '>= 8'} 1135 920 1136 921 crossws@0.3.5: 1137 922 resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==} ··· 1224 1009 resolution: {integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==} 1225 1010 engines: {node: '>=4'} 1226 1011 1227 - eastasianwidth@0.2.0: 1228 - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} 1229 - 1230 1012 emmet@2.4.11: 1231 1013 resolution: {integrity: sha512-23QPJB3moh/U9sT4rQzGgeyyGIrcM+GH5uVYg2C6wZIxAIJq7Ng3QLT79tl8FUwDXhyq9SusfknOrofAKqvgyQ==} 1232 1014 ··· 1236 1018 emoji-regex@8.0.0: 1237 1019 resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 1238 1020 1239 - emoji-regex@9.2.2: 1240 - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} 1241 - 1242 1021 encoding-sniffer@0.2.1: 1243 1022 resolution: {integrity: sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==} 1244 1023 1245 1024 end-of-stream@1.4.5: 1246 1025 resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} 1247 - 1248 - enhanced-resolve@5.18.4: 1249 - resolution: {integrity: sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==} 1250 - engines: {node: '>=10.13.0'} 1251 1026 1252 1027 entities@4.5.0: 1253 1028 resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} ··· 1299 1074 1300 1075 fast-deep-equal@3.1.3: 1301 1076 resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 1302 - 1303 - fast-json-stable-stringify@2.1.0: 1304 - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 1305 1077 1306 1078 fast-uri@3.1.0: 1307 1079 resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} ··· 1318 1090 picomatch: 1319 1091 optional: true 1320 1092 1321 - file-uri-to-path@1.0.0: 1322 - resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} 1323 - 1324 1093 flattie@1.1.1: 1325 1094 resolution: {integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==} 1326 1095 engines: {node: '>=8'} 1327 1096 1328 - fontace@0.4.0: 1329 - resolution: {integrity: sha512-moThBCItUe2bjZip5PF/iZClpKHGLwMvR79Kp8XpGRBrvoRSnySN4VcILdv3/MJzbhvUA5WeiUXF5o538m5fvg==} 1097 + fontace@0.4.1: 1098 + resolution: {integrity: sha512-lDMvbAzSnHmbYMTEld5qdtvNH2/pWpICOqpean9IgC7vUbUJc3k+k5Dokp85CegamqQpFbXf0rAVkbzpyTA8aw==} 1330 1099 1331 1100 fontkitten@1.0.2: 1332 1101 resolution: {integrity: sha512-piJxbLnkD9Xcyi7dWJRnqszEURixe7CrF/efBfbffe2DPyabmuIuqraruY8cXTs19QoM8VJzx47BDRVNXETM7Q==} 1333 1102 engines: {node: '>=20'} 1334 - 1335 - foreground-child@3.3.1: 1336 - resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} 1337 - engines: {node: '>=14'} 1338 1103 1339 1104 fsevents@2.3.3: 1340 1105 resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} ··· 1356 1121 github-slugger@2.0.0: 1357 1122 resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} 1358 1123 1359 - glob@10.5.0: 1360 - resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} 1361 - hasBin: true 1362 - 1363 1124 globals@15.15.0: 1364 1125 resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} 1365 1126 engines: {node: '>=18'} 1366 - 1367 - graceful-fs@4.2.11: 1368 - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 1369 1127 1370 1128 h3@1.15.5: 1371 1129 resolution: {integrity: sha512-xEyq3rSl+dhGX2Lm0+eFQIAzlDN6Fs0EcC4f7BNUmzaRX/PTzeuM+Tr2lHB8FoXggsQIeXLj8EDVgs5ywxyxmg==} ··· 1412 1170 http-cache-semantics@4.2.0: 1413 1171 resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} 1414 1172 1415 - https-proxy-agent@7.0.6: 1416 - resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} 1417 - engines: {node: '>= 14'} 1418 - 1419 1173 iconv-lite@0.6.3: 1420 1174 resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} 1421 1175 engines: {node: '>=0.10.0'} ··· 1448 1202 resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} 1449 1203 engines: {node: '>=16'} 1450 1204 1451 - isexe@2.0.0: 1452 - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1453 - 1454 - jackspeak@3.4.3: 1455 - resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} 1456 - 1457 1205 jiti@2.6.1: 1458 1206 resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} 1459 1207 hasBin: true ··· 1461 1209 js-yaml@4.1.1: 1462 1210 resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} 1463 1211 hasBin: true 1464 - 1465 - json-schema-traverse@0.4.1: 1466 - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 1467 1212 1468 1213 json-schema-traverse@1.0.0: 1469 1214 resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} ··· 1555 1300 resolution: {integrity: sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==} 1556 1301 engines: {node: '>= 12.0.0'} 1557 1302 1558 - lite-youtube-embed@0.3.4: 1559 - resolution: {integrity: sha512-aXgxpwK7AIW58GEbRzA8EYaY4LWvF3FKak6B9OtSJmuNyLhX2ouD4cMTxz/yR5HFInhknaYd2jLWOTRTvT8oAw==} 1560 - 1561 1303 local-pkg@1.1.2: 1562 1304 resolution: {integrity: sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==} 1563 1305 engines: {node: '>=14'} ··· 1567 1309 1568 1310 longest-streak@3.1.0: 1569 1311 resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} 1570 - 1571 - lru-cache@10.4.3: 1572 - resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} 1573 1312 1574 1313 lru-cache@11.2.5: 1575 1314 resolution: {integrity: sha512-vFrFJkWtJvJnD5hg+hJvVE8Lh/TcMzKnTgCWmtBipwI5yLX/iX+5UB2tfuyODF5E7k9xEzMdYgGqaSb1c0c5Yw==} ··· 1578 1317 magic-string@0.30.21: 1579 1318 resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} 1580 1319 1581 - magicast@0.5.1: 1582 - resolution: {integrity: sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw==} 1320 + magicast@0.5.2: 1321 + resolution: {integrity: sha512-E3ZJh4J3S9KfwdjZhe2afj6R9lGIN5Pher1pF39UGrXRqq/VDaGVIGN13BjHd2u8B61hArAGOnso7nBOouW3TQ==} 1583 1322 1584 1323 markdown-table@3.0.4: 1585 1324 resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} ··· 1716 1455 micromark@4.0.2: 1717 1456 resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} 1718 1457 1719 - minimatch@9.0.5: 1720 - resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} 1721 - engines: {node: '>=16 || 14 >=14.17'} 1722 - 1723 1458 minipass@7.1.2: 1724 1459 resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} 1725 1460 engines: {node: '>=16 || 14 >=14.17'} ··· 1756 1491 node-fetch-native@1.6.7: 1757 1492 resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==} 1758 1493 1759 - node-fetch@2.7.0: 1760 - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} 1761 - engines: {node: 4.x || >=6.0.0} 1762 - peerDependencies: 1763 - encoding: ^0.1.0 1764 - peerDependenciesMeta: 1765 - encoding: 1766 - optional: true 1767 - 1768 - node-gyp-build@4.8.4: 1769 - resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} 1770 - hasBin: true 1771 - 1772 1494 node-mock-http@1.0.4: 1773 1495 resolution: {integrity: sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ==} 1774 - 1775 - nopt@8.1.0: 1776 - resolution: {integrity: sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==} 1777 - engines: {node: ^18.17.0 || >=20.5.0} 1778 - hasBin: true 1779 1496 1780 1497 normalize-path@3.0.0: 1781 1498 resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} ··· 1811 1528 resolution: {integrity: sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==} 1812 1529 engines: {node: '>=14.16'} 1813 1530 1814 - package-json-from-dist@1.0.1: 1815 - resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} 1816 - 1817 1531 package-manager-detector@1.6.0: 1818 1532 resolution: {integrity: sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==} 1819 1533 ··· 1831 1545 1832 1546 path-browserify@1.0.1: 1833 1547 resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} 1834 - 1835 - path-key@3.1.1: 1836 - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1837 - engines: {node: '>=8'} 1838 - 1839 - path-scurry@1.11.1: 1840 - resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} 1841 - engines: {node: '>=16 || 14 >=14.18'} 1842 - 1843 - path-to-regexp@6.1.0: 1844 - resolution: {integrity: sha512-h9DqehX3zZZDCEm+xbfU0ZmwCGFCAAraPJWMXJ4+v32NjZJilVg3k1TcKsRgIb8IQ/izZSaydDc1OhJCZvs2Dw==} 1845 - 1846 - path-to-regexp@6.3.0: 1847 - resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} 1848 1548 1849 1549 pathe@2.0.3: 1850 1550 resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} ··· 1883 1583 resolution: {integrity: sha512-RiBETaaP9veVstE4vUwSIcdATj6dKmXljouXc/DDNwBSPTp8FRkLGDSGFClKsAFeeg+13SB0Z1JZvbD76bigJw==} 1884 1584 engines: {node: ^14.15.0 || >=16.0.0} 1885 1585 1886 - prettier-plugin-tailwindcss@0.7.2: 1887 - resolution: {integrity: sha512-LkphyK3Fw+q2HdMOoiEHWf93fNtYJwfamoKPl7UwtjFQdei/iIBoX11G6j706FzN3ymX9mPVi97qIY8328vdnA==} 1888 - engines: {node: '>=20.19'} 1889 - peerDependencies: 1890 - '@ianvs/prettier-plugin-sort-imports': '*' 1891 - '@prettier/plugin-hermes': '*' 1892 - '@prettier/plugin-oxc': '*' 1893 - '@prettier/plugin-pug': '*' 1894 - '@shopify/prettier-plugin-liquid': '*' 1895 - '@trivago/prettier-plugin-sort-imports': '*' 1896 - '@zackad/prettier-plugin-twig': '*' 1897 - prettier: ^3.0 1898 - prettier-plugin-astro: '*' 1899 - prettier-plugin-css-order: '*' 1900 - prettier-plugin-jsdoc: '*' 1901 - prettier-plugin-marko: '*' 1902 - prettier-plugin-multiline-arrays: '*' 1903 - prettier-plugin-organize-attributes: '*' 1904 - prettier-plugin-organize-imports: '*' 1905 - prettier-plugin-sort-imports: '*' 1906 - prettier-plugin-svelte: '*' 1907 - peerDependenciesMeta: 1908 - '@ianvs/prettier-plugin-sort-imports': 1909 - optional: true 1910 - '@prettier/plugin-hermes': 1911 - optional: true 1912 - '@prettier/plugin-oxc': 1913 - optional: true 1914 - '@prettier/plugin-pug': 1915 - optional: true 1916 - '@shopify/prettier-plugin-liquid': 1917 - optional: true 1918 - '@trivago/prettier-plugin-sort-imports': 1919 - optional: true 1920 - '@zackad/prettier-plugin-twig': 1921 - optional: true 1922 - prettier-plugin-astro: 1923 - optional: true 1924 - prettier-plugin-css-order: 1925 - optional: true 1926 - prettier-plugin-jsdoc: 1927 - optional: true 1928 - prettier-plugin-marko: 1929 - optional: true 1930 - prettier-plugin-multiline-arrays: 1931 - optional: true 1932 - prettier-plugin-organize-attributes: 1933 - optional: true 1934 - prettier-plugin-organize-imports: 1935 - optional: true 1936 - prettier-plugin-sort-imports: 1937 - optional: true 1938 - prettier-plugin-svelte: 1939 - optional: true 1940 - 1941 1586 prettier@3.8.1: 1942 1587 resolution: {integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==} 1943 1588 engines: {node: '>=14'} ··· 1956 1601 1957 1602 pump@3.0.3: 1958 1603 resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} 1959 - 1960 - punycode@2.3.1: 1961 - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 1962 - engines: {node: '>=6'} 1963 1604 1964 1605 quansync@0.2.11: 1965 1606 resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} ··· 2026 1667 resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} 2027 1668 engines: {node: '>=0.10.0'} 2028 1669 2029 - resolve-from@5.0.0: 2030 - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} 2031 - engines: {node: '>=8'} 2032 - 2033 1670 retext-latin@4.0.0: 2034 1671 resolution: {integrity: sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==} 2035 1672 ··· 2042 1679 retext@9.0.0: 2043 1680 resolution: {integrity: sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==} 2044 1681 2045 - rollup@4.57.0: 2046 - resolution: {integrity: sha512-e5lPJi/aui4TO1LpAXIRLySmwXSE8k3b9zoGfd42p67wzxog4WHjiZF3M2uheQih4DGyc25QEV4yRBbpueNiUA==} 1682 + rollup@4.57.1: 1683 + resolution: {integrity: sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==} 2047 1684 engines: {node: '>=18.0.0', npm: '>=8.0.0'} 2048 1685 hasBin: true 2049 1686 ··· 2060 1697 resolution: {integrity: sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==} 2061 1698 engines: {node: '>=11.0.0'} 2062 1699 2063 - semver@7.7.3: 2064 - resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} 1700 + semver@7.7.4: 1701 + resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} 2065 1702 engines: {node: '>=10'} 2066 1703 hasBin: true 2067 1704 ··· 2069 1706 resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==} 2070 1707 engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 2071 1708 2072 - shebang-command@2.0.0: 2073 - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 2074 - engines: {node: '>=8'} 2075 - 2076 - shebang-regex@3.0.0: 2077 - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 2078 - engines: {node: '>=8'} 2079 - 2080 - shiki@3.21.0: 2081 - resolution: {integrity: sha512-N65B/3bqL/TI2crrXr+4UivctrAGEjmsib5rPMMPpFp1xAx/w03v8WZ9RDDFYteXoEgY7qZ4HGgl5KBIu1153w==} 2082 - 2083 - signal-exit@4.1.0: 2084 - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} 2085 - engines: {node: '>=14'} 1709 + shiki@3.22.0: 1710 + resolution: {integrity: sha512-LBnhsoYEe0Eou4e1VgJACes+O6S6QC0w71fCSp5Oya79inkwkm15gQ1UF6VtQ8j/taMDh79hAB49WUk8ALQW3g==} 2086 1711 2087 1712 sisteransi@1.0.5: 2088 1713 resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} ··· 2110 1735 resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 2111 1736 engines: {node: '>=8'} 2112 1737 2113 - string-width@5.1.2: 2114 - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} 2115 - engines: {node: '>=12'} 2116 - 2117 1738 string-width@7.2.0: 2118 1739 resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} 2119 1740 engines: {node: '>=18'} ··· 2142 1763 engines: {node: '>=16'} 2143 1764 hasBin: true 2144 1765 2145 - tailwindcss@4.1.18: 2146 - resolution: {integrity: sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==} 2147 - 2148 - tapable@2.3.0: 2149 - resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} 2150 - engines: {node: '>=6'} 2151 - 2152 1766 tar@7.5.7: 2153 1767 resolution: {integrity: sha512-fov56fJiRuThVFXD6o6/Q354S7pnWMJIVlDBYijsTNx6jKSE4pvrDTs6lUnmGvNyfJwFQQwWy3owKz1ucIhveQ==} 2154 1768 engines: {node: '>=18'} ··· 2163 1777 tinyglobby@0.2.15: 2164 1778 resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} 2165 1779 engines: {node: '>=12.0.0'} 2166 - 2167 - tr46@0.0.3: 2168 - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} 2169 1780 2170 1781 trim-lines@3.0.1: 2171 1782 resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} ··· 2213 1824 undici-types@7.16.0: 2214 1825 resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} 2215 1826 2216 - undici@7.19.2: 2217 - resolution: {integrity: sha512-4VQSpGEGsWzk0VYxyB/wVX/Q7qf9t5znLRgs0dzszr9w9Fej/8RVNQ+S20vdXSAyra/bJ7ZQfGv6ZMj7UEbzSg==} 1827 + undici@7.21.0: 1828 + resolution: {integrity: sha512-Hn2tCQpoDt1wv23a68Ctc8Cr/BHpUSfaPYrkajTXOS9IKpxVRx/X5m1K2YkbK2ipgZgxXSgsUinl3x+2YdSSfg==} 2218 1829 engines: {node: '>=20.18.1'} 2219 1830 2220 1831 unified@11.0.5: ··· 2311 1922 optional: true 2312 1923 uploadthing: 2313 1924 optional: true 2314 - 2315 - uri-js@4.4.1: 2316 - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 2317 1925 2318 1926 vfile-location@5.0.3: 2319 1927 resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} ··· 2466 2074 2467 2075 web-namespaces@2.0.1: 2468 2076 resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} 2469 - 2470 - webidl-conversions@3.0.1: 2471 - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} 2472 2077 2473 2078 whatwg-encoding@3.1.1: 2474 2079 resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} ··· 2479 2084 resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} 2480 2085 engines: {node: '>=18'} 2481 2086 2482 - whatwg-url@5.0.0: 2483 - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} 2484 - 2485 2087 which-pm-runs@1.1.0: 2486 2088 resolution: {integrity: sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==} 2487 2089 engines: {node: '>=4'} 2488 2090 2489 - which@2.0.2: 2490 - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 2491 - engines: {node: '>= 8'} 2492 - hasBin: true 2493 - 2494 2091 widest-line@5.0.0: 2495 2092 resolution: {integrity: sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==} 2496 2093 engines: {node: '>=18'} ··· 2498 2095 wrap-ansi@7.0.0: 2499 2096 resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 2500 2097 engines: {node: '>=10'} 2501 - 2502 - wrap-ansi@8.1.0: 2503 - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} 2504 - engines: {node: '>=12'} 2505 2098 2506 2099 wrap-ansi@9.0.2: 2507 2100 resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} ··· 2584 2177 2585 2178 '@antfu/utils@8.1.1': {} 2586 2179 2587 - '@astro-community/astro-embed-youtube@0.5.10': 2588 - dependencies: 2589 - lite-youtube-embed: 0.3.4 2590 - 2591 2180 '@astrojs/check@0.9.6(prettier-plugin-astro@0.14.1)(prettier@3.8.1)(typescript@5.9.3)': 2592 2181 dependencies: 2593 2182 '@astrojs/language-server': 2.16.3(prettier-plugin-astro@0.14.1)(prettier@3.8.1)(typescript@5.9.3) ··· 2599 2188 - prettier 2600 2189 - prettier-plugin-astro 2601 2190 2602 - '@astrojs/compiler@2.13.0': {} 2191 + '@astrojs/compiler@2.13.1': {} 2603 2192 2604 2193 '@astrojs/internal-helpers@0.7.5': {} 2605 2194 2606 2195 '@astrojs/language-server@2.16.3(prettier-plugin-astro@0.14.1)(prettier@3.8.1)(typescript@5.9.3)': 2607 2196 dependencies: 2608 - '@astrojs/compiler': 2.13.0 2197 + '@astrojs/compiler': 2.13.1 2609 2198 '@astrojs/yaml2ts': 0.2.2 2610 2199 '@jridgewell/sourcemap-codec': 1.5.5 2611 - '@volar/kit': 2.4.27(typescript@5.9.3) 2612 - '@volar/language-core': 2.4.27 2613 - '@volar/language-server': 2.4.27 2614 - '@volar/language-service': 2.4.27 2200 + '@volar/kit': 2.4.28(typescript@5.9.3) 2201 + '@volar/language-core': 2.4.28 2202 + '@volar/language-server': 2.4.28 2203 + '@volar/language-service': 2.4.28 2615 2204 muggle-string: 0.4.1 2616 2205 tinyglobby: 0.2.15 2617 - volar-service-css: 0.0.68(@volar/language-service@2.4.27) 2618 - volar-service-emmet: 0.0.68(@volar/language-service@2.4.27) 2619 - volar-service-html: 0.0.68(@volar/language-service@2.4.27) 2620 - volar-service-prettier: 0.0.68(@volar/language-service@2.4.27)(prettier@3.8.1) 2621 - volar-service-typescript: 0.0.68(@volar/language-service@2.4.27) 2622 - volar-service-typescript-twoslash-queries: 0.0.68(@volar/language-service@2.4.27) 2623 - volar-service-yaml: 0.0.68(@volar/language-service@2.4.27) 2206 + volar-service-css: 0.0.68(@volar/language-service@2.4.28) 2207 + volar-service-emmet: 0.0.68(@volar/language-service@2.4.28) 2208 + volar-service-html: 0.0.68(@volar/language-service@2.4.28) 2209 + volar-service-prettier: 0.0.68(@volar/language-service@2.4.28)(prettier@3.8.1) 2210 + volar-service-typescript: 0.0.68(@volar/language-service@2.4.28) 2211 + volar-service-typescript-twoslash-queries: 0.0.68(@volar/language-service@2.4.28) 2212 + volar-service-yaml: 0.0.68(@volar/language-service@2.4.28) 2624 2213 vscode-html-languageservice: 5.6.1 2625 2214 vscode-uri: 3.1.0 2626 2215 optionalDependencies: ··· 2645 2234 remark-parse: 11.0.0 2646 2235 remark-rehype: 11.1.2 2647 2236 remark-smartypants: 3.0.2 2648 - shiki: 3.21.0 2237 + shiki: 3.22.0 2649 2238 smol-toml: 1.6.0 2650 2239 unified: 11.0.5 2651 2240 unist-util-remove-position: 5.0.0 ··· 2667 2256 2668 2257 '@astrojs/telemetry@3.3.0': 2669 2258 dependencies: 2670 - ci-info: 4.3.1 2259 + ci-info: 4.4.0 2671 2260 debug: 4.4.3 2672 2261 dlv: 1.1.3 2673 2262 dset: 3.1.4 ··· 2677 2266 transitivePeerDependencies: 2678 2267 - supports-color 2679 2268 2680 - '@astrojs/vercel@9.0.4(astro@5.16.15(@types/node@25.0.10)(@vercel/functions@2.2.13)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.0)(typescript@5.9.3)(yaml@2.8.2))(rollup@4.57.0)': 2681 - dependencies: 2682 - '@astrojs/internal-helpers': 0.7.5 2683 - '@vercel/analytics': 1.6.1 2684 - '@vercel/functions': 2.2.13 2685 - '@vercel/nft': 0.30.4(rollup@4.57.0) 2686 - '@vercel/routing-utils': 5.3.2 2687 - astro: 5.16.15(@types/node@25.0.10)(@vercel/functions@2.2.13)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.0)(typescript@5.9.3)(yaml@2.8.2) 2688 - esbuild: 0.25.12 2689 - tinyglobby: 0.2.15 2690 - transitivePeerDependencies: 2691 - - '@aws-sdk/credential-provider-web-identity' 2692 - - '@remix-run/react' 2693 - - '@sveltejs/kit' 2694 - - encoding 2695 - - next 2696 - - react 2697 - - rollup 2698 - - supports-color 2699 - - svelte 2700 - - vue 2701 - - vue-router 2702 - 2703 2269 '@astrojs/yaml2ts@0.2.2': 2704 2270 dependencies: 2705 2271 yaml: 2.8.2 ··· 2708 2274 2709 2275 '@babel/helper-validator-identifier@7.28.5': {} 2710 2276 2711 - '@babel/parser@7.28.6': 2277 + '@babel/parser@7.29.0': 2712 2278 dependencies: 2713 - '@babel/types': 7.28.6 2279 + '@babel/types': 7.29.0 2714 2280 2715 - '@babel/types@7.28.6': 2281 + '@babel/types@7.29.0': 2716 2282 dependencies: 2717 2283 '@babel/helper-string-parser': 7.27.1 2718 2284 '@babel/helper-validator-identifier': 7.28.5 2719 2285 2720 - '@biomejs/biome@2.3.13': 2286 + '@biomejs/biome@2.3.14': 2721 2287 optionalDependencies: 2722 - '@biomejs/cli-darwin-arm64': 2.3.13 2723 - '@biomejs/cli-darwin-x64': 2.3.13 2724 - '@biomejs/cli-linux-arm64': 2.3.13 2725 - '@biomejs/cli-linux-arm64-musl': 2.3.13 2726 - '@biomejs/cli-linux-x64': 2.3.13 2727 - '@biomejs/cli-linux-x64-musl': 2.3.13 2728 - '@biomejs/cli-win32-arm64': 2.3.13 2729 - '@biomejs/cli-win32-x64': 2.3.13 2288 + '@biomejs/cli-darwin-arm64': 2.3.14 2289 + '@biomejs/cli-darwin-x64': 2.3.14 2290 + '@biomejs/cli-linux-arm64': 2.3.14 2291 + '@biomejs/cli-linux-arm64-musl': 2.3.14 2292 + '@biomejs/cli-linux-x64': 2.3.14 2293 + '@biomejs/cli-linux-x64-musl': 2.3.14 2294 + '@biomejs/cli-win32-arm64': 2.3.14 2295 + '@biomejs/cli-win32-x64': 2.3.14 2730 2296 2731 - '@biomejs/cli-darwin-arm64@2.3.13': 2297 + '@biomejs/cli-darwin-arm64@2.3.14': 2732 2298 optional: true 2733 2299 2734 - '@biomejs/cli-darwin-x64@2.3.13': 2300 + '@biomejs/cli-darwin-x64@2.3.14': 2735 2301 optional: true 2736 2302 2737 - '@biomejs/cli-linux-arm64-musl@2.3.13': 2303 + '@biomejs/cli-linux-arm64-musl@2.3.14': 2738 2304 optional: true 2739 2305 2740 - '@biomejs/cli-linux-arm64@2.3.13': 2306 + '@biomejs/cli-linux-arm64@2.3.14': 2741 2307 optional: true 2742 2308 2743 - '@biomejs/cli-linux-x64-musl@2.3.13': 2309 + '@biomejs/cli-linux-x64-musl@2.3.14': 2744 2310 optional: true 2745 2311 2746 - '@biomejs/cli-linux-x64@2.3.13': 2312 + '@biomejs/cli-linux-x64@2.3.14': 2747 2313 optional: true 2748 2314 2749 - '@biomejs/cli-win32-arm64@2.3.13': 2315 + '@biomejs/cli-win32-arm64@2.3.14': 2750 2316 optional: true 2751 2317 2752 - '@biomejs/cli-win32-x64@2.3.13': 2318 + '@biomejs/cli-win32-x64@2.3.14': 2753 2319 optional: true 2754 2320 2755 2321 '@capsizecss/unpack@4.0.0': ··· 2862 2428 '@esbuild/win32-x64@0.25.12': 2863 2429 optional: true 2864 2430 2865 - '@iconify-json/lucide@1.2.87': 2431 + '@iconify-json/lucide@1.2.89': 2866 2432 dependencies: 2867 2433 '@iconify/types': 2.0.0 2868 2434 ··· 2991 2557 '@img/sharp-win32-x64@0.34.5': 2992 2558 optional: true 2993 2559 2994 - '@isaacs/cliui@8.0.2': 2995 - dependencies: 2996 - string-width: 5.1.2 2997 - string-width-cjs: string-width@4.2.3 2998 - strip-ansi: 7.1.2 2999 - strip-ansi-cjs: strip-ansi@6.0.1 3000 - wrap-ansi: 8.1.0 3001 - wrap-ansi-cjs: wrap-ansi@7.0.0 3002 - 3003 2560 '@isaacs/fs-minipass@4.0.1': 3004 2561 dependencies: 3005 2562 minipass: 7.1.2 3006 2563 3007 - '@jridgewell/gen-mapping@0.3.13': 3008 - dependencies: 3009 - '@jridgewell/sourcemap-codec': 1.5.5 3010 - '@jridgewell/trace-mapping': 0.3.31 3011 - 3012 - '@jridgewell/remapping@2.3.5': 3013 - dependencies: 3014 - '@jridgewell/gen-mapping': 0.3.13 3015 - '@jridgewell/trace-mapping': 0.3.31 3016 - 3017 - '@jridgewell/resolve-uri@3.1.2': {} 3018 - 3019 2564 '@jridgewell/sourcemap-codec@1.5.5': {} 3020 - 3021 - '@jridgewell/trace-mapping@0.3.31': 3022 - dependencies: 3023 - '@jridgewell/resolve-uri': 3.1.2 3024 - '@jridgewell/sourcemap-codec': 1.5.5 3025 - 3026 - '@mapbox/node-pre-gyp@2.0.3': 3027 - dependencies: 3028 - consola: 3.4.2 3029 - detect-libc: 2.1.2 3030 - https-proxy-agent: 7.0.6 3031 - node-fetch: 2.7.0 3032 - nopt: 8.1.0 3033 - semver: 7.7.3 3034 - tar: 7.5.7 3035 - transitivePeerDependencies: 3036 - - encoding 3037 - - supports-color 3038 2565 3039 2566 '@oslojs/encoding@1.1.0': {} 3040 2567 3041 - '@pkgjs/parseargs@0.11.0': 3042 - optional: true 3043 - 3044 - '@rollup/pluginutils@5.3.0(rollup@4.57.0)': 2568 + '@rollup/pluginutils@5.3.0(rollup@4.57.1)': 3045 2569 dependencies: 3046 2570 '@types/estree': 1.0.8 3047 2571 estree-walker: 2.0.2 3048 2572 picomatch: 4.0.3 3049 2573 optionalDependencies: 3050 - rollup: 4.57.0 2574 + rollup: 4.57.1 3051 2575 3052 - '@rollup/rollup-android-arm-eabi@4.57.0': 2576 + '@rollup/rollup-android-arm-eabi@4.57.1': 3053 2577 optional: true 3054 2578 3055 - '@rollup/rollup-android-arm64@4.57.0': 2579 + '@rollup/rollup-android-arm64@4.57.1': 3056 2580 optional: true 3057 2581 3058 - '@rollup/rollup-darwin-arm64@4.57.0': 2582 + '@rollup/rollup-darwin-arm64@4.57.1': 3059 2583 optional: true 3060 2584 3061 - '@rollup/rollup-darwin-x64@4.57.0': 2585 + '@rollup/rollup-darwin-x64@4.57.1': 3062 2586 optional: true 3063 2587 3064 - '@rollup/rollup-freebsd-arm64@4.57.0': 2588 + '@rollup/rollup-freebsd-arm64@4.57.1': 3065 2589 optional: true 3066 2590 3067 - '@rollup/rollup-freebsd-x64@4.57.0': 2591 + '@rollup/rollup-freebsd-x64@4.57.1': 3068 2592 optional: true 3069 2593 3070 - '@rollup/rollup-linux-arm-gnueabihf@4.57.0': 2594 + '@rollup/rollup-linux-arm-gnueabihf@4.57.1': 3071 2595 optional: true 3072 2596 3073 - '@rollup/rollup-linux-arm-musleabihf@4.57.0': 2597 + '@rollup/rollup-linux-arm-musleabihf@4.57.1': 3074 2598 optional: true 3075 2599 3076 - '@rollup/rollup-linux-arm64-gnu@4.57.0': 2600 + '@rollup/rollup-linux-arm64-gnu@4.57.1': 3077 2601 optional: true 3078 2602 3079 - '@rollup/rollup-linux-arm64-musl@4.57.0': 2603 + '@rollup/rollup-linux-arm64-musl@4.57.1': 3080 2604 optional: true 3081 2605 3082 - '@rollup/rollup-linux-loong64-gnu@4.57.0': 2606 + '@rollup/rollup-linux-loong64-gnu@4.57.1': 3083 2607 optional: true 3084 2608 3085 - '@rollup/rollup-linux-loong64-musl@4.57.0': 2609 + '@rollup/rollup-linux-loong64-musl@4.57.1': 3086 2610 optional: true 3087 2611 3088 - '@rollup/rollup-linux-ppc64-gnu@4.57.0': 2612 + '@rollup/rollup-linux-ppc64-gnu@4.57.1': 3089 2613 optional: true 3090 2614 3091 - '@rollup/rollup-linux-ppc64-musl@4.57.0': 2615 + '@rollup/rollup-linux-ppc64-musl@4.57.1': 3092 2616 optional: true 3093 2617 3094 - '@rollup/rollup-linux-riscv64-gnu@4.57.0': 2618 + '@rollup/rollup-linux-riscv64-gnu@4.57.1': 3095 2619 optional: true 3096 2620 3097 - '@rollup/rollup-linux-riscv64-musl@4.57.0': 2621 + '@rollup/rollup-linux-riscv64-musl@4.57.1': 3098 2622 optional: true 3099 2623 3100 - '@rollup/rollup-linux-s390x-gnu@4.57.0': 2624 + '@rollup/rollup-linux-s390x-gnu@4.57.1': 3101 2625 optional: true 3102 2626 3103 - '@rollup/rollup-linux-x64-gnu@4.57.0': 2627 + '@rollup/rollup-linux-x64-gnu@4.57.1': 3104 2628 optional: true 3105 2629 3106 - '@rollup/rollup-linux-x64-musl@4.57.0': 2630 + '@rollup/rollup-linux-x64-musl@4.57.1': 3107 2631 optional: true 3108 2632 3109 - '@rollup/rollup-openbsd-x64@4.57.0': 2633 + '@rollup/rollup-openbsd-x64@4.57.1': 3110 2634 optional: true 3111 2635 3112 - '@rollup/rollup-openharmony-arm64@4.57.0': 2636 + '@rollup/rollup-openharmony-arm64@4.57.1': 3113 2637 optional: true 3114 2638 3115 - '@rollup/rollup-win32-arm64-msvc@4.57.0': 2639 + '@rollup/rollup-win32-arm64-msvc@4.57.1': 3116 2640 optional: true 3117 2641 3118 - '@rollup/rollup-win32-ia32-msvc@4.57.0': 2642 + '@rollup/rollup-win32-ia32-msvc@4.57.1': 3119 2643 optional: true 3120 2644 3121 - '@rollup/rollup-win32-x64-gnu@4.57.0': 2645 + '@rollup/rollup-win32-x64-gnu@4.57.1': 3122 2646 optional: true 3123 2647 3124 - '@rollup/rollup-win32-x64-msvc@4.57.0': 2648 + '@rollup/rollup-win32-x64-msvc@4.57.1': 3125 2649 optional: true 3126 2650 3127 - '@shikijs/core@3.21.0': 2651 + '@shikijs/core@3.22.0': 3128 2652 dependencies: 3129 - '@shikijs/types': 3.21.0 2653 + '@shikijs/types': 3.22.0 3130 2654 '@shikijs/vscode-textmate': 10.0.2 3131 2655 '@types/hast': 3.0.4 3132 2656 hast-util-to-html: 9.0.5 3133 2657 3134 - '@shikijs/engine-javascript@3.21.0': 2658 + '@shikijs/engine-javascript@3.22.0': 3135 2659 dependencies: 3136 - '@shikijs/types': 3.21.0 2660 + '@shikijs/types': 3.22.0 3137 2661 '@shikijs/vscode-textmate': 10.0.2 3138 2662 oniguruma-to-es: 4.3.4 3139 2663 3140 - '@shikijs/engine-oniguruma@3.21.0': 2664 + '@shikijs/engine-oniguruma@3.22.0': 3141 2665 dependencies: 3142 - '@shikijs/types': 3.21.0 2666 + '@shikijs/types': 3.22.0 3143 2667 '@shikijs/vscode-textmate': 10.0.2 3144 2668 3145 - '@shikijs/langs@3.21.0': 2669 + '@shikijs/langs@3.22.0': 3146 2670 dependencies: 3147 - '@shikijs/types': 3.21.0 2671 + '@shikijs/types': 3.22.0 3148 2672 3149 - '@shikijs/themes@3.21.0': 2673 + '@shikijs/themes@3.22.0': 3150 2674 dependencies: 3151 - '@shikijs/types': 3.21.0 2675 + '@shikijs/types': 3.22.0 3152 2676 3153 - '@shikijs/types@3.21.0': 2677 + '@shikijs/types@3.22.0': 3154 2678 dependencies: 3155 2679 '@shikijs/vscode-textmate': 10.0.2 3156 2680 '@types/hast': 3.0.4 3157 2681 3158 2682 '@shikijs/vscode-textmate@10.0.2': {} 3159 2683 3160 - '@tailwindcss/node@4.1.18': 3161 - dependencies: 3162 - '@jridgewell/remapping': 2.3.5 3163 - enhanced-resolve: 5.18.4 3164 - jiti: 2.6.1 3165 - lightningcss: 1.30.2 3166 - magic-string: 0.30.21 3167 - source-map-js: 1.2.1 3168 - tailwindcss: 4.1.18 3169 - 3170 - '@tailwindcss/oxide-android-arm64@4.1.18': 3171 - optional: true 3172 - 3173 - '@tailwindcss/oxide-darwin-arm64@4.1.18': 3174 - optional: true 3175 - 3176 - '@tailwindcss/oxide-darwin-x64@4.1.18': 3177 - optional: true 3178 - 3179 - '@tailwindcss/oxide-freebsd-x64@4.1.18': 3180 - optional: true 3181 - 3182 - '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.18': 3183 - optional: true 3184 - 3185 - '@tailwindcss/oxide-linux-arm64-gnu@4.1.18': 3186 - optional: true 3187 - 3188 - '@tailwindcss/oxide-linux-arm64-musl@4.1.18': 3189 - optional: true 3190 - 3191 - '@tailwindcss/oxide-linux-x64-gnu@4.1.18': 3192 - optional: true 3193 - 3194 - '@tailwindcss/oxide-linux-x64-musl@4.1.18': 3195 - optional: true 3196 - 3197 - '@tailwindcss/oxide-wasm32-wasi@4.1.18': 3198 - optional: true 3199 - 3200 - '@tailwindcss/oxide-win32-arm64-msvc@4.1.18': 3201 - optional: true 3202 - 3203 - '@tailwindcss/oxide-win32-x64-msvc@4.1.18': 3204 - optional: true 3205 - 3206 - '@tailwindcss/oxide@4.1.18': 3207 - optionalDependencies: 3208 - '@tailwindcss/oxide-android-arm64': 4.1.18 3209 - '@tailwindcss/oxide-darwin-arm64': 4.1.18 3210 - '@tailwindcss/oxide-darwin-x64': 4.1.18 3211 - '@tailwindcss/oxide-freebsd-x64': 4.1.18 3212 - '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.18 3213 - '@tailwindcss/oxide-linux-arm64-gnu': 4.1.18 3214 - '@tailwindcss/oxide-linux-arm64-musl': 4.1.18 3215 - '@tailwindcss/oxide-linux-x64-gnu': 4.1.18 3216 - '@tailwindcss/oxide-linux-x64-musl': 4.1.18 3217 - '@tailwindcss/oxide-wasm32-wasi': 4.1.18 3218 - '@tailwindcss/oxide-win32-arm64-msvc': 4.1.18 3219 - '@tailwindcss/oxide-win32-x64-msvc': 4.1.18 3220 - 3221 - '@tailwindcss/vite@4.1.18(vite@6.4.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.2))': 3222 - dependencies: 3223 - '@tailwindcss/node': 4.1.18 3224 - '@tailwindcss/oxide': 4.1.18 3225 - tailwindcss: 4.1.18 3226 - vite: 6.4.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.2) 3227 - 3228 2684 '@trysound/sax@0.2.0': {} 3229 2685 3230 2686 '@types/debug@4.1.12': ··· 3249 2705 3250 2706 '@types/node@17.0.45': {} 3251 2707 3252 - '@types/node@25.0.10': 2708 + '@types/node@25.2.1': 3253 2709 dependencies: 3254 2710 undici-types: 7.16.0 3255 - optional: true 3256 2711 3257 2712 '@types/sax@1.2.7': 3258 2713 dependencies: 3259 - '@types/node': 17.0.45 2714 + '@types/node': 25.2.1 3260 2715 3261 2716 '@types/unist@3.0.3': {} 3262 2717 3263 2718 '@types/yauzl@2.10.3': 3264 2719 dependencies: 3265 - '@types/node': 25.0.10 2720 + '@types/node': 25.2.1 3266 2721 optional: true 3267 2722 3268 2723 '@ungap/structured-clone@1.3.0': {} 3269 2724 3270 - '@vercel/analytics@1.6.1': {} 3271 - 3272 2725 '@vercel/functions@2.2.13': 3273 2726 dependencies: 3274 2727 '@vercel/oidc': 2.0.2 3275 - 3276 - '@vercel/nft@0.30.4(rollup@4.57.0)': 3277 - dependencies: 3278 - '@mapbox/node-pre-gyp': 2.0.3 3279 - '@rollup/pluginutils': 5.3.0(rollup@4.57.0) 3280 - acorn: 8.15.0 3281 - acorn-import-attributes: 1.9.5(acorn@8.15.0) 3282 - async-sema: 3.1.1 3283 - bindings: 1.5.0 3284 - estree-walker: 2.0.2 3285 - glob: 10.5.0 3286 - graceful-fs: 4.2.11 3287 - node-gyp-build: 4.8.4 3288 - picomatch: 4.0.3 3289 - resolve-from: 5.0.0 3290 - transitivePeerDependencies: 3291 - - encoding 3292 - - rollup 3293 - - supports-color 2728 + optional: true 3294 2729 3295 2730 '@vercel/oidc@2.0.2': 3296 2731 dependencies: 3297 2732 '@types/ms': 2.1.0 3298 2733 ms: 2.1.3 2734 + optional: true 3299 2735 3300 - '@vercel/routing-utils@5.3.2': 2736 + '@volar/kit@2.4.28(typescript@5.9.3)': 3301 2737 dependencies: 3302 - path-to-regexp: 6.1.0 3303 - path-to-regexp-updated: path-to-regexp@6.3.0 3304 - optionalDependencies: 3305 - ajv: 6.12.6 3306 - 3307 - '@volar/kit@2.4.27(typescript@5.9.3)': 3308 - dependencies: 3309 - '@volar/language-service': 2.4.27 3310 - '@volar/typescript': 2.4.27 2738 + '@volar/language-service': 2.4.28 2739 + '@volar/typescript': 2.4.28 3311 2740 typesafe-path: 0.2.2 3312 2741 typescript: 5.9.3 3313 2742 vscode-languageserver-textdocument: 1.0.12 3314 2743 vscode-uri: 3.1.0 3315 2744 3316 - '@volar/language-core@2.4.27': 2745 + '@volar/language-core@2.4.28': 3317 2746 dependencies: 3318 - '@volar/source-map': 2.4.27 2747 + '@volar/source-map': 2.4.28 3319 2748 3320 - '@volar/language-server@2.4.27': 2749 + '@volar/language-server@2.4.28': 3321 2750 dependencies: 3322 - '@volar/language-core': 2.4.27 3323 - '@volar/language-service': 2.4.27 3324 - '@volar/typescript': 2.4.27 2751 + '@volar/language-core': 2.4.28 2752 + '@volar/language-service': 2.4.28 2753 + '@volar/typescript': 2.4.28 3325 2754 path-browserify: 1.0.1 3326 2755 request-light: 0.7.0 3327 2756 vscode-languageserver: 9.0.1 ··· 3329 2758 vscode-languageserver-textdocument: 1.0.12 3330 2759 vscode-uri: 3.1.0 3331 2760 3332 - '@volar/language-service@2.4.27': 2761 + '@volar/language-service@2.4.28': 3333 2762 dependencies: 3334 - '@volar/language-core': 2.4.27 2763 + '@volar/language-core': 2.4.28 3335 2764 vscode-languageserver-protocol: 3.17.5 3336 2765 vscode-languageserver-textdocument: 1.0.12 3337 2766 vscode-uri: 3.1.0 3338 2767 3339 - '@volar/source-map@2.4.27': {} 2768 + '@volar/source-map@2.4.28': {} 3340 2769 3341 - '@volar/typescript@2.4.27': 2770 + '@volar/typescript@2.4.28': 3342 2771 dependencies: 3343 - '@volar/language-core': 2.4.27 2772 + '@volar/language-core': 2.4.28 3344 2773 path-browserify: 1.0.1 3345 2774 vscode-uri: 3.1.0 3346 2775 ··· 3354 2783 3355 2784 '@vscode/l10n@0.0.18': {} 3356 2785 3357 - abbrev@3.0.1: {} 3358 - 3359 - acorn-import-attributes@1.9.5(acorn@8.15.0): 3360 - dependencies: 3361 - acorn: 8.15.0 3362 - 3363 2786 acorn@8.15.0: {} 3364 - 3365 - agent-base@7.1.4: {} 3366 2787 3367 2788 ajv-draft-04@1.0.0(ajv@8.17.1): 3368 2789 optionalDependencies: 3369 2790 ajv: 8.17.1 3370 - 3371 - ajv@6.12.6: 3372 - dependencies: 3373 - fast-deep-equal: 3.1.3 3374 - fast-json-stable-stringify: 2.1.0 3375 - json-schema-traverse: 0.4.1 3376 - uri-js: 4.4.1 3377 - optional: true 3378 2791 3379 2792 ajv@8.17.1: 3380 2793 dependencies: ··· 3410 2823 3411 2824 array-iterate@2.0.1: {} 3412 2825 3413 - astro-capo@0.0.1(astro@5.16.15(@types/node@25.0.10)(@vercel/functions@2.2.13)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.0)(typescript@5.9.3)(yaml@2.8.2)): 2826 + astro-capo@0.0.1(astro@5.17.1(@types/node@25.2.1)(@vercel/functions@2.2.13)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(typescript@5.9.3)(yaml@2.8.2)): 3414 2827 dependencies: 3415 - astro: 5.16.15(@types/node@25.0.10)(@vercel/functions@2.2.13)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.0)(typescript@5.9.3)(yaml@2.8.2) 2828 + astro: 5.17.1(@types/node@25.2.1)(@vercel/functions@2.2.13)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(typescript@5.9.3)(yaml@2.8.2) 3416 2829 ultrahtml: 1.6.0 3417 2830 3418 2831 astro-icon@1.1.5: ··· 3423 2836 transitivePeerDependencies: 3424 2837 - supports-color 3425 2838 3426 - astro-og@0.3.2(astro@5.16.15(@types/node@25.0.10)(@vercel/functions@2.2.13)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.0)(typescript@5.9.3)(yaml@2.8.2)): 2839 + astro-og@0.3.2(astro@5.17.1(@types/node@25.2.1)(@vercel/functions@2.2.13)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(typescript@5.9.3)(yaml@2.8.2)): 3427 2840 dependencies: 3428 - astro: 5.16.15(@types/node@25.0.10)(@vercel/functions@2.2.13)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.0)(typescript@5.9.3)(yaml@2.8.2) 2841 + astro: 5.17.1(@types/node@25.2.1)(@vercel/functions@2.2.13)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(typescript@5.9.3)(yaml@2.8.2) 3429 2842 preact: 10.28.2 3430 2843 3431 2844 astro-seo@1.1.0(prettier-plugin-astro@0.14.1)(prettier@3.8.1)(typescript@5.9.3): ··· 3436 2849 - prettier-plugin-astro 3437 2850 - typescript 3438 2851 3439 - astro@5.16.15(@types/node@25.0.10)(@vercel/functions@2.2.13)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.0)(typescript@5.9.3)(yaml@2.8.2): 2852 + astro@5.17.1(@types/node@25.2.1)(@vercel/functions@2.2.13)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.57.1)(typescript@5.9.3)(yaml@2.8.2): 3440 2853 dependencies: 3441 - '@astrojs/compiler': 2.13.0 2854 + '@astrojs/compiler': 2.13.1 3442 2855 '@astrojs/internal-helpers': 0.7.5 3443 2856 '@astrojs/markdown-remark': 6.3.10 3444 2857 '@astrojs/telemetry': 3.3.0 3445 2858 '@capsizecss/unpack': 4.0.0 3446 2859 '@oslojs/encoding': 1.1.0 3447 - '@rollup/pluginutils': 5.3.0(rollup@4.57.0) 2860 + '@rollup/pluginutils': 5.3.0(rollup@4.57.1) 3448 2861 acorn: 8.15.0 3449 2862 aria-query: 5.3.2 3450 2863 axobject-query: 4.1.0 3451 2864 boxen: 8.0.1 3452 - ci-info: 4.3.1 2865 + ci-info: 4.4.0 3453 2866 clsx: 2.1.1 3454 2867 common-ancestor-path: 1.0.1 3455 2868 cookie: 1.1.1 ··· 3464 2877 esbuild: 0.25.12 3465 2878 estree-walker: 3.0.3 3466 2879 flattie: 1.1.1 3467 - fontace: 0.4.0 2880 + fontace: 0.4.1 3468 2881 github-slugger: 2.0.0 3469 2882 html-escaper: 3.0.3 3470 2883 http-cache-semantics: 4.2.0 3471 2884 import-meta-resolve: 4.2.0 3472 2885 js-yaml: 4.1.1 3473 2886 magic-string: 0.30.21 3474 - magicast: 0.5.1 2887 + magicast: 0.5.2 3475 2888 mrmime: 2.0.1 3476 2889 neotraverse: 0.6.18 3477 2890 p-limit: 6.2.0 ··· 3481 2894 picomatch: 4.0.3 3482 2895 prompts: 2.4.2 3483 2896 rehype: 13.0.2 3484 - semver: 7.7.3 3485 - shiki: 3.21.0 2897 + semver: 7.7.4 2898 + shiki: 3.22.0 3486 2899 smol-toml: 1.6.0 3487 2900 svgo: 4.0.0 3488 2901 tinyexec: 1.0.2 ··· 3493 2906 unist-util-visit: 5.1.0 3494 2907 unstorage: 1.17.4(@vercel/functions@2.2.13) 3495 2908 vfile: 6.0.3 3496 - vite: 6.4.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.2) 3497 - vitefu: 1.1.1(vite@6.4.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.2)) 2909 + vite: 6.4.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.2) 2910 + vitefu: 1.1.1(vite@6.4.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.2)) 3498 2911 xxhash-wasm: 1.1.0 3499 2912 yargs-parser: 21.1.1 3500 2913 yocto-spinner: 0.2.3 ··· 3538 2951 - uploadthing 3539 2952 - yaml 3540 2953 3541 - async-sema@3.1.1: {} 3542 - 3543 2954 axobject-query@4.1.0: {} 3544 2955 3545 2956 bail@2.0.2: {} 3546 2957 3547 - balanced-match@1.0.2: {} 3548 - 3549 2958 base-64@1.0.0: {} 3550 2959 3551 - bindings@1.5.0: 3552 - dependencies: 3553 - file-uri-to-path: 1.0.0 3554 - 3555 2960 boolbase@1.0.0: {} 3556 2961 3557 2962 boxen@8.0.1: ··· 3565 2970 widest-line: 5.0.0 3566 2971 wrap-ansi: 9.0.2 3567 2972 3568 - brace-expansion@2.0.2: 3569 - dependencies: 3570 - balanced-match: 1.0.2 3571 - 3572 2973 buffer-crc32@0.2.13: {} 3573 2974 3574 2975 camelcase@8.0.0: {} ··· 3603 3004 parse5: 7.3.0 3604 3005 parse5-htmlparser2-tree-adapter: 7.1.0 3605 3006 parse5-parser-stream: 7.1.2 3606 - undici: 7.19.2 3007 + undici: 7.21.0 3607 3008 whatwg-mimetype: 4.0.0 3608 3009 3609 3010 chokidar@4.0.3: ··· 3616 3017 3617 3018 chownr@3.0.0: {} 3618 3019 3619 - ci-info@4.3.1: {} 3020 + ci-info@4.4.0: {} 3620 3021 3621 3022 cli-boxes@3.0.0: {} 3622 3023 ··· 3644 3045 3645 3046 confbox@0.1.8: {} 3646 3047 3647 - confbox@0.2.2: {} 3648 - 3649 - consola@3.4.2: {} 3048 + confbox@0.2.4: {} 3650 3049 3651 3050 cookie-es@1.2.2: {} 3652 3051 3653 3052 cookie@1.1.1: {} 3654 3053 3655 - cross-spawn@7.0.6: 3656 - dependencies: 3657 - path-key: 3.1.1 3658 - shebang-command: 2.0.0 3659 - which: 2.0.2 3660 - 3661 3054 crossws@0.3.5: 3662 3055 dependencies: 3663 3056 uncrypto: 0.1.3 ··· 3743 3136 3744 3137 dset@3.1.4: {} 3745 3138 3746 - eastasianwidth@0.2.0: {} 3747 - 3748 3139 emmet@2.4.11: 3749 3140 dependencies: 3750 3141 '@emmetio/abbreviation': 2.3.3 ··· 3754 3145 3755 3146 emoji-regex@8.0.0: {} 3756 3147 3757 - emoji-regex@9.2.2: {} 3758 - 3759 3148 encoding-sniffer@0.2.1: 3760 3149 dependencies: 3761 3150 iconv-lite: 0.6.3 ··· 3765 3154 dependencies: 3766 3155 once: 1.4.0 3767 3156 3768 - enhanced-resolve@5.18.4: 3769 - dependencies: 3770 - graceful-fs: 4.2.11 3771 - tapable: 2.3.0 3772 - 3773 3157 entities@4.5.0: {} 3774 3158 3775 3159 entities@6.0.1: {} ··· 3835 3219 3836 3220 fast-deep-equal@3.1.3: {} 3837 3221 3838 - fast-json-stable-stringify@2.1.0: 3839 - optional: true 3840 - 3841 3222 fast-uri@3.1.0: {} 3842 3223 3843 3224 fd-slicer@1.1.0: ··· 3848 3229 optionalDependencies: 3849 3230 picomatch: 4.0.3 3850 3231 3851 - file-uri-to-path@1.0.0: {} 3852 - 3853 3232 flattie@1.1.1: {} 3854 3233 3855 - fontace@0.4.0: 3234 + fontace@0.4.1: 3856 3235 dependencies: 3857 3236 fontkitten: 1.0.2 3858 3237 ··· 3860 3239 dependencies: 3861 3240 tiny-inflate: 1.0.3 3862 3241 3863 - foreground-child@3.3.1: 3864 - dependencies: 3865 - cross-spawn: 7.0.6 3866 - signal-exit: 4.1.0 3867 - 3868 3242 fsevents@2.3.3: 3869 3243 optional: true 3870 3244 ··· 3878 3252 3879 3253 github-slugger@2.0.0: {} 3880 3254 3881 - glob@10.5.0: 3882 - dependencies: 3883 - foreground-child: 3.3.1 3884 - jackspeak: 3.4.3 3885 - minimatch: 9.0.5 3886 - minipass: 7.1.2 3887 - package-json-from-dist: 1.0.1 3888 - path-scurry: 1.11.1 3889 - 3890 3255 globals@15.15.0: {} 3891 - 3892 - graceful-fs@4.2.11: {} 3893 3256 3894 3257 h3@1.15.5: 3895 3258 dependencies: ··· 4003 3366 4004 3367 http-cache-semantics@4.2.0: {} 4005 3368 4006 - https-proxy-agent@7.0.6: 4007 - dependencies: 4008 - agent-base: 7.1.4 4009 - debug: 4.4.3 4010 - transitivePeerDependencies: 4011 - - supports-color 4012 - 4013 3369 iconv-lite@0.6.3: 4014 3370 dependencies: 4015 3371 safer-buffer: 2.1.2 ··· 4032 3388 dependencies: 4033 3389 is-inside-container: 1.0.0 4034 3390 4035 - isexe@2.0.0: {} 4036 - 4037 - jackspeak@3.4.3: 4038 - dependencies: 4039 - '@isaacs/cliui': 8.0.2 4040 - optionalDependencies: 4041 - '@pkgjs/parseargs': 0.11.0 4042 - 4043 - jiti@2.6.1: {} 3391 + jiti@2.6.1: 3392 + optional: true 4044 3393 4045 3394 js-yaml@4.1.1: 4046 3395 dependencies: 4047 3396 argparse: 2.0.1 4048 - 4049 - json-schema-traverse@0.4.1: 4050 - optional: true 4051 3397 4052 3398 json-schema-traverse@1.0.0: {} 4053 3399 ··· 4109 3455 lightningcss-linux-x64-musl: 1.30.2 4110 3456 lightningcss-win32-arm64-msvc: 1.30.2 4111 3457 lightningcss-win32-x64-msvc: 1.30.2 4112 - 4113 - lite-youtube-embed@0.3.4: {} 3458 + optional: true 4114 3459 4115 3460 local-pkg@1.1.2: 4116 3461 dependencies: ··· 4122 3467 4123 3468 longest-streak@3.1.0: {} 4124 3469 4125 - lru-cache@10.4.3: {} 4126 - 4127 3470 lru-cache@11.2.5: {} 4128 3471 4129 3472 magic-string@0.30.21: 4130 3473 dependencies: 4131 3474 '@jridgewell/sourcemap-codec': 1.5.5 4132 3475 4133 - magicast@0.5.1: 3476 + magicast@0.5.2: 4134 3477 dependencies: 4135 - '@babel/parser': 7.28.6 4136 - '@babel/types': 7.28.6 3478 + '@babel/parser': 7.29.0 3479 + '@babel/types': 7.29.0 4137 3480 source-map-js: 1.2.1 4138 3481 4139 3482 markdown-table@3.0.4: {} ··· 4455 3798 transitivePeerDependencies: 4456 3799 - supports-color 4457 3800 4458 - minimatch@9.0.5: 4459 - dependencies: 4460 - brace-expansion: 2.0.2 4461 - 4462 3801 minipass@7.1.2: {} 4463 3802 4464 3803 minizlib@3.1.0: ··· 4487 3826 '@types/nlcst': 2.0.3 4488 3827 4489 3828 node-fetch-native@1.6.7: {} 4490 - 4491 - node-fetch@2.7.0: 4492 - dependencies: 4493 - whatwg-url: 5.0.0 4494 - 4495 - node-gyp-build@4.8.4: {} 4496 3829 4497 3830 node-mock-http@1.0.4: {} 4498 3831 4499 - nopt@8.1.0: 4500 - dependencies: 4501 - abbrev: 3.0.1 4502 - 4503 3832 normalize-path@3.0.0: {} 4504 3833 4505 3834 nth-check@2.1.1: ··· 4537 3866 4538 3867 p-timeout@6.1.4: {} 4539 3868 4540 - package-json-from-dist@1.0.1: {} 4541 - 4542 3869 package-manager-detector@1.6.0: {} 4543 3870 4544 3871 parse-latin@7.0.0: ··· 4565 3892 4566 3893 path-browserify@1.0.1: {} 4567 3894 4568 - path-key@3.1.1: {} 4569 - 4570 - path-scurry@1.11.1: 4571 - dependencies: 4572 - lru-cache: 10.4.3 4573 - minipass: 7.1.2 4574 - 4575 - path-to-regexp@6.1.0: {} 4576 - 4577 - path-to-regexp@6.3.0: {} 4578 - 4579 3895 pathe@2.0.3: {} 4580 3896 4581 3897 pend@1.2.0: {} ··· 4596 3912 4597 3913 pkg-types@2.3.0: 4598 3914 dependencies: 4599 - confbox: 0.2.2 3915 + confbox: 0.2.4 4600 3916 exsolve: 1.0.8 4601 3917 pathe: 2.0.3 4602 3918 ··· 4610 3926 4611 3927 prettier-plugin-astro@0.14.1: 4612 3928 dependencies: 4613 - '@astrojs/compiler': 2.13.0 3929 + '@astrojs/compiler': 2.13.1 4614 3930 prettier: 3.8.1 4615 3931 sass-formatter: 0.7.9 4616 - 4617 - prettier-plugin-tailwindcss@0.7.2(prettier-plugin-astro@0.14.1)(prettier@3.8.1): 4618 - dependencies: 4619 - prettier: 3.8.1 4620 - optionalDependencies: 4621 - prettier-plugin-astro: 0.14.1 3932 + optional: true 4622 3933 4623 3934 prettier@3.8.1: {} 4624 3935 ··· 4635 3946 dependencies: 4636 3947 end-of-stream: 1.4.5 4637 3948 once: 1.4.0 4638 - 4639 - punycode@2.3.1: 4640 - optional: true 4641 3949 4642 3950 quansync@0.2.11: {} 4643 3951 ··· 4731 4039 4732 4040 require-from-string@2.0.2: {} 4733 4041 4734 - resolve-from@5.0.0: {} 4735 - 4736 4042 retext-latin@4.0.0: 4737 4043 dependencies: 4738 4044 '@types/nlcst': 2.0.3 ··· 4758 4064 retext-stringify: 4.0.0 4759 4065 unified: 11.0.5 4760 4066 4761 - rollup@4.57.0: 4067 + rollup@4.57.1: 4762 4068 dependencies: 4763 4069 '@types/estree': 1.0.8 4764 4070 optionalDependencies: 4765 - '@rollup/rollup-android-arm-eabi': 4.57.0 4766 - '@rollup/rollup-android-arm64': 4.57.0 4767 - '@rollup/rollup-darwin-arm64': 4.57.0 4768 - '@rollup/rollup-darwin-x64': 4.57.0 4769 - '@rollup/rollup-freebsd-arm64': 4.57.0 4770 - '@rollup/rollup-freebsd-x64': 4.57.0 4771 - '@rollup/rollup-linux-arm-gnueabihf': 4.57.0 4772 - '@rollup/rollup-linux-arm-musleabihf': 4.57.0 4773 - '@rollup/rollup-linux-arm64-gnu': 4.57.0 4774 - '@rollup/rollup-linux-arm64-musl': 4.57.0 4775 - '@rollup/rollup-linux-loong64-gnu': 4.57.0 4776 - '@rollup/rollup-linux-loong64-musl': 4.57.0 4777 - '@rollup/rollup-linux-ppc64-gnu': 4.57.0 4778 - '@rollup/rollup-linux-ppc64-musl': 4.57.0 4779 - '@rollup/rollup-linux-riscv64-gnu': 4.57.0 4780 - '@rollup/rollup-linux-riscv64-musl': 4.57.0 4781 - '@rollup/rollup-linux-s390x-gnu': 4.57.0 4782 - '@rollup/rollup-linux-x64-gnu': 4.57.0 4783 - '@rollup/rollup-linux-x64-musl': 4.57.0 4784 - '@rollup/rollup-openbsd-x64': 4.57.0 4785 - '@rollup/rollup-openharmony-arm64': 4.57.0 4786 - '@rollup/rollup-win32-arm64-msvc': 4.57.0 4787 - '@rollup/rollup-win32-ia32-msvc': 4.57.0 4788 - '@rollup/rollup-win32-x64-gnu': 4.57.0 4789 - '@rollup/rollup-win32-x64-msvc': 4.57.0 4071 + '@rollup/rollup-android-arm-eabi': 4.57.1 4072 + '@rollup/rollup-android-arm64': 4.57.1 4073 + '@rollup/rollup-darwin-arm64': 4.57.1 4074 + '@rollup/rollup-darwin-x64': 4.57.1 4075 + '@rollup/rollup-freebsd-arm64': 4.57.1 4076 + '@rollup/rollup-freebsd-x64': 4.57.1 4077 + '@rollup/rollup-linux-arm-gnueabihf': 4.57.1 4078 + '@rollup/rollup-linux-arm-musleabihf': 4.57.1 4079 + '@rollup/rollup-linux-arm64-gnu': 4.57.1 4080 + '@rollup/rollup-linux-arm64-musl': 4.57.1 4081 + '@rollup/rollup-linux-loong64-gnu': 4.57.1 4082 + '@rollup/rollup-linux-loong64-musl': 4.57.1 4083 + '@rollup/rollup-linux-ppc64-gnu': 4.57.1 4084 + '@rollup/rollup-linux-ppc64-musl': 4.57.1 4085 + '@rollup/rollup-linux-riscv64-gnu': 4.57.1 4086 + '@rollup/rollup-linux-riscv64-musl': 4.57.1 4087 + '@rollup/rollup-linux-s390x-gnu': 4.57.1 4088 + '@rollup/rollup-linux-x64-gnu': 4.57.1 4089 + '@rollup/rollup-linux-x64-musl': 4.57.1 4090 + '@rollup/rollup-openbsd-x64': 4.57.1 4091 + '@rollup/rollup-openharmony-arm64': 4.57.1 4092 + '@rollup/rollup-win32-arm64-msvc': 4.57.1 4093 + '@rollup/rollup-win32-ia32-msvc': 4.57.1 4094 + '@rollup/rollup-win32-x64-gnu': 4.57.1 4095 + '@rollup/rollup-win32-x64-msvc': 4.57.1 4790 4096 fsevents: 2.3.3 4791 4097 4792 - s.color@0.0.15: {} 4098 + s.color@0.0.15: 4099 + optional: true 4793 4100 4794 4101 safer-buffer@2.1.2: {} 4795 4102 4796 4103 sass-formatter@0.7.9: 4797 4104 dependencies: 4798 4105 suf-log: 2.5.3 4106 + optional: true 4799 4107 4800 4108 sax@1.4.4: {} 4801 4109 4802 - semver@7.7.3: {} 4110 + semver@7.7.4: {} 4803 4111 4804 4112 sharp@0.34.5: 4805 4113 dependencies: 4806 4114 '@img/colour': 1.0.0 4807 4115 detect-libc: 2.1.2 4808 - semver: 7.7.3 4116 + semver: 7.7.4 4809 4117 optionalDependencies: 4810 4118 '@img/sharp-darwin-arm64': 0.34.5 4811 4119 '@img/sharp-darwin-x64': 0.34.5 ··· 4832 4140 '@img/sharp-win32-ia32': 0.34.5 4833 4141 '@img/sharp-win32-x64': 0.34.5 4834 4142 4835 - shebang-command@2.0.0: 4143 + shiki@3.22.0: 4836 4144 dependencies: 4837 - shebang-regex: 3.0.0 4838 - 4839 - shebang-regex@3.0.0: {} 4840 - 4841 - shiki@3.21.0: 4842 - dependencies: 4843 - '@shikijs/core': 3.21.0 4844 - '@shikijs/engine-javascript': 3.21.0 4845 - '@shikijs/engine-oniguruma': 3.21.0 4846 - '@shikijs/langs': 3.21.0 4847 - '@shikijs/themes': 3.21.0 4848 - '@shikijs/types': 3.21.0 4145 + '@shikijs/core': 3.22.0 4146 + '@shikijs/engine-javascript': 3.22.0 4147 + '@shikijs/engine-oniguruma': 3.22.0 4148 + '@shikijs/langs': 3.22.0 4149 + '@shikijs/themes': 3.22.0 4150 + '@shikijs/types': 3.22.0 4849 4151 '@shikijs/vscode-textmate': 10.0.2 4850 4152 '@types/hast': 3.0.4 4851 - 4852 - signal-exit@4.1.0: {} 4853 4153 4854 4154 sisteransi@1.0.5: {} 4855 4155 ··· 4874 4174 is-fullwidth-code-point: 3.0.0 4875 4175 strip-ansi: 6.0.1 4876 4176 4877 - string-width@5.1.2: 4878 - dependencies: 4879 - eastasianwidth: 0.2.0 4880 - emoji-regex: 9.2.2 4881 - strip-ansi: 7.1.2 4882 - 4883 4177 string-width@7.2.0: 4884 4178 dependencies: 4885 4179 emoji-regex: 10.6.0 ··· 4902 4196 suf-log@2.5.3: 4903 4197 dependencies: 4904 4198 s.color: 0.0.15 4199 + optional: true 4905 4200 4906 4201 svgo@3.3.2: 4907 4202 dependencies: ··· 4923 4218 picocolors: 1.1.1 4924 4219 sax: 1.4.4 4925 4220 4926 - tailwindcss@4.1.18: {} 4927 - 4928 - tapable@2.3.0: {} 4929 - 4930 4221 tar@7.5.7: 4931 4222 dependencies: 4932 4223 '@isaacs/fs-minipass': 4.0.1 ··· 4944 4235 fdir: 6.5.0(picomatch@4.0.3) 4945 4236 picomatch: 4.0.3 4946 4237 4947 - tr46@0.0.3: {} 4948 - 4949 4238 trim-lines@3.0.1: {} 4950 4239 4951 4240 trough@2.2.0: {} ··· 4963 4252 4964 4253 typescript-auto-import-cache@0.3.6: 4965 4254 dependencies: 4966 - semver: 7.7.3 4255 + semver: 7.7.4 4967 4256 4968 4257 typescript@5.9.3: {} 4969 4258 ··· 4973 4262 4974 4263 uncrypto@0.1.3: {} 4975 4264 4976 - undici-types@7.16.0: 4977 - optional: true 4265 + undici-types@7.16.0: {} 4978 4266 4979 - undici@7.19.2: {} 4267 + undici@7.21.0: {} 4980 4268 4981 4269 unified@11.0.5: 4982 4270 dependencies: ··· 5049 4337 optionalDependencies: 5050 4338 '@vercel/functions': 2.2.13 5051 4339 5052 - uri-js@4.4.1: 5053 - dependencies: 5054 - punycode: 2.3.1 5055 - optional: true 5056 - 5057 4340 vfile-location@5.0.3: 5058 4341 dependencies: 5059 4342 '@types/unist': 3.0.3 ··· 5069 4352 '@types/unist': 3.0.3 5070 4353 vfile-message: 4.0.3 5071 4354 5072 - vite@6.4.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.2): 4355 + vite@6.4.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.2): 5073 4356 dependencies: 5074 4357 esbuild: 0.25.12 5075 4358 fdir: 6.5.0(picomatch@4.0.3) 5076 4359 picomatch: 4.0.3 5077 4360 postcss: 8.5.6 5078 - rollup: 4.57.0 4361 + rollup: 4.57.1 5079 4362 tinyglobby: 0.2.15 5080 4363 optionalDependencies: 5081 - '@types/node': 25.0.10 4364 + '@types/node': 25.2.1 5082 4365 fsevents: 2.3.3 5083 4366 jiti: 2.6.1 5084 4367 lightningcss: 1.30.2 5085 4368 yaml: 2.8.2 5086 4369 5087 - vitefu@1.1.1(vite@6.4.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.2)): 4370 + vitefu@1.1.1(vite@6.4.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.2)): 5088 4371 optionalDependencies: 5089 - vite: 6.4.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.2) 4372 + vite: 6.4.1(@types/node@25.2.1)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.2) 5090 4373 5091 - volar-service-css@0.0.68(@volar/language-service@2.4.27): 4374 + volar-service-css@0.0.68(@volar/language-service@2.4.28): 5092 4375 dependencies: 5093 4376 vscode-css-languageservice: 6.3.9 5094 4377 vscode-languageserver-textdocument: 1.0.12 5095 4378 vscode-uri: 3.1.0 5096 4379 optionalDependencies: 5097 - '@volar/language-service': 2.4.27 4380 + '@volar/language-service': 2.4.28 5098 4381 5099 - volar-service-emmet@0.0.68(@volar/language-service@2.4.27): 4382 + volar-service-emmet@0.0.68(@volar/language-service@2.4.28): 5100 4383 dependencies: 5101 4384 '@emmetio/css-parser': 0.4.1 5102 4385 '@emmetio/html-matcher': 1.3.0 5103 4386 '@vscode/emmet-helper': 2.11.0 5104 4387 vscode-uri: 3.1.0 5105 4388 optionalDependencies: 5106 - '@volar/language-service': 2.4.27 4389 + '@volar/language-service': 2.4.28 5107 4390 5108 - volar-service-html@0.0.68(@volar/language-service@2.4.27): 4391 + volar-service-html@0.0.68(@volar/language-service@2.4.28): 5109 4392 dependencies: 5110 4393 vscode-html-languageservice: 5.6.1 5111 4394 vscode-languageserver-textdocument: 1.0.12 5112 4395 vscode-uri: 3.1.0 5113 4396 optionalDependencies: 5114 - '@volar/language-service': 2.4.27 4397 + '@volar/language-service': 2.4.28 5115 4398 5116 - volar-service-prettier@0.0.68(@volar/language-service@2.4.27)(prettier@3.8.1): 4399 + volar-service-prettier@0.0.68(@volar/language-service@2.4.28)(prettier@3.8.1): 5117 4400 dependencies: 5118 4401 vscode-uri: 3.1.0 5119 4402 optionalDependencies: 5120 - '@volar/language-service': 2.4.27 4403 + '@volar/language-service': 2.4.28 5121 4404 prettier: 3.8.1 5122 4405 5123 - volar-service-typescript-twoslash-queries@0.0.68(@volar/language-service@2.4.27): 4406 + volar-service-typescript-twoslash-queries@0.0.68(@volar/language-service@2.4.28): 5124 4407 dependencies: 5125 4408 vscode-uri: 3.1.0 5126 4409 optionalDependencies: 5127 - '@volar/language-service': 2.4.27 4410 + '@volar/language-service': 2.4.28 5128 4411 5129 - volar-service-typescript@0.0.68(@volar/language-service@2.4.27): 4412 + volar-service-typescript@0.0.68(@volar/language-service@2.4.28): 5130 4413 dependencies: 5131 4414 path-browserify: 1.0.1 5132 - semver: 7.7.3 4415 + semver: 7.7.4 5133 4416 typescript-auto-import-cache: 0.3.6 5134 4417 vscode-languageserver-textdocument: 1.0.12 5135 4418 vscode-nls: 5.2.0 5136 4419 vscode-uri: 3.1.0 5137 4420 optionalDependencies: 5138 - '@volar/language-service': 2.4.27 4421 + '@volar/language-service': 2.4.28 5139 4422 5140 - volar-service-yaml@0.0.68(@volar/language-service@2.4.27): 4423 + volar-service-yaml@0.0.68(@volar/language-service@2.4.28): 5141 4424 dependencies: 5142 4425 vscode-uri: 3.1.0 5143 4426 yaml-language-server: 1.19.2 5144 4427 optionalDependencies: 5145 - '@volar/language-service': 2.4.27 4428 + '@volar/language-service': 2.4.28 5146 4429 5147 4430 vscode-css-languageservice@6.3.9: 5148 4431 dependencies: ··· 5187 4470 5188 4471 web-namespaces@2.0.1: {} 5189 4472 5190 - webidl-conversions@3.0.1: {} 5191 - 5192 4473 whatwg-encoding@3.1.1: 5193 4474 dependencies: 5194 4475 iconv-lite: 0.6.3 5195 4476 5196 4477 whatwg-mimetype@4.0.0: {} 5197 4478 5198 - whatwg-url@5.0.0: 5199 - dependencies: 5200 - tr46: 0.0.3 5201 - webidl-conversions: 3.0.1 5202 - 5203 4479 which-pm-runs@1.1.0: {} 5204 4480 5205 - which@2.0.2: 5206 - dependencies: 5207 - isexe: 2.0.0 5208 - 5209 4481 widest-line@5.0.0: 5210 4482 dependencies: 5211 4483 string-width: 7.2.0 ··· 5215 4487 ansi-styles: 4.3.0 5216 4488 string-width: 4.2.3 5217 4489 strip-ansi: 6.0.1 5218 - 5219 - wrap-ansi@8.1.0: 5220 - dependencies: 5221 - ansi-styles: 6.2.3 5222 - string-width: 5.1.2 5223 - strip-ansi: 7.1.2 5224 4490 5225 4491 wrap-ansi@9.0.2: 5226 4492 dependencies:
-4
public/favicon_green.svg
··· 1 - <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> 2 - <path d="M12 8C12 8 12 8 12.76 7C13.64 5.84 14.94 5 16.5 5C18.99 5 21 7.01 21 9.5C21 10.43 20.72 11.29 20.24 12C19.43 13.21 12 21 12 21C12 21 4.57 13.21 3.76 12C3.28 11.29 3 10.43 3 9.5C3 7.01 5.01 5 7.5 5C9.06 5 10.37 5.84 11.24 7C12 8 12 8 12 8Z" fill="#648D2E"/> 3 - <path d="M12 8C12 8 12 8 11.24 7C10.36 5.84 9.06 5 7.5 5C5.01 5 3 7.01 3 9.5C3 10.43 3.28 11.29 3.76 12C4.57 13.21 12 21 12 21M12 8C12 8 12 8 12.76 7C13.64 5.84 14.94 5 16.5 5C18.99 5 21 7.01 21 9.5C21 10.43 20.72 11.29 20.24 12C19.43 13.21 12 21 12 21" stroke="#4A6822" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> 4 - </svg>
-4
public/favicon_red.svg
··· 1 - <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> 2 - <path d="M12 8C12 8 12 8 12.76 7C13.64 5.84 14.94 5 16.5 5C18.99 5 21 7.01 21 9.5C21 10.43 20.72 11.29 20.24 12C19.43 13.21 12 21 12 21C12 21 4.57 13.21 3.76 12C3.28 11.29 3 10.43 3 9.5C3 7.01 5.01 5 7.5 5C9.06 5 10.37 5.84 11.24 7C12 8 12 8 12 8Z" fill="#CC1517"/> 3 - <path d="M12 8C12 8 12 8 11.24 7C10.36 5.84 9.06 5 7.5 5C5.01 5 3 7.01 3 9.5C3 10.43 3.28 11.29 3.76 12C4.57 13.21 12 21 12 21M12 8C12 8 12 8 12.76 7C13.64 5.84 14.94 5 16.5 5C18.99 5 21 7.01 21 9.5C21 10.43 20.72 11.29 20.24 12C19.43 13.21 12 21 12 21" stroke="#AB1213" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> 4 - </svg>
-4
public/favicon_yellow.svg
··· 1 - <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> 2 - <path d="M12 8C12 8 12 8 12.76 7C13.64 5.84 14.94 5 16.5 5C18.99 5 21 7.01 21 9.5C21 10.43 20.72 11.29 20.24 12C19.43 13.21 12 21 12 21C12 21 4.57 13.21 3.76 12C3.28 11.29 3 10.43 3 9.5C3 7.01 5.01 5 7.5 5C9.06 5 10.37 5.84 11.24 7C12 8 12 8 12 8Z" fill="#FDC748"/> 3 - <path d="M12 8C12 8 12 8 11.24 7C10.36 5.84 9.06 5 7.5 5C5.01 5 3 7.01 3 9.5C3 10.43 3.28 11.29 3.76 12C4.57 13.21 12 21 12 21M12 8C12 8 12 8 12.76 7C13.64 5.84 14.94 5 16.5 5C18.99 5 21 7.01 21 9.5C21 10.43 20.72 11.29 20.24 12C19.43 13.21 12 21 12 21" stroke="#FCB817" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> 4 - </svg>
public/rewrite/favicon.png public/favicon.png
-1
public/robots.txt
··· 1 1 User-agent: * 2 2 Allow: / 3 - Disallow: /rewrite/ 4 3 5 4 Sitemap: https://www.life-series.online/sitemap-index.xml
src/assets/images/og/index.png

This is a binary file and will not be displayed.

src/assets/images/og/seasons/1.png

This is a binary file and will not be displayed.

src/assets/images/og/seasons/2.png

This is a binary file and will not be displayed.

src/assets/images/og/seasons/3.png

This is a binary file and will not be displayed.

src/assets/images/og/seasons/4.png

This is a binary file and will not be displayed.

src/assets/images/og/seasons/5.png

This is a binary file and will not be displayed.

src/assets/images/og/seasons/6.png

This is a binary file and will not be displayed.

src/assets/images/og/seasons/7.png

This is a binary file and will not be displayed.

src/assets/images/og/seasons/nice-life.png

This is a binary file and will not be displayed.

src/assets/images/seasons/1.webp

This is a binary file and will not be displayed.

src/assets/images/seasons/2.webp

This is a binary file and will not be displayed.

src/assets/images/seasons/3.webp

This is a binary file and will not be displayed.

src/assets/images/seasons/4.webp

This is a binary file and will not be displayed.

src/assets/images/seasons/5.webp

This is a binary file and will not be displayed.

src/assets/images/seasons/6.webp

This is a binary file and will not be displayed.

src/assets/images/seasons/7.webp

This is a binary file and will not be displayed.

src/assets/images/seasons/nice-life.webp

This is a binary file and will not be displayed.

src/assets/rewrite/images/og/index.webp src/assets/images/og/index.webp
src/assets/rewrite/images/og/seasons/3rd-life.webp src/assets/images/og/seasons/3rd-life.webp
src/assets/rewrite/images/og/seasons/double-life.webp src/assets/images/og/seasons/double-life.webp
src/assets/rewrite/images/og/seasons/last-life.webp src/assets/images/og/seasons/last-life.webp
src/assets/rewrite/images/og/seasons/limited-life.webp src/assets/images/og/seasons/limited-life.webp
src/assets/rewrite/images/og/seasons/nice-life.webp src/assets/images/og/seasons/nice-life.webp
src/assets/rewrite/images/og/seasons/past-life.webp src/assets/images/og/seasons/past-life.webp
src/assets/rewrite/images/og/seasons/secret-life.webp src/assets/images/og/seasons/secret-life.webp
src/assets/rewrite/images/og/seasons/wild-life.webp src/assets/images/og/seasons/wild-life.webp
src/assets/rewrite/images/seasons/3rd-life.webp src/assets/images/seasons/3rd-life.webp
src/assets/rewrite/images/seasons/double-life.webp src/assets/images/seasons/double-life.webp
src/assets/rewrite/images/seasons/favicons/3rd-life.png src/assets/images/seasons/favicons/3rd-life.png
src/assets/rewrite/images/seasons/favicons/double-life.png src/assets/images/seasons/favicons/double-life.png
src/assets/rewrite/images/seasons/favicons/last-life.png src/assets/images/seasons/favicons/last-life.png
src/assets/rewrite/images/seasons/favicons/limited-life.png src/assets/images/seasons/favicons/limited-life.png
src/assets/rewrite/images/seasons/favicons/past-life.png src/assets/images/seasons/favicons/past-life.png
src/assets/rewrite/images/seasons/favicons/secret-life.png src/assets/images/seasons/favicons/secret-life.png
src/assets/rewrite/images/seasons/favicons/wild-life.png src/assets/images/seasons/favicons/wild-life.png
src/assets/rewrite/images/seasons/icons/3rd-life.webp src/assets/images/seasons/icons/3rd-life.webp
src/assets/rewrite/images/seasons/icons/double-life.webp src/assets/images/seasons/icons/double-life.webp
src/assets/rewrite/images/seasons/icons/last-life.webp src/assets/images/seasons/icons/last-life.webp
src/assets/rewrite/images/seasons/icons/limited-life.webp src/assets/images/seasons/icons/limited-life.webp
src/assets/rewrite/images/seasons/icons/past-life.webp src/assets/images/seasons/icons/past-life.webp
src/assets/rewrite/images/seasons/icons/secret-life.webp src/assets/images/seasons/icons/secret-life.webp
src/assets/rewrite/images/seasons/icons/wild-life.webp src/assets/images/seasons/icons/wild-life.webp
src/assets/rewrite/images/seasons/last-life.webp src/assets/images/seasons/last-life.webp
src/assets/rewrite/images/seasons/limited-life.webp src/assets/images/seasons/limited-life.webp
src/assets/rewrite/images/seasons/nice-life.webp

This is a binary file and will not be displayed.

src/assets/rewrite/images/seasons/past-life.webp src/assets/images/seasons/past-life.webp
src/assets/rewrite/images/seasons/secret-life.webp src/assets/images/seasons/secret-life.webp
src/assets/rewrite/images/seasons/wild-life.webp src/assets/images/seasons/wild-life.webp
+16 -19
src/components/CustomCursor.astro
··· 4 4 width="24" 5 5 height="24" 6 6 viewBox="0 0 24 24" 7 + aria-hidden="true" 7 8 > 8 9 <path 9 10 fill="#648D2E" ··· 40 41 </script> 41 42 42 43 <style> 43 - @layer base { 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(--alpha(var(--color-canvas-text) / 25%) 1px 1px 2px); 53 - transition: opacity 100ms linear; 54 - } 55 - 56 - :global(:has(a:hover)) .custom-cursor { 57 - opacity: 0.25; 58 - } 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(color-mix(in oklch, var(--color-canvas-text) 25%, transparent) 1px 1px 2px); 53 + transition: opacity 100ms linear; 59 54 60 55 @starting-style { 61 - .custom-cursor { 62 - opacity: 0; 63 - } 56 + opacity: 0; 64 57 } 58 + } 59 + 60 + :global(:has(a:hover)) .custom-cursor { 61 + opacity: 0.25; 65 62 } 66 63 </style>
+88 -48
src/components/MemberList.astro
··· 1 1 --- 2 - import { Image } from 'astro:assets'; 3 - import type { CollectionEntry } from 'astro:content'; 4 - import { getMemberImage } from '@/utils/images'; 2 + import { type CollectionEntry, getCollection } from 'astro:content'; 3 + import MemberItem from '@/components/MemberItem.astro'; 5 4 import { isCurrentPage } from '@/utils/url'; 6 5 7 6 interface Props { 8 7 season: CollectionEntry<'seasons'>; 9 - members: CollectionEntry<'members'>[]; 10 8 } 11 9 12 - const { season, members } = Astro.props; 10 + const membersCollection = await getCollection('members'); 11 + 12 + const { season } = Astro.props; 13 13 --- 14 14 15 - <ul 16 - role="list" 17 - class="members-list py-16" 18 - > 15 + <ul role="list" aria-labelledby="sidebar-title" class="member-list"> 19 16 { 20 - members.map((member) => { 17 + membersCollection.map((member) => { 21 18 const isPlaying = Object.keys(season.data.videos).includes(member.data.name); 22 19 23 20 return ( 24 - <li class="my-1"> 21 + <li> 25 22 <a 23 + class="member-item-link" 26 24 role={!isPlaying ? 'link' : undefined} 27 25 aria-disabled={!isPlaying ? 'true' : undefined} 28 26 href={isPlaying ? `/seasons/${season.id}/${member.data.name}` : undefined} 29 - aria-current={ 30 - isPlaying 31 - ? isCurrentPage( 32 - Astro.url.pathname, 33 - `/seasons/${season.id}/${member.data.name}`, 34 - ) 35 - : undefined 36 - } 37 - class:list={[ 38 - 'w-full py-4 pr-12', 39 - { 40 - 'grayscale-75': !isPlaying, 41 - }, 42 - ]} 43 - data-not-playing={!isPlaying ? 'true' : undefined} 27 + aria-current={isPlaying ? isCurrentPage(Astro.url.pathname, `/seasons/${season.id}/${member.data.name}`) : undefined} 44 28 > 45 - <div class="flex items-center gap-8"> 46 - <Image 47 - src={getMemberImage(member.data.name)} 48 - width="64" 49 - height="64" 50 - alt="" 51 - loading="eager" 52 - class="aspect-square max-w-32 rounded-full" 53 - /> 54 - <span 55 - class:list={[ 56 - { 57 - 'line-through decoration-2': !isPlaying, 58 - }, 59 - ]} 60 - > 61 - {member.data.name} 62 - </span> 63 - {!Object.keys(season.data.videos).includes(member.data.name) && ( 64 - <span class="sr-only">, not playing</span> 65 - )} 66 - </div> 29 + <MemberItem memberName={member.data.name} /> 67 30 </a> 68 31 </li> 69 32 ); 70 33 }) 71 34 } 72 35 </ul> 36 + 37 + <style> 38 + .member-list { 39 + min-width: 0; 40 + 41 + &:has(.member-item-link:focus-visible) .member-item-link:not(:focus-visible) { 42 + filter: grayscale(75%); 43 + opacity: 0.8; 44 + } 45 + 46 + @media (width < 48rem) { 47 + padding-inline-end: 12px; 48 + } 49 + 50 + @media (hover: hover) { 51 + &:has(.member-item-link:not([aria-disabled='true']):hover) 52 + .member-item-link:not(:hover) { 53 + filter: grayscale(75%); 54 + opacity: 0.8; 55 + } 56 + } 57 + } 58 + 59 + .member-item-link { 60 + display: grid; /* Fixes parent to be 1px taller */ 61 + justify-content: start; 62 + inline-size: 100%; 63 + padding-block: 4px; 64 + text-decoration: none; 65 + transition-property: filter, opacity; 66 + transition-duration: 100ms; 67 + transition-timing-function: linear; 68 + 69 + @media (prefers-reduced-motion: no-preference) { 70 + transition: 71 + filter 100ms linear, 72 + opacity 100ms linear, 73 + translate var(--spring-transition-duration) var(--spring-transition-timing-function); 74 + } 75 + 76 + &:focus-visible { 77 + outline: none; 78 + 79 + &:not([aria-current='page']) { 80 + @media (prefers-reduced-motion: no-preference) { 81 + translate: 8px; 82 + } 83 + } 84 + 85 + > div { 86 + outline: 2px solid var(--color-canvas-text); 87 + outline-offset: 4px; 88 + } 89 + } 90 + 91 + @media (hover: hover) and (prefers-reduced-motion: no-preference) { 92 + &:hover:not([aria-current='page']):not([aria-disabled]) { 93 + translate: 8px; 94 + } 95 + } 96 + 97 + &[aria-current='page'] { 98 + text-decoration-line: underline; 99 + text-decoration-style: wavy; 100 + font-weight: var(--font-weight-heading); 101 + 102 + @media (prefers-reduced-motion: no-preference) { 103 + translate: 12px; 104 + } 105 + } 106 + 107 + &[aria-disabled='true'] { 108 + filter: grayscale(75%); 109 + text-decoration: line-through 2px; 110 + } 111 + } 112 + </style>
-39
src/components/SeasonList.astro
··· 1 - --- 2 - import { Image } from 'astro:assets'; 3 - import type { CollectionEntry } from 'astro:content'; 4 - import { getSeasonImage } from '@/utils/images'; 5 - import { containsPath, isCurrentPage } from '@/utils/url'; 6 - 7 - interface Props { 8 - seasons: CollectionEntry<'seasons'>[]; 9 - } 10 - 11 - const { seasons } = Astro.props; 12 - --- 13 - 14 - <ol 15 - role="list" 16 - class="seasons-list grid gap-24 overflow-x-clip px-24 py-16" 17 - reversed 18 - > 19 - { 20 - seasons.map((season) => ( 21 - <li> 22 - <a 23 - href={`/seasons/${season.id}`} 24 - aria-current={isCurrentPage(Astro.url.pathname, `/seasons/${season.id}`)} 25 - data-parent-page={containsPath(Astro.url.pathname, `/seasons/${season.id}`)} 26 - > 27 - <Image 28 - src={getSeasonImage(season.id)} 29 - width="360" 30 - alt="" 31 - loading="eager" 32 - class="max-w-80" 33 - /> 34 - <span class="sr-only">{season.data.title}</span> 35 - </a> 36 - </li> 37 - )) 38 - } 39 - </ol>
-122
src/components/SessionList.astro
··· 1 - --- 2 - import type { CollectionEntry } from 'astro:content'; 3 - import { isCurrentPage } from '@/utils/url'; 4 - 5 - interface Props { 6 - season: CollectionEntry<'seasons'>; 7 - sessionNumbers: number[]; 8 - withText: boolean; 9 - } 10 - 11 - const { season, sessionNumbers, withText } = Astro.props; 12 - --- 13 - 14 - <ol 15 - role="list" 16 - reversed 17 - class:list={['session-list', { 'flex gap-8': !withText, 'grid gap-16': withText }]} 18 - > 19 - { 20 - sessionNumbers.map((session) => ( 21 - <li> 22 - <a 23 - href={`/seasons/${season.id}/sessions/${session}`} 24 - class:list={[ 25 - 'bg-canvas-text/5 border-canvas-text/25 flex items-center justify-center rounded-full border-1 p-8 shadow-xs', 26 - { 'mx-6 aspect-square h-44': !withText }, 27 - { 'px-16 text-lg': withText }, 28 - ]} 29 - aria-current={isCurrentPage( 30 - Astro.url.pathname, 31 - `/seasons/${season.id}/sessions/${session}`, 32 - )} 33 - > 34 - <span class="flex gap-6"> 35 - <span class:list={[{ 'sr-only': !withText }]}>Session</span> 36 - <span>{session}</span> 37 - </span> 38 - </a> 39 - </li> 40 - )) 41 - } 42 - </ol> 43 - 44 - <script> 45 - const currentPageElement = document.querySelector('.session-list a[aria-current="page"]'); 46 - currentPageElement?.scrollIntoView({ block: 'end', inline: 'center' }); 47 - </script> 48 - 49 - <style> 50 - .session-list { 51 - a { 52 - transition-property: filter, opacity; 53 - transition-duration: 100ms; 54 - transition-timing-function: linear; 55 - outline-offset: -6px; 56 - } 57 - 58 - a[aria-current='page'] { 59 - outline: 2px solid; 60 - scale: 1.075; 61 - rotate: var(--angle); 62 - } 63 - 64 - &:has(a:focus-visible) a:not(:focus-visible) { 65 - filter: grayscale(75%); 66 - opacity: 0.8; 67 - } 68 - 69 - @media (hover) { 70 - &:has(a:hover) a:not(:hover) { 71 - filter: grayscale(75%); 72 - opacity: 0.8; 73 - } 74 - } 75 - 76 - @media (prefers-reduced-motion: no-preference) { 77 - li:nth-child(1) { 78 - --angle: 3deg; 79 - } 80 - li:nth-child(2) { 81 - --angle: -2deg; 82 - } 83 - li:nth-child(3) { 84 - --angle: 2deg; 85 - } 86 - li:nth-child(4) { 87 - --angle: -1deg; 88 - } 89 - li:nth-child(5) { 90 - --angle: 2deg; 91 - } 92 - li:nth-child(6) { 93 - --angle: -3deg; 94 - } 95 - li:nth-child(7) { 96 - --angle: 1deg; 97 - } 98 - 99 - a { 100 - transition-property: filter, opacity, scale, rotate; 101 - transition-duration: 102 - 100ms, 100ms, var(--spring-transition-duration), 103 - var(--spring-transition-duration); 104 - transition-timing-function: 105 - linear, linear, var(--spring-transition-timing-function), 106 - var(--spring-transition-timing-function); 107 - } 108 - 109 - a:focus-visible:not([aria-current='page']) { 110 - scale: 1.075; 111 - rotate: var(--angle); 112 - } 113 - } 114 - 115 - @media (hover) and (prefers-reduced-motion: no-preference) { 116 - a:hover:not([aria-current='page']) { 117 - scale: 1.075; 118 - rotate: var(--angle); 119 - } 120 - } 121 - } 122 - </style>
-29
src/components/icons/MenuIcon.astro
··· 1 - <svg 2 - xmlns="http://www.w3.org/2000/svg" 3 - width="24" 4 - height="24" 5 - viewBox="0 0 24 24" 6 - > 7 - <g 8 - fill="none" 9 - stroke="currentColor" 10 - stroke-dasharray="16" 11 - stroke-dashoffset="16" 12 - stroke-linecap="round" 13 - stroke-linejoin="round" 14 - stroke-width="2" 15 - > 16 - <path 17 - d="M5 5h14" 18 - stroke-dashoffset="0" 19 - ></path> 20 - <path 21 - d="M5 12h14" 22 - stroke-dashoffset="0" 23 - ></path> 24 - <path 25 - d="M5 19h14" 26 - stroke-dashoffset="0" 27 - ></path> 28 - </g> 29 - </svg>
-63
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(color-mix(in oklch, var(--color-canvas-text) 25%, transparent) 1px 1px 2px); 53 - transition: opacity 100ms linear; 54 - 55 - @starting-style { 56 - opacity: 0; 57 - } 58 - } 59 - 60 - :global(:has(a:hover)) .custom-cursor { 61 - opacity: 0.25; 62 - } 63 - </style>
src/components/rewrite/MemberItem.astro src/components/MemberItem.astro
-106
src/components/rewrite/MemberList.astro
··· 1 - --- 2 - import type { CollectionEntry } from 'astro:content'; 3 - import MemberItem from '@/components/rewrite/MemberItem.astro'; 4 - import { isCurrentPage } from '@/utils/url'; 5 - 6 - interface Props { 7 - members: CollectionEntry<'membersRewrite'>[]; 8 - season: CollectionEntry<'seasonsRewrite'>; 9 - } 10 - 11 - const { members, season } = Astro.props; 12 - --- 13 - 14 - <ul role="list" aria-labelledby="sidebar-title" class="member-list"> 15 - { 16 - members.map((member) => { 17 - const isPlaying = Object.keys(season.data.videos).includes(member.data.name); 18 - 19 - return ( 20 - <li> 21 - <a 22 - class="member-item-link" 23 - role={!isPlaying ? 'link' : undefined} 24 - aria-disabled={!isPlaying ? 'true' : undefined} 25 - href={isPlaying ? `/rewrite/seasons/${season.id}/${member.data.name}` : undefined} 26 - aria-current={isPlaying ? isCurrentPage(Astro.url.pathname, `/rewrite/seasons/${season.id}/${member.data.name}`) : undefined} 27 - > 28 - <MemberItem memberName={member.data.name} /> 29 - </a> 30 - </li> 31 - ); 32 - }) 33 - } 34 - </ul> 35 - 36 - <style> 37 - .member-list { 38 - min-width: 0; 39 - 40 - &:has(.member-item-link:focus-visible) .member-item-link:not(:focus-visible) { 41 - filter: grayscale(75%); 42 - opacity: 0.8; 43 - } 44 - 45 - @media (width < 48rem) { 46 - padding-inline-end: 12px; 47 - } 48 - 49 - @media (hover) { 50 - &:has(.member-item-link:not([aria-disabled='true']):hover) 51 - .member-item-link:not(:hover) { 52 - filter: grayscale(75%); 53 - opacity: 0.8; 54 - } 55 - } 56 - } 57 - 58 - .member-item-link { 59 - display: grid; /* Fixes parent to be 1px taller */ 60 - justify-content: start; 61 - inline-size: 100%; 62 - padding-block: 4px; 63 - text-decoration: none; 64 - transition-property: filter, opacity; 65 - transition-duration: 100ms; 66 - transition-timing-function: linear; 67 - 68 - &:focus-visible { 69 - outline: none; 70 - 71 - &:not([aria-current='page']) { 72 - translate: 8px; 73 - } 74 - 75 - > div { 76 - outline: 2px solid var(--color-canvas-text); 77 - outline-offset: 4px; 78 - } 79 - } 80 - 81 - @media (prefers-reduced-motion: no-preference) { 82 - transition: 83 - filter 100ms linear, 84 - opacity 100ms linear, 85 - translate var(--spring-transition-duration) var(--spring-transition-timing-function); 86 - } 87 - 88 - @media (hover) { 89 - &:hover:not([aria-current='page']):not([aria-disabled]) { 90 - translate: 8px; 91 - } 92 - } 93 - 94 - &[aria-current='page'] { 95 - translate: 12px; 96 - text-decoration-line: underline; 97 - text-decoration-style: wavy; 98 - font-weight: var(--font-weight-heading); 99 - } 100 - 101 - &[aria-disabled='true'] { 102 - filter: grayscale(75%); 103 - text-decoration: line-through 2px; 104 - } 105 - } 106 - </style>
+3 -3
src/components/rewrite/SeasonLayout.astro src/components/SeasonLayout.astro
··· 1 1 --- 2 2 import type { CollectionEntry } from 'astro:content'; 3 - import SiteFooter from '@/components/rewrite/SiteFooter.astro'; 4 - import SiteHeader from '@/components/rewrite/SiteHeader.astro'; 3 + import SiteFooter from '@/components/SiteFooter.astro'; 4 + import SiteHeader from '@/components/SiteHeader.astro'; 5 5 6 6 interface Props { 7 - season: CollectionEntry<'seasonsRewrite'>; 7 + season: CollectionEntry<'seasons'>; 8 8 } 9 9 10 10 const { season } = Astro.props;
+1 -1
src/components/rewrite/SiteFooter.astro src/components/SiteFooter.astro
··· 1 1 <footer> 2 2 <div class="footer-inner"> 3 3 <div class="cluster"> 4 - <a href="/rewrite/attribution"> 4 + <a href="/attribution"> 5 5 <span>Attribution</span> 6 6 </a> 7 7 <a href="/sitemap-0.xml">
+3 -3
src/components/rewrite/SiteHeader.astro src/components/SiteHeader.astro
··· 2 2 import { Image } from 'astro:assets'; 3 3 import type { CollectionEntry } from 'astro:content'; 4 4 import { Icon } from 'astro-icon/components'; 5 - import { getSeasonIconImage } from '@/utils/rewrite/images'; 5 + import { getSeasonIconImage } from '@/utils/images'; 6 6 7 7 interface Props { 8 - season?: CollectionEntry<'seasonsRewrite'>; 8 + season?: CollectionEntry<'seasons'>; 9 9 } 10 10 11 11 const { season } = Astro.props; ··· 14 14 <header> 15 15 <div class="cluster header-inner"> 16 16 <div class="cluster"> 17 - <a href="/rewrite"> 17 + <a href="/"> 18 18 <span class="cluster gap-text-icon"> 19 19 <Image 20 20 src={getSeasonIconImage(season?.id)}
src/components/rewrite/SkipLink.astro src/components/SkipLink.astro
src/components/rewrite/VideoItem.astro src/components/VideoItem.astro
+19 -36
src/content.config.ts
··· 1 1 import { defineCollection, z } from 'astro:content'; 2 2 import { file } from 'astro/loaders'; 3 3 4 - const seasonsSchema = z.object({ 5 - title: z.string(), 6 - sessionCount: z.number().optional(), 7 - seo: z.object({ 8 - description: z.object({ 9 - twist: z.string(), 4 + const seasons = defineCollection({ 5 + loader: file('src/data/seasons.json'), 6 + schema: z.object({ 7 + title: z.string(), 8 + sessionCount: z.number().optional(), 9 + seo: z.object({ 10 + description: z.object({ 11 + twist: z.string(), 12 + }), 10 13 }), 14 + videos: z.record( 15 + z.string(), 16 + z.array( 17 + z.object({ 18 + id: z.string(), 19 + title: z.string(), 20 + isMovie: z.boolean().default(false), 21 + }), 22 + ), 23 + ), 11 24 }), 12 - videos: z.record( 13 - z.string(), 14 - z.array( 15 - z.object({ 16 - id: z.string(), 17 - title: z.string(), 18 - isMovie: z.boolean().default(false), 19 - }), 20 - ), 21 - ), 22 - }); 23 - 24 - const seasons = defineCollection({ 25 - loader: file('src/data/seasons.json'), 26 - schema: seasonsSchema, 27 - }); 28 - 29 - const seasonsRewrite = defineCollection({ 30 - loader: file('src/data/rewrite/seasons.json'), 31 - schema: seasonsSchema, 32 25 }); 33 26 34 27 const members = defineCollection({ 35 28 loader: file('src/data/members.json'), 36 29 schema: z.object({ 37 30 name: z.string(), 38 - seasons: z.array(z.number()), 39 - }), 40 - }); 41 - 42 - const membersRewrite = defineCollection({ 43 - loader: file('src/data/rewrite/members.json'), 44 - schema: z.object({ 45 - name: z.string(), 46 31 }), 47 32 }); 48 33 49 34 export const collections = { 50 35 seasons, 51 - seasonsRewrite, 52 36 members, 53 - membersRewrite, 54 37 };
+18 -36
src/data/members.json
··· 1 1 [ 2 2 { 3 3 "id": "BdoubleO100", 4 - "name": "BdoubleO100", 5 - "seasons": [7, 6, 5, 4, 3, 2, 1] 4 + "name": "BdoubleO100" 6 5 }, 7 6 { 8 7 "id": "BigB", 9 - "name": "BigB", 10 - "seasons": [7, 6, 5, 4, 3, 2, 1] 8 + "name": "BigB" 11 9 }, 12 10 { 13 11 "id": "Etho", 14 - "name": "Etho", 15 - "seasons": [7, 6, 5, 4, 3, 2, 1] 12 + "name": "Etho" 16 13 }, 17 14 { 18 15 "id": "GeminiTay", 19 - "name": "GeminiTay", 20 - "seasons": [6, 5] 16 + "name": "GeminiTay" 21 17 }, 22 18 { 23 19 "id": "GoodTimesWithScar", 24 - "name": "GoodTimesWithScar", 25 - "seasons": [7, 6, 5, 4, 3, 2, 1] 20 + "name": "GoodTimesWithScar" 26 21 }, 27 22 { 28 23 "id": "Grian", 29 - "name": "Grian", 30 - "seasons": [7, 6, 5, 4, 3, 2, 1] 24 + "name": "Grian" 31 25 }, 32 26 { 33 27 "id": "Impulse", 34 - "name": "Impulse", 35 - "seasons": [7, 6, 5, 4, 3, 2, 1] 28 + "name": "Impulse" 36 29 }, 37 30 { 38 31 "id": "InTheLittleWood", 39 - "name": "InTheLittleWood", 40 - "seasons": [7, 6, 5, 4, 3, 2, 1] 32 + "name": "InTheLittleWood" 41 33 }, 42 34 { 43 35 "id": "LDShadowLady", 44 - "name": "LDShadowLady", 45 - "seasons": [6, 5, 2] 36 + "name": "LDShadowLady" 46 37 }, 47 38 { 48 39 "id": "Mumbo", 49 - "name": "Mumbo", 50 - "seasons": [6, 5, 2] 40 + "name": "Mumbo" 51 41 }, 52 42 { 53 43 "id": "PearlescentMoon", 54 - "name": "PearlescentMoon", 55 - "seasons": [7, 6, 5, 4, 3, 2] 44 + "name": "PearlescentMoon" 56 45 }, 57 46 { 58 47 "id": "Rendog", 59 - "name": "Rendog", 60 - "seasons": [7, 6, 3, 2, 1] 48 + "name": "Rendog" 61 49 }, 62 50 { 63 51 "id": "Skizzleman", 64 - "name": "Skizzleman", 65 - "seasons": [7, 6, 5, 4, 2, 1] 52 + "name": "Skizzleman" 66 53 }, 67 54 { 68 55 "id": "Smajor1995", 69 - "name": "Smajor1995", 70 - "seasons": [7, 6, 5, 4, 3, 2, 1] 56 + "name": "Smajor1995" 71 57 }, 72 58 { 73 59 "id": "SmallishBeans", 74 - "name": "SmallishBeans", 75 - "seasons": [7, 6, 5, 4, 3, 2, 1] 60 + "name": "SmallishBeans" 76 61 }, 77 62 { 78 63 "id": "Solidarity", 79 - "name": "Solidarity", 80 - "seasons": [7, 6, 5, 4, 3, 2, 1] 64 + "name": "Solidarity" 81 65 }, 82 66 { 83 67 "id": "Tango", 84 - "name": "Tango", 85 - "seasons": [7, 6, 5, 4, 3, 2, 1] 68 + "name": "Tango" 86 69 }, 87 70 { 88 71 "id": "ZombieCleo", 89 - "name": "ZombieCleo", 90 - "seasons": [7, 6, 5, 4, 3, 2, 1] 72 + "name": "ZombieCleo" 91 73 } 92 74 ]
-74
src/data/rewrite/members.json
··· 1 - [ 2 - { 3 - "id": "BdoubleO100", 4 - "name": "BdoubleO100" 5 - }, 6 - { 7 - "id": "BigB", 8 - "name": "BigB" 9 - }, 10 - { 11 - "id": "Etho", 12 - "name": "Etho" 13 - }, 14 - { 15 - "id": "GeminiTay", 16 - "name": "GeminiTay" 17 - }, 18 - { 19 - "id": "GoodTimesWithScar", 20 - "name": "GoodTimesWithScar" 21 - }, 22 - { 23 - "id": "Grian", 24 - "name": "Grian" 25 - }, 26 - { 27 - "id": "Impulse", 28 - "name": "Impulse" 29 - }, 30 - { 31 - "id": "InTheLittleWood", 32 - "name": "InTheLittleWood" 33 - }, 34 - { 35 - "id": "LDShadowLady", 36 - "name": "LDShadowLady" 37 - }, 38 - { 39 - "id": "Mumbo", 40 - "name": "Mumbo" 41 - }, 42 - { 43 - "id": "PearlescentMoon", 44 - "name": "PearlescentMoon" 45 - }, 46 - { 47 - "id": "Rendog", 48 - "name": "Rendog" 49 - }, 50 - { 51 - "id": "Skizzleman", 52 - "name": "Skizzleman" 53 - }, 54 - { 55 - "id": "Smajor1995", 56 - "name": "Smajor1995" 57 - }, 58 - { 59 - "id": "SmallishBeans", 60 - "name": "SmallishBeans" 61 - }, 62 - { 63 - "id": "Solidarity", 64 - "name": "Solidarity" 65 - }, 66 - { 67 - "id": "Tango", 68 - "name": "Tango" 69 - }, 70 - { 71 - "id": "ZombieCleo", 72 - "name": "ZombieCleo" 73 - } 74 - ]
-3970
src/data/rewrite/seasons.json
··· 1 - [ 2 - { 3 - "id": "nice-life", 4 - "title": "Nice Life", 5 - "sessionCount": 3, 6 - "seo": { 7 - "description": { 8 - "twist": "A 3 part holiday special" 9 - } 10 - }, 11 - "videos": { 12 - "BdoubleO100": [], 13 - "BigB": [ 14 - { 15 - "id": "bG8661ptl8U", 16 - "title": "Nice Life SMP | Ep.1 | THE BIG SURPRISE!" 17 - }, 18 - { 19 - "id": "Y4hDUsnfJTI", 20 - "title": "Nice Life SMP | Ep.2 | THE MACE GRINCH!!" 21 - }, 22 - { 23 - "id": "ClLruexX3fg", 24 - "title": "Nice Life SMP | Ep.3 | THE FINALE!" 25 - } 26 - ], 27 - "GeminiTay": [ 28 - { 29 - "id": "8g50TLYu9hw", 30 - "title": "A Cute Christmas Cottage! Nice Life: Episode 1" 31 - }, 32 - { 33 - "id": "ELRXwQSh0us", 34 - "title": "We are NAUGHTY?! Nice Life: Episode 2" 35 - }, 36 - { 37 - "id": "nocNnHY6JeM", 38 - "title": "The Finale! Nice Life: Episode 3" 39 - } 40 - ], 41 - "GoodTimesWithScar": [ 42 - { 43 - "id": "VXVJfPU_moo", 44 - "title": "Santa Burned Down My House - Nice Life Episode 1" 45 - }, 46 - { 47 - "id": "kcMmKuDj0Hc", 48 - "title": "I'm Santa's HUNTER! - Nice Life Episode 2" 49 - }, 50 - { 51 - "id": "MJHPGtCXMvU", 52 - "title": "Nice Life FINALE!" 53 - } 54 - ], 55 - "Grian": [ 56 - { 57 - "id": "2teag5QC7NA", 58 - "title": "Nice Life: Episode 1 - It's A Wonderful Life" 59 - }, 60 - { 61 - "id": "m_D0KVzslOQ", 62 - "title": "Nice Life: Episode 2 - NETHER ESCAPE!" 63 - }, 64 - { 65 - "id": "dlmfI9ovtD8", 66 - "title": "Nice Life: Episode 3 - RED WINTER FINALE!" 67 - } 68 - ], 69 - "Impulse": [ 70 - { 71 - "id": "5_dByS3XdRg", 72 - "title": "How Am I On The Naughty List!? | Nice Life Ep 01" 73 - }, 74 - { 75 - "id": "n0e_WoCLqCs", 76 - "title": "Fear Thy Neighbor! | Nice Life Ep 02" 77 - } 78 - ], 79 - "InTheLittleWood": [ 80 - { 81 - "id": "Du3gkzYxgng", 82 - "title": "THE GREAT GHAST HEIST - Minecraft Nice Life #1" 83 - }, 84 - { 85 - "id": "6RLA49HlnPw", 86 - "title": "I CONTROL QUIZBOT! - Minecraft Nice Life #2" 87 - }, 88 - { 89 - "id": "M-1DjdWn2pU", 90 - "title": "HE RISES FROM SNOW GRAVE... - Minecraft Nice Life #3" 91 - } 92 - ], 93 - "PearlescentMoon": [ 94 - { 95 - "id": "2Z7TokffUlI", 96 - "title": "Christmas, But Not Quite Right | Nice Life: Episode 1" 97 - }, 98 - { 99 - "id": "EZgvEcEimhM", 100 - "title": "FORESHADOWING | Nice Life: Episode 2" 101 - } 102 - ], 103 - "Rendog": [ 104 - { 105 - "id": "y5fAMDD-7Po", 106 - "title": "THANKS ALOT SANTA! | Nice Life SMP | Ep 01" 107 - }, 108 - { 109 - "id": "Qigme4izL5U", 110 - "title": "SINGING FOR SUPPER! | Nice Life SMP | Ep 02" 111 - }, 112 - { 113 - "id": "6_RX_Y7_9IU", 114 - "title": "RED WINTER IS HERE... AGAIN! | Nice Life SMP | Ep 03" 115 - } 116 - ], 117 - "Skizzleman": [ 118 - { 119 - "id": "9zvwCwImBxM", 120 - "title": "Say One More Thing About My House! - NICE LIFE EP 1" 121 - }, 122 - { 123 - "id": "NK4JhtTP6l0", 124 - "title": "ANether Great Experience! - NICE LIFE EP 2" 125 - } 126 - ], 127 - "Smajor1995": [ 128 - { 129 - "id": "VnC0cwZNhTg", 130 - "title": "My WORST Start EVER! - Nice Life - Ep.1" 131 - }, 132 - { 133 - "id": "1X7FrjLPTl0", 134 - "title": "I've NEVER Been RED This Quickly! - Nice Life - Ep.2" 135 - }, 136 - { 137 - "id": "2u4y5G9zDgI", 138 - "title": "RED WINTER IS HERE! - Nice Life - Ep.3" 139 - } 140 - ], 141 - "SmallishBeans": [ 142 - { 143 - "id": "S5-mVaa7eMA", 144 - "title": "I've Been Naughty! | Nice Life | Ep.1" 145 - }, 146 - { 147 - "id": "1wRmkpzydwE", 148 - "title": "Ruining Everyone's Christmas. | Nice Life | Ep.2" 149 - }, 150 - { 151 - "id": "iab3y7hsDns", 152 - "title": "Christmas is Cancelled. | Nice Life | Ep.3" 153 - } 154 - ], 155 - "Solidarity": [ 156 - { 157 - "id": "1u1TOZwpI74", 158 - "title": "I'm Already On The NAUGHTY LIST!! | Nice Life | #1" 159 - }, 160 - { 161 - "id": "sPXJNeLlS9A", 162 - "title": "The Most NAUGHTY Kill You Will Ever See.. | Nice Life | #2" 163 - }, 164 - { 165 - "id": "fpLy9uxY_MM", 166 - "title": "The RED WINTER Came For Me!! | Nice Life | FINALE" 167 - } 168 - ], 169 - "ZombieCleo": [ 170 - { 171 - "id": "h6eQiU_imEE", 172 - "title": "Can I Survive the Red Christmas Curse? - 01 - Nice Life" 173 - }, 174 - { 175 - "id": "8IOv5dHcd9o", 176 - "title": "THEIR LIFE IN MY HANDS! - 02 - NICE LI|FE" 177 - }, 178 - { 179 - "id": "Msr2EMIF7L8", 180 - "title": "THE LAST YELLOW - 03 - NICE LIFE" 181 - } 182 - ] 183 - } 184 - }, 185 - { 186 - "id": "past-life", 187 - "title": "Past Life", 188 - "sessionCount": 8, 189 - "seo": { 190 - "description": { 191 - "twist": "The first episode starts in Minecraft version beta 1.2_02 and every new episode the Minecraft version gets updated to a newer one until eventually the most recent version." 192 - } 193 - }, 194 - "videos": { 195 - "BdoubleO100": [ 196 - { 197 - "id": "4oxAO-dNUWk", 198 - "title": "Bdubs Past Life :: I'm an Alpha in a Beta" 199 - }, 200 - { 201 - "id": "d70V2-dN1J4", 202 - "title": "Bdubs Past Life :: Trust Building Missions" 203 - }, 204 - { 205 - "id": "Pu0LSmiwYLY", 206 - "title": "Bdubs Past Life :: Payback" 207 - }, 208 - { 209 - "id": "uVnfjrHMcwA", 210 - "title": "Bdubs Past Life :: Horses" 211 - }, 212 - { 213 - "id": "uVnfjrHMcwA", 214 - "title": "Bdubs Past Life :: Horses" 215 - }, 216 - { 217 - "id": "hBFzbN0bkd0", 218 - "title": "Bdubs Past Life :: Nothing to See Here" 219 - }, 220 - { 221 - "id": "hA9cLW438ak", 222 - "title": "Bdubs Past Life :: He Shook" 223 - }, 224 - { 225 - "id": "l_YX7y8wzuo", 226 - "title": "Bdubs Past Life :: Only One B!" 227 - } 228 - ], 229 - "BigB": [ 230 - { 231 - "id": "TSlENFGBepc", 232 - "title": "Past Life SMP | Ep.1 | THE BETA VERSION!" 233 - }, 234 - { 235 - "id": "udJ5qBF4yfY", 236 - "title": "Past Life SMP | Ep.2 | IT'S MY BIRTHDAY!" 237 - }, 238 - { 239 - "id": "bW1d4XJVM3w", 240 - "title": "Past Life SMP | Ep.3 | THE MURDER MYSTERY!" 241 - }, 242 - { 243 - "id": "eoMi1RQ7Tz4", 244 - "title": "Past Life SMP | Ep.4 | THE REJECTS!" 245 - }, 246 - { 247 - "id": "Q5WpZdPpzfo", 248 - "title": "Past Life SMP | Ep.5 | PINK SHEEP?.." 249 - }, 250 - { 251 - "id": "wv0Rzuj5g1s", 252 - "title": "Past Life SMP | Ep.6 | THE SECRET MEETING.." 253 - }, 254 - { 255 - "id": "rC6XG5nXQYU", 256 - "title": "Past Life SMP | Ep.7 | I'M IN BIG TROUBLE.." 257 - }, 258 - { 259 - "id": "hGzGkLdCGi4", 260 - "title": "Past Life SMP | Ep.8 | REJECTS FOR LIFE!" 261 - } 262 - ], 263 - "Etho": [ 264 - { 265 - "id": "gLbv7LFEGgI", 266 - "title": "Past Life #1 - History Repeats" 267 - }, 268 - { 269 - "id": "B3JzdqWxf6E", 270 - "title": "Past Life #2 - Remember This?" 271 - }, 272 - { 273 - "id": "Xcg2TOke-7A", 274 - "title": "Past Life #3 - Secret Society Task" 275 - }, 276 - { 277 - "id": "n8xJsfZu_Ac", 278 - "title": "Past Life #4 - Improv is a Blast!" 279 - }, 280 - { 281 - "id": "QdyvJx1RYls", 282 - "title": "Past Life #5 - Alliance Building" 283 - }, 284 - { 285 - "id": "Jua97rQXCno", 286 - "title": "Past Life #6 - Boogeyman Loyalty Test" 287 - }, 288 - { 289 - "id": "n372vGD3cPU", 290 - "title": "Past Life #7 - Hunkering Down" 291 - }, 292 - { 293 - "id": "x-gqmT60910", 294 - "title": "Past Life #8 - Crashing Out" 295 - } 296 - ], 297 - "GeminiTay": [ 298 - { 299 - "id": "aRuXViO7vco", 300 - "title": "A New Beginning... Past Life - Episode 1" 301 - }, 302 - { 303 - "id": "_ymATtpHHlQ", 304 - "title": "Past Life - The best Villains on the Server! Episode 2" 305 - }, 306 - { 307 - "id": "OzLcuhsUdwA", 308 - "title": "I have a BIG SECRET! Past Life - Episode 3" 309 - }, 310 - { 311 - "id": "_j68HuYFCOk", 312 - "title": "The Calm... Past Life - Episode 4" 313 - }, 314 - { 315 - "id": "49jwMNkiaLE", 316 - "title": "A Strong Alliance! Past Life - Episode 5" 317 - }, 318 - { 319 - "id": "90sUpN0ITTg", 320 - "title": "Complications... Past Life - Episode 6" 321 - }, 322 - { 323 - "id": "fnvY8sE7n2o", 324 - "title": "The Victims... Past Life - Episode 7" 325 - }, 326 - { 327 - "id": "QdX7MobSgpA", 328 - "title": "Betrayal. Past life - Episode 8" 329 - } 330 - ], 331 - "GoodTimesWithScar": [ 332 - { 333 - "id": "NRJRKBfWl48", 334 - "title": "4 Dudes Chilling In A HOT Tub! - Past Life: episode 1" 335 - }, 336 - { 337 - "id": "ZKK6201jpZ0", 338 - "title": "I'm The WORST Bogeyman! - Past Life: episode 2" 339 - }, 340 - { 341 - "id": "Fj9EeQuBzac", 342 - "title": "Mistakes Were Made! - Past Life: episode 3" 343 - }, 344 - { 345 - "id": "ROUn-yM3vYs", 346 - "title": "I'm The BEST Bogeyman! - Past Life: episode 4" 347 - }, 348 - { 349 - "id": "ehsNvFUH49s", 350 - "title": "I'm Being HUNTED For My 6 Lives! - Past Life: episode 5" 351 - }, 352 - { 353 - "id": "Ds43kM4nXmE", 354 - "title": "The Cabin IS GONE!! - Past Life: episode 6" 355 - }, 356 - { 357 - "id": "alrObTQNQdo", 358 - "title": "Shirts Off And Locked In! - Past Life: episode 7" 359 - }, 360 - { 361 - "id": "atwkGtKjakU", 362 - "title": "CabinCore Against The World - Past Life: episode FINALE!" 363 - } 364 - ], 365 - "Grian": [ 366 - { 367 - "id": "05vyterhe_o", 368 - "title": "PAST LIFE: Episode 1 - BACK TO THE BEGINNING!" 369 - }, 370 - { 371 - "id": "itSzR2HNrIE", 372 - "title": "PAST LIFE: Episode 2 - THE SQUARE HOLE!" 373 - }, 374 - { 375 - "id": "78j9zqDp2-M", 376 - "title": "PAST LIFE: Episode 3 - THE SECRET SOCIETY!" 377 - }, 378 - { 379 - "id": "8mKEbwuLCsg", 380 - "title": "PAST LIFE: Episode 4 - THE BOOGEYMAN!" 381 - }, 382 - { 383 - "id": "wQZd93U4ocM", 384 - "title": "PAST LIFE: Episode 5 - THE HORSE ALLIANCE!" 385 - }, 386 - { 387 - "id": "wJ-Uky-Yjek", 388 - "title": "PAST LIFE: Episode 6 - THE BETRAYAL!" 389 - }, 390 - { 391 - "id": "nGclG4O1xFc", 392 - "title": "PAST LIFE: Episode 7 - ALL IS LOST!" 393 - }, 394 - { 395 - "id": "hAD0YR5Xv0g", 396 - "title": "PAST LIFE: Episode 8 - THE END." 397 - } 398 - ], 399 - "Impulse": [ 400 - { 401 - "id": "cIRcRDAUI0w", 402 - "title": "The Goodest Gluten Guys! | Past Life Episode 1" 403 - }, 404 - { 405 - "id": "HnH_aNOuV68", 406 - "title": "Dodging Death Like A Boss! | Past Life Episode 2" 407 - }, 408 - { 409 - "id": "U5hzqczP1cw", 410 - "title": "All Hail The Infinite Cake!!! | Past Life Episode 3" 411 - }, 412 - { 413 - "id": "nwWqHPjuy6c", 414 - "title": "I CHEATED. | Past Life Episode 4" 415 - }, 416 - { 417 - "id": "OCV9tIWWT_I", 418 - "title": "The Eulogy | Past Life Episode 5" 419 - }, 420 - { 421 - "id": "a7KS_3hMHc8", 422 - "title": "Take That, Stupid Square Hole! | Past Life Episode 6" 423 - }, 424 - { 425 - "id": "Q1pf6hHTKTQ", 426 - "title": "THIS Saved MY Life! | Past Life Episode 7" 427 - }, 428 - { 429 - "id": "DcTxulu_RjM", 430 - "title": "I AM LOST! | Past Life Episode 8" 431 - } 432 - ], 433 - "InTheLittleWood": [ 434 - { 435 - "id": "0Y_21B20gFw", 436 - "title": "BLOCK TUB TIME MACHINE - Minecraft Past Life #1" 437 - }, 438 - { 439 - "id": "MjP5dDsR2qc", 440 - "title": "THERE'S ALWAYS A CATCH - Minecraft Past Life #2" 441 - }, 442 - { 443 - "id": "dWb5AizGRiQ", 444 - "title": "I'M ABSOLUTELY FINE... I'M NOT FINE!! - Minecraft Past Life #3" 445 - }, 446 - { 447 - "id": "-XL6jonqt5s", 448 - "title": "ARRIVING AT THE PEARLY GATES... - Minecraft Past Life #4" 449 - }, 450 - { 451 - "id": "FqmmHje9Gdg", 452 - "title": "SETTING AN A-MAZE-ING TRAP!! - Minecraft Past Life #5" 453 - }, 454 - { 455 - "id": "k4EifgwRTyU", 456 - "title": "ECHOES OF TANGO.. - Minecraft Past Life #6" 457 - }, 458 - { 459 - "id": "iEh8JV__7tw", 460 - "title": "WHEN THE CLOCK STRIKES 5... - Minecraft Past Life #7" 461 - }, 462 - { 463 - "id": "isZKL6X0GHY", 464 - "title": "WE MUST FEED... - Minecraft Past Life #8 (Finale)" 465 - } 466 - ], 467 - "PearlescentMoon": [ 468 - { 469 - "id": "n-rxPX29Vrg", 470 - "title": "Back to BETA Minecraft! | Past Life: Episode 1" 471 - }, 472 - { 473 - "id": "xK5uAMmnc6o", 474 - "title": "I'm In Pain | Past Life: Episode 2" 475 - }, 476 - { 477 - "id": "eYzJk28O0J8", 478 - "title": "What Fits In The Square Hole? | Past Life: Episode 3" 479 - }, 480 - { 481 - "id": "k7e7snd2j7M", 482 - "title": "Sludge Canyon? | Past Life: Episode 4" 483 - }, 484 - { 485 - "id": "gbGJ58gncc0", 486 - "title": "Ghost Rider | Past Life: Episode 5" 487 - }, 488 - { 489 - "id": "0yFEOfr4GHw", 490 - "title": "Whiplash | Past Life: Episode 6" 491 - }, 492 - { 493 - "id": "zHqN7Hj7q7s", 494 - "title": "Blood Moon | Past Life: Episode 7" 495 - } 496 - ], 497 - "Rendog": [ 498 - { 499 - "id": "Hba3fflOaKg", 500 - "title": "LAVA PYRAMID FOR THE BOYS! | Past Life SMP | Ep 01" 501 - }, 502 - { 503 - "id": "h_tPipzaiek", 504 - "title": "THERE'S SOMETHING ABOUT TANGO! | Past Life SMP | Ep 02" 505 - }, 506 - { 507 - "id": "Zvr5LfmIxiY", 508 - "title": "WE NEVER SAW IT COMING! | Past Life SMP | Ep 03" 509 - }, 510 - { 511 - "id": "9HOWlj4FNWc", 512 - "title": "AN EXPLOSIVE PERFORMANCE! | Past Life SMP | Ep 04" 513 - }, 514 - { 515 - "id": "Cp_9GlEhgiI", 516 - "title": "T IS FOR TANGO! | Past Life SMP | Ep 05" 517 - }, 518 - { 519 - "id": "4x2FSJvn04s", 520 - "title": "OBVIOUSLY IT WORKED! | Past Life SMP | Ep 06" 521 - }, 522 - { 523 - "id": "clcgPcJqOCM", 524 - "title": "WE GOT EM! | Past Life SMP | Ep 07" 525 - } 526 - ], 527 - "Skizzleman": [ 528 - { 529 - "id": "N9dIp0HpBaI", 530 - "title": "Past Life Ep 1 - REJECTS ASSEMBLE!" 531 - }, 532 - { 533 - "id": "bWNQP1OdGdI", 534 - "title": "Past Life Ep 2 - REJECTS SUIT UP!!" 535 - }, 536 - { 537 - "id": "QjY1BHocqI4", 538 - "title": "I'M TEARING THE SERVER IN HALF!!! - Past Life Ep 3" 539 - }, 540 - { 541 - "id": "8p-FU3i9fFM", 542 - "title": "CAN'T TRUST ANYBODY!!! - Past Life Ep 4" 543 - }, 544 - { 545 - "id": "E4ydLmXdLlA", 546 - "title": "It's Raining Mobs! - Past Life Ep 5" 547 - }, 548 - { 549 - "id": "pQHFDgnOOmA", 550 - "title": "How Use This Boom Boom?! - Past Life Ep 6" 551 - }, 552 - { 553 - "id": "agye5IwqdYs", 554 - "title": "IS THERE A SPOTLIGHT ON ME?!!!! - Past Life Ep 7" 555 - }, 556 - { 557 - "id": "wTzjhSdc-rE", 558 - "title": "The Hardest Time! - Past Life Ep 8" 559 - } 560 - ], 561 - "Smajor1995": [ 562 - { 563 - "id": "8SSFWtfWr5s", 564 - "title": "A BLAST From the PAST! - Past Life - Ep.1" 565 - }, 566 - { 567 - "id": "QtK-AggwHss", 568 - "title": "A Deadly Return... - Past Life - Ep.2" 569 - }, 570 - { 571 - "id": "Ch9rt7kAlNg", 572 - "title": "Everyone is going to HATE us... - Past Life - Ep.3" 573 - }, 574 - { 575 - "id": "N8betkItYTE", 576 - "title": "The Fight To End it All... - Past Life - Ep.4" 577 - }, 578 - { 579 - "id": "wdGys2fOT5w", 580 - "title": "I was the Boogeyman TWICE in One Episode?! - Past Life - Ep.5" 581 - }, 582 - { 583 - "id": "B_RtGYJbGvw", 584 - "title": "The Cabin burns, they all burn! - Past Life - Ep.6" 585 - }, 586 - { 587 - "id": "J-e2YoYYPXo", 588 - "title": "I FELL FOR IT TWICE?! - Past Life - Ep.7" 589 - }, 590 - { 591 - "id": "aDBkYY46D5E", 592 - "title": "Scott Smajor Vs The World! - Past Life - Ep.8" 593 - } 594 - ], 595 - "SmallishBeans": [ 596 - { 597 - "id": "_tGP6G6SaCI", 598 - "title": "Everything is UGLY | Past Life | Ep.1" 599 - }, 600 - { 601 - "id": "_PpzFVHG-So", 602 - "title": "It's All OGRE. | Past Life | Ep.2" 603 - }, 604 - { 605 - "id": "zFm2nEAlX_E", 606 - "title": "Boat Boy Betrayal.. | Past Life | Ep.3" 607 - }, 608 - { 609 - "id": "XfFtpPq7YZ0", 610 - "title": "JumboBeans! | Past Life | Ep.4" 611 - }, 612 - { 613 - "id": "hbzNfz0im0I", 614 - "title": "Mumbo, What Did You Do? | Past Life | Ep.5" 615 - }, 616 - { 617 - "id": "edckD-89HlA", 618 - "title": "I've Had ENOUGH. | Past Life | Ep.6" 619 - }, 620 - { 621 - "id": "xbnMkjrJILA", 622 - "title": "BOW DOWN TO HIM! | Past Life | Ep.7" 623 - }, 624 - { 625 - "id": "cuc1nqMP9lk", 626 - "title": "The Pathetic Boogeyman. | Past Life | Ep.8" 627 - } 628 - ], 629 - "Solidarity": [ 630 - { 631 - "id": "YkH826UqH5E", 632 - "title": "WE ARE BACK IN THE PAST!! | Minecraft PAST LIFE | #1" 633 - }, 634 - { 635 - "id": "Fg07klpa9C8", 636 - "title": "HOW AM I STILL SO BAD.. | Minecraft PAST LIFE | #2" 637 - }, 638 - { 639 - "id": "cY30RwA_cY8", 640 - "title": "The SODA POP Boys Do PRANKS!! | Minecraft PAST LIFE | #3" 641 - }, 642 - { 643 - "id": "yQjYs5wfaMA", 644 - "title": "They Don't Like My BRIDGE.. | Minecraft PAST LIFE | #4" 645 - }, 646 - { 647 - "id": "Oe2L9Z4UILg", 648 - "title": "We Are LOSERS!! | Minecraft PAST LIFE | #5" 649 - }, 650 - { 651 - "id": "4unHsXogkS0", 652 - "title": "I'M CRASHING OUT!! | Minecraft PAST LIFE | #6" 653 - }, 654 - { 655 - "id": "JisqS1rHlng", 656 - "title": "THIS COULD BE MY SEASON!?.. | Minecraft PAST LIFE | #7" 657 - }, 658 - { 659 - "id": "OFg8qLo46cI", 660 - "title": "I WAS SO CLOSE.. | Minecraft PAST LIFE | FINALE" 661 - } 662 - ], 663 - "Tango": [ 664 - { 665 - "id": "1GnBjMDAeAc", 666 - "title": "Time to Flex Our GLUTES! - PastLife #1" 667 - }, 668 - { 669 - "id": "MjIreNlbODI", 670 - "title": "Grab Your Boats and Hoes Everyone! - PastLife #2" 671 - }, 672 - { 673 - "id": "kp8Cqe2nM_k", 674 - "title": "Time to put the P in their OOL! - PastLife #3" 675 - }, 676 - { 677 - "id": "vHu7xcj_PX0", 678 - "title": "I'm UNSTOPPABLE with TNT! - PastLife #4" 679 - }, 680 - { 681 - "id": "RKmGiQO9-64", 682 - "title": "I AM DEATH!! - PastLife #5" 683 - } 684 - ], 685 - "ZombieCleo": [ 686 - { 687 - "id": "BCeqCenwAlo", 688 - "title": "PAST LIFE - 01 - THE LOST GENERATION" 689 - }, 690 - { 691 - "id": "ME2jkY0mrgw", 692 - "title": "CHAOS VIBES - 02 - PAST LIFE" 693 - }, 694 - { 695 - "id": "wZ6YH34k_4w", 696 - "title": "BOLD DRAMATIC FAILURES - 03 - PAST LIFE" 697 - }, 698 - { 699 - "id": "493gofhxoXw", 700 - "title": "BUT I'M NOT THE BOOGEY! - 04 - PAST LIFE" 701 - }, 702 - { 703 - "id": "iR4ZygsBpBY", 704 - "title": "FRIEND OF THE BOOGIES! - 05 - PAST LIFE" 705 - }, 706 - { 707 - "id": "Jllb-tGUqVw", 708 - "title": "RED SACRIFICE - 06 - PAST LIFE" 709 - }, 710 - { 711 - "id": "II0Mm_TH9qM", 712 - "title": "RED ON RED - 07 - PAST LIFE" 713 - }, 714 - { 715 - "id": "BaVgRgkBcPI", 716 - "title": "MY FIRST PVP KILL - 08 - PAST LIFE" 717 - } 718 - ] 719 - } 720 - }, 721 - { 722 - "id": "wild-life", 723 - "title": "Wild Life", 724 - "seo": { 725 - "description": { 726 - "twist": "Each episode has 1 wild card activated which fundamentally changes the game in some way, shape, or form." 727 - } 728 - }, 729 - "videos": { 730 - "BdoubleO100": [ 731 - { 732 - "id": "KBURhL0D1NE", 733 - "title": "Bdubs Wild Life :: We Have a Problem" 734 - }, 735 - { 736 - "id": "DEZbmmPFy5o", 737 - "title": "Bdubs Wild Life :: What My Clock Taste Like" 738 - }, 739 - { 740 - "id": "hKmsj0lmijg", 741 - "title": "Bdubs Wild Life :: The Worst Day Of My Life" 742 - }, 743 - { 744 - "id": "gkcVzxVoZQk", 745 - "title": "Bdubs Wild Life :: Wolf in Sheeps Clothing" 746 - }, 747 - { 748 - "id": "td1YgbfAL1I", 749 - "title": "Bdubs Wild Life :: The HUGE curse" 750 - }, 751 - { 752 - "id": "frViJbKCiPw", 753 - "title": "Bdubs Wild Life :: To Smithereens" 754 - }, 755 - { 756 - "id": "MaDbj_xYSYg", 757 - "title": "Bdubs Wild Life :: Slow Mo Sleepy Boy!" 758 - }, 759 - { 760 - "id": "-4M0LhRDL5c", 761 - "title": "Bdubs Wild Life :: Bye Bye!" 762 - } 763 - ], 764 - "BigB": [ 765 - { 766 - "id": "ELBdYGOx0xU", 767 - "title": "Wild Life SMP | Ep.1 | THE FIRST WILD CARD!" 768 - }, 769 - { 770 - "id": "V5qH-cZgARY", 771 - "title": "Wild Life SMP | Ep.2 | WHAT’S HAPPENING!!" 772 - }, 773 - { 774 - "id": "u_KqIVeumLo", 775 - "title": "Wild Life SMP | Ep.3 | MY BEST FRIEND" 776 - }, 777 - { 778 - "id": "M0n2pGWRopY", 779 - "title": "Wild Life SMP | Ep.4 | STAY GREEN!" 780 - }, 781 - { 782 - "id": "iH77clwSMIM", 783 - "title": "Wild Life SMP | Ep.5 | HELLO ROBOT.." 784 - }, 785 - { 786 - "id": "YADfsky2tHo", 787 - "title": "Wild Life SMP | Ep.6 | SETTING THE TRAP" 788 - }, 789 - { 790 - "id": "Gi1swxPbgSU", 791 - "title": "Wild Life SMP | Ep.7 | CREAKING LEADER.." 792 - }, 793 - { 794 - "id": "iTsOx7TUris", 795 - "title": "Wild Life SMP | Ep.8 | THE FINALE!" 796 - } 797 - ], 798 - "Etho": [ 799 - { 800 - "id": "lbpN8lZ-oa0", 801 - "title": "Wild Life #1 - Horse Drama" 802 - }, 803 - { 804 - "id": "JV9cC1ajsnM", 805 - "title": "Wild Life #2 - The Tuff Guys" 806 - }, 807 - { 808 - "id": "z3ns4rbD_a4", 809 - "title": "Wild Life #3 - Slow Speed Chase" 810 - }, 811 - { 812 - "id": "pH2dL7AhS34", 813 - "title": "Wild Life #4 - The Three Stooges" 814 - }, 815 - { 816 - "id": "wif5GjWe0Ls", 817 - "title": "Wild Life #5 - Trivia & Tridents" 818 - }, 819 - { 820 - "id": "HuLg7YRHirg", 821 - "title": "Wild Life #6 - Stuck in Traffic" 822 - }, 823 - { 824 - "id": "4UQPVd_pUvQ", 825 - "title": "Wild Life #7 - The Windy Whiffer" 826 - }, 827 - { 828 - "id": "qT0Ygz89KZs", 829 - "title": "Wild Life #8 - A Wild & Tuff Finale" 830 - } 831 - ], 832 - "GeminiTay": [ 833 - { 834 - "id": "P0sGBZVKPc4", 835 - "title": "There is Drama Already... Wild Life - Episode 1" 836 - }, 837 - { 838 - "id": "QXAhjnbrC8w", 839 - "title": "Making Friends! Wild Life - Episode 2" 840 - }, 841 - { 842 - "id": "nbWze7jrgIQ", 843 - "title": "The Sweats - Wild Life Episode 3" 844 - }, 845 - { 846 - "id": "CwB8r_utp_4", 847 - "title": "Stayin' Alive! Wild Life - Episode 4" 848 - }, 849 - { 850 - "id": "E5LKBp0GBJs", 851 - "title": "The Social Game - Wild Life - Episode 5" 852 - }, 853 - { 854 - "id": "v0oVgt8lUqw", 855 - "title": "Creating Problems - Wild Life Ep.6" 856 - }, 857 - { 858 - "id": "o7rrTQjo_1c", 859 - "title": "I'm Projecting?! - Wild Life Ep. 7" 860 - }, 861 - { 862 - "id": "dfrCXoHJmtc", 863 - "title": "THE END! - Wild Life Ep. 8" 864 - } 865 - ], 866 - "GoodTimesWithScar": [ 867 - { 868 - "id": "TRJA1EAhJMg", 869 - "title": "My FIRST Death!! - Wild Life SMP: Episode 1" 870 - }, 871 - { 872 - "id": "feAIdRp4ybI", 873 - "title": "My ROLLER COASTER Of Death!! - Wild Life SMP: Episode 2" 874 - }, 875 - { 876 - "id": "68-XAc861Mc", 877 - "title": "I'M ON MY LAST LIFE! - Wild Life SMP: Episode 3" 878 - }, 879 - { 880 - "id": "qUbvkht8iA8", 881 - "title": "I'm Bad At Minecraft - Wild Life SMP: Episode 4" 882 - }, 883 - { 884 - "id": "MBmBHA5gP1M", 885 - "title": "Life Series Trivia Champion?! - Wild Life SMP: Episode 5" 886 - }, 887 - { 888 - "id": "TzgUqnJgUko", 889 - "title": "I Don't Like Super Trial Chambers! - Wild Life SMP: Episode 6" 890 - }, 891 - { 892 - "id": "c9uC7kvG-pA", 893 - "title": "Riding My FRIENDS! - Wild Life SMP: Episode 7" 894 - }, 895 - { 896 - "id": "AxZwc6F25LY", 897 - "title": "I DID IT! - Wild Life SMP: Finale" 898 - } 899 - ], 900 - "Grian": [ 901 - { 902 - "id": "cITT748zAgs", 903 - "title": "Wild Life: THE MOVIE", 904 - "isMovie": true 905 - }, 906 - { 907 - "id": "4G5seww-ATY", 908 - "title": "Wild Life: Episode 1 - ANYTHING COULD HAPPEN!" 909 - }, 910 - { 911 - "id": "BZ6mmUijhCE", 912 - "title": "Wild Life: Episode 2 - EATING WELL!" 913 - }, 914 - { 915 - "id": "4UnyorKuqXc", 916 - "title": "Wild Life: Episode 3 - THE SNAIL." 917 - }, 918 - { 919 - "id": "8pw6_DA2HIQ", 920 - "title": "Wild Life: Episode 4 - STUPID IDEAS" 921 - }, 922 - { 923 - "id": "S4M88a_Q3aI", 924 - "title": "Wild Life: Episode 5 - THE BIG QUIZ" 925 - }, 926 - { 927 - "id": "ypVE0XeAY64", 928 - "title": "Wild Life: Episode 6 - WILD MOBS!" 929 - }, 930 - { 931 - "id": "9XbbapMzh1g", 932 - "title": "Wild Life: Episode 7 - SUPERPOWERS" 933 - }, 934 - { 935 - "id": "R3A7XjHQ_BQ", 936 - "title": "Wild Life: Episode 8 - THE FINALE!" 937 - } 938 - ], 939 - "Impulse": [ 940 - { 941 - "id": "PgdQKRugr2Y", 942 - "title": "Drama on Day One?! | Wild Life Episode 01" 943 - }, 944 - { 945 - "id": "MFtu03m7bX0", 946 - "title": "Getting Ahead of It! | Wild Life Episode 02" 947 - }, 948 - { 949 - "id": "uVUvek05KiI", 950 - "title": "Cute But Deadly! | Wild Life Episode 03" 951 - }, 952 - { 953 - "id": "vu8JSFiq3sc", 954 - "title": "Hyperspeed Creeper Farm! | Wild Life Episode 04" 955 - }, 956 - { 957 - "id": "gZGDOYSKm4k", 958 - "title": "Make Good Choices! | Wild Life Episode 05" 959 - }, 960 - { 961 - "id": "SV64YD6neLc", 962 - "title": "On The Offensive! | Wild Life Episode 06" 963 - }, 964 - { 965 - "id": "f1A5AIogYh4", 966 - "title": "GET SWAPPED! | Wild Life Episode 07" 967 - }, 968 - { 969 - "id": "rhdt1kytrfw", 970 - "title": "Oh Good…The Snails Are Back! | Wild Life Episode 08" 971 - } 972 - ], 973 - "InTheLittleWood": [ 974 - { 975 - "id": "y3_YakogAq4", 976 - "title": "A TINY WORLD OF OUR OWN - Minecraft Wild Life #1" 977 - }, 978 - { 979 - "id": "s5_XMFlwgw0", 980 - "title": "A SPOONFUL OF WHAT?! - Minecraft Wild Life #2" 981 - }, 982 - { 983 - "id": "9zkal5dfbZY", 984 - "title": "THE SNAILS THAT CAME TO TEA - Minecraft Wild Life #3" 985 - }, 986 - { 987 - "id": "00AeOye5w7E", 988 - "title": "EIGHTY EIGHT MILES PER HOUR!!! - Minecraft Wild Life #4" 989 - }, 990 - { 991 - "id": "oyFiOts0kt8", 992 - "title": "THE LITTLE WE KNOW.. - Minecraft Wild Life #5" 993 - }, 994 - { 995 - "id": "EuCc_N3YHv8", 996 - "title": "RIDE LIKE THE WIND... BULLSEYE!! - Minecraft Wild Life #6" 997 - }, 998 - { 999 - "id": "ox90SNDx_8Q", 1000 - "title": "NOW YOU LISTEN HERE! - Minecraft Wild Life EP07" 1001 - } 1002 - ], 1003 - "LDShadowLady": [ 1004 - { 1005 - "id": "UluZ54MxGNI", 1006 - "title": "Surprise! 🎲 | Ep. 1 | Wild Life" 1007 - }, 1008 - { 1009 - "id": "aZlRG12Ami8", 1010 - "title": "Bamboozled! 🎋 | Ep. 2 | Wild Life" 1011 - }, 1012 - { 1013 - "id": "II4sfdRM3Ac", 1014 - "title": "The Snail.....🐌 | Ep. 3 | Wild Life" 1015 - }, 1016 - { 1017 - "id": "j9koj7O1xcM", 1018 - "title": "Suspiciously Slow | Ep. 4 | Wild Life" 1019 - }, 1020 - { 1021 - "id": "IesKpKrq8gI", 1022 - "title": "✨LIFE QUIZ ✨ | Ep. 5 | Wild Life" 1023 - }, 1024 - { 1025 - "id": "gQGkS_pN7NI", 1026 - "title": "The WORST Best Day Ever | Ep. 6 | Wild Life" 1027 - }, 1028 - { 1029 - "id": "L4hhbkPm0-A", 1030 - "title": "Failed Traps 💣 | Ep. 7 | Wild Life" 1031 - }, 1032 - { 1033 - "id": "YEr8d6JoYfk", 1034 - "title": "The FINAL Bamdown | Ep. 8 | Wild Life" 1035 - } 1036 - ], 1037 - "Mumbo": [ 1038 - { 1039 - "id": "ZvC2LVFR8rY", 1040 - "title": "WILD LIFE: Episode 1 - HOBBITS!" 1041 - }, 1042 - { 1043 - "id": "W2nEprNNiyY", 1044 - "title": "WILD LIFE: Episode 2 - FLOATERS" 1045 - }, 1046 - { 1047 - "id": "-Pw5ExQwxDo", 1048 - "title": "WILD LIFE: Episode 3 - I'M STRESSED" 1049 - }, 1050 - { 1051 - "id": "XeSG6VwV7JY", 1052 - "title": "WILD LIFE: Episode 4 - GOOD, BAD, UGLY" 1053 - }, 1054 - { 1055 - "id": "zlbZHMPA74Y", 1056 - "title": "WILD LIFE: Episode 5 - MACE TO THE FACE" 1057 - }, 1058 - { 1059 - "id": "baRkqtuBKeU", 1060 - "title": "They brought me back." 1061 - } 1062 - ], 1063 - "PearlescentMoon": [ 1064 - { 1065 - "id": "YMEuk26UNBk", 1066 - "title": "SMALL Lives, BIG Challenges! | Wild Life: Episode 1" 1067 - }, 1068 - { 1069 - "id": "qD_E1fh80Vc", 1070 - "title": "The Hunger RETURNS | Wild Life: Episode 2" 1071 - }, 1072 - { 1073 - "id": "vK6H_5WmhOI", 1074 - "title": "If Not Friend, Why Friend Shaped? | Wild Life: Episode 3" 1075 - }, 1076 - { 1077 - "id": "bQOnUHXR0oI", 1078 - "title": "The Elephants BELOW | Wild Life: Episode 4" 1079 - }, 1080 - { 1081 - "id": "uuj66eq36ms", 1082 - "title": "Trivial Conflict | Wild Life: Episode 5" 1083 - }, 1084 - { 1085 - "id": "PfCup8alalk", 1086 - "title": "Loss | Wild Life: Episode 6" 1087 - }, 1088 - { 1089 - "id": "kitPA48iuGg", 1090 - "title": "All The POWER | Wild Life: Episode 7" 1091 - }, 1092 - { 1093 - "id": "iTiJtpfeP8w", 1094 - "title": "Pathetic | Wild Life: Episode 8" 1095 - } 1096 - ], 1097 - "Rendog": [ 1098 - { 1099 - "id": "YJ4YQS44rqk", 1100 - "title": "SORRY JIMMY! | Wild Life SMP | Ep 01" 1101 - }, 1102 - { 1103 - "id": "s-OT2Cwk6C0", 1104 - "title": "A VERY FLAMMABLE BASE! | Wild Life SMP | Ep 02" 1105 - }, 1106 - { 1107 - "id": "aFCAbgCT904", 1108 - "title": "THE SNAIL MADE ME DO IT! | Wild Life SMP | Ep 03" 1109 - }, 1110 - { 1111 - "id": "Xh6eyI7UhIs", 1112 - "title": "PLANS FAIL UNTIL THEY DON'T! | Wild Life SMP | Ep 04" 1113 - }, 1114 - { 1115 - "id": "KFZbQ9eswds", 1116 - "title": "COMBO KABOOM! | Wild Life SMP | Ep 05" 1117 - }, 1118 - { 1119 - "id": "sQdK3m5mP6U", 1120 - "title": "CAMEL SKATEBOARDS & WHOOPSIES! | Wild Life SMP | Ep 06" 1121 - }, 1122 - { 1123 - "id": "f_PTogb03WE", 1124 - "title": "I CAN BECOME ANYONE! | Wild Life SMP | Ep 07" 1125 - }, 1126 - { 1127 - "id": "SAx7TWlPtaE", 1128 - "title": "MARTREN NEEDS FRIENDS! | Wild Life SMP | Ep 08 (FINALE)" 1129 - } 1130 - ], 1131 - "Skizzleman": [ 1132 - { 1133 - "id": "-c05jALwPpM", 1134 - "title": "Wild Life! Ep 1 - DID NOT SEE THIS COMING!" 1135 - }, 1136 - { 1137 - "id": "0237C5kpdmA", 1138 - "title": "Wild Life! Ep 2 - AN UNEXPECTED ENEMY!!!" 1139 - }, 1140 - { 1141 - "id": "HsxX4NYh7nw", 1142 - "title": "Wild Life! Ep 3 - A Dangerous Handsome Snail?" 1143 - }, 1144 - { 1145 - "id": "FCA3RBmqG0M", 1146 - "title": "Wild Life! Ep 4 - FOES AND FAILURE!" 1147 - }, 1148 - { 1149 - "id": "WyRWErKX9jg", 1150 - "title": "Wild Life! Ep 5 - I'M GONNA LOSE IT! In so many ways." 1151 - }, 1152 - { 1153 - "id": "kuEI07-F4aw", 1154 - "title": "Wild Life! Ep 6 - IS THIS THE END?!?!" 1155 - }, 1156 - { 1157 - "id": "itVEFDGsShs", 1158 - "title": "Wild Life! Ep 7? I'M BAAAAACK!" 1159 - } 1160 - ], 1161 - "Smajor1995": [ 1162 - { 1163 - "id": "F2LRqSxo9gg", 1164 - "title": "Small World. BIG Problems! - Wild Life - Ep.1" 1165 - }, 1166 - { 1167 - "id": "S76UhyssPN0", 1168 - "title": "Eat. EVERYTHING. - Wild Life - Ep.2" 1169 - }, 1170 - { 1171 - "id": "3sqhwhkPwso", 1172 - "title": "Pure. Evil. - Wild Life - Ep.3" 1173 - }, 1174 - { 1175 - "id": "G5c3RoCWHFo", 1176 - "title": "They got me... - Wild Life - Ep.4" 1177 - }, 1178 - { 1179 - "id": "LJmJNwHm6vo", 1180 - "title": "Minecraft's Most DANGEROUS Quiz Show! - Wild Life - Ep.5" 1181 - }, 1182 - { 1183 - "id": "nG8fxYVu5p4", 1184 - "title": "The WEIRDEST One YET! - Wild Life - Ep.6" 1185 - }, 1186 - { 1187 - "id": "YYc5kGZlReA", 1188 - "title": "I got the LAMEST Super Power! Wild Life - Ep.7" 1189 - }, 1190 - { 1191 - "id": "Mp4gEX7UiZE", 1192 - "title": "The WILDEST Finale EVER! Wild Life - Ep.8" 1193 - } 1194 - ], 1195 - "SmallishBeans": [ 1196 - { 1197 - "id": "im4PRwzar7M", 1198 - "title": "Make it WILD! | Wild Life The Movie", 1199 - "isMovie": true 1200 - }, 1201 - { 1202 - "id": "XVGRYWBN4co", 1203 - "title": "A Fresh Start! | Wild Life | Ep.1" 1204 - }, 1205 - { 1206 - "id": "KCOHp5VHs_s", 1207 - "title": "Building The Base! | Wild Life | Ep.2" 1208 - }, 1209 - { 1210 - "id": "mSnM6jhXHa8", 1211 - "title": "I Can't Do ANYTHING! | Wild Life | Ep.3" 1212 - }, 1213 - { 1214 - "id": "kqzChTwCzMM", 1215 - "title": "Slow & Furious?!?! | Wild Life | Ep.4" 1216 - }, 1217 - { 1218 - "id": "uPxAydfNK9k", 1219 - "title": "Oh Dear. Oh No. | Wild Life | Ep.5" 1220 - }, 1221 - { 1222 - "id": "WTf3bSnbFwI", 1223 - "title": "Traps & Trial Chambers! | Wild Life | Ep.6" 1224 - }, 1225 - { 1226 - "id": "_d_UznMnQXU", 1227 - "title": "Time to Have Some Fun.. | Wild Life | Ep.7" 1228 - }, 1229 - { 1230 - "id": "4IkEYX3PCkM", 1231 - "title": "It's About FAMILY. | Wild Life | Finale" 1232 - } 1233 - ], 1234 - "Solidarity": [ 1235 - { 1236 - "id": "xZwBBCKFjfE", 1237 - "title": "I AM SMALL... AGAIN! | Wild Life | #1" 1238 - }, 1239 - { 1240 - "id": "dCcSDsctGhQ", 1241 - "title": "I Made MUMBO Eat My.. | Wild Life | #2" 1242 - }, 1243 - { 1244 - "id": "NEbbMlR66Ts", 1245 - "title": "The WORST Day In The LIFE SERIES.. | Wild Life | #3" 1246 - }, 1247 - { 1248 - "id": "4y4od_l2zn0", 1249 - "title": "The BEST Day In The LIFE SERIES.. | Wild Life | #4" 1250 - }, 1251 - { 1252 - "id": "b_81RlzNEDQ", 1253 - "title": "THE ROBOT PRANKED ME.. | Wild Life | #5" 1254 - }, 1255 - { 1256 - "id": "x2CQZiDh1Q4", 1257 - "title": "I MADE A BIG MISTAKE.. | Wild Life | #6" 1258 - }, 1259 - { 1260 - "id": "qq2yf8BM_jU", 1261 - "title": "This Feels SO WRONG!! | Wild Life | #7" 1262 - }, 1263 - { 1264 - "id": "27DhSZg2vzY", 1265 - "title": "IT WAS ALWAYS GOING TO HAPPEN... | Wild Life | #8" 1266 - } 1267 - ], 1268 - "Tango": [ 1269 - { 1270 - "id": "NdXbaufIjSI", 1271 - "title": "We're In For a WILD Ride! - Wild Life #1" 1272 - }, 1273 - { 1274 - "id": "X8edTCgjpa0", 1275 - "title": "Redstone Torches are DELICIOUS! - Wild Life #2" 1276 - }, 1277 - { 1278 - "id": "dKduQECYzm8", 1279 - "title": "I'M SHELL SHOCKED! - Wild Life #3" 1280 - }, 1281 - { 1282 - "id": "kZexYG89HwU", 1283 - "title": "A Lesson in Murder! - Wild Life #4" 1284 - }, 1285 - { 1286 - "id": "6ThWp_BWlHw", 1287 - "title": "REDEMPTION! - Wild Life #5" 1288 - }, 1289 - { 1290 - "id": "SrBOHFqWbwU", 1291 - "title": "Donkeys and Happiness! - Wild Life #6" 1292 - }, 1293 - { 1294 - "id": "WJkRRSDXOZQ", 1295 - "title": "The ENTIRE Server is HUNTING ME! - Wild Life #7" 1296 - }, 1297 - { 1298 - "id": "4JNHrUWimDA", 1299 - "title": "Mass Chaos! - WildLife #8" 1300 - } 1301 - ], 1302 - "ZombieCleo": [ 1303 - { 1304 - "id": "6reyGA6hEZY", 1305 - "title": "FUN SIZE - 01 - WILD LIFE" 1306 - }, 1307 - { 1308 - "id": "O7yzdRulVBk", 1309 - "title": "FEED ME - 02 - WILD LIFE" 1310 - }, 1311 - { 1312 - "id": "73wWJAvJOHI", 1313 - "title": "SNAILED IT! - 03 - WILD LIFE" 1314 - }, 1315 - { 1316 - "id": "8UkQH2rxOuY", 1317 - "title": "THE BIG B-TRAYAL - 04 - WILD LIFE" 1318 - }, 1319 - { 1320 - "id": "oQI-FDTz5iE", 1321 - "title": "BURN BABY BURN - 05 - WILD LIFE" 1322 - }, 1323 - { 1324 - "id": "KkTgm7N4npk", 1325 - "title": "THE GANG'S ALL HERE - 06 - WILD LIFE" 1326 - }, 1327 - { 1328 - "id": "a_Uy9oD0_wk", 1329 - "title": "We got SUPERPOWERS and all I got was LIPPY ZOMBIES! - 07 - WILD LIFE" 1330 - }, 1331 - { 1332 - "id": "MPGMpfB1MMg", 1333 - "title": "EVERY CARD ACTIVE, ALL AT ONCE, - 08 - WILD LIFE FINALE" 1334 - } 1335 - ] 1336 - } 1337 - }, 1338 - { 1339 - "id": "secret-life", 1340 - "title": "Secret Life", 1341 - "seo": { 1342 - "description": { 1343 - "twist": "At the start of each episode each player is given a unique secret task with a challange that they have to complete. At all times, the secret must be kept as a secret." 1344 - } 1345 - }, 1346 - "videos": { 1347 - "BdoubleO100": [ 1348 - { 1349 - "id": "mx5P47605-M", 1350 - "title": "Bdubs Secret Life :: Discomfort" 1351 - }, 1352 - { 1353 - "id": "mPopGLKUkvM", 1354 - "title": "Bdubs Secret Life :: Will They Leave?" 1355 - }, 1356 - { 1357 - "id": "BeuH0bIhiyk", 1358 - "title": "Bdubs Secret Life :: Bdubs Dabs, Yeets and Pogs!" 1359 - }, 1360 - { 1361 - "id": "oc5z-QEerCk", 1362 - "title": "Bdubs Secret Life :: \"Kill the Ender Dragon.\"" 1363 - }, 1364 - { 1365 - "id": "U6UQS_lsOK4", 1366 - "title": "Bdubs Secret Life :: Danger Tag!" 1367 - }, 1368 - { 1369 - "id": "W6_P-1mXTiU", 1370 - "title": "Bdubs Secret Life :: My Worst Best Friend" 1371 - }, 1372 - { 1373 - "id": "8uzN0n4ODx4", 1374 - "title": "Bdubs Secret Life :: I Hate Someone Else Now" 1375 - }, 1376 - { 1377 - "id": "4gLegTmn_Ao", 1378 - "title": "Bdubs Secret Life :: TRIPWIRE!" 1379 - }, 1380 - { 1381 - "id": "MnJAfxk8AUU", 1382 - "title": "Bdubs Secret Life :: They Burned Mumbo's World!" 1383 - } 1384 - ], 1385 - "BigB": [ 1386 - { 1387 - "id": "ehZlGbAgpOQ", 1388 - "title": "Minecraft SECRET LIFE: The Movie", 1389 - "isMovie": true 1390 - }, 1391 - { 1392 - "id": "okToo7Xa4X8", 1393 - "title": "Secret Life SMP | Ep.1 | KEEP IT A SECRET!" 1394 - }, 1395 - { 1396 - "id": "oGyishJ-33o", 1397 - "title": "Secret Life SMP | Ep.2 | I CAN'T EXPLAIN IT!" 1398 - }, 1399 - { 1400 - "id": "5mkT7lU2F0A", 1401 - "title": "Secret Life SMP | Ep.3 | SAY IT PLEASE!!" 1402 - }, 1403 - { 1404 - "id": "7WF4L9z9c_s", 1405 - "title": "Secret Life SMP | Ep.4 | THE BACKROOMS.." 1406 - }, 1407 - { 1408 - "id": "bZ9gtBDITLw", 1409 - "title": "Secret Life SMP | Ep.5 | THE BETRAYAL" 1410 - }, 1411 - { 1412 - "id": "-PWX9mmXyPo", 1413 - "title": "Secret Life SMP | Ep.6 | WHAT HAVE YOU DONE!" 1414 - }, 1415 - { 1416 - "id": "6Smbwx0Jvuc", 1417 - "title": "Secret Life SMP | Ep.7 | THE SURVIVORS!" 1418 - }, 1419 - { 1420 - "id": "pWOZpXbzId4", 1421 - "title": "Secret Life SMP | Ep.8 | HURRY UP!" 1422 - }, 1423 - { 1424 - "id": "E8q86D1p4xs", 1425 - "title": "Secret Life SMP | Ep.9 | THE FINAL TASK!" 1426 - } 1427 - ], 1428 - "Etho": [ 1429 - { 1430 - "id": "Yuy3GJMbdBM", 1431 - "title": "Secret Life #1 - Everyone Must Sleep!" 1432 - }, 1433 - { 1434 - "id": "BcMWJYg5Rb8", 1435 - "title": "Secret Life #2 - Server Full of Weirdos" 1436 - }, 1437 - { 1438 - "id": "2Xm05gVDRuw", 1439 - "title": "Secret Life #3 - Fail Them or Fail Me" 1440 - }, 1441 - { 1442 - "id": "vjGh27QIkB8", 1443 - "title": "Secret Life #4 - Listening Comprehension Skills" 1444 - }, 1445 - { 1446 - "id": "EhaRkbt7Cf8", 1447 - "title": "Secret Life #5 - Bdubs Is Amazing!" 1448 - }, 1449 - { 1450 - "id": "HLFj7_6bRP0", 1451 - "title": "Secret Life #6 - Warden vs. Wither" 1452 - }, 1453 - { 1454 - "id": "p1BhrcCT91Y", 1455 - "title": "Secret Life #7 - Everyone Be Running" 1456 - }, 1457 - { 1458 - "id": "swmt9_n_YrE", 1459 - "title": "Secret Life #8 & 9 - Etho Shows Up" 1460 - } 1461 - ], 1462 - "GeminiTay": [ 1463 - { 1464 - "id": "rErmtQv-LB0", 1465 - "title": "Secret Life Ep.1 - I have a Reputation" 1466 - }, 1467 - { 1468 - "id": "96k3Mv7zRUA", 1469 - "title": "Secret Life Ep.2 - Everyone's crazy" 1470 - }, 1471 - { 1472 - "id": "4ZJl2VqjjgY", 1473 - "title": "Secret Life Ep.3 - A Plan to Win" 1474 - }, 1475 - { 1476 - "id": "5JHsouyDbpA", 1477 - "title": "Secret Life Ep.4 - Influencing an Army" 1478 - }, 1479 - { 1480 - "id": "JBJk00Hh2Tk", 1481 - "title": "Secret Life Ep. 5 - The Tallest Tower" 1482 - }, 1483 - { 1484 - "id": "F1Kwu6l2LNs", 1485 - "title": "Secret Life Ep.6 - Liar" 1486 - }, 1487 - { 1488 - "id": "26Wgwi-WJsg", 1489 - "title": "How I killed the Entire Secret Life Server (nearly) Ep.7" 1490 - }, 1491 - { 1492 - "id": "UMIVm1TTNj4", 1493 - "title": "Secret Life Ep. 8 - Heart Breaking" 1494 - }, 1495 - { 1496 - "id": "bp59iWT87GA", 1497 - "title": "Secret Life Ep.9 - how it ended" 1498 - } 1499 - ], 1500 - "GoodTimesWithScar": [ 1501 - { 1502 - "id": "tqHFh7KA3Vc", 1503 - "title": "Secret Life SMP - episode 1: I Broke The Game" 1504 - }, 1505 - { 1506 - "id": "bJq2phrM3js", 1507 - "title": "Secret Life SMP - Ep2: The Secret Life Courthouse!!" 1508 - }, 1509 - { 1510 - "id": "cp702Jj3f3o", 1511 - "title": "Secret Life SMP - Ep3: Stealing The Servers Light!" 1512 - }, 1513 - { 1514 - "id": "fupMK0nyFMA", 1515 - "title": "Secret Life SMP - Ep4: My Task Made Me a VILLAIN!" 1516 - }, 1517 - { 1518 - "id": "Xzz4ksCPJvI", 1519 - "title": "Secret Life SMP - Ep5: How Did I Become OverPowered !!??!!" 1520 - }, 1521 - { 1522 - "id": "5yZQRjzr7SE", 1523 - "title": "Secret Life SMP - Ep6: I Got Chased By A Wither!!" 1524 - }, 1525 - { 1526 - "id": "VJV19bnl1Gk", 1527 - "title": "Secret Life SMP - Ep7: Scar The VILLAIN is Back...." 1528 - }, 1529 - { 1530 - "id": "ryUoXrkvHxY", 1531 - "title": "Secret Life SMP - Ep8: Sabotaging The Red's Secret Plans!" 1532 - } 1533 - ], 1534 - "Grian": [ 1535 - { 1536 - "id": "UXyeT0EiqJs", 1537 - "title": "Secret Life The Movie (All Secret Life Episodes)", 1538 - "isMovie": true 1539 - }, 1540 - { 1541 - "id": "CRlNu1rgJ4w", 1542 - "title": "Secret Life: Episode 1 - KEEP A SECRET!" 1543 - }, 1544 - { 1545 - "id": "HMKDw6XtRvc", 1546 - "title": "Secret Life: Episode 2 - MORE DOORS FOR ME!" 1547 - }, 1548 - { 1549 - "id": "aN3ZbIiqQQ0", 1550 - "title": "Secret Life: Episode 3 - DOUBLE LIFE?" 1551 - }, 1552 - { 1553 - "id": "W-3GyxBeiSI", 1554 - "title": "Secret Life: Episode 4 - A NEW ALLIANCE!" 1555 - }, 1556 - { 1557 - "id": "DbhQTYShwRI", 1558 - "title": "Secret Life: Episode 5 - GETTING INVOLVED!" 1559 - }, 1560 - { 1561 - "id": "p-4jmObluEk", 1562 - "title": "Secret Life: Episode 6 - THE HARD TASK" 1563 - }, 1564 - { 1565 - "id": "uwWsiQb8aQg", 1566 - "title": "Secret Life: Episode 7 - DON'T LOOK UP!" 1567 - }, 1568 - { 1569 - "id": "6zMdLcEAenc", 1570 - "title": "Secret Life: Episode 8 - A GHOSTLY TASK" 1571 - }, 1572 - { 1573 - "id": "8XWhMFbxwVk", 1574 - "title": "Secret Life: Episode 9 - THE FINALE" 1575 - } 1576 - ], 1577 - "Impulse": [ 1578 - { 1579 - "id": "OoKMmzBT69Q", 1580 - "title": "Secret Life The Movie", 1581 - "isMovie": true 1582 - }, 1583 - { 1584 - "id": "9SOIRaMr-IQ", 1585 - "title": "I Joined a New Band! | Secret Life Episode 1" 1586 - }, 1587 - { 1588 - "id": "4yxXweiIMJE", 1589 - "title": "Loose Lips Sink Ships! | Secret Life Episode 2" 1590 - }, 1591 - { 1592 - "id": "zK0TQ2YrQJU", 1593 - "title": "I Betrayed My Best Friend! | Secret Life Episode 3" 1594 - }, 1595 - { 1596 - "id": "smR77KURO8s", 1597 - "title": "The End? | Secret Life Episode 4" 1598 - }, 1599 - { 1600 - "id": "45gHiwuLAnY", 1601 - "title": "THEY'RE AFTER ME! | Secret Life Episode 5" 1602 - }, 1603 - { 1604 - "id": "yUkMuPDLcm4", 1605 - "title": "I Dare you to:___ | Secret Life Episode 6" 1606 - }, 1607 - { 1608 - "id": "9jO82FSaysk", 1609 - "title": "I AM THE BOOGIE! | Secret Life Episode 7" 1610 - }, 1611 - { 1612 - "id": "4Pefv3lxxQM", 1613 - "title": "How i became the LAST Yellow | Secret life Episode 8" 1614 - }, 1615 - { 1616 - "id": "8d3qefBP4DM", 1617 - "title": "Not like this... | Secret Life Episode 09" 1618 - } 1619 - ], 1620 - "InTheLittleWood": [ 1621 - { 1622 - "id": "cB6DAAbqSvk", 1623 - "title": "I CAN'T TELL ANYBODY!! - Minecraft Secret Life #1" 1624 - }, 1625 - { 1626 - "id": "rZ6NeOwhaTo", 1627 - "title": "TERRIBLE, HORRIBLE, NO GOOD, VERY BAD DAY - Minecraft Secret Life #2" 1628 - }, 1629 - { 1630 - "id": "ZeDPl8r13rE", 1631 - "title": "TASK FORCE IN ACTION! - Minecraft Secret Life #3" 1632 - }, 1633 - { 1634 - "id": "pPf0eLF-NQM", 1635 - "title": "THIS IS THE END... - Minecraft Secret Life #4" 1636 - }, 1637 - { 1638 - "id": "_jzzMLgLPK8", 1639 - "title": "HAUNTED BY THE REDS - Minecraft Secret Life #5" 1640 - }, 1641 - { 1642 - "id": "hOuKJKwLDCU", 1643 - "title": "HUNTERS BECOME THE HUNTED - Minecraft Secret Life #6" 1644 - }, 1645 - { 1646 - "id": "1UvZVmYwX-s", 1647 - "title": "BEING A HEART BREAKER - Minecraft Secret Life #7" 1648 - }, 1649 - { 1650 - "id": "Pt9BabHiZj0", 1651 - "title": "GOING FOR ALL THE BONES - Minecraft Secret Life #8" 1652 - }, 1653 - { 1654 - "id": "7IUWNC7HOpg", 1655 - "title": "THE ONLY WAY IS UP - Minecraft Secret Life #9 (Finale)" 1656 - } 1657 - ], 1658 - "LDShadowLady": [ 1659 - { 1660 - "id": "T4-lFdOIA1M", 1661 - "title": "Secrets | Ep. 1 | Secret Life" 1662 - }, 1663 - { 1664 - "id": "soNKxgX8JaY", 1665 - "title": "Strange Behaviour | Ep. 2 | Secret Life" 1666 - }, 1667 - { 1668 - "id": "YooS8162SMk", 1669 - "title": "Danger Camel | Ep. 3 | Secret Life" 1670 - }, 1671 - { 1672 - "id": "PgxgsulRtN8", 1673 - "title": "Not So Secret Paths ✨ | Ep. 4 | Secret Life" 1674 - }, 1675 - { 1676 - "id": "vQyTeTIF2tc", 1677 - "title": "IMPOSSIBLE TASK | Ep. 5 | Secret Life" 1678 - }, 1679 - { 1680 - "id": "QTPAt1J8XUY", 1681 - "title": "Disaster. | Ep. 6 | Secret Life" 1682 - } 1683 - ], 1684 - "Mumbo": [ 1685 - { 1686 - "id": "txAxAOcnNf4", 1687 - "title": "SECRET LIFE: Episode 1 - The Mounders" 1688 - }, 1689 - { 1690 - "id": "ZyLlxVnN90Y", 1691 - "title": "SECRET LIFE: Episode 2 - Best Friends" 1692 - }, 1693 - { 1694 - "id": "7sA3HR8rs_8", 1695 - "title": "SECRET LIFE: Episode 3 - Impossible Task" 1696 - }, 1697 - { 1698 - "id": "QAgzJQ5l2eY", 1699 - "title": "SECRET LIFE: Episode 4 - Confusing Everyone" 1700 - }, 1701 - { 1702 - "id": "LUlrPqosPzk", 1703 - "title": "SECRET LIFE: Episode 5 - I'm Sorry" 1704 - }, 1705 - { 1706 - "id": "-c5yMtJO4kk", 1707 - "title": "SECRET LIFE: Episode 6 - IDIOT" 1708 - } 1709 - ], 1710 - "PearlescentMoon": [ 1711 - { 1712 - "id": "pobq77s98xI", 1713 - "title": "Secret Life: Don't Tell ANYONE | Episode 1" 1714 - }, 1715 - { 1716 - "id": "o83LMyu9uKs", 1717 - "title": "Secret Life: Bunk Buddies! | Episode 2" 1718 - }, 1719 - { 1720 - "id": "hS8-CWAmMII", 1721 - "title": "Secret Life: DROP IT! | Episode 3" 1722 - }, 1723 - { 1724 - "id": "nTGyE9bQylw", 1725 - "title": "Secret Life: YES, AND | Episode 4" 1726 - }, 1727 - { 1728 - "id": "aLblyEEShMQ", 1729 - "title": "Secret Life: HOT POTATO | Episode 5" 1730 - }, 1731 - { 1732 - "id": "rCBRoi3wWcI", 1733 - "title": "Secret Life: IMPOSTER | Episode 6" 1734 - }, 1735 - { 1736 - "id": "DzxWDSXLGkI", 1737 - "title": "Secret Life: INFECTED | Episode 7" 1738 - }, 1739 - { 1740 - "id": "2w29hNPcqKM", 1741 - "title": "Secret Life: Broken Alliances | Episode 8" 1742 - }, 1743 - { 1744 - "id": "p0CSgJJj1S8", 1745 - "title": "Secret Life: MOUNDERS For Life | Episode 9" 1746 - } 1747 - ], 1748 - "Skizzleman": [ 1749 - { 1750 - "id": "VldNHPEdJ_M", 1751 - "title": "Secret Life - THE MOVIE! - Skizz POV", 1752 - "isMovie": true 1753 - }, 1754 - { 1755 - "id": "pGSQn3npaIw", 1756 - "title": "Secret Life - Shhhhhhh! - Ep 1" 1757 - }, 1758 - { 1759 - "id": "iDUVATSpFtU", 1760 - "title": "Secret Life - Bros For Life! - Ep 2" 1761 - }, 1762 - { 1763 - "id": "FX_zFYt6ATA", 1764 - "title": "Secret Life - It Takes Heart! - Ep 3" 1765 - }, 1766 - { 1767 - "id": "qxRXzKBwjcg", 1768 - "title": "Secret Life - Is It Really That Complicated?! - Ep 4" 1769 - }, 1770 - { 1771 - "id": "u26lWhPy718", 1772 - "title": "Secret Life - Reds Are Attacking! - Ep 5" 1773 - }, 1774 - { 1775 - "id": "K80RcnNNzlQ", 1776 - "title": "Secret Life - Dr Skizz In The House! - Ep 6" 1777 - }, 1778 - { 1779 - "id": "U-dDsQSdiTE", 1780 - "title": "Secret Life - Ohhh The Heartburn! - Ep 7" 1781 - }, 1782 - { 1783 - "id": "--C_PZ1BRqM", 1784 - "title": "Secret Life - Sweet Revenge!!! - Ep 8" 1785 - }, 1786 - { 1787 - "id": "9h2UfHeVlww", 1788 - "title": "Secret Life - Complete Carnage! - Ep 9" 1789 - } 1790 - ], 1791 - "Smajor1995": [ 1792 - { 1793 - "id": "GNMWcr88dP0", 1794 - "title": "Secret Life SMP: The Movie", 1795 - "isMovie": true 1796 - }, 1797 - { 1798 - "id": "N5M6Xp25GSc", 1799 - "title": "I have a BIG Secret... - Secret Life SMP - Ep.1" 1800 - }, 1801 - { 1802 - "id": "8b43CFrMAtY", 1803 - "title": "This is my worst nightmare... - Secret Life SMP - Ep.2" 1804 - }, 1805 - { 1806 - "id": "1W23iOlHMjE", 1807 - "title": "This was a BAD Idea... - Secret Life SMP - Ep.3" 1808 - }, 1809 - { 1810 - "id": "zc9PWQxyDO0", 1811 - "title": "This is a bad idea right?... - Secret Life SMP - Ep.4" 1812 - }, 1813 - { 1814 - "id": "tszCWEeDQTY", 1815 - "title": "I have to GET him! - Secret Life SMP - Ep.5" 1816 - }, 1817 - { 1818 - "id": "15Dsi9GUEHU", 1819 - "title": "This was a DISASTER! - Secret Life SMP - Ep.6" 1820 - }, 1821 - { 1822 - "id": "8QHCmOGCbPw", 1823 - "title": "I need to Survive!!! - Secret Life SMP - Ep.7" 1824 - }, 1825 - { 1826 - "id": "5d8FzaitQrI", 1827 - "title": "It's the Final Countdown...- Secret Life SMP - Ep.8" 1828 - }, 1829 - { 1830 - "id": "1B8jDakxu80", 1831 - "title": "Our Final Show! - Secret Life SMP - Ep.9 FINALE" 1832 - } 1833 - ], 1834 - "SmallishBeans": [ 1835 - { 1836 - "id": "EN0ZIL6sYvs", 1837 - "title": "AWFUL START | Secret Life Ep.1" 1838 - }, 1839 - { 1840 - "id": "65hskfsVfUc", 1841 - "title": "I Started a Cult.. | Secret Life Ep.2" 1842 - }, 1843 - { 1844 - "id": "B5cIG9Krqeo", 1845 - "title": "The 100 Block Water Bucket Clutch.. | Secret Life Ep.3" 1846 - }, 1847 - { 1848 - "id": "zDwunRgU0f8", 1849 - "title": "Hey Now, You're an All Star! | Secret Life Ep.4" 1850 - }, 1851 - { 1852 - "id": "ApwEdbBiOeA", 1853 - "title": "Backseat Gaming & Ferris Wheels! | Secret Life Ep.5" 1854 - }, 1855 - { 1856 - "id": "uR5c43GgbV4", 1857 - "title": "THE ASSASSIN! | Secret Life Ep. 6" 1858 - }, 1859 - { 1860 - "id": "9fTOrfsCBDs", 1861 - "title": "The Boogie RETURNS! | Secret Life Ep. 7" 1862 - }, 1863 - { 1864 - "id": "kM8fqr7k2I4", 1865 - "title": "I am the Danger. | Secret Life Ep. 8" 1866 - }, 1867 - { 1868 - "id": "7DMw50SmuUI", 1869 - "title": "The Finale | Secret Life Ep. 9" 1870 - } 1871 - ], 1872 - "Solidarity": [ 1873 - { 1874 - "id": "lvw2YlHEdJU", 1875 - "title": "Minecraft Secret Life SMP | The Movie", 1876 - "isMovie": true 1877 - }, 1878 - { 1879 - "id": "0xbrdptLE6Q", 1880 - "title": "I Have A HUGE SECRET!! | Secret Life SMP | #1" 1881 - }, 1882 - { 1883 - "id": "wfYIn88YELQ", 1884 - "title": "I'M THE FAILURE OF THE SERVER!! | Secret Life SMP | #2" 1885 - }, 1886 - { 1887 - "id": "ajTomDUHN_Y", 1888 - "title": "THE LEAP OF FAITH GONE WRONG!! | Secret Life SMP | #3" 1889 - }, 1890 - { 1891 - "id": "xl0B8pc49H0", 1892 - "title": "IT'S HAPPENING AGAIN.. | Secret Life SMP | #4" 1893 - }, 1894 - { 1895 - "id": "HiVScPz_2iE", 1896 - "title": "A WAR HAS BEGUN!! | Secret Life SMP | #5" 1897 - }, 1898 - { 1899 - "id": "dkLQkmZYTk8", 1900 - "title": "THE CURSE HAS BEEN BROKEN!! | Secret Life SMP | #6" 1901 - }, 1902 - { 1903 - "id": "3bA16-b9aoY", 1904 - "title": "GRIAN'S SECRET ANGEL!! | Secret Life SMP" 1905 - } 1906 - ], 1907 - "Tango": [ 1908 - { 1909 - "id": "o75KCZJL1X4", 1910 - "title": "Can You Keep a Secret? - Secret Life #1" 1911 - }, 1912 - { 1913 - "id": "ag1lBEEJKHI", 1914 - "title": "Care to Make a Wager? - Secret Life #2" 1915 - }, 1916 - { 1917 - "id": "k4y0njZlE-g", 1918 - "title": "Me and My Friend Torchy! - Secret Life #3" 1919 - }, 1920 - { 1921 - "id": "DjxpxOGDB6g", 1922 - "title": "Mumbo's Shadow! - Secret Life #4" 1923 - }, 1924 - { 1925 - "id": "-98DR8DNZn0", 1926 - "title": "TAG! I'm it! - Secret Life #5" 1927 - }, 1928 - { 1929 - "id": "Axwl4sSzPZk", 1930 - "title": "I'm Not Feeling... Myself Today - Secret Life #6" 1931 - }, 1932 - { 1933 - "id": "JTBTagjGMNM", 1934 - "title": "The Secret Life Genie! - Secret Life #7" 1935 - }, 1936 - { 1937 - "id": "WOYaLoVzyHw", 1938 - "title": "TREMBLE at my PVP PROWESS! - Secret Life #8" 1939 - }, 1940 - { 1941 - "id": "IK9fuKjnb_0", 1942 - "title": "Burning with Scar! - Secret Life #9" 1943 - } 1944 - ], 1945 - "ZombieCleo": [ 1946 - { 1947 - "id": "OaDgkAdsM4k", 1948 - "title": "THE SECRET INGREDIENT - 01 - SECRET LIFE" 1949 - }, 1950 - { 1951 - "id": "0FHVUYixqGw", 1952 - "title": "A PIG DEAL - 02 - SECRET LIFE" 1953 - }, 1954 - { 1955 - "id": "9NOP__O9wcM", 1956 - "title": "SUPER SPY - 03 - SECRET LIFE" 1957 - }, 1958 - { 1959 - "id": "_-45KNzBopU", 1960 - "title": "NEW FRIENDS - 04 - SECRET LIFE" 1961 - }, 1962 - { 1963 - "id": "tQM28WH6Lzo", 1964 - "title": "ADOORABLE - 05 - SECRET LIFE" 1965 - }, 1966 - { 1967 - "id": "kPnzBSe0F3s", 1968 - "title": "THE HILLS ARE ALIVE... WITH SCREAMS - 06 - SECRET LIFE" 1969 - }, 1970 - { 1971 - "id": "6iTvVkF3ufE", 1972 - "title": "FINAL GREEN IN THE APOCALYPSE - 07 - SECRET LIFE" 1973 - }, 1974 - { 1975 - "id": "T_7H3ic1fFg", 1976 - "title": "THE YELLOW TEAM - 08 - SECRET LIFE" 1977 - }, 1978 - { 1979 - "id": "ICOjxjXrYIo", 1980 - "title": "AN EXPLOSIVE FINISH - 09 - SECRET LIFE" 1981 - } 1982 - ] 1983 - } 1984 - }, 1985 - { 1986 - "id": "limited-life", 1987 - "title": "Limited Life", 1988 - "seo": { 1989 - "description": { 1990 - "twist": "Each player has 24 hours to live. If player runs out of time, they are eliminated from the series. Every time player dies, they lose 1 hour. If player kills someone, they gain 30 minutes." 1991 - } 1992 - }, 1993 - "videos": { 1994 - "BdoubleO100": [ 1995 - { 1996 - "id": "oOC8P_uLcyA", 1997 - "title": "BdoubleO Limited Life ~12 HOUR Superfan Episode!", 1998 - "isMovie": true 1999 - } 2000 - ], 2001 - "BigB": [ 2002 - { 2003 - "id": "l9URy-DV2bI", 2004 - "title": "Minecraft LIMITED LIFE: The Movie", 2005 - "isMovie": true 2006 - }, 2007 - { 2008 - "id": "V0m21CfjbUc", 2009 - "title": "Limited Life | Ep.1 | THE TIME IS TICKING!" 2010 - }, 2011 - { 2012 - "id": "XwiIgM3n0wU", 2013 - "title": "Limited Life | Ep.2 | NOSEY NEIGHBORS!" 2014 - }, 2015 - { 2016 - "id": "thUphGIUEPI", 2017 - "title": "Limited Life | Ep.3 | FROGS AND DEATH!" 2018 - }, 2019 - { 2020 - "id": "ARJxNLoXScA", 2021 - "title": "Limited Life | Ep.4 | I'VE BEEN TRICKED!" 2022 - }, 2023 - { 2024 - "id": "72GfDAjXGXY", 2025 - "title": "Limited Life | Ep.5 | GOODBYE FRIEND!" 2026 - }, 2027 - { 2028 - "id": "DPP87-gg7Xw", 2029 - "title": "Limited Life | Ep.6 | RED NAMES!" 2030 - }, 2031 - { 2032 - "id": "u_igv8DYV7U", 2033 - "title": "Limited Life | Ep.7 | PART-TIME BAD BOY!" 2034 - }, 2035 - { 2036 - "id": "20ksKbvFgh8", 2037 - "title": "Limited Life | Ep.8 | TIMES UP!" 2038 - } 2039 - ], 2040 - "Etho": [ 2041 - { 2042 - "id": "TOwaac5-VXg", 2043 - "title": "Limited Life #1: Can't Keep Cows" 2044 - }, 2045 - { 2046 - "id": "-pFx2U6kkL0", 2047 - "title": "Limited Life #2: TNT Building" 2048 - }, 2049 - { 2050 - "id": "CSYcyhPiOUw", 2051 - "title": "Limited Life #3: 2 Hours 2 Diamonds" 2052 - }, 2053 - { 2054 - "id": "-c7pGCdBulc", 2055 - "title": "Limited Life #4: Green Hunting Day" 2056 - }, 2057 - { 2058 - "id": "lOXJP6pgD-4", 2059 - "title": "Limited Life #5: Awkward Family Supper" 2060 - }, 2061 - { 2062 - "id": "CDwJLg06ONw", 2063 - "title": "Limited Life #6&7: Struggling For Life" 2064 - }, 2065 - { 2066 - "id": "PFwyuUVosrU", 2067 - "title": "Limited Life #8: Betrayal & Loyalty" 2068 - } 2069 - ], 2070 - "GoodTimesWithScar": [ 2071 - { 2072 - "id": "wFXzuOc5pgw", 2073 - "title": "Limited Life - episode 1: LOOTING THE SERVER" 2074 - }, 2075 - { 2076 - "id": "pWJC584Vvlo", 2077 - "title": "Limited Life - episode 2: Building Alliances & Bases!" 2078 - }, 2079 - { 2080 - "id": "pfeygvsiIQA", 2081 - "title": "Limited Life - episode 3: CHAOS SCAR IS BACK!" 2082 - }, 2083 - { 2084 - "id": "exFsR2N947g", 2085 - "title": "Limited Life - episode 4: It Was A BAD DAY!" 2086 - }, 2087 - { 2088 - "id": "RtSUHwaVZl8", 2089 - "title": "Limited Life - episode 5: The Red Names are Here!" 2090 - }, 2091 - { 2092 - "id": "78xYiITsdcQ", 2093 - "title": "Limited Life - episode 6: Unintentionally Destroying Etho" 2094 - }, 2095 - { 2096 - "id": "S3MUbQ9hW3E", 2097 - "title": "Limited Life - episode 7: The Family Goes To WAR!" 2098 - }, 2099 - { 2100 - "id": "aNC437szf5A", 2101 - "title": "Limited Life - episode 8: EPIC FINALE!" 2102 - } 2103 - ], 2104 - "Grian": [ 2105 - { 2106 - "id": "GdBqUiaYhKI", 2107 - "title": "Limited Life The Movie", 2108 - "isMovie": true 2109 - }, 2110 - { 2111 - "id": "gzaIHdjLIyM", 2112 - "title": "Limited Life: Episode 1 - 24 HOURS TO LIVE" 2113 - }, 2114 - { 2115 - "id": "WbvO3pp-hsE", 2116 - "title": "Limited Life: Episode 2 - BREAD BRIDGE" 2117 - }, 2118 - { 2119 - "id": "33-8xUvoRwM", 2120 - "title": "Limited Life: Episode 3 - THE AFK SESSION" 2121 - }, 2122 - { 2123 - "id": "KdcWR9t-uo4", 2124 - "title": "Limited Life: Episode 4 - YELLOW MAYHEM" 2125 - }, 2126 - { 2127 - "id": "KsNEKPXNheE", 2128 - "title": "Limited Life: Episode 5 - BREAD BRIDGE BAKERY" 2129 - }, 2130 - { 2131 - "id": "j7M5q4B2pSE", 2132 - "title": "Limited Life: Episode 6 - RED CHAOS" 2133 - }, 2134 - { 2135 - "id": "pKaw6YueKnU", 2136 - "title": "Limited Life: Episode 7 - THE LAST BOY" 2137 - }, 2138 - { 2139 - "id": "wXsDRKYJa1w", 2140 - "title": "Limited Life: Episode 8 - THE END." 2141 - } 2142 - ], 2143 - "Impulse": [ 2144 - { 2145 - "id": "e4pCk8nzLTU", 2146 - "title": "That Escalated Quickly! - Limited Life Episode 01" 2147 - }, 2148 - { 2149 - "id": "dWUFPp_Hf4Y", 2150 - "title": "First to the Fortress! - Limited Life Episode 02" 2151 - }, 2152 - { 2153 - "id": "OgWvJWdfXoQ", 2154 - "title": "I AM THE BOOGIEMAN! - Limited Life Episode 03" 2155 - }, 2156 - { 2157 - "id": "aNyW5rC91RQ", 2158 - "title": "EVERYONE IS AFTER ME! - Limited Life Episode 04" 2159 - }, 2160 - { 2161 - "id": "7EU0WDnJKWc", 2162 - "title": "BYE BYE BREAD BRIDGE! - Limited Life Episode 05" 2163 - }, 2164 - { 2165 - "id": "SRQthonvync", 2166 - "title": "I REFUSE TO GO RED! - Limited Life Episode 06" 2167 - }, 2168 - { 2169 - "id": "H7S4TYJ45GU", 2170 - "title": "MY WORST ENEMY! - Limited Life Episode 07" 2171 - }, 2172 - { 2173 - "id": "RyBeEL3jzvU", 2174 - "title": "TIME’S UP! - Limited Life Episode 08" 2175 - } 2176 - ], 2177 - "InTheLittleWood": [ 2178 - { 2179 - "id": "N5fv1XmbPWc", 2180 - "title": "THE SANDS OF TIME - Minecraft Limited Life #1" 2181 - }, 2182 - { 2183 - "id": "peqXC59_eUs", 2184 - "title": "LIFE BY THE SEA - Minecraft Limited Life #2" 2185 - }, 2186 - { 2187 - "id": "9lMUdl6eAiw", 2188 - "title": "HOW TO STEAL A GRIAN - Minecraft Limited Life #3" 2189 - }, 2190 - { 2191 - "id": "mKIbklfmyHQ", 2192 - "title": "TIME THAT IS OWED - Minecraft Limited Life #4" 2193 - }, 2194 - { 2195 - "id": "b0dlvhhJq9k", 2196 - "title": "SLAY THEM WITH YOUR WORDS - Minecraft Limited Life #5" 2197 - }, 2198 - { 2199 - "id": "XQPUWdmwAqs", 2200 - "title": "MY BIRTHDAY WAS A BLAST! - Minecraft Limited Life #6" 2201 - }, 2202 - { 2203 - "id": "yyWcrJoloc8", 2204 - "title": "SETTING TRAPS IS A REAL PANE - Minecraft Limited Life #7" 2205 - }, 2206 - { 2207 - "id": "HrQhcJOVaMY", 2208 - "title": "OUT OF TIME - Minecraft Limited Life #8 (Finale)" 2209 - } 2210 - ], 2211 - "PearlescentMoon": [ 2212 - { 2213 - "id": "77k1cU6FT_c", 2214 - "title": "24 HOURS LEFT TO LIVE | Limited Life: Episode 1" 2215 - }, 2216 - { 2217 - "id": "8sqqGv7wJkc", 2218 - "title": "Limited Life: Nosy Neighbours | Episode 2" 2219 - }, 2220 - { 2221 - "id": "EfzOcz1Sl8k", 2222 - "title": "Limited Life: Getting Dicey | Episode 3" 2223 - }, 2224 - { 2225 - "id": "klzUdckWbPA", 2226 - "title": "Limited Life: They've Gone Mad | Episode 4" 2227 - }, 2228 - { 2229 - "id": "dZkkVSU6ksI", 2230 - "title": "Limited Life: No Braincells | Episode 5" 2231 - }, 2232 - { 2233 - "id": "gxNmj5eTnVY", 2234 - "title": "Limited Life: SWITCH OUT | Episode 6" 2235 - }, 2236 - { 2237 - "id": "c0pTQoyF-OY", 2238 - "title": "Limited Life: The Nose Grows | Episode 7" 2239 - }, 2240 - { 2241 - "id": "TzQqLGN32JY", 2242 - "title": "Limited Life: I'm BEHIND You... | Episode 8" 2243 - } 2244 - ], 2245 - "Skizzleman": [ 2246 - { 2247 - "id": "gAdimMgajpA", 2248 - "title": "WORST START EVER!!! - Limited Life Ep: 1" 2249 - }, 2250 - { 2251 - "id": "M21uE_LVLSQ", 2252 - "title": "LET'S DANCE!!! - Limited Life Ep: 2" 2253 - }, 2254 - { 2255 - "id": "V_-S1ZVL59w", 2256 - "title": "FALLING FOR IT! - Limited Life Ep: 3" 2257 - }, 2258 - { 2259 - "id": "I5Z6A0KsQJg", 2260 - "title": "NOBODY WORSE, GOSH!!! - Limited Life Ep: 4" 2261 - }, 2262 - { 2263 - "id": "uNPIBNpaTE8", 2264 - "title": "BREAD CRUMB BRIDGE? - Limited Life Ep: 5" 2265 - }, 2266 - { 2267 - "id": "wfPcbZJnm0A", 2268 - "title": "CHAOS & CARNAGE!!! - Limited Life Ep: 6" 2269 - }, 2270 - { 2271 - "id": "3q7WHEN8r2M", 2272 - "title": "UNTIED!!! - Limited Life Ep: 7" 2273 - } 2274 - ], 2275 - "Smajor1995": [ 2276 - { 2277 - "id": "uYHrZUQJTd4", 2278 - "title": "Limited Life SMP: The Movie", 2279 - "isMovie": true 2280 - }, 2281 - { 2282 - "id": "YApzw9Ios-A", 2283 - "title": "IM THE FIRST EVER BOOGEYMAN?! - Limited Life - Ep.1" 2284 - }, 2285 - { 2286 - "id": "JpYU8JAAssQ", 2287 - "title": "The Mean Gills Are Here! - Limited Life - Ep.2" 2288 - }, 2289 - { 2290 - "id": "uwcymu57kG0", 2291 - "title": "So... We Stole Grian. - Limited Life - Ep.3" 2292 - }, 2293 - { 2294 - "id": "H05XM_5k-vw", 2295 - "title": "They hunted me down!- Limited Life - Ep.4" 2296 - }, 2297 - { 2298 - "id": "6A5RJ_tZ4hc", 2299 - "title": "Close Calls and Broken Alliances!- Limited Life - Ep.5" 2300 - }, 2301 - { 2302 - "id": "CfsRnzSG-8s", 2303 - "title": "Time is running out! - Limited Life - Ep.6" 2304 - }, 2305 - { 2306 - "id": "lNbwPrR_8us", 2307 - "title": "They'll regret making me Red... - Limited Life - Ep.7" 2308 - }, 2309 - { 2310 - "id": "DhHQp3IkEPU", 2311 - "title": "The Biggest Betrayal... - Limited Life - Ep.8" 2312 - } 2313 - ], 2314 - "SmallishBeans": [ 2315 - { 2316 - "id": "Ry7tyf_KGuY", 2317 - "title": "The Bad Boys | Limited Life Ep.1" 2318 - }, 2319 - { 2320 - "id": "I8cBg5hfggA", 2321 - "title": "Baddest Boogey.. | Limited Life Ep.2" 2322 - }, 2323 - { 2324 - "id": "t8hiKri0yjY", 2325 - "title": "Grian's Bad Boy Bodyguard | Limited Life Ep.3" 2326 - }, 2327 - { 2328 - "id": "tmu8Nd7laBM", 2329 - "title": "The Baddest Yellows! | Limited Life Ep.4" 2330 - }, 2331 - { 2332 - "id": "zEGiYXMuqeI", 2333 - "title": "They Blew Up Bad Boys Bread Bridge.. | Limited Life Ep.5" 2334 - }, 2335 - { 2336 - "id": "Yc7jmkOIu_8", 2337 - "title": "I Am BAD.. Boys. | Limited Life Ep.6" 2338 - }, 2339 - { 2340 - "id": "y4zs5_HRXtQ", 2341 - "title": "No More Bad Boys :( | Limited Life Ep.7" 2342 - } 2343 - ], 2344 - "Solidarity": [ 2345 - { 2346 - "id": "R_NxDaUo_M8", 2347 - "title": "Solidarity's Limited Life.. (FULL MOVIE)", 2348 - "isMovie": true 2349 - }, 2350 - { 2351 - "id": "HuLnyVm0OPY", 2352 - "title": "TIME IS NOT ON OUR SIDE!! | Limited Life | #1" 2353 - }, 2354 - { 2355 - "id": "9PAzdthtliU", 2356 - "title": "THE MEGA BAD BOYS BREAD BRIDGE!! | Limited Life | #2" 2357 - }, 2358 - { 2359 - "id": "mywrnOutnOQ", 2360 - "title": "THE SECRET BAD BOYS BUNKER!! | Limited Life | #3" 2361 - }, 2362 - { 2363 - "id": "u4B9Y-3MRpw", 2364 - "title": "I KIDNAPPED SOMEONE FOR THE BAD BOYS!! | Limited Life | #4" 2365 - }, 2366 - { 2367 - "id": "IDBMZoZHNqs", 2368 - "title": "A TRAGIC LOSS ON THE SERVER.. | Limited Life | #5" 2369 - }, 2370 - { 2371 - "id": "rzcVeFa-7Gw", 2372 - "title": "THE WORST ASSASSINS ON THE SERVER!! | Limited Life | #6" 2373 - }, 2374 - { 2375 - "id": "WLsS8kSe1Ag", 2376 - "title": "THE CURSE CONTINUES!! | Limited Life | #7" 2377 - } 2378 - ], 2379 - "Tango": [ 2380 - { 2381 - "id": "krzCvg_gw_g", 2382 - "title": "The T.I.E.S that Bind! - Limited Life #1" 2383 - }, 2384 - { 2385 - "id": "wrNAF5pbFNc", 2386 - "title": "Into Flame! - Limited Life #2" 2387 - }, 2388 - { 2389 - "id": "rjDWz7B7vEE", 2390 - "title": "They Blew Up my Crooked Tower! - Limited Life #3" 2391 - }, 2392 - { 2393 - "id": "nkLOS0Burx4", 2394 - "title": "TOTAL CHAOS!! - Limited Life #4" 2395 - }, 2396 - { 2397 - "id": "NZxB9-_HKuo", 2398 - "title": "Two Weeks in a ROW?! - Limited Life #5" 2399 - }, 2400 - { 2401 - "id": "U1JNj9wLoX8", 2402 - "title": "Death by Poultry!! - Limited Life #6" 2403 - }, 2404 - { 2405 - "id": "Z_e_koOU8GE", 2406 - "title": "All Ding, no Death - Limited Life #7" 2407 - }, 2408 - { 2409 - "id": "4-epi6KAIGs", 2410 - "title": "The End Times - Limited life #8" 2411 - } 2412 - ], 2413 - "ZombieCleo": [ 2414 - { 2415 - "id": "_zYkXZDcpmU", 2416 - "title": "I'M THE PROBLEM - 01 - LIMITED LIFE" 2417 - }, 2418 - { 2419 - "id": "2qOH_tdlpw4", 2420 - "title": "Boogey Betrayal at Bread Bridge - 02 - Limited Life" 2421 - }, 2422 - { 2423 - "id": "WnpkWPcSLhY", 2424 - "title": "THE GREAT GRIAN ROBBERY - 03 - LIMITED LIFE" 2425 - }, 2426 - { 2427 - "id": "TQMwUD4-qM8", 2428 - "title": "WARDEN SUMMONING - 04 - Limited Life" 2429 - }, 2430 - { 2431 - "id": "n-D9K7EJV0c", 2432 - "title": "MY BOYS! - 05 - LIMITED LIFE" 2433 - }, 2434 - { 2435 - "id": "4UyUnwEvOQ0", 2436 - "title": "THE GREAT MOM SWAP - 6 - LIMITED LIFE" 2437 - }, 2438 - { 2439 - "id": "aOb-wUpPC04", 2440 - "title": "BLOOD GAMES - 07 - LIMITED LIFE" 2441 - }, 2442 - { 2443 - "id": "L9rd_KsCnV0", 2444 - "title": "THANKS FOR THE MOMMA-RIES - 08 - LIMITED LIFE" 2445 - } 2446 - ] 2447 - } 2448 - }, 2449 - { 2450 - "id": "double-life", 2451 - "title": "Double Life", 2452 - "seo": { 2453 - "description": { 2454 - "twist": "Each player is soul bound to another random player by sharing a health bar. If one of the soul mates takes damage or dies, both players take damage or die." 2455 - } 2456 - }, 2457 - "videos": { 2458 - "BdoubleO100": [ 2459 - { 2460 - "id": "1oToYgCLvu4", 2461 - "title": "Double Life #1 :: The Nick of Time" 2462 - }, 2463 - { 2464 - "id": "1yGoXW8IHgw", 2465 - "title": "Planting Seeds of Doubt :: Double Life #2" 2466 - }, 2467 - { 2468 - "id": "iQA0sfA3ZEc", 2469 - "title": "Etho is Taking Care of Me :: Double Life #3" 2470 - }, 2471 - { 2472 - "id": "PAuHQeH8ZXw", 2473 - "title": "Hunted by Reds :: Double Life #4" 2474 - }, 2475 - { 2476 - "id": "lVB8UqacYH8", 2477 - "title": "Everyone's Accusy! :: Double Life #5" 2478 - }, 2479 - { 2480 - "id": "xUefj1qH4ZM", 2481 - "title": "The Great Escape! :: Double Life #6" 2482 - } 2483 - ], 2484 - "BigB": [ 2485 - { 2486 - "id": "ut655DDp2po", 2487 - "title": "Minecraft DOUBLE LIFE: The Movie", 2488 - "isMovie": true 2489 - }, 2490 - { 2491 - "id": "briYgRXaYSc", 2492 - "title": "Double Life | Ep.1 | WHO IS MY SOULMATE?" 2493 - }, 2494 - { 2495 - "id": "hJUV5_GGOWs", 2496 - "title": "Double Life | Ep.2 | WARDEN TROUBLE!" 2497 - }, 2498 - { 2499 - "id": "9AwxqNH2VEs", 2500 - "title": "Double Life | Ep.3 | SECRET SOULMATES!" 2501 - }, 2502 - { 2503 - "id": "Ne2Su9BYNCc", 2504 - "title": "Double Life | Ep.4 | THE TIME IS NOW!" 2505 - }, 2506 - { 2507 - "id": "uvYs4A-XnNU", 2508 - "title": "Double Life | Ep.5 | THE APOCALYPSE!" 2509 - } 2510 - ], 2511 - "Etho": [ 2512 - { 2513 - "id": "fUKOJlfty2A", 2514 - "title": "Double Life #1: Stuck Together Forever" 2515 - }, 2516 - { 2517 - "id": "zmlIxNaL7SA", 2518 - "title": "Double Life #2: Warden Shenanigans" 2519 - }, 2520 - { 2521 - "id": "bRmPCgzfvHQ", 2522 - "title": "Double Life #3: Sugar Cane Hunt" 2523 - }, 2524 - { 2525 - "id": "DyRLt3-YBlI", 2526 - "title": "Double Life #4: Hitmen Revenge" 2527 - }, 2528 - { 2529 - "id": "H9p3S60sS9o", 2530 - "title": "Double Life #5: Everything Burns!" 2531 - }, 2532 - { 2533 - "id": "HrSBZWPwN-M", 2534 - "title": "Double Life #6: Chasing Wind" 2535 - } 2536 - ], 2537 - "GoodTimesWithScar": [ 2538 - { 2539 - "id": "aljJnQOG0_I", 2540 - "title": "Double Life Episode 1: Living With The JELLIES!" 2541 - }, 2542 - { 2543 - "id": "REBBMUwdnxY", 2544 - "title": "Double Life Episode 2: Burn It All DOWN!" 2545 - }, 2546 - { 2547 - "id": "LNDsRawN5qY", 2548 - "title": "Double Life Episode 3: WHO WILL WIN?!" 2549 - }, 2550 - { 2551 - "id": "LXylG71dlZw", 2552 - "title": "Double Life Episode 4: The Last Green - S TIER UNLOCKED!" 2553 - }, 2554 - { 2555 - "id": "_XILWYOgyzE", 2556 - "title": "Double Life Episode 5: I Made Terrible Mistakes!" 2557 - }, 2558 - { 2559 - "id": "FhEkEjI76aU", 2560 - "title": "Double Life Episode 6: THE EPIC ENDING!" 2561 - } 2562 - ], 2563 - "Grian": [ 2564 - { 2565 - "id": "pxLt8bWmXFI", 2566 - "title": "Minecraft Double Life: The Movie (3rd Season)", 2567 - "isMovie": true 2568 - }, 2569 - { 2570 - "id": "UwFbtE4YS7g", 2571 - "title": "Double Life: Episode 1 - DOUBLE TROUBLE!" 2572 - }, 2573 - { 2574 - "id": "LtFcStS9g5Y", 2575 - "title": "Double Life: Episode 2 - BUILDING UP!" 2576 - }, 2577 - { 2578 - "id": "2i_Fg7tx88U", 2579 - "title": "Double Life: Episode 3 - A REAL MONOPOLY" 2580 - }, 2581 - { 2582 - "id": "S8M_akvDTNE", 2583 - "title": "Double Life: Episode 4 - ABSOLUTE CHAOS" 2584 - }, 2585 - { 2586 - "id": "yxmCHZ9WfVE", 2587 - "title": "Double Life: Episode 5 - UH OH!" 2588 - }, 2589 - { 2590 - "id": "5siDY0DT_68", 2591 - "title": "Double Life: Episode 6 - THE FINALE" 2592 - } 2593 - ], 2594 - "Impulse": [ 2595 - { 2596 - "id": "NoXJF8WGluk", 2597 - "title": "Double Life | Ep 01: DOUBLE TROUBLE!" 2598 - }, 2599 - { 2600 - "id": "GBrzp90Wedw", 2601 - "title": "Double Life | Ep 02: RUN ETHO, RUN!" 2602 - }, 2603 - { 2604 - "id": "UM6wU33dIHE", 2605 - "title": "Double Life | Ep 03: Put To The Test!" 2606 - }, 2607 - { 2608 - "id": "gBD5bCyFOaw", 2609 - "title": "Double Life | Ep 04: THE RED POOL PARTY!" 2610 - }, 2611 - { 2612 - "id": "1KwSy1STnBw", 2613 - "title": "Double Life | Ep 05: EXPERT TRAP MAKERS!" 2614 - }, 2615 - { 2616 - "id": "g6OS_I8yIow", 2617 - "title": "Double Life | Ep 06: A NEW ALLIANCE!" 2618 - } 2619 - ], 2620 - "InTheLittleWood": [ 2621 - { 2622 - "id": "9emkqcVdK84", 2623 - "title": "Minecraft Double Life #1 - Lost And Bound" 2624 - }, 2625 - { 2626 - "id": "ibUruiUjUkU", 2627 - "title": "Minecraft Double Life #2 - Bleeding Heart" 2628 - }, 2629 - { 2630 - "id": "p12VJdq3Yj4", 2631 - "title": "Minecraft Double Life #3 - Falling Out With My Soulmate" 2632 - }, 2633 - { 2634 - "id": "94BgGJnRmz8", 2635 - "title": "Minecraft Double Life #4 - How To Train Your Pet Warden" 2636 - }, 2637 - { 2638 - "id": "aFjD-vMrjd4", 2639 - "title": "Minecraft Double Life #5 - We Kidnapped A Red Life" 2640 - }, 2641 - { 2642 - "id": "EqPbJmDGvgk", 2643 - "title": "Minecraft Double Life #6 Finale - And Here We Are..." 2644 - } 2645 - ], 2646 - "PearlescentMoon": [ 2647 - { 2648 - "id": "PvT7LQcJ4ik", 2649 - "title": "Double Life: New Chaos Begins! | Episode 1" 2650 - }, 2651 - { 2652 - "id": "bseKKE4ZG4Q", 2653 - "title": "Double Life: Far Too COLD!! | Episode 2" 2654 - }, 2655 - { 2656 - "id": "kCB2HXqBow4", 2657 - "title": "Double Life: Complete CONFUSION | Episode 3" 2658 - }, 2659 - { 2660 - "id": "l2YlzW7NUkM", 2661 - "title": "Double Life: Umm... Oops? | Episode 4" 2662 - }, 2663 - { 2664 - "id": "P4ZgOgUeK8U", 2665 - "title": "Double Life: Are We FRIENDS?! | Episode 5" 2666 - }, 2667 - { 2668 - "id": "ScA9EV9NfEQ", 2669 - "title": "Double Life: Something Wicked This Way Comes | Episode 6" 2670 - } 2671 - ], 2672 - "Rendog": [ 2673 - { 2674 - "id": "rtRE6nqRlkU", 2675 - "title": "BOX BASE BEST BASE! | Double Life SMP | Ep 01" 2676 - }, 2677 - { 2678 - "id": "EFPlynJnjQM", 2679 - "title": "PEARL IS PURE EVIL! | Double Life SMP | Ep 02" 2680 - }, 2681 - { 2682 - "id": "6cB6JZ8OTFE", 2683 - "title": "CROAK FROG! PET DOG! BURN LOG! | Double Life SMP | Ep 03" 2684 - }, 2685 - { 2686 - "id": "-Xl_S_WBrys", 2687 - "title": "WE POOPED THE POOL PARTY! | Double Life SMP | Ep 04" 2688 - }, 2689 - { 2690 - "id": "xbadn2qQJS0", 2691 - "title": "PANDAMONIUM UNLEASHED! | Double Life SMP | Ep 05" 2692 - } 2693 - ], 2694 - "Smajor1995": [ 2695 - { 2696 - "id": "sfdmhF41zIY", 2697 - "title": "Minecraft Double Life SMP: The Movie", 2698 - "isMovie": true 2699 - }, 2700 - { 2701 - "id": "CqAd1NJ7BJk", 2702 - "title": "Double Life - Ep.1 - Finding My Soulmate!" 2703 - }, 2704 - { 2705 - "id": "-Nr339DD0z0", 2706 - "title": "Double Life - Ep.2 - Causing Chaos and My Crazy EX Soulmate!" 2707 - }, 2708 - { 2709 - "id": "0OpTN9CSfcA", 2710 - "title": "Double Life - Ep.3 - The Relationship Ranch!" 2711 - }, 2712 - { 2713 - "id": "LNr8iHTSsF8", 2714 - "title": "Double Life - Ep.4 - Pearl Lost Our First Life!" 2715 - }, 2716 - { 2717 - "id": "eK8PFWeCXV8", 2718 - "title": "Double Life - Ep.5 - They're hunting us down!" 2719 - }, 2720 - { 2721 - "id": "Bue5H2lb28A", 2722 - "title": "Double Life - Ep.6 - Tilly Death Do Us Part" 2723 - } 2724 - ], 2725 - "SmallishBeans": [ 2726 - { 2727 - "id": "m_W5vrciPu4", 2728 - "title": "Chaotic Duo! | Double Life Episode 1" 2729 - }, 2730 - { 2731 - "id": "wOnGdYjjJGo", 2732 - "title": "The 'Relation' Ship! | Double Life Episode 2" 2733 - }, 2734 - { 2735 - "id": "fs0Fl1W5I2o", 2736 - "title": "Getting in Trouble... | Double Life Episode 3" 2737 - }, 2738 - { 2739 - "id": "CsThRABuT2E", 2740 - "title": "So You Want Chaos? | Double Life Episode 4" 2741 - }, 2742 - { 2743 - "id": "tpx3qf2s6IE", 2744 - "title": "The Ship Burns, EVERYTHING BURNS!! | Double Life Episode 5" 2745 - }, 2746 - { 2747 - "id": "uwEhtnIeLbM", 2748 - "title": "They must pay.. | Double Life Finale" 2749 - } 2750 - ], 2751 - "Solidarity": [ 2752 - { 2753 - "id": "d9Oc4c8BbBg", 2754 - "title": "WORST START EVER!? | Double Life | #1" 2755 - }, 2756 - { 2757 - "id": "mcgayykO0b8", 2758 - "title": "I GOT BANNED FROM THE HORN CLUB!? | Double Life | #2" 2759 - }, 2760 - { 2761 - "id": "VvNnCsgyC70", 2762 - "title": "THEY ARE BANNED FROM THE RANCH!! | Double Life | #3" 2763 - }, 2764 - { 2765 - "id": "ewEg2HLeYcs", 2766 - "title": "WRONG PLACE, WRONG TIME!! | Double Life | #4" 2767 - }, 2768 - { 2769 - "id": "39sGYPRSAs4", 2770 - "title": "I AM CURSED.. | Double Life | #5" 2771 - } 2772 - ], 2773 - "Tango": [ 2774 - { 2775 - "id": "Gjvrl2EydaY", 2776 - "title": "Double Life #1 - What a Start!" 2777 - }, 2778 - { 2779 - "id": "NGEa9OP-iOs", 2780 - "title": "Double Life #2 - TREACHERY AT THE RANCH!" 2781 - }, 2782 - { 2783 - "id": "jrKpOdxdei0", 2784 - "title": "Double Life #3 - CHAOS FROM THE DEPTHS!" 2785 - }, 2786 - { 2787 - "id": "t0dHnKN12_4", 2788 - "title": "Double Life #4 - Tragedy Strikes!" 2789 - }, 2790 - { 2791 - "id": "HN3D_fCDZDs", 2792 - "title": "Double Life #5 - The Long Reach of Death..." 2793 - } 2794 - ], 2795 - "ZombieCleo": [ 2796 - { 2797 - "id": "tYw-3fjw5_E", 2798 - "title": "DOUBLE LIFE - 01 - THE BREAK UP" 2799 - }, 2800 - { 2801 - "id": "-IfPoVdj9Fg", 2802 - "title": "UNHINGED EXES? - 02 - DOUBLE LIFE" 2803 - }, 2804 - { 2805 - "id": "4gQZ18SYcho", 2806 - "title": "TRUST FALL - 03 - DOUBLE LIFE" 2807 - }, 2808 - { 2809 - "id": "4IBQtaARO3M", 2810 - "title": "HIRING A HIT - 04 - DOUBLE LIFE" 2811 - }, 2812 - { 2813 - "id": "sxSpeFhFPt4", 2814 - "title": "THE KIDNAPPING - 05 - DOUBLE LIFE" 2815 - }, 2816 - { 2817 - "id": "ifbx7gMJ7-Q", 2818 - "title": "TO THE END - 06 - DOUBLE LIFE" 2819 - } 2820 - ] 2821 - } 2822 - }, 2823 - { 2824 - "id": "last-life", 2825 - "title": "Last Life", 2826 - "seo": { 2827 - "description": { 2828 - "twist": "Each player is randomly assigned between 2 and 6 lives. They can gift one of their lives to another player." 2829 - } 2830 - }, 2831 - "videos": { 2832 - "BdoubleO100": [ 2833 - { 2834 - "id": "4lLZhB_rpOI", 2835 - "title": "Minecraft Last Life: Day 1 - Hunting for a Cure" 2836 - }, 2837 - { 2838 - "id": "i51t3Sv2oFw", 2839 - "title": "Minecraft Last Life: Day 2 - A Close Encounter!" 2840 - }, 2841 - { 2842 - "id": "AghCOtlhWQo", 2843 - "title": "Minecraft Last Life: Day 3 - The HOW MUCH Heroes!" 2844 - }, 2845 - { 2846 - "id": "6gDSHERQqpY", 2847 - "title": "Minecraft Last Life: Day 4 - Running the Traffic Light" 2848 - }, 2849 - { 2850 - "id": "oA6Pd477pQw", 2851 - "title": "Minecraft Last Life: Day 5 - Red Conversion" 2852 - }, 2853 - { 2854 - "id": "3w9Osupu1PA", 2855 - "title": "Turning on the Team AGAIN! - Minecraft Last Life: Day 6" 2856 - } 2857 - ], 2858 - "BigB": [ 2859 - { 2860 - "id": "e2GxBtvaghU", 2861 - "title": "Minecraft LAST LIFE: The Movie", 2862 - "isMovie": true 2863 - }, 2864 - { 2865 - "id": "PoXqTprTFLM", 2866 - "title": "THE NEW BEGINNING! | Minecraft Last Life | Ep.1" 2867 - }, 2868 - { 2869 - "id": "RMgPhpxznlk", 2870 - "title": "I CAN'T BELIEVE THIS!.. - Minecraft Last Life | Ep.2" 2871 - }, 2872 - { 2873 - "id": "k0ksFgh8N9w", 2874 - "title": "THE BOOGEYMAN SONG! - Minecraft Last Life | Ep.3" 2875 - }, 2876 - { 2877 - "id": "tUISy5axJSc", 2878 - "title": "OMG!..DO NOT MOVE! - Minecraft Last Life | Ep.4 (Part 1)" 2879 - }, 2880 - { 2881 - "id": "NpUvDj9KhgU", 2882 - "title": "I'M SORRY! - Minecraft Last Life | Ep.4 (Part 2)" 2883 - }, 2884 - { 2885 - "id": "U9uvzXIwLrI", 2886 - "title": "I'M IN BIG TROUBLE! - Minecraft Last Life | Ep.5" 2887 - }, 2888 - { 2889 - "id": "NDJHvuAZ3KA", 2890 - "title": "IT'S NOT SAFE ANYMORE! - Minecraft Last Life | Ep.6 (Part 1)" 2891 - }, 2892 - { 2893 - "id": "uvET-Rd86Ew", 2894 - "title": "ALL OUT CHAOS!! - Minecraft Last Life | Ep.6 (Part 2)" 2895 - }, 2896 - { 2897 - "id": "Dxgom9g11lk", 2898 - "title": "THE UNEXPECTED DEATHS! - Minecraft Last Life | Ep.7" 2899 - }, 2900 - { 2901 - "id": "wd5qbCXRm00", 2902 - "title": "THE END! - Minecraft Last Life | Ep.8" 2903 - } 2904 - ], 2905 - "Etho": [ 2906 - { 2907 - "id": "B6zQqbby3dQ", 2908 - "title": "Last Life #1: The Gentle Giant" 2909 - }, 2910 - { 2911 - "id": "lD19jNPXYEo", 2912 - "title": "Last Life #3: Frightening Exploit Tactics" 2913 - }, 2914 - { 2915 - "id": "RNz36wVfYes", 2916 - "title": "Last Life #4: BEST Team Brew Heist" 2917 - }, 2918 - { 2919 - "id": "3G4SKQUQoUg", 2920 - "title": "Last Life #5: Boogeyman Business" 2921 - }, 2922 - { 2923 - "id": "-J25_jVfqhU", 2924 - "title": "Last Life #6: BEST Team Struggles" 2925 - }, 2926 - { 2927 - "id": "J_Msxy9RUnI", 2928 - "title": "Last Life #7: Make Up & Break Up" 2929 - }, 2930 - { 2931 - "id": "fbahqk4ypPo", 2932 - "title": "Last Life #8: Plan Bubblevate Initiate" 2933 - }, 2934 - { 2935 - "id": "sM15Xhk2JJE", 2936 - "title": "Last Life #9: The Final Showdown" 2937 - } 2938 - ], 2939 - "GoodTimesWithScar": [ 2940 - { 2941 - "id": "MBmcZNfmJMs", 2942 - "title": "Last Life episode 1: CHAOS SCAR" 2943 - }, 2944 - { 2945 - "id": "SQkCGZbM-iQ", 2946 - "title": "Last Life episode 2: THE ULTIMATE BOGEYMAN SURPRISE" 2947 - }, 2948 - { 2949 - "id": "0qCeBiaRTQY", 2950 - "title": "Last Life episode 3: TRADING LIVES AND A BETRAYAL...." 2951 - }, 2952 - { 2953 - "id": "h5muUkQOios", 2954 - "title": "Last Life episode 4: I Got A Life!" 2955 - }, 2956 - { 2957 - "id": "rpUMj6WQRoQ", 2958 - "title": "Last Life episode 5: I LOST Everything!" 2959 - }, 2960 - { 2961 - "id": "4ewuwaZ73LI", 2962 - "title": "Last Life episode 6: MY REVENGE!" 2963 - }, 2964 - { 2965 - "id": "29vAW4df3Ic", 2966 - "title": "Last Life episode 7: The Last Life Of Scar" 2967 - } 2968 - ], 2969 - "Grian": [ 2970 - { 2971 - "id": "86AOaurCozs", 2972 - "title": "Minecraft Last Life: The Movie (2nd Season)", 2973 - "isMovie": true 2974 - }, 2975 - { 2976 - "id": "hjt-lI4n6B8", 2977 - "title": "Last Life: Episode 1 - A NEW START" 2978 - }, 2979 - { 2980 - "id": "yUBk_zXBbRM", 2981 - "title": "Last Life: Episode 2 - WHO'S THE BOOGEY?" 2982 - }, 2983 - { 2984 - "id": "lcT19t_73J8", 2985 - "title": "Last Life: Episode 3 - BEYOND THE BORDER" 2986 - }, 2987 - { 2988 - "id": "QilgLV6jbxU", 2989 - "title": "Last Life: Episode 4 - UH OH!" 2990 - }, 2991 - { 2992 - "id": "cdvHGAGCq90", 2993 - "title": "Last Life: Episode 5 - IN THE RED" 2994 - }, 2995 - { 2996 - "id": "1Gx4fJNXdzQ", 2997 - "title": "Last Life: Episode 6 - FALL OF THE SOUTHLANDS" 2998 - }, 2999 - { 3000 - "id": "CTaT1zeJ6do", 3001 - "title": "Last Life: Episode 7 - BETRAYED" 3002 - }, 3003 - { 3004 - "id": "0rjMWpBhbJY", 3005 - "title": "Last Life: Episode 8 - THE ENDGAME" 3006 - }, 3007 - { 3008 - "id": "tXoc3OHxW9w", 3009 - "title": "Last Life: Episode 9 - THE FINALE!" 3010 - } 3011 - ], 3012 - "Impulse": [ 3013 - { 3014 - "id": "_rhaCfdMkpE", 3015 - "title": "Minecraft Last Life SMP | Ep 01 - THE NEXT GENERATION OF 3RD LIFE!" 3016 - }, 3017 - { 3018 - "id": "KI9ZCl2TCEU", 3019 - "title": "Minecraft Last Life SMP | Ep 02 - COME AT ME BOOGEYMAN!" 3020 - }, 3021 - { 3022 - "id": "6NdCmlYPj3M", 3023 - "title": "Minecraft Last Life SMP | Ep 03 - THE GREAT SUGARCANE HEIST!" 3024 - }, 3025 - { 3026 - "id": "SomoixvW2Cg", 3027 - "title": "Minecraft Last Life SMP | Ep 04 - BIG BRAIN MUMBO!" 3028 - }, 3029 - { 3030 - "id": "wxtNuVTsj9M", 3031 - "title": "Minecraft Last Life SMP | Ep 05 - A Very Explosive Session!" 3032 - }, 3033 - { 3034 - "id": "bjAFDIPdgHA", 3035 - "title": "Minecraft Last Life SMP | Ep 06 - Boogeyman Blood Bath!" 3036 - }, 3037 - { 3038 - "id": "wNvfFVQIkig", 3039 - "title": "Minecraft Last Life SMP | Ep 07 - RELEASE THE WITHER!" 3040 - } 3041 - ], 3042 - "InTheLittleWood": [ 3043 - { 3044 - "id": "k96C4Yk7cds", 3045 - "title": "Minecraft Last Life #1 - The MA-HAdness Begins!" 3046 - }, 3047 - { 3048 - "id": "2lKt10KTLlc", 3049 - "title": "Minecraft Last Life #2 - It's All Happening TWO Fast!" 3050 - }, 3051 - { 3052 - "id": "Uwn8l1LPGHk", 3053 - "title": "Minecraft Last Life #3 - The Fate Of Yellow Snow" 3054 - }, 3055 - { 3056 - "id": "x0Kj5gPqJLk", 3057 - "title": "Minecraft Last Life #4 - Pa'harting Ways..." 3058 - }, 3059 - { 3060 - "id": "ZrITBNb-vfg", 3061 - "title": "Minecraft Last Life #5 - The Trial Of Timmy" 3062 - }, 3063 - { 3064 - "id": "Dfs4WbUXu68", 3065 - "title": "Minecraft Last Life #6 - Red Light, Green Light" 3066 - }, 3067 - { 3068 - "id": "_j2ftEyCqMc", 3069 - "title": "Minecraft Last Life #7 - Wither Without Us" 3070 - }, 3071 - { 3072 - "id": "eaU0Oe9FLq8", 3073 - "title": "Minecraft Last Life #8 - They're All Gone.." 3074 - }, 3075 - { 3076 - "id": "zzBjYkyC1Hk", 3077 - "title": "Minecraft Last Life #9 - The End (Finale)" 3078 - } 3079 - ], 3080 - "LDShadowLady": [ 3081 - { 3082 - "id": "brlW0eAvGXM", 3083 - "title": "Fairy Circle Fort | Ep. 1 | Last Life" 3084 - }, 3085 - { 3086 - "id": "qZsqvxmMOHQ", 3087 - "title": "Friendship is Magic | Ep. 2 | Last Life" 3088 - }, 3089 - { 3090 - "id": "qh5M4bstxG0", 3091 - "title": "Curses and Haunts | Ep. 3 | Last Life" 3092 - }, 3093 - { 3094 - "id": "6FIDlp4dLYY", 3095 - "title": "Fairy Drama | Ep. 4 | Last Life" 3096 - }, 3097 - { 3098 - "id": "r8Zf7H5Sv9I", 3099 - "title": "FIRE in the Fairy Fort | Ep. 5 | Last Life" 3100 - }, 3101 - { 3102 - "id": "57AlU040Yyg", 3103 - "title": "Disaster Strikes | Ep. 6 | Last Life" 3104 - }, 3105 - { 3106 - "id": "3FDgJ-Sl1m8", 3107 - "title": "The End | Ep. 7 | Last Life" 3108 - } 3109 - ], 3110 - "Mumbo": [ 3111 - { 3112 - "id": "J5jQJ0zLEsA", 3113 - "title": "LAST LIFE: Episode 1 - THE BUNKER" 3114 - }, 3115 - { 3116 - "id": "HjK3YznE2wM", 3117 - "title": "LAST LIFE: Episode 2 - LOSING IT ALL" 3118 - }, 3119 - { 3120 - "id": "XC4kdUM8KSs", 3121 - "title": "LAST LIFE: Episode 3 - BOAT HACKS" 3122 - }, 3123 - { 3124 - "id": "SOQOOuenUMg", 3125 - "title": "LAST LIFE: Episode 4 - GHAST FARM!" 3126 - }, 3127 - { 3128 - "id": "0LfDy0NG8VU", 3129 - "title": "LAST LIFE: Episode 5 - MASS DESTRUCTION" 3130 - }, 3131 - { 3132 - "id": "xKg5eArfqHg", 3133 - "title": "LAST LIFE: Episode 6 - KILLING AND DYING" 3134 - }, 3135 - { 3136 - "id": "yTzDK7hKU94", 3137 - "title": "LAST LIFE: Episode 7 - OH NOOO!" 3138 - } 3139 - ], 3140 - "PearlescentMoon": [ 3141 - { 3142 - "id": "fc8vbgeWrVE", 3143 - "title": "Last Life: New Hardcore Chaos Begins! | Episode 1" 3144 - }, 3145 - { 3146 - "id": "vTOtLoTd5lY", 3147 - "title": "Last Life: Oh No... This Was Unexpected | Episode 2" 3148 - }, 3149 - { 3150 - "id": "Txwvlb7UVfA", 3151 - "title": "Last Life: Doom Approaches! A Life Lost... | Episode 3" 3152 - }, 3153 - { 3154 - "id": "vTA73DLxbx0", 3155 - "title": "Last Life: All the Power! Secrets and Looming Danger | Episode 4" 3156 - }, 3157 - { 3158 - "id": "mOxPD8qLqf4", 3159 - "title": "Last Life: OK, Who Brought the TNT? | Episode 5" 3160 - }, 3161 - { 3162 - "id": "kDNvxH2YWBc", 3163 - "title": "Last Life: The Target On Our Back Grows + Villager Yoinkage | Episode 6" 3164 - }, 3165 - { 3166 - "id": "cT6C9sPZKiI", 3167 - "title": "Last Life | Episode 8: RELENTLESS RECKLESSNESS" 3168 - }, 3169 - { 3170 - "id": "EjQP72eZQgs", 3171 - "title": "Last Life | Episode 9: THE LAST BOOGIE" 3172 - } 3173 - ], 3174 - "Rendog": [ 3175 - { 3176 - "id": "2-OYSt2KqjI", 3177 - "title": "THE GRUMPY TOWER! | Last Life SMP | Ep 01" 3178 - }, 3179 - { 3180 - "id": "KAX9aE67MzY", 3181 - "title": "EXTRA LIFE PLEASE?! | Last Life SMP | Ep 02" 3182 - }, 3183 - { 3184 - "id": "2Z9zpgtIbdA", 3185 - "title": "THE SHADOW ALLIANCE RISES! | Last Life SMP | Ep 03" 3186 - }, 3187 - { 3188 - "id": "wqHdzC_3X3Y", 3189 - "title": "I AM THE BOOGEYMAN!!! :( | Last Life SMP | Ep 04" 3190 - }, 3191 - { 3192 - "id": "UpnVs526cK4", 3193 - "title": "STRONGEST ALLIANCE ON THE SERVER?! | Last Life SMP | Ep 05" 3194 - }, 3195 - { 3196 - "id": "vV43Xk7b1Wo", 3197 - "title": "THE SHADOW STRIKES BACK!! | Last Life SMP | Ep 06" 3198 - }, 3199 - { 3200 - "id": "LEiJbRO3J54", 3201 - "title": "THE SHADOW STRIKES BACK!! | Last Life SMP | Ep 07" 3202 - }, 3203 - { 3204 - "id": "gQ3225RW54I", 3205 - "title": "BANANAS! BANANAS! BANANAS! | Last Life SMP | Ep 08" 3206 - }, 3207 - { 3208 - "id": "RBntocXDZ50", 3209 - "title": "THE END OF LAST LIFE! | Last Life SMP | Ep 09 [FINALE EPISODE]" 3210 - } 3211 - ], 3212 - "Skizzleman": [ 3213 - { 3214 - "id": "7HMAiaG1L2c", 3215 - "title": "Last Life: Episode 1 - A WHOLE NEW WORLD" 3216 - }, 3217 - { 3218 - "id": "Eof4XovRGlQ", 3219 - "title": "Last Life: Episode 2 - DON'T YOU DARE CLOSE YOUR EYES!!!" 3220 - }, 3221 - { 3222 - "id": "n2OpNe8A_0s", 3223 - "title": "Last Life: Episode 3 - THAT'S A PRICEY MISSION!" 3224 - }, 3225 - { 3226 - "id": "bcULUg2J9qc", 3227 - "title": "Last Life: Episode 04 - THE WEBS WE WEAVE!" 3228 - }, 3229 - { 3230 - "id": "rwPMF_YG5Qw", 3231 - "title": "Last Life: Episode 05 - TEMPERATURE RISING!!!" 3232 - }, 3233 - { 3234 - "id": "osJtmi34nKk", 3235 - "title": "Last Life: Episode 06 -THE ULTIMATE TEST FOR B.E.S.T." 3236 - }, 3237 - { 3238 - "id": "KYEG8cWAabo", 3239 - "title": "Last Life: Episode 07 - DANGEROUS TWO MAN ARMY!!" 3240 - } 3241 - ], 3242 - "Smajor1995": [ 3243 - { 3244 - "id": "u3FBVRCxvg8", 3245 - "title": "Minecraft Last Life SMP: The Movie", 3246 - "isMovie": true 3247 - }, 3248 - { 3249 - "id": "sXP7EHp1Ecg", 3250 - "title": "I have the WORST Luck! - Last Life - Ep.1" 3251 - }, 3252 - { 3253 - "id": "rj1k4-3ptpw", 3254 - "title": "The BIGGEST Comeback EVER! - Last Life - Ep.2" 3255 - }, 3256 - { 3257 - "id": "UxtWx0NZEGw", 3258 - "title": "They Tried to Kill me, TWICE! - Last Life - Ep.3" 3259 - }, 3260 - { 3261 - "id": "B7bUi2fgam8", 3262 - "title": "Don’t. Mess. With. The. Wall. - Last Life - Ep.4" 3263 - }, 3264 - { 3265 - "id": "_PIvD4KoIAE", 3266 - "title": "They Blew It Up... - Last Life - Ep.5" 3267 - }, 3268 - { 3269 - "id": "ip9Mp6nnHKI", 3270 - "title": "The WILDEST Episode Yet! - Last Life - Ep.6" 3271 - }, 3272 - { 3273 - "id": "Zms1Mb0Wk70", 3274 - "title": "So. Many. Deaths! - Last Life - Ep.7" 3275 - }, 3276 - { 3277 - "id": "pJEKDQhh5fE", 3278 - "title": "Friends to Enemies... - Last Life - Ep.8" 3279 - }, 3280 - { 3281 - "id": "hKHS_-hoDLQ", 3282 - "title": "The Final Life - Last Life - Ep.9" 3283 - } 3284 - ], 3285 - "SmallishBeans": [ 3286 - { 3287 - "id": "R1v712oKhDA", 3288 - "title": "The Enchanted Cave.. | Last Life Ep.1" 3289 - }, 3290 - { 3291 - "id": "WbNKu5hvkU4", 3292 - "title": "I Betrayed EVERYONE.. | Last Life Ep.2" 3293 - }, 3294 - { 3295 - "id": "MA8MslG2me4", 3296 - "title": "Building My Base & Sugar Cane Heist.. | Last Life Ep.3" 3297 - }, 3298 - { 3299 - "id": "oikIxoLMD40", 3300 - "title": "MY TRAP WORKED!! | Last Life Ep.4" 3301 - }, 3302 - { 3303 - "id": "NQ5d4OpjFvk", 3304 - "title": "Angry House & Sneaky Missions.. | Last Life Ep.5" 3305 - }, 3306 - { 3307 - "id": "p7G-44-lziI", 3308 - "title": "She Killed Me... | Last Life Ep.6" 3309 - }, 3310 - { 3311 - "id": "BNZbBx8ebKw", 3312 - "title": "We Griefed the Server.. | Last Life Ep.7" 3313 - }, 3314 - { 3315 - "id": "XvpM2tWMuxc", 3316 - "title": "I Must End Them.. | Last Life Ep.8" 3317 - }, 3318 - { 3319 - "id": "heyfQWgeCWA", 3320 - "title": "All Against Us.. | Last Life Finale" 3321 - } 3322 - ], 3323 - "Solidarity": [ 3324 - { 3325 - "id": "wiFJxCmMwwo", 3326 - "title": "A BRAND NEW WORLD!! | Last Life | #1" 3327 - }, 3328 - { 3329 - "id": "BocdjGgvYRU", 3330 - "title": "WE MADE A HUGE MISTAKE!? | Last Life | #2" 3331 - }, 3332 - { 3333 - "id": "CgwKGPGDWoc", 3334 - "title": "SOMEONE TRIED TO BURN DOWN THE SOUTHLANDS.. | Last Life | #3" 3335 - }, 3336 - { 3337 - "id": "8fNfOtRjqn0", 3338 - "title": "I PRANKED THE FAIRY FORT AND THIS HAPPENED.. | Last Life | #4" 3339 - }, 3340 - { 3341 - "id": "mpAuQUcrn3s", 3342 - "title": "I GOT EXILED!?.. | Last Life | #5" 3343 - }, 3344 - { 3345 - "id": "9GWDIYs2zo0", 3346 - "title": "I MADE A HUGE MISTAKE.. (RED LIFE!!) | Last Life | #6" 3347 - }, 3348 - { 3349 - "id": "Hv8fOuLU44U", 3350 - "title": "I'M THE FIRST PLAYER ELIMINATED!! | Last Life | #7" 3351 - } 3352 - ], 3353 - "Tango": [ 3354 - { 3355 - "id": "KLlXTA_wifc", 3356 - "title": "Last Life #1! - You Bet Your LIFE!" 3357 - }, 3358 - { 3359 - "id": "3wWXX916BUY", 3360 - "title": "Last Life #2! - We are the B.E.S.T!" 3361 - }, 3362 - { 3363 - "id": "C-OF9hvB0zs", 3364 - "title": "Last Life #3! - The Roctopus!" 3365 - }, 3366 - { 3367 - "id": "1G_ZMUh4HCs", 3368 - "title": "Last Life #4! - An Alliance Broken!" 3369 - }, 3370 - { 3371 - "id": "vtOC19mqJsQ", 3372 - "title": "Last Life #5! - THE RAGE!" 3373 - }, 3374 - { 3375 - "id": "Lll9sI4AYgI", 3376 - "title": "Last Life #6! - Mass Carnage!" 3377 - }, 3378 - { 3379 - "id": "0MutDs1ashM", 3380 - "title": "Last Life #7! - The Trap Master!" 3381 - } 3382 - ], 3383 - "ZombieCleo": [ 3384 - { 3385 - "id": "7BBP2tBAiN4", 3386 - "title": "YELLOW ALREADY - 01 - Last Life" 3387 - }, 3388 - { 3389 - "id": "z8oLTI4QTSM", 3390 - "title": "LAST LIFE - 02 - GATEKEEP, GASLIGHT, GIRLBOSS" 3391 - }, 3392 - { 3393 - "id": "T7KxG9jXAPc", 3394 - "title": "LAST LIFE - 02.5 - AVENGERS TOWER" 3395 - }, 3396 - { 3397 - "id": "8NUmgNESIhE", 3398 - "title": "FAIRIES ASSEMBLE! - 03 (Part 1) - Last Life" 3399 - }, 3400 - { 3401 - "id": "ZbwgmkyPYFU", 3402 - "title": "BLAZING - 3.5 - LAST LIFE" 3403 - }, 3404 - { 3405 - "id": "iRauxN_ocqw", 3406 - "title": "THE BETRAYAL - 04 - LAST LIFE" 3407 - }, 3408 - { 3409 - "id": "vE4kjc60BtQ", 3410 - "title": "LET IT BURN - 05 - LAST LIFE" 3411 - }, 3412 - { 3413 - "id": "eTf3IhyTzjY", 3414 - "title": "THE HEIST - 06 - LAST LIFE" 3415 - }, 3416 - { 3417 - "id": "x5hxAxX8AVs", 3418 - "title": "THE RED RISE - 07 - LAST LIFE" 3419 - }, 3420 - { 3421 - "id": "mujQ77ikjk4", 3422 - "title": "REVENGE - 08 - LAST LIFE" 3423 - }, 3424 - { 3425 - "id": "J_8UODcWIqc", 3426 - "title": "THE END - 09 - LAST LIFE" 3427 - } 3428 - ] 3429 - } 3430 - }, 3431 - { 3432 - "id": "3rd-life", 3433 - "title": "3rd Life", 3434 - "seo": { 3435 - "description": { 3436 - "twist": "Each player starts with 3 lives. After dying 3 times, they are eliminated from the series. Each time player dies, they change their name color. On the last life they become hostile to other players." 3437 - } 3438 - }, 3439 - "videos": { 3440 - "BdoubleO100": [ 3441 - { 3442 - "id": "_VDEFjpj4ag", 3443 - "title": "Minecraft 3rd Life: Day 1 - Massive Phantom Attack!" 3444 - }, 3445 - { 3446 - "id": "rtxp4JCT_1Y", 3447 - "title": "Minecraft 3rd Life: Day 2 - Team Yellow!" 3448 - }, 3449 - { 3450 - "id": "K3_OLhf7Yts", 3451 - "title": "Minecraft 3rd Life: Day 3 - Trial by Lava!" 3452 - }, 3453 - { 3454 - "id": "-GFS_z7Qg0I", 3455 - "title": "Minecraft 3rd Life: Day 4 - Finally in the Red" 3456 - }, 3457 - { 3458 - "id": "kqwmYDlsl6Q", 3459 - "title": "Minecraft 3rd Life: Day 5 - Peekaboo! I See YOU!" 3460 - }, 3461 - { 3462 - "id": "FCiCz_V38dQ", 3463 - "title": "Minecraft 3rd Life: Day 6 - The Nick of Time" 3464 - } 3465 - ], 3466 - "BigB": [ 3467 - { 3468 - "id": "B0Pbni2bDTI", 3469 - "title": "Minecraft 3RD LIFE: The Movie", 3470 - "isMovie": true 3471 - }, 3472 - { 3473 - "id": "hFMlp5qbObk", 3474 - "title": "WHO CAN I TRUST? l Minecraft 3rd Life SMP l EP.1" 3475 - }, 3476 - { 3477 - "id": "fB08GT4rdAY", 3478 - "title": "PHANTOM OF THE NIGHT!l Minecraft 3rd Life SMP l EP.2" 3479 - }, 3480 - { 3481 - "id": "l3XBz_lOE8s", 3482 - "title": "MONOPOLY MOUNTAIN SCAM? l Minecraft 3rd Life SMP l EP.3" 3483 - }, 3484 - { 3485 - "id": "qloCaG0B1AE", 3486 - "title": "I'M SO SORRY! l Minecraft 3rd Life SMP l EP.4" 3487 - }, 3488 - { 3489 - "id": "oa97OwQUvmk", 3490 - "title": "THE FRIENDSHIP DEAL.. l Minecraft 3rd Life SMP l EP.5" 3491 - }, 3492 - { 3493 - "id": "skGBA6eKTMc", 3494 - "title": "MY MOUNTAIN! l Minecraft 3rd Life SMP l EP.6" 3495 - }, 3496 - { 3497 - "id": "0Dd-aPRin70", 3498 - "title": "I CAN'T BELIEVE THIS! l Minecraft 3rd Life SMP l EP.7" 3499 - }, 3500 - { 3501 - "id": "mhU7xCCw9zQ", 3502 - "title": "SO MUCH DEATH! l Minecraft 3rd Life SMP l EP.8" 3503 - }, 3504 - { 3505 - "id": "0ITBWtZp_iM", 3506 - "title": "FINDING ALL THE DIAMONDS💎! l Minecraft 3rd Life SMP l EP.9" 3507 - }, 3508 - { 3509 - "id": "5UZldS2Bh4M", 3510 - "title": "THE RED BANNERS 🚩! l Minecraft 3rd Life SMP l EP.10" 3511 - }, 3512 - { 3513 - "id": "cwpPR3zohOs", 3514 - "title": "ALL OUT WAR! l l Minecraft 3rd Life SMP l EP.11" 3515 - }, 3516 - { 3517 - "id": "wf5ksgLo26A", 3518 - "title": "MY FIRST DEATH! l Minecraft 3rd Life SMP l EP.12" 3519 - }, 3520 - { 3521 - "id": "VsBeG9XIMv4", 3522 - "title": "THE NO KILL PASS! l Minecraft 3rd Life SMP l FINALE!" 3523 - } 3524 - ], 3525 - "Etho": [ 3526 - { 3527 - "id": "r5C1SYXRK60", 3528 - "title": "3rd Life #1: Welcome The Village People" 3529 - }, 3530 - { 3531 - "id": "k6TvhFyCjE4", 3532 - "title": "3rd Life #2: Poorly Kept Secrets" 3533 - }, 3534 - { 3535 - "id": "ISmoDVm57Os", 3536 - "title": "3rd Life #3: Get Shrek's Swamp" 3537 - }, 3538 - { 3539 - "id": "V-ICxDOQ9UU", 3540 - "title": "3rd Life #4: Fanning The Flames" 3541 - }, 3542 - { 3543 - "id": "79kq3Sh98VM", 3544 - "title": "3rd Life #5: Going Up In Flames" 3545 - }, 3546 - { 3547 - "id": "0yfh3Qlca1A", 3548 - "title": "3rd Life #6: Heat Of Battle" 3549 - }, 3550 - { 3551 - "id": "79t2u1ZZjPE", 3552 - "title": "3rd Life #7: Fallen Ashes" 3553 - } 3554 - ], 3555 - "GoodTimesWithScar": [ 3556 - { 3557 - "id": "4vEzj79pTfE", 3558 - "title": "3RD Life - episode 1: RIP ME!" 3559 - }, 3560 - { 3561 - "id": "XOEgW45J3TI", 3562 - "title": "3RD Life SMP - episode 2: What Happened To Pizza?!" 3563 - }, 3564 - { 3565 - "id": "6dgmkmRnPrI", 3566 - "title": "3RD Life SMP - Episode 3: The Great DEMISE!" 3567 - }, 3568 - { 3569 - "id": "whvHz4azNOA", 3570 - "title": "3RD Life SMP - Episode 4: Adventures Of Mr. BUBBLES" 3571 - }, 3572 - { 3573 - "id": "AfgPPJL6Y44", 3574 - "title": "3RD Life SMP - Episode 5: A Great Loss.." 3575 - }, 3576 - { 3577 - "id": "MpPUy4g3Tlk", 3578 - "title": "3RD Life SMP - Episode 6: Mistakes Were Made!" 3579 - }, 3580 - { 3581 - "id": "htvcL8qXsoc", 3582 - "title": "3RD Life SMP - Episode 7: THE FALLEN KINGDOM" 3583 - }, 3584 - { 3585 - "id": "fK8Xm5mJDQc", 3586 - "title": "3RD Life SMP - Final: The King Slayer" 3587 - } 3588 - ], 3589 - "Grian": [ 3590 - { 3591 - "id": "P0I_9-Q5qD0", 3592 - "title": "Minecraft 3rd Life: The Movie (1st Season)", 3593 - "isMovie": true 3594 - }, 3595 - { 3596 - "id": "nszciRXXJZk", 3597 - "title": "Grian plays Minecraft... With a TWIST: 3rd Life - Ep 1" 3598 - }, 3599 - { 3600 - "id": "sl2VD8fQ-go", 3601 - "title": "3rd Life: Episode 2 - WELCOME TO SANDLAND" 3602 - }, 3603 - { 3604 - "id": "qcJ2ATYN0UI", 3605 - "title": "3rd Life: Episode 3 - DESERT DEFENSES" 3606 - }, 3607 - { 3608 - "id": "S_BGbpfPWc0", 3609 - "title": "3rd Life: Episode 4 - I HAVE A PLAN" 3610 - }, 3611 - { 3612 - "id": "aV3bsP08VOk", 3613 - "title": "3rd Life: Episode 5 - NETHERITE UPGRADES" 3614 - }, 3615 - { 3616 - "id": "4jswF-loe_U", 3617 - "title": "3rd Life: Episode 6 - A NEW BASE" 3618 - }, 3619 - { 3620 - "id": "BkAgQdivl0U", 3621 - "title": "3rd Life: Episode 7 - THE BATTLE OF RED DESERT" 3622 - }, 3623 - { 3624 - "id": "jft49jbtbxU", 3625 - "title": "3rd Life: Episode 8 - THE FINAL LIFE" 3626 - } 3627 - ], 3628 - "Impulse": [ 3629 - { 3630 - "id": "ieaaUZ-_u6Y", 3631 - "title": "Minecraft 3rd Life SMP | Ep 01 - A Minecraft SMP Experience Like Never Before!" 3632 - }, 3633 - { 3634 - "id": "_6TsNMoHLeE", 3635 - "title": "Minecraft 3rd Life SMP | Ep 02 - An Alliance Has Formed!" 3636 - }, 3637 - { 3638 - "id": "MVh-DosrbZw", 3639 - "title": "Minecraft 3rd Life SMP | Ep 03 - We Be Vibin' Again!" 3640 - }, 3641 - { 3642 - "id": "8Zh50GKg4Zw", 3643 - "title": "Minecraft 3rd Life SMP | Ep 04 - Farming Diamonds The Easy Way!" 3644 - }, 3645 - { 3646 - "id": "Q6DVP5Aiphg", 3647 - "title": "Minecraft 3rd Life SMP | Ep 05 - OP Villagers & Chaos!" 3648 - }, 3649 - { 3650 - "id": "p_yrYZEz9ZQ", 3651 - "title": "Minecraft 3rd Life SMP | Ep 06 - Tough Love!" 3652 - }, 3653 - { 3654 - "id": "Jr3hKHny87w", 3655 - "title": "Minecraft 3rd Life SMP | Ep 07 - LINES HAVE BEEN DRAWN!" 3656 - }, 3657 - { 3658 - "id": "v3FGN1yNagk", 3659 - "title": "Minecraft 3rd Life SMP | Ep 08 - THE ULTIMATE BETRAYAL!" 3660 - }, 3661 - { 3662 - "id": "R1vsGpzThZY", 3663 - "title": "Minecraft 3rd Life SMP | Ep 09 - THE BATTLE OF DOGWARTS (FINALE)!" 3664 - } 3665 - ], 3666 - "InTheLittleWood": [ 3667 - { 3668 - "id": "UEEkqVyunZY", 3669 - "title": "Minecraft 3rd Life: The Movie (Season 1 InTheLittleWood POV)", 3670 - "isMovie": true 3671 - }, 3672 - { 3673 - "id": "Gt0lAzOlQqY", 3674 - "title": "First Death Is My Fault? | Minecraft 3rd Life SMP #1" 3675 - }, 3676 - { 3677 - "id": "3DTFE-94vSE", 3678 - "title": "Business Turns Sour... | Minecraft 3rd Life SMP #2" 3679 - }, 3680 - { 3681 - "id": "lxRqvgi8baI", 3682 - "title": "The Undercover Villager Heist | Minecraft 3rd Life SMP #3" 3683 - }, 3684 - { 3685 - "id": "_CYecMBqB2I", 3686 - "title": "The Nether Wall | Minecraft 3rd Life SMP #4" 3687 - }, 3688 - { 3689 - "id": "_TgzxVIzeko", 3690 - "title": "The List.. | Minecraft 3rd Life SMP #5" 3691 - }, 3692 - { 3693 - "id": "k2HlvseAUE8", 3694 - "title": "A King Is Crowned | Minecraft 3rd Life SMP #6" 3695 - }, 3696 - { 3697 - "id": "PKIWhPN0mec", 3698 - "title": "The Siege Of Dogwarts | Minecraft 3rd Life SMP #7" 3699 - }, 3700 - { 3701 - "id": "wfUU3gh2Ock", 3702 - "title": "Red Winter Is Coming | Minecraft 3rd Life SMP #8" 3703 - }, 3704 - { 3705 - "id": "g60pruQUMl4", 3706 - "title": "The One Where They All Fight | Minecraft 3rd Life SMP #9" 3707 - }, 3708 - { 3709 - "id": "AqnnBjHO8eM", 3710 - "title": "He Must Fall | Minecraft 3rd Life SMP #10" 3711 - }, 3712 - { 3713 - "id": "m8BcgBrM1tA", 3714 - "title": "The Hand | Minecraft 3rd Life SMP #11 (Finale)" 3715 - } 3716 - ], 3717 - "Rendog": [ 3718 - { 3719 - "id": "jgxX-ErMEK0", 3720 - "title": "3rd Life SMP | WHO WANTS TO TRADE?! | Ep 01" 3721 - }, 3722 - { 3723 - "id": "EvuNThrQieY", 3724 - "title": "3rd Life SMP | HAVE A RENCHANTED DAY! | Ep 02" 3725 - }, 3726 - { 3727 - "id": "b4bBHFAHhV4", 3728 - "title": "3rd Life SMP | A HAPPY LITTLE ACCIDENT! | Ep 03" 3729 - }, 3730 - { 3731 - "id": "-Z-DApCN3hs", 3732 - "title": "3rd Life SMP | WHAT THE LLAMA?! | Ep 04" 3733 - }, 3734 - { 3735 - "id": "-0cZtg9BSwc", 3736 - "title": "3rd Life SMP | THE MESS WE'VE MADE! | Ep 05" 3737 - }, 3738 - { 3739 - "id": "ExrFLHUd1_Q", 3740 - "title": "3rd Life SMP | SPECIAL DELIVERY! | Ep 06" 3741 - }, 3742 - { 3743 - "id": "8qdDH8TC6HI", 3744 - "title": "3rd Life SMP | SCAR WANTS RENCHANTING!!! | Ep 07" 3745 - }, 3746 - { 3747 - "id": "D0ON-ratWvE", 3748 - "title": "3rd Life SMP | BLOWN TO BITS!! | Ep 08" 3749 - }, 3750 - { 3751 - "id": "tQNb1P1tm3I", 3752 - "title": "3rd Life SMP | THE RED KING RISES!! | Ep 09" 3753 - }, 3754 - { 3755 - "id": "rKuhB6-Dxzc", 3756 - "title": "3rd Life SMP | RED TEAM WINS! | Ep 10" 3757 - }, 3758 - { 3759 - "id": "2LO4IFgTybg", 3760 - "title": "3rd Life SMP | WE'VE BEEN BETRAYED!! | Ep 11" 3761 - }, 3762 - { 3763 - "id": "r2aJkb7wsVg", 3764 - "title": "3rd Life SMP | FALL OF THE KING FINALE!! | Ep 12" 3765 - } 3766 - ], 3767 - "Skizzleman": [ 3768 - { 3769 - "id": "94nnV34QXwA", 3770 - "title": "3rd Life: Episode 1 - MINECRAFT SMP DONE...DIFFERENTLY!" 3771 - }, 3772 - { 3773 - "id": "toDfEA6-Ai8", 3774 - "title": "3rd Life: Episode 2 - MEETING THE WHOLE FAMILY." 3775 - }, 3776 - { 3777 - "id": "D3WDSm0ws1Y", 3778 - "title": "3rd Life: Episode 3 - SKIZZ....THE SERVER CHUMP!" 3779 - }, 3780 - { 3781 - "id": "TKwOIztd7Dc", 3782 - "title": "3rd Life: Episode 4 - AN EXPLOSIVE EXPERIENCE!!!" 3783 - }, 3784 - { 3785 - "id": "X6FfPnIh30g", 3786 - "title": "3rd Life: Episode 5 - CHUMP TO CHAMP BABY!!!" 3787 - }, 3788 - { 3789 - "id": "fkyk_YJ-3FI", 3790 - "title": "3rd Life: Episode 6 - The Red Army Rules!!!" 3791 - }, 3792 - { 3793 - "id": "kFAFkXTn_F0", 3794 - "title": "3rd Life: Episode 7 - SKIZZ UNLEASHED!!!" 3795 - } 3796 - ], 3797 - "Smajor1995": [ 3798 - { 3799 - "id": "eJ5tSUp4Zjg", 3800 - "title": "Minecraft 3rd Life SMP: The Movie", 3801 - "isMovie": true 3802 - }, 3803 - { 3804 - "id": "ZCuqjCSvy9U", 3805 - "title": "I've NEVER done a series like THIS before! - Minecraft 3rd Life SMP - Ep.1" 3806 - }, 3807 - { 3808 - "id": "-4SGLwU27Fg", 3809 - "title": "The Nether Is MINE Now! - Minecraft 3rd Life SMP - Ep.2" 3810 - }, 3811 - { 3812 - "id": "ywp69TdlTzE", 3813 - "title": "The Great Cow HEIST! - Minecraft 3rd Life SMP - Ep.3" 3814 - }, 3815 - { 3816 - "id": "AyPq57lL0LU", 3817 - "title": "SO MANY DEATHS! - Minecraft 3rd Life SMP - Ep.4" 3818 - }, 3819 - { 3820 - "id": "gARUHjShKOE", 3821 - "title": "Alliances, Enemies & DEATH! - Minecraft 3rd Life SMP - Ep.5" 3822 - }, 3823 - { 3824 - "id": "djdjkOQov_s", 3825 - "title": "Someone is going to PAY for this!... - Minecraft 3rd Life SMP - Ep.6" 3826 - }, 3827 - { 3828 - "id": "1G_UCWCdKoQ", 3829 - "title": "The one where they all BLOW UP! - Minecraft 3rd Life SMP - Ep.7" 3830 - }, 3831 - { 3832 - "id": "8dyqBNvsjzM", 3833 - "title": "And they all Died Happily Ever After... - Minecraft 3rd Life SMP - Ep.8 FINALE" 3834 - } 3835 - ], 3836 - "SmallishBeans": [ 3837 - { 3838 - "id": "rS3DWyyW6Bw", 3839 - "title": "A Scary Start.. | 3rd Life | Ep.1" 3840 - }, 3841 - { 3842 - "id": "oRlSNKrVnd0", 3843 - "title": "I Have The Monopoly Now.. | 3rd Life | Ep.2" 3844 - }, 3845 - { 3846 - "id": "6rESEPbejOk", 3847 - "title": "Building My Base! | 3rd Life | Ep.3" 3848 - }, 3849 - { 3850 - "id": "DVWcKQ1g3kQ", 3851 - "title": "What Did it Cost? | 3rd Life | Ep.4" 3852 - }, 3853 - { 3854 - "id": "YOXiGHURnfE", 3855 - "title": "Burnt & Reborn.. | 3rd Life | Ep.5" 3856 - }, 3857 - { 3858 - "id": "_9dQY4OPOGU", 3859 - "title": "Let's Burn Some Stuff.. | 3rd Life | Ep.6" 3860 - }, 3861 - { 3862 - "id": "PEZdPCyNavo", 3863 - "title": "The Wolf King Rises.. | 3rd Life | Finale" 3864 - } 3865 - ], 3866 - "Solidarity": [ 3867 - { 3868 - "id": "CZ6jvuup6VY", 3869 - "title": "A DEADLY NEW ADVENTURE!! | Minecraft 3rd Life SMP | #1" 3870 - }, 3871 - { 3872 - "id": "91cDgEafDT0", 3873 - "title": "WE RUINED THEIR MASTER PLAN.. | Minecraft 3rd Life SMP | #2" 3874 - }, 3875 - { 3876 - "id": "w4oC6VUyL0c", 3877 - "title": "I FOUND SOMEONE'S SECRET HIDEOUT.. | Minecraft 3rd Life SMP | #3" 3878 - }, 3879 - { 3880 - "id": "xDWHnmh4vG0", 3881 - "title": "I DIED TWICE!? | Minecraft 3rd Life SMP | #4" 3882 - }, 3883 - { 3884 - "id": "6BwO3zeY9Gw", 3885 - "title": "THE SECRET RED LIFE ROOM.. | Minecraft 3rd Life SMP | #5" 3886 - }, 3887 - { 3888 - "id": "TeUNMuPYnFI", 3889 - "title": "SOMEONE BURNT DOWN OUR BASE!! | Minecraft 3rd Life SMP | #6" 3890 - }, 3891 - { 3892 - "id": "zIo2G1kZIxs", 3893 - "title": "THE FIRST PLAYER ELIMINATED FROM 3RD LIFE!! | Minecraft 3rd Life SMP | #7" 3894 - } 3895 - ], 3896 - "Tango": [ 3897 - { 3898 - "id": "ZdkaI5bXsuE", 3899 - "title": "3rd Life #1 - Refugees and Death Pranks!" 3900 - }, 3901 - { 3902 - "id": "S2LP3Bz2Mpc", 3903 - "title": "3rd Life #2 - Pants Swappers and Team Castle!" 3904 - }, 3905 - { 3906 - "id": "MzD3KEI3rp0", 3907 - "title": "3rd Life #3 - Bovine Blackmail and Happy Fun Sauce!" 3908 - }, 3909 - { 3910 - "id": "0N8IkfOoZ9M", 3911 - "title": "3rd Life #4 - We Got Em!" 3912 - }, 3913 - { 3914 - "id": "GG_Icm2bh1k", 3915 - "title": "3rd Life #5 - The Firing Squad!" 3916 - }, 3917 - { 3918 - "id": "1UWFmQOvn6Q", 3919 - "title": "3rd Life #6 - Double Double Agent!" 3920 - }, 3921 - { 3922 - "id": "11chXNJb0wc", 3923 - "title": "3rd Life #7 - Team Crastle!" 3924 - }, 3925 - { 3926 - "id": "IvDIlLwJv_M", 3927 - "title": "3rd LIFE FINALE! - Massive Battle!" 3928 - } 3929 - ], 3930 - "ZombieCleo": [ 3931 - { 3932 - "id": "3tNCZroHays", 3933 - "title": "3rd Life - 01 - TREE.T.S.D" 3934 - }, 3935 - { 3936 - "id": "UDp0qbzjSok", 3937 - "title": "3rd LIFE - 02 - The Betrayal" 3938 - }, 3939 - { 3940 - "id": "_2uuDLvSN0Q", 3941 - "title": "I DID A BAD THING - 03 - 3rd Life" 3942 - }, 3943 - { 3944 - "id": "bBgp4VUPdeg", 3945 - "title": "THE FALL - 04 - 3rd Life" 3946 - }, 3947 - { 3948 - "id": "3zP-bClr2S8", 3949 - "title": "THE PLAN - 05 - 3rd Life" 3950 - }, 3951 - { 3952 - "id": "RY5mboQ3-XY", 3953 - "title": "CRASTLE DEFENCE - 06 - 3rd Life" 3954 - }, 3955 - { 3956 - "id": "oGEr2M9L4TE", 3957 - "title": "ETHO ALERT - 07 - 3rd Life" 3958 - }, 3959 - { 3960 - "id": "TRiF-ExELn4", 3961 - "title": "BATTLE OF BEAN HILL - 08 - 3rd Life" 3962 - }, 3963 - { 3964 - "id": "KwwTBFaL_qs", 3965 - "title": "BETTER RED THAN DEAD - 09 - 3rd Life" 3966 - } 3967 - ] 3968 - } 3969 - } 3970 - ]
+7 -7
src/data/seasons.json
··· 183 183 } 184 184 }, 185 185 { 186 - "id": "7", 186 + "id": "past-life", 187 187 "title": "Past Life", 188 188 "sessionCount": 8, 189 189 "seo": { ··· 719 719 } 720 720 }, 721 721 { 722 - "id": "6", 722 + "id": "wild-life", 723 723 "title": "Wild Life", 724 724 "seo": { 725 725 "description": { ··· 1336 1336 } 1337 1337 }, 1338 1338 { 1339 - "id": "5", 1339 + "id": "secret-life", 1340 1340 "title": "Secret Life", 1341 1341 "seo": { 1342 1342 "description": { ··· 1983 1983 } 1984 1984 }, 1985 1985 { 1986 - "id": "4", 1986 + "id": "limited-life", 1987 1987 "title": "Limited Life", 1988 1988 "seo": { 1989 1989 "description": { ··· 2447 2447 } 2448 2448 }, 2449 2449 { 2450 - "id": "3", 2450 + "id": "double-life", 2451 2451 "title": "Double Life", 2452 2452 "seo": { 2453 2453 "description": { ··· 2821 2821 } 2822 2822 }, 2823 2823 { 2824 - "id": "2", 2824 + "id": "last-life", 2825 2825 "title": "Last Life", 2826 2826 "seo": { 2827 2827 "description": { ··· 3429 3429 } 3430 3430 }, 3431 3431 { 3432 - "id": "1", 3432 + "id": "3rd-life", 3433 3433 "title": "3rd Life", 3434 3434 "seo": { 3435 3435 "description": {
-7
src/env.d.ts
··· 1 - /// <reference types="astro/client" /> 2 - 3 - declare namespace App { 4 - interface Locals { 5 - isRewrite: boolean; 6 - } 7 - }
+10 -7
src/layouts/BaseLayout.astro
··· 1 1 --- 2 + import { Font } from 'astro:assets'; 2 3 import { Head } from 'astro-capo'; 3 - 4 4 import CustomCursor from '@/components/CustomCursor.astro'; 5 5 import PostHog from '@/components/posthog.astro'; 6 6 import '@/styles/global.css'; 7 7 8 8 interface Props { 9 9 title: string; 10 + favicon?: string; 10 11 } 11 12 12 - const { title } = Astro.props; 13 - 14 - Astro.response.headers.set('Cache-Control', 'public, max-age=0, s-maxage=86400'); 15 - Astro.response.headers.set('CDN-Cache-Control', 'public, max-age=0, s-maxage=86400'); 13 + const { title, favicon } = Astro.props; 16 14 --- 17 15 18 16 <html lang="en"> 19 17 <Head> 18 + <script is:inline>document.documentElement.classList.add('js')</script> 20 19 <meta charset="utf-8" /> 21 20 <meta name="theme-color" content="#d9ebd2" /> 22 - <link rel="icon" type="image/svg+xml" href="/favicon_green.svg" /> 21 + {favicon 22 + ? <link rel="icon" href={favicon} /> 23 + : <link rel="icon" href="/favicon.png" /> 24 + } 23 25 <link rel="sitemap" href="/sitemap-index.xml" /> 24 26 <meta name="viewport" content="width=device-width" /> 25 27 <meta name="generator" content={Astro.generator} /> 26 - <title>{title} · Life Series · Non-official site</title> 28 + <title>{title} - Life Series - Non-official site</title> 29 + <Font cssVariable="--font-nunito" preload /> 27 30 <slot name="seo" /> 28 31 <PostHog /> 29 32 </Head>
-142
src/layouts/SeasonsLayout.astro
··· 1 - --- 2 - import { type CollectionEntry, getCollection } from 'astro:content'; 3 - import { Head } from 'astro-capo'; 4 - import CustomCursor from '@/components/CustomCursor.astro'; 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 - import '@/styles/global.css'; 10 - 11 - interface Props { 12 - title: string; 13 - season: CollectionEntry<'seasons'>; 14 - canPageBecomeScrollable?: boolean; 15 - } 16 - 17 - const { title, season, canPageBecomeScrollable } = Astro.props; 18 - 19 - const seasons = await getCollection('seasons'); 20 - const members = await getCollection('members'); 21 - 22 - Astro.response.headers.set('Cache-Control', 'public, max-age=0, s-maxage=86400'); 23 - Astro.response.headers.set('CDN-Cache-Control', 'public, max-age=0, s-maxage=86400'); 24 - --- 25 - 26 - <html 27 - lang="en" 28 - class:list={[{ 'custom-scrollbar-gutter-stable': canPageBecomeScrollable }]} 29 - > 30 - <Head> 31 - <meta charset="utf-8" /> 32 - <meta 33 - name="theme-color" 34 - content="#d9ebd2" 35 - /> 36 - <link 37 - rel="icon" 38 - type="image/svg+xml" 39 - href="/favicon_green.svg" 40 - /> 41 - <link 42 - rel="sitemap" 43 - href="/sitemap-index.xml" 44 - /> 45 - <meta 46 - name="viewport" 47 - content="width=device-width" 48 - /> 49 - <meta 50 - name="generator" 51 - content={Astro.generator} 52 - /> 53 - <title>{title} · Life Series · Non-official site</title> 54 - <slot name="seo" /> 55 - <PostHog /> 56 - </Head> 57 - <body> 58 - <a 59 - href="#main-content" 60 - class="bg-canvas sr-only top-16 left-24 z-1 focus-visible:not-sr-only focus-visible:fixed focus-visible:px-8 focus-visible:py-4" 61 - > 62 - Skip to main content 63 - </a> 64 - <button 65 - class="border-canvas bg-canvas-text text-canvas fixed right-16 bottom-16 z-1 flex aspect-square cursor-pointer items-center justify-center rounded-full border-2 p-12 shadow-md md:hidden" 66 - popovertarget="mobile-menu" 67 - > 68 - <MenuIcon /> 69 - <span class="sr-only">Menu</span> 70 - </button> 71 - <div 72 - id="mobile-menu" 73 - class="border-canvas-text inset-auto right-16 bottom-76 ml-16 max-h-[calc(100%-92px)] max-w-[calc(100%-32px)] overscroll-y-none rounded-lg border-2 shadow-md" 74 - popover 75 - > 76 - <div class="flex items-end"> 77 - <div class="sticky bottom-0 max-h-[calc(100svh-96px)] shrink-0 overflow-y-auto"> 78 - <h2 79 - id="all-seasons-title" 80 - class="sr-only" 81 - > 82 - All seasons 83 - </h2> 84 - <nav aria-labelledby="all-seasons-title"> 85 - <SeasonList seasons={seasons} /> 86 - </nav> 87 - </div> 88 - <div class="px-24"> 89 - <h2 90 - id="all-members-title" 91 - class="sr-only" 92 - > 93 - All members 94 - </h2> 95 - <nav aria-labelledby="all-members-title"> 96 - <MemberList 97 - season={season} 98 - members={members} 99 - /> 100 - </nav> 101 - </div> 102 - </div> 103 - </div> 104 - <div class="grid min-h-svh items-start md:grid-cols-[auto_auto_1fr]"> 105 - <div 106 - class="custom-scrollbar-gutter-stable sticky top-0 hidden h-full max-h-svh overflow-y-auto overscroll-y-none md:grid" 107 - > 108 - <div class="self-center"> 109 - <h2 110 - id="all-seasons-title" 111 - class="sr-only" 112 - > 113 - All seasons 114 - </h2> 115 - <nav aria-labelledby="all-seasons-title"> 116 - <SeasonList seasons={seasons} /> 117 - </nav> 118 - </div> 119 - </div> 120 - <div 121 - class="custom-scrollbar-gutter-stable sticky top-0 hidden h-full max-h-svh overflow-y-auto overscroll-y-none pl-2 md:grid" 122 - > 123 - <div class="self-center"> 124 - <h2 125 - id="all-members-title" 126 - class="sr-only" 127 - > 128 - All members 129 - </h2> 130 - <nav aria-labelledby="all-members-title"> 131 - <MemberList 132 - season={season} 133 - members={members} 134 - /> 135 - </nav> 136 - </div> 137 - </div> 138 - <slot /> 139 - </div> 140 - <CustomCursor /> 141 - </body> 142 - </html>
-38
src/layouts/rewrite/BaseLayout.astro
··· 1 - --- 2 - import { Font } from 'astro:assets'; 3 - import { Head } from 'astro-capo'; 4 - import CustomCursor from '@/components/rewrite/CustomCursor.astro'; 5 - import '@/styles/rewrite/global.css'; 6 - 7 - interface Props { 8 - title: string; 9 - favicon?: string; 10 - } 11 - 12 - const { title, favicon } = Astro.props; 13 - --- 14 - 15 - <html lang="en"> 16 - <Head> 17 - <script is:inline>document.documentElement.classList.add('js')</script> 18 - <meta charset="utf-8" /> 19 - <meta name="theme-color" content="#d9ebd2" /> 20 - {favicon 21 - ? <link rel="icon" href={favicon} /> 22 - : <link rel="icon" href="/rewrite/favicon.png" /> 23 - } 24 - <!-- TODO --> 25 - <!-- <link rel="sitemap" href="/sitemap-index.xml" /> --> 26 - <meta name="viewport" content="width=device-width" /> 27 - <meta name="generator" content={Astro.generator} /> 28 - <title>{title} - Life Series - Non-official site</title> 29 - <Font cssVariable="--font-nunito" preload /> 30 - <slot name="seo" /> 31 - <!-- TODO --> 32 - <!-- <PostHog /> --> 33 - </Head> 34 - <body> 35 - <slot /> 36 - <CustomCursor /> 37 - </body> 38 - </html>
-29
src/middleware.ts
··· 1 - import { defineMiddleware } from 'astro:middleware'; 2 - 3 - const REWRITE_SECRET = import.meta.env.REWRITE_SECRET || 'rewrite-secret'; 4 - const COOKIE_NAME = 'rewrite'; 5 - 6 - export const onRequest = defineMiddleware(async (context, next) => { 7 - const url = new URL(context.request.url); 8 - const rewriteParam = url.searchParams.get('rewrite'); 9 - 10 - // Activate rewrite: ?rewrite=your-secret 11 - if (rewriteParam === REWRITE_SECRET) { 12 - context.cookies.set(COOKIE_NAME, 'true', { 13 - path: '/', 14 - httpOnly: true, 15 - sameSite: 'lax', 16 - maxAge: 31536000, 17 - }); 18 - } 19 - 20 - // Deactivate rewrite: ?rewrite=off 21 - if (rewriteParam === 'off') { 22 - context.cookies.delete(COOKIE_NAME, { path: '/' }); 23 - } 24 - 25 - const isRewrite = context.cookies.get(COOKIE_NAME)?.value === 'true'; 26 - context.locals.isRewrite = isRewrite; 27 - 28 - return next(); 29 - });
+95 -34
src/pages/index.astro
··· 1 1 --- 2 - import { getImage, Image } from 'astro:assets'; 3 - import { site } from 'astro:config/client'; 2 + import { Image } from 'astro:assets'; 3 + import type { CollectionEntry } from 'astro:content'; 4 4 import { getCollection } from 'astro:content'; 5 5 import { SEO } from 'astro-seo'; 6 - import ogIndexImage from '@/assets/images/og/index.png'; 6 + import ogIndexImage from '@/assets/images/og/index.webp'; 7 7 import BaseLayout from '@/layouts/BaseLayout.astro'; 8 8 import { getSeasonImage } from '@/utils/images'; 9 9 10 - const { isRewrite } = Astro.locals; 11 - if (isRewrite) { 12 - return Astro.redirect('/404'); 13 - } 14 - 15 10 const seasons = await getCollection('seasons'); 16 11 17 12 const ogTitle = 'The Life Series Minecraft hardcore survival multiplayer series.'; 18 - const ogDescription = 19 - 'Non-official site. Watch all The Life Series member point of views from all seasons.'; 20 - const ogImage = `${site}${ 21 - ( 22 - await getImage({ 23 - src: ogIndexImage, 24 - format: 'webp', 25 - width: 1200, 26 - height: 630, 27 - }) 28 - ).src 29 - }`; 30 - const ogImageAlt = 31 - 'Grid of all 7 Life Series season logos in order from newest to oldest - "Past Life", "Wild Life", "Secret Life", "Limited Life", "Double Life", "Last Life", "Third Life"'; 13 + const ogDescription = 'Non-official site. Watch all The Life Series member point of views from all seasons.'; 14 + const ogImage = ogIndexImage.src; 15 + const ogImageAlt = 'Grid of 8 Life Series season logos in order from newest to oldest - "Nice Life", "Past Life", "Wild Life", "Secret Life", "Limited Life", "Double Life", "Last Life", "Third Life"'; 16 + 17 + function getUrl(season: CollectionEntry<'seasons'>) { 18 + if (season.data.sessionCount) { 19 + return `/seasons/${season.id}/sessions/1`; 20 + } 21 + 22 + return `/seasons/${season.id}`; 23 + } 32 24 --- 33 25 34 26 <BaseLayout title="Home"> 35 27 <SEO 36 28 slot="seo" 29 + title={ogTitle} 37 30 description={ogDescription} 38 31 openGraph={{ 39 32 basic: { ··· 58 51 imageAlt: ogImageAlt, 59 52 }} 60 53 /> 61 - <main class="grid min-h-svh items-center justify-items-center overflow-x-hidden p-32"> 62 - <h1 class="sr-only">Life Series · Non-official site</h1> 63 - <nav class="w-full max-w-636"> 64 - <ol 65 - role="list" 66 - class="seasons-list grid grid-cols-[repeat(auto-fit,minmax(min(180px,100%),1fr))] place-items-center gap-48" 67 - reversed 68 - > 54 + <main> 55 + <h1 class="visually-hidden">Home - Life Series - Non-official site</h1> 56 + <nav> 57 + <ol role="list" reversed> 69 58 { 70 59 seasons.map((season) => ( 71 60 <li> 72 - <a href={`/seasons/${season.id}`}> 61 + <a href={getUrl(season)}> 73 62 <Image 74 63 src={getSeasonImage(season.id)} 75 64 width="360" 76 - alt="" 65 + alt={season.data.title} 77 66 loading="eager" 78 - class="max-w-180" 79 67 /> 80 - <span class="sr-only">{season.data.title}</span> 81 68 </a> 82 69 </li> 83 70 )) ··· 86 73 </nav> 87 74 </main> 88 75 </BaseLayout> 76 + 77 + <style> 78 + main { 79 + box-sizing: border-box; 80 + display: grid; 81 + min-block-size: 100svh; 82 + place-items: center; 83 + padding: 32px; 84 + } 85 + 86 + nav { 87 + inline-size: 100%; 88 + max-inline-size: 636px; 89 + } 90 + 91 + ol { 92 + display: grid; 93 + grid-template-columns: repeat(auto-fit, minmax(min(180px, 100%), 1fr)); 94 + place-items: center; 95 + gap: 48px; 96 + } 97 + 98 + li { 99 + @media (prefers-reduced-motion: no-preference) { 100 + &:nth-child(odd) { 101 + --angle: 2deg; 102 + } 103 + 104 + &:nth-child(even) { 105 + --angle: -2deg; 106 + } 107 + } 108 + } 109 + 110 + a { 111 + @media (prefers-reduced-motion: no-preference) { 112 + transition: 113 + scale var(--spring-transition-duration), 114 + rotate var(--spring-transition-duration); 115 + transition-timing-function: var(--spring-transition-timing-function); 116 + 117 + &:focus-visible { 118 + scale: 1.075; 119 + rotate: var(--angle); 120 + } 121 + } 122 + 123 + @media (hover: hover) and (prefers-reduced-motion: no-preference) { 124 + &:hover { 125 + scale: 1.075; 126 + rotate: var(--angle); 127 + } 128 + } 129 + } 130 + 131 + img { 132 + max-inline-size: 180px; 133 + transition-property: filter, opacity; 134 + transition-duration: 100ms; 135 + transition-timing-function: linear; 136 + 137 + :has(a:focus-visible) a:not(:focus-visible) & { 138 + filter: grayscale(75%); 139 + opacity: 0.8; 140 + } 141 + 142 + @media (hover: hover) { 143 + :has(a:hover) a:not(:hover) & { 144 + filter: grayscale(75%); 145 + opacity: 0.8; 146 + } 147 + } 148 + } 149 + </style>
+3 -3
src/pages/rewrite/attribution.astro src/pages/attribution.astro
··· 1 1 --- 2 2 import { Icon } from 'astro-icon/components'; 3 - import SiteFooter from '@/components/rewrite/SiteFooter.astro'; 4 - import SiteHeader from '@/components/rewrite/SiteHeader.astro'; 5 - import BaseLayout from '@/layouts/rewrite/BaseLayout.astro'; 3 + import SiteFooter from '@/components/SiteFooter.astro'; 4 + import SiteHeader from '@/components/SiteHeader.astro'; 5 + import BaseLayout from '@/layouts/BaseLayout.astro'; 6 6 --- 7 7 8 8 <BaseLayout title="Attribution">
-153
src/pages/rewrite/index.astro
··· 1 - --- 2 - import { Image } from 'astro:assets'; 3 - import type { CollectionEntry } from 'astro:content'; 4 - import { getCollection } from 'astro:content'; 5 - import { SEO } from 'astro-seo'; 6 - import ogIndexImage from '@/assets/rewrite/images/og/index.webp'; 7 - import BaseLayout from '@/layouts/rewrite/BaseLayout.astro'; 8 - import { getSeasonImage } from '@/utils/rewrite/images'; 9 - 10 - const { isRewrite } = Astro.locals; 11 - if (!isRewrite) { 12 - return Astro.redirect('/404'); 13 - } 14 - 15 - const seasons = await getCollection('seasonsRewrite'); 16 - 17 - const ogTitle = 'The Life Series Minecraft hardcore survival multiplayer series.'; 18 - const ogDescription = 'Non-official site. Watch all The Life Series member point of views from all seasons.'; 19 - const ogImage = ogIndexImage.src; 20 - const ogImageAlt = 'Grid of 8 Life Series season logos in order from newest to oldest - "Nice Life", "Past Life", "Wild Life", "Secret Life", "Limited Life", "Double Life", "Last Life", "Third Life"'; 21 - 22 - function getUrl(season: CollectionEntry<'seasonsRewrite'>) { 23 - if (season.data.sessionCount) { 24 - return `/rewrite/seasons/${season.id}/sessions/1`; 25 - } 26 - 27 - return `/rewrite/seasons/${season.id}`; 28 - } 29 - --- 30 - 31 - <BaseLayout title="Home"> 32 - <SEO 33 - slot="seo" 34 - title={ogTitle} 35 - description={ogDescription} 36 - openGraph={{ 37 - basic: { 38 - title: ogTitle, 39 - type: 'website', 40 - image: ogImage, 41 - }, 42 - image: { 43 - alt: ogImageAlt, 44 - }, 45 - optional: { 46 - description: ogDescription, 47 - siteName: 'The Life Series', 48 - }, 49 - }} 50 - twitter={{ 51 - card: 'summary', 52 - creator: '@ghustvn', 53 - title: ogTitle, 54 - description: ogDescription, 55 - image: ogImage, 56 - imageAlt: ogImageAlt, 57 - }} 58 - /> 59 - <main> 60 - <h1 class="visually-hidden">Home - Life Series - Non-official site</h1> 61 - <nav> 62 - <ol role="list" reversed> 63 - { 64 - seasons.map((season) => ( 65 - <li> 66 - <a href={getUrl(season)}> 67 - <Image 68 - src={getSeasonImage(season.id)} 69 - width="360" 70 - alt={season.data.title} 71 - loading="eager" 72 - /> 73 - </a> 74 - </li> 75 - )) 76 - } 77 - </ol> 78 - </nav> 79 - </main> 80 - </BaseLayout> 81 - 82 - <style> 83 - main { 84 - box-sizing: border-box; 85 - display: grid; 86 - min-block-size: 100svh; 87 - place-items: center; 88 - padding: 32px; 89 - } 90 - 91 - nav { 92 - inline-size: 100%; 93 - max-inline-size: 636px; 94 - } 95 - 96 - ol { 97 - display: grid; 98 - grid-template-columns: repeat(auto-fit, minmax(min(180px, 100%), 1fr)); 99 - place-items: center; 100 - gap: 48px; 101 - } 102 - 103 - li { 104 - @media (prefers-reduced-motion: no-preference) { 105 - &:nth-child(odd) { 106 - --angle: 2deg; 107 - } 108 - &:nth-child(even) { 109 - --angle: -2deg; 110 - } 111 - } 112 - } 113 - 114 - a { 115 - @media (prefers-reduced-motion: no-preference) { 116 - transition: 117 - scale var(--spring-transition-duration), 118 - rotate var(--spring-transition-duration); 119 - transition-timing-function: var(--spring-transition-timing-function); 120 - 121 - &:focus-visible { 122 - scale: 1.075; 123 - rotate: var(--angle); 124 - } 125 - } 126 - 127 - @media (hover) and (prefers-reduced-motion: no-preference) { 128 - &:hover { 129 - scale: 1.075; 130 - rotate: var(--angle); 131 - } 132 - } 133 - } 134 - 135 - img { 136 - max-inline-size: 180px; 137 - transition-property: filter, opacity; 138 - transition-duration: 100ms; 139 - transition-timing-function: linear; 140 - 141 - :has(a:focus-visible) a:not(:focus-visible) & { 142 - filter: grayscale(75%); 143 - opacity: 0.8; 144 - } 145 - 146 - @media (hover) { 147 - :has(a:hover) a:not(:hover) & { 148 - filter: grayscale(75%); 149 - opacity: 0.8; 150 - } 151 - } 152 - } 153 - </style>
-76
src/pages/rewrite/seasons/[season_id].astro
··· 1 - --- 2 - import { getCollection } from 'astro:content'; 3 - import { SEO } from 'astro-seo'; 4 - import MemberList from '@/components/rewrite/MemberList.astro'; 5 - import SeasonLayout from '@/components/rewrite/SeasonLayout.astro'; 6 - import SkipLink from '@/components/rewrite/SkipLink.astro'; 7 - import BaseLayout from '@/layouts/rewrite/BaseLayout.astro'; 8 - import { getSeasonFaviconImage, getSeasonOGImage } from '@/utils/rewrite/images'; 9 - 10 - const { isRewrite } = Astro.locals; 11 - if (!isRewrite) { 12 - return Astro.redirect('/404'); 13 - } 14 - 15 - const seasonsCollection = await getCollection('seasonsRewrite'); 16 - const membersCollection = await getCollection('membersRewrite'); 17 - 18 - const pages = seasonsCollection.map((season) => { 19 - return { 20 - params: { season_id: season.id }, 21 - props: { 22 - season, 23 - members: membersCollection, 24 - }, 25 - }; 26 - }); 27 - 28 - const { season_id } = Astro.params; 29 - const page = pages.find((page) => page.params.season_id === season_id); 30 - if (!page) return Astro.redirect('/404'); 31 - const { season, members } = page.props; 32 - 33 - const pageTitle = `${season.data.title}`; 34 - 35 - const ogTitle = season.data.title; 36 - const ogDescription = `Watch all point of views of ${season.data.title}`; 37 - const faviconImage = (await getSeasonFaviconImage(season.id)).default.src; 38 - const ogImage = (await getSeasonOGImage(season.id)).default.src; 39 - const ogImageAlt = `The Life Series logo - ${season.data.title}`; 40 - --- 41 - 42 - <BaseLayout title={pageTitle} favicon={faviconImage}> 43 - <SEO 44 - slot="seo" 45 - title={ogTitle} 46 - description={ogDescription} 47 - openGraph={{ 48 - basic: { 49 - title: ogTitle, 50 - type: 'website', 51 - image: ogImage, 52 - }, 53 - image: { 54 - alt: ogImageAlt, 55 - }, 56 - optional: { 57 - description: ogDescription, 58 - siteName: 'The Life Series', 59 - }, 60 - }} 61 - twitter={{ 62 - card: 'summary', 63 - creator: '@ghustvn', 64 - title: ogTitle, 65 - description: ogDescription, 66 - image: ogImage, 67 - imageAlt: ogImageAlt, 68 - }} 69 - /> 70 - <SkipLink /> 71 - <SeasonLayout season={season}> 72 - <Fragment slot="sidebar-title">Members</Fragment> 73 - <MemberList slot="sidebar-nav" members={members} season={season} /> 74 - <Fragment slot="main-title">{season.data.title}</Fragment> 75 - </SeasonLayout> 76 - </BaseLayout>
-188
src/pages/rewrite/seasons/[season_id]/[member_name].astro
··· 1 - --- 2 - import { getCollection, getEntry } from 'astro:content'; 3 - import { SEO } from 'astro-seo'; 4 - import MemberItem from '@/components/rewrite/MemberItem.astro'; 5 - import MemberList from '@/components/rewrite/MemberList.astro'; 6 - import SeasonLayout from '@/components/rewrite/SeasonLayout.astro'; 7 - import SkipLink from '@/components/rewrite/SkipLink.astro'; 8 - import VideoItem from '@/components/rewrite/VideoItem.astro'; 9 - import BaseLayout from '@/layouts/rewrite/BaseLayout.astro'; 10 - import { getSeasonFaviconImage, getSeasonOGImage } from '@/utils/rewrite/images'; 11 - 12 - const { isRewrite } = Astro.locals; 13 - if (!isRewrite) { 14 - return Astro.redirect('/404'); 15 - } 16 - 17 - async function asyncFilter<T>(arr: T[], predicate: (value: T) => object) { 18 - return Promise.all(arr.map(predicate)).then((results) => 19 - arr.filter((_: unknown, index: number) => results[index]), 20 - ); 21 - } 22 - 23 - const seasonsCollection = await getCollection('seasonsRewrite'); 24 - const membersCollection = await getCollection('membersRewrite'); 25 - 26 - const result = seasonsCollection.map((season) => { 27 - return membersCollection.map((member) => { 28 - return { 29 - params: { season_id: season.id, member_name: member.data.name }, 30 - props: { 31 - member, 32 - members: membersCollection, 33 - season, 34 - videos: season.data.videos[member.data.name] ?? [], 35 - }, 36 - }; 37 - }); 38 - }); 39 - 40 - const flatResult = result.flat(); 41 - 42 - const pages = await asyncFilter<(typeof flatResult)[0]>(flatResult, async (result) => { 43 - const season = await getEntry('seasonsRewrite', result.params.season_id); 44 - const member = await getEntry('membersRewrite', result.params.member_name); 45 - 46 - return season && member && Object.keys(season.data.videos).includes(member.data.name); 47 - }); 48 - 49 - const { season_id, member_name } = Astro.params; 50 - const page = pages.find( 51 - (page) => page.params.season_id === season_id && page.params.member_name === member_name, 52 - ); 53 - if (!page) return Astro.redirect('/404'); 54 - const { member, members, season, videos } = page.props; 55 - 56 - const movie = videos.find((video) => video.isMovie); 57 - const sessions = videos.filter((video) => !video.isMovie); 58 - 59 - const pageTitle = `${member.data.name} - ${season.data.title}`; 60 - 61 - const ogTitle = `${member.data.name} in ${season.data.title}`; 62 - const ogDescription = `Watch all sessions from ${member.data.name} point of view of ${season.data.title}`; 63 - const faviconImage = (await getSeasonFaviconImage(season.id)).default.src; 64 - const ogImage = (await getSeasonOGImage(season.id)).default.src; 65 - const ogImageAlt = `The Life Series logo - ${season.data.title}`; 66 - --- 67 - 68 - <BaseLayout title={pageTitle} favicon={faviconImage}> 69 - <SEO 70 - slot="seo" 71 - title={ogTitle} 72 - description={ogDescription} 73 - openGraph={{ 74 - basic: { 75 - title: ogTitle, 76 - type: 'website', 77 - image: ogImage, 78 - }, 79 - image: { 80 - alt: ogImageAlt, 81 - }, 82 - optional: { 83 - description: ogDescription, 84 - siteName: 'The Life Series', 85 - }, 86 - }} 87 - twitter={{ 88 - card: 'summary', 89 - creator: '@ghustvn', 90 - title: ogTitle, 91 - description: ogDescription, 92 - image: ogImage, 93 - imageAlt: ogImageAlt, 94 - }} 95 - /> 96 - <SkipLink /> 97 - <SeasonLayout season={season}> 98 - { 99 - season.data.sessionCount && ( 100 - <a slot="inline-start-links" href={`/rewrite/seasons/${season.id}/sessions/1`}> 101 - <span>All sessions</span> 102 - </a> 103 - ) 104 - } 105 - <Fragment slot="sidebar-title">Members</Fragment> 106 - <MemberList slot="sidebar-nav" members={members} season={season} /> 107 - <MemberItem slot="main-title" memberName={member.data.name} title={`${member.data.name} - ${season.data.title}`} /> 108 - <div class="flow movie-session-wrapper"> 109 - { 110 - movie && ( 111 - <div class="flow movie-wrapper"> 112 - <h2>The Movie</h2> 113 - <VideoItem ytId={movie.id} title={movie.title} /> 114 - </div> 115 - ) 116 - } 117 - { 118 - sessions.length > 0 && ( 119 - <div class="flow session-wrapper"> 120 - <h2>Sessions</h2> 121 - <ol role="list" class="flow session-list"> 122 - {sessions.map((session, i) => ( 123 - <li> 124 - <VideoItem ytId={session.id} title={session.title} /> 125 - </li> 126 - ))} 127 - </ol> 128 - </div> 129 - ) 130 - } 131 - </div> 132 - </SeasonLayout> 133 - </BaseLayout> 134 - 135 - <script is:inline> 136 - const currentPageLink = document.querySelector('[aria-current="page"]'); 137 - 138 - if (currentPageLink) { 139 - let scrollable = currentPageLink.parentElement; 140 - 141 - while (scrollable) { 142 - const overflow = getComputedStyle(scrollable).overflowY; 143 - if (overflow === 'auto' || overflow === 'scroll') break; 144 - scrollable = scrollable.parentElement; 145 - } 146 - 147 - if (scrollable && scrollable !== document.documentElement) { 148 - const prevBehavior = scrollable.style.scrollBehavior; 149 - scrollable.style.scrollBehavior = 'auto'; 150 - 151 - const linkTop = currentPageLink.getBoundingClientRect().top; 152 - const containerTop = scrollable.getBoundingClientRect().top; 153 - const containerHeight = scrollable.clientHeight; 154 - const offset = linkTop - containerTop - containerHeight / 2 + currentPageLink.clientHeight / 2; 155 - 156 - scrollable.scrollTop += offset; 157 - scrollable.style.scrollBehavior = prevBehavior; 158 - } 159 - } 160 - 161 - document.documentElement.classList.remove('js'); 162 - </script> 163 - 164 - <style> 165 - .movie-session-wrapper { 166 - margin-block-start: 16px; 167 - } 168 - 169 - .movie-session-wrapper > * + * { 170 - --flow-space: clamp(48px, 25.7391px + 6.9565cqi, 160px); 171 - } 172 - 173 - .movie-wrapper > * + * { 174 - --flow-space: 1em; 175 - } 176 - 177 - .session-wrapper > * + * { 178 - --flow-space: 1em; 179 - } 180 - 181 - .session-list { 182 - margin-block-start: 16px; 183 - } 184 - 185 - .session-list > * + * { 186 - --flow-space: clamp(48px, 25.7391px + 6.9565cqi, 160px); 187 - } 188 - </style>
+52 -56
src/pages/rewrite/seasons/[season_id]/sessions/[session_id].astro src/pages/seasons/[season_id]/sessions/[session_id].astro
··· 1 1 --- 2 2 import { type CollectionEntry, getCollection } from 'astro:content'; 3 3 import { SEO } from 'astro-seo'; 4 - import MemberItem from '@/components/rewrite/MemberItem.astro'; 5 - import SeasonLayout from '@/components/rewrite/SeasonLayout.astro'; 6 - import SkipLink from '@/components/rewrite/SkipLink.astro'; 7 - import VideoItem from '@/components/rewrite/VideoItem.astro'; 8 - import BaseLayout from '@/layouts/rewrite/BaseLayout.astro'; 9 - import { getSeasonFaviconImage, getSeasonOGImage } from '@/utils/rewrite/images'; 4 + import MemberItem from '@/components/MemberItem.astro'; 5 + import SeasonLayout from '@/components/SeasonLayout.astro'; 6 + import SkipLink from '@/components/SkipLink.astro'; 7 + import VideoItem from '@/components/VideoItem.astro'; 8 + import BaseLayout from '@/layouts/BaseLayout.astro'; 9 + import { getSeasonFaviconImage, getSeasonOGImage } from '@/utils/images'; 10 10 import { isCurrentPage } from '@/utils/url'; 11 11 12 - const { isRewrite } = Astro.locals; 13 - if (!isRewrite) { 14 - return Astro.redirect('/404'); 15 - } 16 - 17 - function createSeasonSessionList(season: CollectionEntry<'seasonsRewrite'>, sessionNumber: number) { 18 - return Object.entries(season.data.videos).map(([member, memberVideos]) => { 19 - return { 20 - [member]: memberVideos.filter((video) => !video.isMovie)[sessionNumber - 1], 21 - }; 22 - }); 23 - } 12 + export async function getStaticPaths() { 13 + function createSeasonSessionList(season: CollectionEntry<'seasons'>, sessionNumber: number) { 14 + return Object.entries(season.data.videos).map(([member, memberVideos]) => { 15 + return { 16 + [member]: memberVideos.filter((video) => !video.isMovie)[sessionNumber - 1], 17 + }; 18 + }); 19 + } 24 20 25 - const seasonsCollection = await getCollection('seasonsRewrite'); 26 - const membersCollection = await getCollection('membersRewrite'); 21 + const seasonsCollection = await getCollection('seasons'); 27 22 28 - const result = seasonsCollection.map((season) => { 29 - const sessionNumbers = season.data.sessionCount 30 - ? Array.from(Array(season.data.sessionCount).keys()).map((sessionIndex) => ++sessionIndex) 31 - : []; 23 + const result = seasonsCollection.map((season) => { 24 + const sessionNumbers = season.data.sessionCount 25 + ? Array.from(Array(season.data.sessionCount).keys()).map((sessionIndex) => ++sessionIndex) 26 + : []; 32 27 33 - return sessionNumbers.map((sessionNumber) => { 34 - return { 35 - params: { season_id: season.id, session_id: sessionNumber }, 36 - props: { 37 - season, 38 - sessionNumber, 39 - sessionNumbers, 40 - sessions: createSeasonSessionList(season, sessionNumber), 41 - }, 42 - }; 28 + return sessionNumbers.map((sessionNumber) => { 29 + return { 30 + params: { season_id: season.id, session_id: sessionNumber }, 31 + props: { 32 + season, 33 + sessionNumber, 34 + sessionNumbers, 35 + sessions: createSeasonSessionList(season, sessionNumber), 36 + }, 37 + }; 38 + }); 43 39 }); 44 - }); 45 40 46 - const pages = result.flat(); 41 + return result.flat(); 42 + } 47 43 48 - const { season_id, session_id } = Astro.params; 49 - const page = pages.find( 50 - (page) => page.params.season_id === season_id && `${page.params.session_id}` === session_id, 51 - ); 52 - if (!page) return Astro.redirect('/404'); 53 - const { season, sessionNumber, sessionNumbers, sessions } = page.props; 44 + const { season, sessionNumber, sessionNumbers, sessions } = Astro.props; 54 45 55 46 const pageTitle = `Session ${sessionNumber} - ${season.data.title}`; 56 47 ··· 102 93 sessionNumbers.map((sessionNumber) => ( 103 94 <li> 104 95 <a 105 - class="session-item-link" href={`/rewrite/seasons/${season.id}/sessions/${sessionNumber}`} 106 - aria-current={isCurrentPage(Astro.url.pathname, `/rewrite/seasons/${season.id}/sessions/${sessionNumber}`)} 96 + class="session-item-link" href={`/seasons/${season.id}/sessions/${sessionNumber}`} 97 + aria-current={isCurrentPage(Astro.url.pathname, `/seasons/${season.id}/sessions/${sessionNumber}`)} 107 98 > 108 99 <span>Session {sessionNumber}</span> 109 100 </a> ··· 119 110 <h2 id={member}> 120 111 <MemberItem memberName={member} /> 121 112 </h2> 122 - <a href={`/rewrite/seasons/${season.id}/${member}`} aria-describedby={member}> 113 + <a href={`/seasons/${season.id}/${member}`} aria-describedby={member}> 123 114 All sessions 124 115 </a> 125 116 </div> ··· 170 161 padding-inline-end: 12px; 171 162 } 172 163 173 - @media (hover) { 164 + @media (hover: hover) { 174 165 &:has(.session-item-link:hover) 175 166 .session-item-link:not(:hover) { 176 167 filter: grayscale(75%); ··· 189 180 transition-duration: 100ms; 190 181 transition-timing-function: linear; 191 182 183 + @media (prefers-reduced-motion: no-preference) { 184 + transition: 185 + filter 100ms linear, 186 + opacity 100ms linear, 187 + translate var(--spring-transition-duration) var(--spring-transition-timing-function); 188 + } 189 + 192 190 &:focus-visible { 193 191 outline: none; 194 192 195 193 &:not([aria-current='page']) { 196 - translate: 8px; 194 + @media (prefers-reduced-motion: no-preference) { 195 + translate: 8px; 196 + } 197 197 } 198 198 199 199 > span { ··· 202 202 } 203 203 } 204 204 205 - @media (prefers-reduced-motion: no-preference) { 206 - transition: 207 - filter 100ms linear, 208 - opacity 100ms linear, 209 - translate var(--spring-transition-duration) var(--spring-transition-timing-function); 210 - } 211 - 212 - @media (hover) { 205 + @media (hover: hover) and (prefers-reduced-motion: no-preference) { 213 206 &:hover:not([aria-current='page']) { 214 207 translate: 8px; 215 208 } 216 209 } 217 210 218 211 &[aria-current='page'] { 219 - translate: 12px; 220 212 text-decoration-line: underline; 221 213 text-decoration-style: wavy; 222 214 font-weight: var(--font-weight-heading); 215 + 216 + @media (prefers-reduced-motion: no-preference) { 217 + translate: 12px; 218 + } 223 219 } 224 220 } 225 221
-137
src/pages/seasons/7/sessions/[session_id].astro
··· 1 - --- 2 - import { Image } from 'astro:assets'; 3 - import { type CollectionEntry, getEntry } from 'astro:content'; 4 - import { YouTube } from '@astro-community/astro-embed-youtube'; 5 - import { SEO } from 'astro-seo'; 6 - import SessionList from '@/components/SessionList.astro'; 7 - import SeasonsLayout from '@/layouts/SeasonsLayout.astro'; 8 - import { getMemberImage } from '@/utils/images'; 9 - 10 - const { isRewrite } = Astro.locals; 11 - if (isRewrite) { 12 - return Astro.redirect('/404'); 13 - } 14 - 15 - function createSeasonSessionList(season: CollectionEntry<'seasons'>, sessionNumber: number) { 16 - return Object.entries(season.data.videos).map(([member, memberVideos]) => { 17 - return { 18 - [member]: memberVideos.filter((video) => !video.isMovie)[sessionNumber - 1], 19 - }; 20 - }); 21 - } 22 - 23 - const seasonSeven = await getEntry('seasons', '7'); 24 - if (!seasonSeven) { 25 - return; 26 - } 27 - 28 - const seasonSevenSessionNumbers = seasonSeven.data.sessionCount 29 - ? Array.from(Array(seasonSeven.data.sessionCount).keys()) 30 - .map((sessionIndex) => ++sessionIndex) 31 - .reverse() 32 - : []; 33 - 34 - const pages = seasonSevenSessionNumbers.map((sessionNumber) => { 35 - return { 36 - params: { session_id: sessionNumber }, 37 - props: { 38 - season: seasonSeven, 39 - sessions: createSeasonSessionList(seasonSeven, sessionNumber), 40 - sessionNumbers: seasonSevenSessionNumbers, 41 - sessionNumber, 42 - }, 43 - }; 44 - }); 45 - 46 - const { session_id } = Astro.params; 47 - const page = pages.find((page) => `${page.params.session_id}` === session_id); 48 - if (!page) return Astro.redirect('/404'); 49 - const { season, sessions, sessionNumbers, sessionNumber } = page.props; 50 - 51 - const title = `Session ${sessionNumber} · ${season.data.title}`; 52 - --- 53 - 54 - <SeasonsLayout 55 - title={title} 56 - season={season} 57 - > 58 - <SEO 59 - slot="seo" 60 - description={`Session ${sessionNumber} of ${season.data.title}.`} 61 - /> 62 - <div class="@container pt-8"> 63 - <h2 64 - id="all-sessions-title" 65 - class="mx-fluid-v-320-768-16-24 md:mx-fluid-v-768-1930-24-128 text-base font-normal" 66 - > 67 - {season.data.title} sessions 68 - </h2> 69 - <div 70 - class="mx-fluid-v-320-768-16-24 md:mx-fluid-v-768-1930-24-128 bg-canvas border-canvas-text/25 sticky top-0 z-1 max-w-720 overflow-x-auto overflow-y-clip border-b-1 py-12 motion-safe:scroll-smooth" 71 - > 72 - <nav aria-labelledby="all-sessions-title"> 73 - <SessionList 74 - season={season} 75 - sessionNumbers={sessionNumbers} 76 - withText={false} 77 - /> 78 - </nav> 79 - </div> 80 - <main> 81 - <div 82 - class="mx-fluid-v-320-768-16-24 md:mx-fluid-v-768-1930-24-128 pt-fluid-v-320-768-16-24 md:pt-fluid-c-320-1930-24-80 max-w-720 pb-[25vh]" 83 - > 84 - <h1 85 - id="main-content" 86 - tabindex="-1" 87 - class="custom-trim-start mb-8 w-fit text-base text-balance" 88 - > 89 - Session {sessionNumber} of {season.data.title} 90 - </h1> 91 - <ul 92 - role="list" 93 - aria-labelledby="main-content" 94 - class="space-y-fluid-c-320-768-24-64" 95 - > 96 - { 97 - sessions.map((session) => { 98 - return Object.entries(session).map( 99 - ([member, video]) => 100 - video && ( 101 - <li> 102 - <h2 class="grid gap-y-4 pb-8 text-base font-normal text-balance"> 103 - <div class="flex items-center gap-8"> 104 - <Image 105 - src={getMemberImage(member)} 106 - width="64" 107 - height="64" 108 - alt="" 109 - loading="eager" 110 - class="aspect-square max-w-32 rounded-full" 111 - /> 112 - <span>{member}</span> 113 - </div> 114 - <span class="text-h3">{video.title}</span> 115 - </h2> 116 - {import.meta.env.PROD ? ( 117 - <YouTube 118 - id={video.id} 119 - title={video.title} 120 - poster={`https://i.ytimg.com/vi_webp/${video.id}/maxresdefault.webp`} 121 - playlabel={`Play video: ${video.title}`} 122 - posterQuality="max" 123 - class="rounded-lg" 124 - /> 125 - ) : ( 126 - <div class="bg-canvas-text aspect-video max-w-720 rounded-lg" /> 127 - )} 128 - </li> 129 - ), 130 - ); 131 - }) 132 - } 133 - </ul> 134 - </div> 135 - </main> 136 - </div> 137 - </SeasonsLayout>
+29 -58
src/pages/seasons/[season_id].astro
··· 1 1 --- 2 2 import { getCollection } from 'astro:content'; 3 3 import { SEO } from 'astro-seo'; 4 - import SessionList from '@/components/SessionList.astro'; 5 - import SeasonsLayout from '@/layouts/SeasonsLayout.astro'; 6 - import { getSeasonOGImage } from '@/utils/images'; 7 - 8 - const { isRewrite } = Astro.locals; 9 - if (isRewrite) { 10 - return Astro.redirect('/404'); 11 - } 4 + import MemberList from '@/components/MemberList.astro'; 5 + import SeasonLayout from '@/components/SeasonLayout.astro'; 6 + import SkipLink from '@/components/SkipLink.astro'; 7 + import BaseLayout from '@/layouts/BaseLayout.astro'; 8 + import { getSeasonFaviconImage, getSeasonOGImage } from '@/utils/images'; 12 9 13 - const seasons = await getCollection('seasons'); 10 + export async function getStaticPaths() { 11 + const seasonsCollection = await getCollection('seasons'); 14 12 15 - const pages = seasons.map((season) => { 16 - const sessions = season.data.sessionCount 17 - ? Array.from(Array(season.data.sessionCount).keys()) 18 - .map((sessionIndex) => ++sessionIndex) 19 - .reverse() 20 - : []; 13 + return seasonsCollection.map((season) => { 14 + return { 15 + params: { season_id: season.id }, 16 + props: { season }, 17 + }; 18 + }); 19 + } 21 20 22 - return { 23 - params: { season_id: season.id }, 24 - props: { season, sessions }, 25 - }; 26 - }); 21 + const { season } = Astro.props; 27 22 28 - const { season_id } = Astro.params; 29 - const page = pages.find((page) => page.params.season_id === season_id); 30 - if (!page) return Astro.redirect('/404'); 31 - const { season, sessions } = page.props; 23 + const pageTitle = `${season.data.title}`; 32 24 33 - const title = `${season.data.title}`; 34 - 35 - const ogTitle = `${season.data.title} - The Life Series Minecraft hardcore survival multiplayer series.`; 36 - const ogDescription = `Watch all sessions. ${season.data.seo.description.twist}.`; 37 - const ogImage = await getSeasonOGImage(season.id); 25 + const ogTitle = season.data.title; 26 + const ogDescription = `Watch all point of views of ${season.data.title}`; 27 + const faviconImage = (await getSeasonFaviconImage(season.id)).default.src; 28 + const ogImage = (await getSeasonOGImage(season.id)).default.src; 38 29 const ogImageAlt = `The Life Series logo - ${season.data.title}`; 39 30 --- 40 31 41 - <SeasonsLayout 42 - title={title} 43 - season={season} 44 - > 32 + <BaseLayout title={pageTitle} favicon={faviconImage}> 45 33 <SEO 46 34 slot="seo" 35 + title={ogTitle} 47 36 description={ogDescription} 48 37 openGraph={{ 49 38 basic: { ··· 68 57 imageAlt: ogImageAlt, 69 58 }} 70 59 /> 71 - <main class="@container h-full"> 72 - <div 73 - class="mx-fluid-v-320-768-16-24 md:mx-fluid-v-768-1930-24-128 grid h-full place-content-center justify-items-center gap-16 py-16 text-center text-balance" 74 - > 75 - <h1 76 - id="main-content" 77 - tabindex="-1" 78 - class="text-3xl" 79 - > 80 - {season.data.title} 81 - </h1> 82 - { 83 - sessions.length > 0 ? ( 84 - <SessionList 85 - season={season} 86 - sessionNumbers={sessions} 87 - withText 88 - /> 89 - ) : ( 90 - <p>Select a member from navigation</p> 91 - ) 92 - } 93 - </div> 94 - </main> 95 - </SeasonsLayout> 60 + <SkipLink /> 61 + <SeasonLayout season={season}> 62 + <Fragment slot="sidebar-title">Members</Fragment> 63 + <MemberList slot="sidebar-nav" season={season} /> 64 + <Fragment slot="main-title">{season.data.title}</Fragment> 65 + </SeasonLayout> 66 + </BaseLayout>
+160 -128
src/pages/seasons/[season_id]/[member_name].astro
··· 1 1 --- 2 2 import { getCollection, getEntry } from 'astro:content'; 3 - import { YouTube } from '@astro-community/astro-embed-youtube'; 4 3 import { SEO } from 'astro-seo'; 5 - import SeasonsLayout from '@/layouts/SeasonsLayout.astro'; 6 - 7 - const { isRewrite } = Astro.locals; 8 - if (isRewrite) { 9 - return Astro.redirect('/404'); 10 - } 4 + import MemberItem from '@/components/MemberItem.astro'; 5 + import MemberList from '@/components/MemberList.astro'; 6 + import SeasonLayout from '@/components/SeasonLayout.astro'; 7 + import SkipLink from '@/components/SkipLink.astro'; 8 + import VideoItem from '@/components/VideoItem.astro'; 9 + import BaseLayout from '@/layouts/BaseLayout.astro'; 10 + import { getSeasonFaviconImage, getSeasonOGImage } from '@/utils/images'; 11 11 12 - async function asyncFilter<T>(arr: T[], predicate: (value: T) => object) { 13 - return Promise.all(arr.map(predicate)).then((results) => 14 - arr.filter((_: unknown, index: number) => results[index]), 15 - ); 16 - } 12 + export async function getStaticPaths() { 13 + async function asyncFilter<T>(arr: T[], predicate: (value: T) => object) { 14 + return Promise.all(arr.map(predicate)).then((results) => 15 + arr.filter((_: unknown, index: number) => results[index]), 16 + ); 17 + } 17 18 18 - const seasons = await getCollection('seasons'); 19 - const members = await getCollection('members'); 19 + const seasonsCollection = await getCollection('seasons'); 20 + const membersCollection = await getCollection('members'); 20 21 21 - const result = seasons.map((season) => { 22 - return members.map((member) => { 23 - return { 24 - params: { season_id: season.id, member_name: member.data.name }, 25 - props: { 26 - season, 27 - member, 28 - videos: season.data.videos[member.data.name] ?? [], 29 - }, 30 - }; 22 + const result = seasonsCollection.map((season) => { 23 + return membersCollection.map((member) => { 24 + return { 25 + params: { season_id: season.id, member_name: member.data.name }, 26 + props: { 27 + member, 28 + season, 29 + videos: season.data.videos[member.data.name] ?? [], 30 + }, 31 + }; 32 + }); 31 33 }); 32 - }); 33 34 34 - const flatResult = result.flat(); 35 + const flatResult = result.flat(); 35 36 36 - const pages = await asyncFilter<(typeof flatResult)[0]>(flatResult, async (result) => { 37 - const season = await getEntry('seasons', result.params.season_id); 38 - const member = await getEntry('members', result.params.member_name); 37 + const pages = await asyncFilter<(typeof flatResult)[0]>(flatResult, async (result) => { 38 + const season = await getEntry('seasons', result.params.season_id); 39 + const member = await getEntry('members', result.params.member_name); 39 40 40 - return season && member && Object.keys(season.data.videos).includes(member.data.name); 41 - }); 41 + return season && member && Object.keys(season.data.videos).includes(member.data.name); 42 + }); 42 43 43 - const { season_id, member_name } = Astro.params; 44 - const page = pages.find( 45 - (page) => page.params.season_id === season_id && page.params.member_name === member_name, 46 - ); 47 - if (!page) return Astro.redirect('/404'); 48 - const { season, member, videos } = page.props; 44 + return pages; 45 + } 46 + 47 + const { member, season, videos } = Astro.props; 49 48 50 49 const movie = videos.find((video) => video.isMovie); 51 50 const sessions = videos.filter((video) => !video.isMovie); 52 51 53 - const title = `${member.data.name} · ${season.data.title}`; 52 + const pageTitle = `${member.data.name} - ${season.data.title}`; 53 + 54 + const ogTitle = `${member.data.name} in ${season.data.title}`; 55 + const ogDescription = `Watch all sessions from ${member.data.name} point of view of ${season.data.title}`; 56 + const faviconImage = (await getSeasonFaviconImage(season.id)).default.src; 57 + const ogImage = (await getSeasonOGImage(season.id)).default.src; 58 + const ogImageAlt = `The Life Series logo - ${season.data.title}`; 54 59 --- 55 60 56 - <SeasonsLayout 57 - title={title} 58 - season={season} 59 - canPageBecomeScrollable 60 - > 61 + <BaseLayout title={pageTitle} favicon={faviconImage}> 61 62 <SEO 62 63 slot="seo" 63 - description={`${member.data.name} point of view for ${season.data.title}.`} 64 + title={ogTitle} 65 + description={ogDescription} 66 + openGraph={{ 67 + basic: { 68 + title: ogTitle, 69 + type: 'website', 70 + image: ogImage, 71 + }, 72 + image: { 73 + alt: ogImageAlt, 74 + }, 75 + optional: { 76 + description: ogDescription, 77 + siteName: 'The Life Series', 78 + }, 79 + }} 80 + twitter={{ 81 + card: 'summary', 82 + creator: '@ghustvn', 83 + title: ogTitle, 84 + description: ogDescription, 85 + image: ogImage, 86 + imageAlt: ogImageAlt, 87 + }} 64 88 /> 65 - <main class="@container"> 66 - <div class="mx-fluid-v-320-768-16-24 md:mx-fluid-v-768-1930-24-128 max-w-1080 pb-[25vh]"> 67 - <div 68 - class="bg-canvas border-canvas-text/25 sticky top-0 z-1 flex flex-wrap items-center gap-x-32 border-b-1" 69 - > 70 - <h1 71 - id="main-content" 72 - class="w-fit text-base font-normal text-balance" 73 - tabindex="-1" 74 - > 75 - {title} 76 - </h1> 77 - { 78 - season.data.sessionCount && ( 79 - <a 80 - href={`/seasons/${season.id}/sessions/${season.data.sessionCount}`} 81 - class="py-8 text-base underline decoration-1 underline-offset-4 hover:no-underline" 82 - > 83 - All {season.data.title} sessions 84 - </a> 85 - ) 86 - } 87 - </div> 88 - <div class="pt-fluid-v-320-768-16-24 md:pt-fluid-c-320-1930-24-80"> 89 - { 90 - movie && ( 91 - <> 92 - <h2 class="custom-trim-start mb-8 text-base">The Movie</h2> 93 - {import.meta.env.PROD ? ( 94 - <YouTube 95 - id={movie.id} 96 - title={movie.title} 97 - poster={`https://i.ytimg.com/vi_webp/${movie.id}/maxresdefault.webp`} 98 - playlabel={`Play video: ${movie.title}`} 99 - posterQuality="max" 100 - class="movie-video rounded-lg" 101 - /> 102 - ) : ( 103 - <div class="bg-canvas-text aspect-video max-w-1080 rounded-lg" /> 104 - )} 105 - <hr class="my-fluid-c-320-1930-24-80 border-canvas-text/25 border-x-0 border-t-0 border-solid" /> 106 - </> 107 - ) 108 - } 109 - { 110 - sessions.length > 0 && ( 111 - <> 112 - <h2 113 - id="session-title" 114 - class="custom-trim-start mb-8 text-base" 115 - > 116 - Episodes 117 - </h2> 118 - <ol 119 - role="list" 120 - aria-labelledby="session-title" 121 - class="space-y-fluid-c-320-768-24-64" 122 - > 123 - {sessions.map((session) => ( 124 - <li> 125 - <h3 class="text-h3 pb-8 font-normal text-balance"> 126 - {session.title} 127 - </h3> 128 - {import.meta.env.PROD ? ( 129 - <YouTube 130 - id={session.id} 131 - title={session.title} 132 - poster={`https://i.ytimg.com/vi_webp/${session.id}/maxresdefault.webp`} 133 - playlabel={`Play video: ${session.title}`} 134 - posterQuality="max" 135 - class="rounded-lg" 136 - /> 137 - ) : ( 138 - <div class="bg-canvas-text aspect-video max-w-720 rounded-lg" /> 139 - )} 140 - </li> 141 - ))} 142 - </ol> 143 - </> 144 - ) 145 - } 146 - </div> 89 + <SkipLink /> 90 + <SeasonLayout season={season}> 91 + { 92 + season.data.sessionCount && ( 93 + <a slot="inline-start-links" href={`/seasons/${season.id}/sessions/1`}> 94 + <span>All sessions</span> 95 + </a> 96 + ) 97 + } 98 + <Fragment slot="sidebar-title">Members</Fragment> 99 + <MemberList slot="sidebar-nav" season={season} /> 100 + <MemberItem slot="main-title" memberName={member.data.name} title={`${member.data.name} - ${season.data.title}`} /> 101 + <div class="flow movie-session-wrapper"> 102 + { 103 + movie && ( 104 + <div class="flow movie-wrapper"> 105 + <h2>The Movie</h2> 106 + <VideoItem ytId={movie.id} title={movie.title} /> 107 + </div> 108 + ) 109 + } 110 + { 111 + sessions.length > 0 && ( 112 + <div class="flow session-wrapper"> 113 + <h2>Sessions</h2> 114 + <ol role="list" class="flow session-list"> 115 + {sessions.map((session) => ( 116 + <li> 117 + <VideoItem ytId={session.id} title={session.title} /> 118 + </li> 119 + ))} 120 + </ol> 121 + </div> 122 + ) 123 + } 147 124 </div> 148 - </main> 149 - </SeasonsLayout> 125 + </SeasonLayout> 126 + </BaseLayout> 127 + 128 + <script is:inline> 129 + const currentPageLink = document.querySelector('[aria-current="page"]'); 130 + 131 + if (currentPageLink) { 132 + let scrollable = currentPageLink.parentElement; 133 + 134 + while (scrollable) { 135 + const overflow = getComputedStyle(scrollable).overflowY; 136 + if (overflow === 'auto' || overflow === 'scroll') break; 137 + scrollable = scrollable.parentElement; 138 + } 139 + 140 + if (scrollable && scrollable !== document.documentElement) { 141 + const prevBehavior = scrollable.style.scrollBehavior; 142 + scrollable.style.scrollBehavior = 'auto'; 143 + 144 + const linkTop = currentPageLink.getBoundingClientRect().top; 145 + const containerTop = scrollable.getBoundingClientRect().top; 146 + const containerHeight = scrollable.clientHeight; 147 + const offset = linkTop - containerTop - containerHeight / 2 + currentPageLink.clientHeight / 2; 148 + 149 + scrollable.scrollTop += offset; 150 + scrollable.style.scrollBehavior = prevBehavior; 151 + } 152 + } 153 + 154 + document.documentElement.classList.remove('js'); 155 + </script> 156 + 157 + <style> 158 + .movie-session-wrapper { 159 + margin-block-start: 16px; 160 + } 161 + 162 + .movie-session-wrapper > * + * { 163 + --flow-space: clamp(48px, 25.7391px + 6.9565cqi, 160px); 164 + } 165 + 166 + .movie-wrapper > * + * { 167 + --flow-space: 1em; 168 + } 169 + 170 + .session-wrapper > * + * { 171 + --flow-space: 1em; 172 + } 173 + 174 + .session-list { 175 + margin-block-start: 16px; 176 + } 177 + 178 + .session-list > * + * { 179 + --flow-space: clamp(48px, 25.7391px + 6.9565cqi, 160px); 180 + } 181 + </style>
-137
src/pages/seasons/nice-life/sessions/[session_id].astro
··· 1 - --- 2 - import { Image } from 'astro:assets'; 3 - import { type CollectionEntry, getEntry } from 'astro:content'; 4 - import { YouTube } from '@astro-community/astro-embed-youtube'; 5 - import { SEO } from 'astro-seo'; 6 - import SessionList from '@/components/SessionList.astro'; 7 - import SeasonsLayout from '@/layouts/SeasonsLayout.astro'; 8 - import { getMemberImage } from '@/utils/images'; 9 - 10 - const { isRewrite } = Astro.locals; 11 - if (isRewrite) { 12 - return Astro.redirect('/404'); 13 - } 14 - 15 - function createSeasonSessionList(season: CollectionEntry<'seasons'>, sessionNumber: number) { 16 - return Object.entries(season.data.videos).map(([member, memberVideos]) => { 17 - return { 18 - [member]: memberVideos.filter((video) => !video.isMovie)[sessionNumber - 1], 19 - }; 20 - }); 21 - } 22 - 23 - const seasonNiceLife = await getEntry('seasons', 'nice-life'); 24 - if (!seasonNiceLife) { 25 - return; 26 - } 27 - 28 - const sessionNumbersNiceLife = seasonNiceLife.data.sessionCount 29 - ? Array.from(Array(seasonNiceLife.data.sessionCount).keys()) 30 - .map((sessionIndex) => ++sessionIndex) 31 - .reverse() 32 - : []; 33 - 34 - const pages = sessionNumbersNiceLife.map((sessionNumber) => { 35 - return { 36 - params: { session_id: sessionNumber }, 37 - props: { 38 - season: seasonNiceLife, 39 - sessions: createSeasonSessionList(seasonNiceLife, sessionNumber), 40 - sessionNumbers: sessionNumbersNiceLife, 41 - sessionNumber, 42 - }, 43 - }; 44 - }); 45 - 46 - const { session_id } = Astro.params; 47 - const page = pages.find((page) => `${page.params.session_id}` === session_id); 48 - if (!page) return Astro.redirect('/404'); 49 - const { season, sessions, sessionNumbers, sessionNumber } = page.props; 50 - 51 - const title = `Session ${sessionNumber} · ${season.data.title}`; 52 - --- 53 - 54 - <SeasonsLayout 55 - title={title} 56 - season={season} 57 - > 58 - <SEO 59 - slot="seo" 60 - description={`Session ${sessionNumber} of ${season.data.title}.`} 61 - /> 62 - <div class="@container pt-8"> 63 - <h2 64 - id="all-sessions-title" 65 - class="mx-fluid-v-320-768-16-24 md:mx-fluid-v-768-1930-24-128 text-base font-normal" 66 - > 67 - {season.data.title} sessions 68 - </h2> 69 - <div 70 - class="mx-fluid-v-320-768-16-24 md:mx-fluid-v-768-1930-24-128 bg-canvas border-canvas-text/25 sticky top-0 z-1 max-w-720 overflow-x-auto overflow-y-clip border-b-1 py-12 motion-safe:scroll-smooth" 71 - > 72 - <nav aria-labelledby="all-sessions-title"> 73 - <SessionList 74 - season={season} 75 - sessionNumbers={sessionNumbers} 76 - withText={false} 77 - /> 78 - </nav> 79 - </div> 80 - <main> 81 - <div 82 - class="mx-fluid-v-320-768-16-24 md:mx-fluid-v-768-1930-24-128 pt-fluid-v-320-768-16-24 md:pt-fluid-c-320-1930-24-80 max-w-720 pb-[25vh]" 83 - > 84 - <h1 85 - id="main-content" 86 - tabindex="-1" 87 - class="custom-trim-start mb-8 w-fit text-base text-balance" 88 - > 89 - Session {sessionNumber} of {season.data.title} 90 - </h1> 91 - <ul 92 - role="list" 93 - aria-labelledby="main-content" 94 - class="space-y-fluid-c-320-768-24-64" 95 - > 96 - { 97 - sessions.map((session) => { 98 - return Object.entries(session).map( 99 - ([member, video]) => 100 - video && ( 101 - <li> 102 - <h2 class="grid gap-y-4 pb-8 text-base font-normal text-balance"> 103 - <div class="flex items-center gap-8"> 104 - <Image 105 - src={getMemberImage(member)} 106 - width="64" 107 - height="64" 108 - alt="" 109 - loading="eager" 110 - class="aspect-square max-w-32 rounded-full" 111 - /> 112 - <span>{member}</span> 113 - </div> 114 - <span class="text-h3">{video.title}</span> 115 - </h2> 116 - {import.meta.env.PROD ? ( 117 - <YouTube 118 - id={video.id} 119 - title={video.title} 120 - poster={`https://i.ytimg.com/vi_webp/${video.id}/maxresdefault.webp`} 121 - playlabel={`Play video: ${video.title}`} 122 - posterQuality="max" 123 - class="rounded-lg" 124 - /> 125 - ) : ( 126 - <div class="bg-canvas-text aspect-video max-w-720 rounded-lg" /> 127 - )} 128 - </li> 129 - ), 130 - ); 131 - }) 132 - } 133 - </ul> 134 - </div> 135 - </main> 136 - </div> 137 - </SeasonsLayout>
+80 -233
src/styles/global.css
··· 1 - @layer base, tw.theme, tw.utilities; 2 - 3 - @import 'tailwindcss/theme.css' layer(tw.theme); 4 - @import 'tailwindcss/utilities.css' layer(tw.utilities); 5 - 6 - @theme { 7 - --spacing: 1px; 8 - 9 - /* @link https://utopia.fyi/clamp/calculator?a=320,768,16—24 */ 10 - --spacing-fluid-v-320-768-16-24: clamp(16px, 10.2857px + 1.7857vw, 24px); 11 - /* @link https://utopia.fyi/clamp/calculator?a=320,768,24—64 */ 12 - --spacing-fluid-c-320-768-24-64: clamp(24px, -4.5714px + 8.9286cqi, 64px); 13 - /* @link https://utopia.fyi/clamp/calculator?a=320,1930,24—80 */ 14 - --spacing-fluid-c-320-1930-24-80: clamp(24px, 12.8696px + 3.4783cqi, 80px); 15 - /* @link https://utopia.fyi/clamp/calculator?a=768,1930,24—128 */ 16 - --spacing-fluid-v-768-1930-24-128: clamp( 17 - 24px, 18 - -44.7367px + 19 - 8.9501vw, 20 - 128px 21 - ); 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); 22 6 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 */ 24 - --text-h3: clamp(1rem, 0.8214rem + 0.8929cqi, 1.25rem); 7 + --font-weight-body: 500; 8 + --font-weight-heading: 800; 25 9 26 10 --spring-transition-duration: 250ms; 27 11 --spring-transition-timing-function: linear( ··· 54 38 ); 55 39 } 56 40 57 - @theme inline { 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 - ); 68 - } 69 - 70 - @utility custom-scrollbar-gutter-stable { 71 - scrollbar-gutter: stable; 72 - } 73 - 74 - @utility custom-trim-start { 75 - text-box: trim-start cap alphabetic; 76 - } 77 - 78 - @layer base { 41 + @media (prefers-reduced-motion: no-preference) { 79 42 @view-transition { 80 43 navigation: auto; 81 44 } 45 + } 82 46 83 - *, 84 - *::before, 85 - *::after { 86 - box-sizing: border-box; 87 - margin: 0; 88 - padding: 0; 89 - } 47 + html { 48 + text-size-adjust: none; 49 + -webkit-tap-highlight-color: color-mix( 50 + in oklch, 51 + var(--color-surface-2) 40%, 52 + transparent 53 + ); 54 + scrollbar-color: var(--color-canvas-text) var(--color-canvas); 90 55 91 - :root { 92 - --green-color: oklab(0.6 -0.14 0.13); 56 + @media (prefers-reduced-motion: no-preference) { 57 + scroll-behavior: smooth; 93 58 } 59 + } 94 60 95 - html { 96 - text-size-adjust: none; 97 - -webkit-tap-highlight-color: transparent; 98 - scrollbar-color: var(--color-canvas-text) var(--color-canvas); 99 - } 61 + body { 62 + margin: 0; 63 + background-color: var(--color-canvas); 64 + color: var(--color-canvas-text); 65 + font-family: var(--font-nunito); 66 + font-weight: var(--font-weight-body); 67 + } 100 68 101 - body { 102 - font-family: var(--font-sans); 103 - background-color: var(--color-canvas); 104 - color: var(--color-canvas-text); 105 - } 69 + ::selection { 70 + background-color: var(--color-surface-2); 71 + } 106 72 107 - ::selection { 108 - background-color: var(--color-canvas-text); 109 - color: var(--color-canvas); 110 - } 73 + :focus-visible { 74 + outline: 2px solid var(--color-canvas-text); 75 + outline-offset: 4px; 76 + } 111 77 112 - :focus-visible { 113 - outline-color: var(--color-canvas-text); 114 - } 78 + h1, 79 + h2 { 80 + margin: 0; 81 + } 115 82 116 - :focus-within { 117 - @media (prefers-reduced-motion: no-preference) { 118 - scroll-behavior: smooth; 119 - } 120 - } 83 + h1, 84 + h2 { 85 + font-size: 1rem; 86 + font-weight: var(--font-weight-heading); 87 + } 121 88 122 - :target { 123 - scroll-margin-block: 80px; 124 - } 89 + ul[role='list'], 90 + ol[role='list'] { 91 + list-style: none; 92 + padding: 0; 93 + margin: 0; 94 + } 125 95 126 - [popover] { 127 - background-color: var(--color-canvas); 128 - color: var(--color-canvas-text); 129 - } 96 + img { 97 + max-width: 100%; 98 + height: auto; 99 + vertical-align: middle; 100 + } 130 101 131 - ul, 132 - ol { 133 - list-style-type: none; 134 - } 102 + a { 103 + display: inline-block; 104 + color: inherit; 105 + text-underline-position: under; 106 + } 135 107 136 - a { 137 - color: inherit; 138 - text-decoration: none; 139 - display: inline-block; 140 - } 141 - 142 - img { 143 - max-width: 100%; 144 - height: auto; 145 - vertical-align: middle; 146 - } 147 - 148 - .seasons-list { 149 - img { 150 - transition-property: filter, opacity; 151 - transition-duration: 100ms; 152 - transition-timing-function: linear; 153 - } 154 - 155 - a:is(:focus-visible, [aria-current='page'], [data-parent-page]) { 156 - outline: 2px solid; 157 - border-radius: var(--radius-xs); 158 - } 159 - 160 - a:is([aria-current='page'], [data-parent-page]) { 161 - scale: 1.075; 162 - rotate: var(--angle); 163 - } 164 - 165 - &:has(a:focus-visible) a:not(:focus-visible) img { 166 - filter: grayscale(75%); 167 - opacity: 0.8; 168 - } 169 - 170 - @media (hover) { 171 - &:has(a:hover) a:not(:hover) img { 172 - filter: grayscale(75%); 173 - opacity: 0.8; 174 - } 175 - } 176 - 177 - @media (prefers-reduced-motion: no-preference) { 178 - li:nth-child(1) { 179 - --angle: 3deg; 180 - } 181 - li:nth-child(2) { 182 - --angle: -2deg; 183 - } 184 - li:nth-child(3) { 185 - --angle: 2deg; 186 - } 187 - li:nth-child(4) { 188 - --angle: -1deg; 189 - } 190 - li:nth-child(5) { 191 - --angle: 2deg; 192 - } 193 - li:nth-child(6) { 194 - --angle: -3deg; 195 - } 196 - li:nth-child(7) { 197 - --angle: 1deg; 198 - } 199 - li:nth-child(8) { 200 - --angle: -2deg; 201 - } 202 - 203 - a { 204 - transition: 205 - scale var(--spring-transition-duration), 206 - rotate var(--spring-transition-duration); 207 - transition-timing-function: var( 208 - --spring-transition-timing-function 209 - ); 210 - } 211 - 212 - a:focus-visible { 213 - scale: 1.075; 214 - rotate: var(--angle); 215 - } 216 - } 108 + .visually-hidden:not(:focus-visible):not(:active) { 109 + clip-path: inset(50%); 110 + height: 1px; 111 + overflow: hidden; 112 + position: absolute; 113 + white-space: nowrap; 114 + width: 1px; 115 + } 217 116 218 - @media (hover) and (prefers-reduced-motion: no-preference) { 219 - a:hover { 220 - scale: 1.075; 221 - rotate: var(--angle); 222 - } 223 - } 224 - } 225 - 226 - .members-list { 227 - a { 228 - transition-property: filter, opacity; 229 - transition-duration: 100ms; 230 - transition-timing-function: linear; 231 - 232 - &[aria-current='page'] { 233 - text-decoration-line: underline; 234 - text-decoration-thickness: 2px; 235 - text-decoration-style: wavy; 236 - text-underline-offset: 4px; 237 - } 238 - } 239 - 240 - &:has(a:focus-visible) a:not(:focus-visible) { 241 - filter: grayscale(75%); 242 - opacity: 0.8; 243 - } 244 - 245 - @media (hover) { 246 - &:has(a:not([data-not-playing]):hover) a:not(:hover) { 247 - filter: grayscale(75%); 248 - opacity: 0.8; 249 - } 250 - } 251 - 252 - @media (prefers-reduced-motion: no-preference) { 253 - div { 254 - transition: translate var(--spring-transition-duration); 255 - transition-timing-function: var( 256 - --spring-transition-timing-function 257 - ); 258 - } 259 - 260 - a:focus-visible:not([aria-current='page']) div { 261 - translate: 8px; 262 - } 263 - } 117 + .flow > * + * { 118 + margin-block-start: var(--flow-space, 1em); 119 + } 264 120 265 - @media (hover) and (prefers-reduced-motion: no-preference) { 266 - a:hover:not([aria-current='page']):not([data-not-playing]) div { 267 - translate: 8px; 268 - } 269 - } 270 - 271 - [aria-current='page'] div { 272 - translate: 12px; 273 - } 274 - } 121 + .cluster { 122 + display: flex; 123 + flex-direction: var(--cluster-direction, row); 124 + flex-wrap: var(--cluster-wrap, wrap); 125 + align-items: center; 126 + justify-content: var(--cluster-horizontal-alignment, flex-start); 127 + column-gap: var(--cluster-column-gap, var(--gutter, 16px)); 128 + row-gap: var(--cluster-row-gap, var(--gutter, 16px)); 275 129 } 276 130 277 - lite-youtube { 278 - &:has(:focus-visible) { 279 - outline: 4px solid; 280 - outline-offset: 8px; 281 - } 282 - 283 - &.movie-video { 284 - max-width: 1080px; 285 - } 131 + .gap-text-icon { 132 + --gutter: 8px; 286 133 }
-127
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 - --font-weight-body: 500; 8 - --font-weight-heading: 800; 9 - 10 - --spring-transition-duration: 250ms; 11 - --spring-transition-timing-function: linear( 12 - 0, 13 - 0.01 1%, 14 - 0.041 2.1%, 15 - 0.091 3.2%, 16 - 0.163 4.4%, 17 - 0.329 6.6%, 18 - 0.83 12.5%, 19 - 0.955 14.2%, 20 - 1.056 15.8%, 21 - 1.138 17.4%, 22 - 1.2 19%, 23 - 1.243 20.6%, 24 - 1.268 22.2%, 25 - 1.275 24.5%, 26 - 1.251 27%, 27 - 1.204 29.6%, 28 - 1.059 35.8%, 29 - 0.999 38.8%, 30 - 0.951 42.2%, 31 - 0.928 45.6%, 32 - 0.931 50.8%, 33 - 1 62.5%, 34 - 1.019 69%, 35 - 1.019 74.7%, 36 - 0.996 90%, 37 - 1 38 - ); 39 - } 40 - 41 - @view-transition { 42 - navigation: auto; 43 - } 44 - 45 - html { 46 - text-size-adjust: none; 47 - -webkit-tap-highlight-color: color-mix( 48 - in oklch, 49 - var(--color-surface-2) 40%, 50 - transparent 51 - ); 52 - scrollbar-color: var(--color-canvas-text) var(--color-canvas); 53 - } 54 - 55 - body { 56 - margin: 0; 57 - background-color: var(--color-canvas); 58 - color: var(--color-canvas-text); 59 - font-family: var(--font-nunito); 60 - font-weight: var(--font-weight-body); 61 - } 62 - 63 - ::selection { 64 - background-color: var(--color-surface-2); 65 - } 66 - 67 - :focus-visible { 68 - outline: 2px solid var(--color-canvas-text); 69 - outline-offset: 4px; 70 - } 71 - 72 - h1, 73 - h2 { 74 - margin: 0; 75 - } 76 - 77 - h1, 78 - h2 { 79 - font-size: 1rem; 80 - font-weight: var(--font-weight-heading); 81 - } 82 - 83 - ul[role='list'], 84 - ol[role='list'] { 85 - list-style: none; 86 - padding: 0; 87 - margin: 0; 88 - } 89 - 90 - img { 91 - max-width: 100%; 92 - height: auto; 93 - vertical-align: middle; 94 - } 95 - 96 - a { 97 - display: inline-block; 98 - color: inherit; 99 - text-underline-position: under; 100 - } 101 - 102 - .visually-hidden:not(:focus-visible):not(:active) { 103 - clip-path: inset(50%); 104 - height: 1px; 105 - overflow: hidden; 106 - position: absolute; 107 - white-space: nowrap; 108 - width: 1px; 109 - } 110 - 111 - .flow > * + * { 112 - margin-block-start: var(--flow-space, 1em); 113 - } 114 - 115 - .cluster { 116 - display: flex; 117 - flex-direction: var(--cluster-direction, row); 118 - flex-wrap: var(--cluster-wrap, wrap); 119 - align-items: center; 120 - justify-content: var(--cluster-horizontal-alignment, flex-start); 121 - column-gap: var(--cluster-column-gap, var(--gutter, 16px)); 122 - row-gap: var(--cluster-row-gap, var(--gutter, 16px)); 123 - } 124 - 125 - .gap-text-icon { 126 - --gutter: 8px; 127 - }
+26 -12
src/utils/images.ts
··· 1 - import { getImage } from 'astro:assets'; 2 - import { site } from 'astro:config/client'; 3 1 import type { ImageMetadata } from 'astro'; 4 2 5 3 export async function getMemberImage(member: string) { ··· 9 7 return memberImages[`/src/assets/images/members/${member}.jpg`](); 10 8 } 11 9 10 + export async function getSeasonIconImage(season?: string) { 11 + const seasonImages = import.meta.glob<{ default: ImageMetadata }>( 12 + '/src/assets/images/seasons/icons/*', 13 + ); 14 + 15 + if (!season) { 16 + return seasonImages[`/src/assets/images/seasons/icons/3rd-life.webp`](); 17 + } 18 + 19 + return ( 20 + seasonImages[`/src/assets/images/seasons/icons/${season}.webp`] ?? 21 + seasonImages[`/src/assets/images/seasons/icons/3rd-life.webp`] 22 + )(); 23 + } 24 + 25 + export async function getSeasonFaviconImage(season: string) { 26 + const seasonImages = import.meta.glob<{ default: ImageMetadata }>( 27 + '/src/assets/images/seasons/favicons/*', 28 + ); 29 + return ( 30 + seasonImages[`/src/assets/images/seasons/favicons/${season}.png`] ?? 31 + seasonImages[`/src/assets/images/seasons/favicons/3rd-life.png`] 32 + )(); 33 + } 34 + 12 35 export async function getSeasonImage(season: string) { 13 36 const seasonImages = import.meta.glob<{ default: ImageMetadata }>( 14 37 '/src/assets/images/seasons/*', ··· 20 43 const seasonImages = import.meta.glob<{ default: ImageMetadata }>( 21 44 '/src/assets/images/og/seasons/*', 22 45 ); 23 - const image = 24 - await seasonImages[`/src/assets/images/og/seasons/${season}.png`](); 25 - const formattedImage = await getImage({ 26 - src: image.default, 27 - format: 'webp', 28 - width: 1200, 29 - height: 630, 30 - }); 31 - 32 - return `${site}${formattedImage.src}`; 46 + return seasonImages[`/src/assets/images/og/seasons/${season}.webp`](); 33 47 }
-48
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 - 8 - if (!season) { 9 - return seasonImages[ 10 - `/src/assets/rewrite/images/seasons/icons/3rd-life.webp` 11 - ](); 12 - } 13 - 14 - return ( 15 - seasonImages[ 16 - `/src/assets/rewrite/images/seasons/icons/${season}.webp` 17 - ] ?? 18 - seasonImages[`/src/assets/rewrite/images/seasons/icons/3rd-life.webp`] 19 - )(); 20 - } 21 - 22 - export async function getSeasonFaviconImage(season: string) { 23 - const seasonImages = import.meta.glob<{ default: ImageMetadata }>( 24 - '/src/assets/rewrite/images/seasons/favicons/*', 25 - ); 26 - return ( 27 - seasonImages[ 28 - `/src/assets/rewrite/images/seasons/favicons/${season}.png` 29 - ] ?? 30 - seasonImages[`/src/assets/rewrite/images/seasons/favicons/3rd-life.png`] 31 - )(); 32 - } 33 - 34 - export async function getSeasonImage(season: string) { 35 - const seasonImages = import.meta.glob<{ default: ImageMetadata }>( 36 - '/src/assets/rewrite/images/seasons/*', 37 - ); 38 - return seasonImages[`/src/assets/rewrite/images/seasons/${season}.webp`](); 39 - } 40 - 41 - export async function getSeasonOGImage(season: string) { 42 - const seasonImages = import.meta.glob<{ default: ImageMetadata }>( 43 - '/src/assets/rewrite/images/og/seasons/*', 44 - ); 45 - return seasonImages[ 46 - `/src/assets/rewrite/images/og/seasons/${season}.webp` 47 - ](); 48 - }